Compare commits

..

709 commits

Author SHA1 Message Date
Vanessa
2570a971a2 🚨
Some checks failed
Release Docker Image / build (push) Has been cancelled
2025-08-26 11:07:19 +08:00
Daniel
a4f025a2c2
🔖 Release v3.3.0 2025-08-26 11:05:10 +08:00
Vanessa
4d07212fee 🚨 2025-08-26 11:04:40 +08:00
Vanessa
877e2c4334 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 11:03:21 +08:00
Vanessa
1017610ec8 Merge remote-tracking branch 'origin/dev' into dev 2025-08-26 10:47:21 +08:00
Vanessa
92447342b6 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:47:08 +08:00
Daniel
7b995fd16c
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:46:41 +08:00
Daniel
b332574217
🎨 Improve av 2025-08-26 10:38:26 +08:00
Daniel
3182f7abb8
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 10:01:22 +08:00
Vanessa
ca9427cc82 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 00:51:02 +08:00
Vanessa
e775d0b5f8 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-26 00:36:07 +08:00
Vanessa
2535a64ff1 Merge remote-tracking branch 'origin/dev' into dev 2025-08-25 22:50:40 +08:00
Vanessa
b2ad366da3 🎨 https://github.com/siyuan-note/siyuan/issues/10659 2025-08-25 22:50:19 +08:00
Daniel
bc08148dab
📝 Update changelogs 2025-08-25 17:59:16 +08:00
Vanessa
79a7f4e8e9 🐛 数据库分页 2025-08-25 17:35:36 +08:00
Vanessa
838f3977db Merge remote-tracking branch 'origin/dev' into dev 2025-08-25 17:21:32 +08:00
Vanessa
210e44ec12 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 17:21:19 +08:00
Daniel
0a729d7c1b
🧑‍💻 Improve kernel API /api/filetree/moveDocsByID https://github.com/siyuan-note/siyuan/issues/15616 2025-08-25 16:33:38 +08:00
Daniel
29ac895046
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:24:16 +08:00
Daniel
55541f62b0
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:17:52 +08:00
Daniel
8ccb1e4143
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 16:13:43 +08:00
Daniel
662aaa6458
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 16:12:23 +08:00
Daniel
86018c5f49
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:51:28 +08:00
Daniel
e4f0e02177
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:39:22 +08:00
Daniel
34360fb9e3
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 11:23:42 +08:00
Daniel
8895613f8b
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:58:45 +08:00
Daniel
d0f350d215
🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:43:50 +08:00
Daniel
7e6752a8fb
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:28 +08:00
Daniel
1f3c3a53b4
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:27 +08:00
Daniel
f92074f386
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:26 +08:00
Daniel
58585356d6
🎨 Manually optimize the data index to reduce space usage and improve performance https://github.com/siyuan-note/siyuan/issues/15663 2025-08-25 10:40:25 +08:00
Vanessa
568cdb2f1b 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-25 10:39:11 +08:00
Vanessa
7c23daab06 💄 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 23:12:19 +08:00
Vanessa
e2d9010fca Revert "🎨 https://github.com/siyuan-note/siyuan/issues/15451"
This reverts commit 72c98874
2025-08-24 22:54:54 +08:00
Vanessa
39f965dca0 🎨 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 15:46:45 +08:00
Vanessa
b3ea067792 Merge remote-tracking branch 'origin/dev' into dev 2025-08-24 15:44:39 +08:00
Vanessa
72c9887439 🎨 https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 15:44:25 +08:00
Daniel
a26dc51b21
🎨 Improve av 2025-08-24 15:27:04 +08:00
Daniel
202ccfa5cf
🎨 Limit the database title to 512 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-24 15:16:10 +08:00
Daniel
014ecca54c
🎨 Alert users when .sy file or database .json exceed 8MB https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 11:39:31 +08:00
Daniel
af3220f241
🎨 Limit the database title to 512 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-24 11:30:04 +08:00
Vanessa
4a5237dbd0 🎨 https://github.com/siyuan-note/siyuan/issues/15670 2025-08-24 11:28:15 +08:00
Vanessa
9457d55d14 Merge remote-tracking branch 'origin/dev' into dev 2025-08-24 11:18:11 +08:00
Vanessa
8889235bea 🎨 https://github.com/siyuan-note/siyuan/issues/15670 2025-08-24 11:17:57 +08:00
Daniel
eb13c34fe5
🎨 Alert users when .sy file or database .json exceed 8MB https://github.com/siyuan-note/siyuan/issues/15451 2025-08-24 10:50:03 +08:00
Vanessa
f3cc641005 🎨 https://github.com/siyuan-note/siyuan/issues/15669 2025-08-24 10:46:16 +08:00
Daniel
be5bf8978d
🎨 Improve av 2025-08-24 10:27:47 +08:00
Vanessa
7300a4849c 🎨 https://github.com/siyuan-note/siyuan/issues/15664 2025-08-24 10:14:58 +08:00
Vanessa
7206fc107d 🎨 https://github.com/siyuan-note/siyuan/issues/15664 2025-08-23 23:05:56 +08:00
Vanessa
b715625d89 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 22:28:04 +08:00
Vanessa
28067deffa 🎨 https://github.com/siyuan-note/siyuan/issues/15595 2025-08-23 22:27:42 +08:00
Daniel
ef5236e0b1
🎨 Improve av 2025-08-23 22:16:05 +08:00
Vanessa
161dd7eb2a Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 22:09:41 +08:00
Vanessa
04fc8cfa97 🎨 https://github.com/siyuan-note/siyuan/issues/15668 2025-08-23 22:09:21 +08:00
Daniel
e98bb0a2d4
🎨 https://github.com/siyuan-note/siyuan/issues/15666 2025-08-23 21:54:27 +08:00
Daniel
1503363a7c
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 21:49:57 +08:00
Daniel
17924377ec
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 21:43:05 +08:00
Vanessa
eb578a3d9d Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 21:03:19 +08:00
Vanessa
3fafe0a1b6 🎨 https://github.com/siyuan-note/siyuan/issues/15667 2025-08-23 21:03:02 +08:00
Daniel
a5ca8efcae
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 20:09:16 +08:00
Daniel
77c1aa49b3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 19:57:40 +08:00
Daniel
e7eb62e660
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15665 2025-08-23 19:53:38 +08:00
Daniel
fb9f0f9a35
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 19:42:39 +08:00
Daniel
91a9b27789
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:48:54 +08:00
Daniel
9eec8510b7
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:44:26 +08:00
Vanessa
6b8bd6e8f2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 18:36:12 +08:00
Vanessa
7d9c120a86 🎨 https://github.com/siyuan-note/siyuan/issues/15603 2025-08-23 18:35:58 +08:00
Daniel
920291d52b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 18:31:54 +08:00
Vanessa
39e2b7adf6 Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 18:18:27 +08:00
Vanessa
e91b8e97f7 🎨 https://github.com/siyuan-note/siyuan/issues/15528 2025-08-23 18:18:14 +08:00
Daniel
d3e86ffcaa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 18:08:07 +08:00
Daniel
ef643e60d7
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 17:58:52 +08:00
Daniel
1b3e1b4efe
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15661 2025-08-23 17:45:26 +08:00
Daniel
0a680d7d81
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 17:34:39 +08:00
Daniel
8c9efebbe3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15659 2025-08-23 17:34:20 +08:00
Daniel
73dce6c5c4
🧑‍💻 /api/block/getBlockKramdown link/image URLs are no longer encoded with spaces https://github.com/siyuan-note/siyuan/issues/15611 2025-08-23 17:17:11 +08:00
Daniel
fefb674fc0
🧑‍💻 /api/block/getBlockKramdown link/image URLs are no longer encoded with spaces https://github.com/siyuan-note/siyuan/issues/15611 2025-08-23 17:16:47 +08:00
Daniel
94f8fc5b71
🎨 Improve av 2025-08-23 16:52:10 +08:00
Vanessa
52fe742a8c Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 12:17:57 +08:00
Vanessa
a475a77a3b 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-23 12:17:43 +08:00
Daniel
005ae241e9
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-23 11:55:56 +08:00
Daniel
8aa8ad65f8
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 11:24:53 +08:00
Daniel
c521a0f985
🎨 Improve parsing <img> tags when importing https://github.com/siyuan-note/siyuan/issues/15638 2025-08-23 11:24:53 +08:00
Jeffrey Chen
cd7734ba91
🎨 Improve protyle slash (#15648)
fix https://github.com/siyuan-note/siyuan/issues/15647
2025-08-23 11:23:34 +08:00
Vanessa
1e5f514225 🎨 https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 11:19:11 +08:00
Vanessa
9d4ed40acd Merge remote-tracking branch 'origin/dev' into dev 2025-08-23 10:25:43 +08:00
Vanessa
ab32bb9027 🎨 属性面板数据库关联设置 2025-08-23 10:25:31 +08:00
Jeffrey Chen
9993c2db4c
📝 Improve text (#15613) 2025-08-23 09:57:54 +08:00
Daniel
aa9e6fdf4c
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-23 09:53:16 +08:00
Daniel
c2075e6387
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:45:15 +08:00
Daniel
9bb6f4d134
🎨 The database rollup field supports using the updated/created field https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:30:59 +08:00
Daniel
ee95f9bf6f
🎨 https://github.com/siyuan-note/siyuan/issues/15662 2025-08-22 21:00:43 +08:00
Daniel
eea13b713d
🎨 https://github.com/siyuan-note/siyuan/issues/15661 2025-08-22 20:35:33 +08:00
Vanessa
4beccf5b93 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 19:32:50 +08:00
Vanessa
ddec6c0820 🎨 https://github.com/siyuan-note/siyuan/issues/15528 2025-08-22 19:32:33 +08:00
Daniel
73300c8408
🎨 https://github.com/siyuan-note/siyuan/issues/15660 2025-08-22 19:25:12 +08:00
Daniel
b14f057a76
🎨 https://github.com/siyuan-note/siyuan/issues/15659 2025-08-22 19:10:52 +08:00
Vanessa
8a6922b56f 🎨 https://github.com/siyuan-note/siyuan/issues/15614 2025-08-22 19:05:17 +08:00
Vanessa
c92240a085 🎨 https://github.com/siyuan-note/siyuan/issues/15658 2025-08-22 18:11:12 +08:00
Vanessa
691ef04f62 🎨 https://github.com/siyuan-note/siyuan/issues/15656 2025-08-22 17:55:17 +08:00
Daniel
53c41561c8
🎨 https://github.com/siyuan-note/siyuan/issues/15656 2025-08-22 17:31:18 +08:00
Vanessa
6007cf00b0 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 17:30:08 +08:00
Vanessa
00d80270a1 🎨 https://github.com/siyuan-note/siyuan/issues/15657 2025-08-22 17:29:52 +08:00
Daniel
ace97cbcf0
🎨 https://github.com/siyuan-note/siyuan/issues/15654 2025-08-22 16:53:33 +08:00
Vanessa
0db4daf183 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 16:37:24 +08:00
Vanessa
e08004c59e 🎨 https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 16:37:11 +08:00
Daniel
61d0e5a3d6
🐛 Incorrect results for database rollup field filtering https://github.com/siyuan-note/siyuan/issues/15608 2025-08-22 16:13:51 +08:00
Daniel
312be8a019
🐛 Incorrect results for database rollup field filtering https://github.com/siyuan-note/siyuan/issues/15608 2025-08-22 16:00:43 +08:00
Vanessa
fa7ec5ab95 🎨 https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 12:16:41 +08:00
Vanessa
365c1dfb19 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 12:00:42 +08:00
Vanessa
1d7a3abf28 🎨 https://github.com/siyuan-note/siyuan/issues/15652 2025-08-22 12:00:28 +08:00
Daniel
2058061bc3
⬆️ Upgrade lute 2025-08-22 12:00:11 +08:00
Vanessa
f4d11c59a2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 11:43:47 +08:00
Vanessa
a857aaa11e 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 11:43:31 +08:00
Daniel
bd7e547ac0
♻️ Upgrade to Electron v37.3.1 https://github.com/siyuan-note/siyuan/issues/15410 2025-08-22 11:29:30 +08:00
Daniel
cd2b131dc9
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15653 2025-08-22 11:17:57 +08:00
Daniel
76266cac87
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-22 11:06:54 +08:00
Daniel
980cf25745
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-22 11:05:12 +08:00
Vanessa
85800b8085 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 10:59:00 +08:00
Vanessa
be7ac73904 🎨 https://github.com/siyuan-note/siyuan/issues/15424 2025-08-22 10:57:53 +08:00
Daniel
1ce39eb85c
⬆️ Upgrade lute 2025-08-22 10:48:35 +08:00
Vanessa
1fa16ccb86 Merge remote-tracking branch 'origin/dev' into dev 2025-08-22 10:46:28 +08:00
Vanessa
bc27681e38 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-22 10:46:14 +08:00
Daniel
5077ed3b56
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:48:15 +08:00
Daniel
4f073c85cd
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:34:41 +08:00
Daniel
c2ac34942b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:28:37 +08:00
Daniel
e3df9ab316
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15649 2025-08-22 00:16:28 +08:00
Daniel
b6b5b20daa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15650 2025-08-22 00:07:54 +08:00
Daniel
83af400f65
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15643 2025-08-22 00:00:38 +08:00
Daniel
f8bccc2d9f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:10 +08:00
Daniel
f74283f2a3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:09 +08:00
Daniel
9d7e0625ae
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 23:31:09 +08:00
Vanessa
0e8d07ac4d Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 23:12:44 +08:00
Vanessa
45c53b7da6 🎨 https://github.com/siyuan-note/siyuan/issues/15629 2025-08-21 23:12:26 +08:00
Daniel
4598e3237b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15593 2025-08-21 22:25:41 +08:00
Daniel
35de72f64d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15575 2025-08-21 22:02:19 +08:00
Daniel
4210dad5b0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15603 2025-08-21 21:56:11 +08:00
Daniel
e451c1f60a
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15603 2025-08-21 21:50:34 +08:00
Daniel
65fd1fafc9
⬆️ Upgrade lute 2025-08-21 21:50:34 +08:00
Vanessa
540fe7cfde 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:29:26 +08:00
Vanessa
19c5a9952e 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:25:16 +08:00
Vanessa
38e7992e1a 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-21 21:12:16 +08:00
Vanessa
2c811c06d3 🎨 https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 20:40:50 +08:00
Vanessa
aee4c64006 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-21 20:33:56 +08:00
Vanessa
e35b203201 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:28:35 +08:00
Vanessa
128b9d1f13 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:27:51 +08:00
Vanessa
3bd7c92710 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 20:25:10 +08:00
Vanessa
7a6cd95656 Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 18:05:50 +08:00
Vanessa
b6df6b2cee 🎨 https://github.com/siyuan-note/siyuan/issues/15642 2025-08-21 18:05:38 +08:00
Daniel
4a0c4506e8
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15645 2025-08-21 18:02:07 +08:00
Daniel
bbc788cfa5
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15644 2025-08-21 17:55:18 +08:00
Daniel
2899e3851d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15644 2025-08-21 15:27:10 +08:00
Daniel
e1fca0674d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15590 2025-08-21 14:44:34 +08:00
Daniel
8c3837deaa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15588 2025-08-21 14:10:40 +08:00
Vanessa
bf3023ec48 Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 14:10:02 +08:00
Vanessa
d1dc88c422 🎨 https://github.com/siyuan-note/siyuan/issues/15594 2025-08-21 14:09:37 +08:00
Daniel
a7ab91d509
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15586 2025-08-21 13:52:08 +08:00
Daniel
d4cc17c1c0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15589 2025-08-21 13:49:31 +08:00
Daniel
089080c818
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15587 2025-08-21 13:42:32 +08:00
Daniel
f97dab787b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15432 https://github.com/siyuan-note/siyuan/issues/15587 2025-08-21 13:42:21 +08:00
Daniel
9ee427d567
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15591 2025-08-21 13:31:22 +08:00
Daniel
30bde33dd2
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15591 2025-08-21 13:31:21 +08:00
Daniel
93580cc27f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15592 2025-08-21 13:31:21 +08:00
Vanessa
e746093a0f Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 13:19:35 +08:00
Vanessa
8b21b8fd03 🎨 https://github.com/siyuan-note/siyuan/issues/15641 2025-08-21 13:19:13 +08:00
Daniel
c7c7bdb950
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-21 12:01:12 +08:00
Daniel
6270d55fa3
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 11:25:15 +08:00
Daniel
ed4cc1faf6
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15600 2025-08-21 11:19:53 +08:00
Daniel
7d91781e8c
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-21 11:10:26 +08:00
Daniel
599cf0cf46
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15565 2025-08-21 10:55:51 +08:00
Vanessa
6803c6483e Merge remote-tracking branch 'origin/dev' into dev 2025-08-21 10:50:56 +08:00
Vanessa
557f4866d5 🎨 https://github.com/siyuan-note/siyuan/issues/15565 2025-08-21 10:50:42 +08:00
Daniel
916c00e714
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-21 09:55:11 +08:00
Daniel
8934856d75
🎨 Parse <img> tags when pasting https://github.com/siyuan-note/siyuan/issues/15464 2025-08-20 19:36:08 +08:00
Daniel
752457b888
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-20 19:34:19 +08:00
Daniel
aabb85d895
🎨 Parse <img> tags when pasting https://github.com/siyuan-note/siyuan/issues/15464 2025-08-20 19:02:55 +08:00
Daniel
6e6522d56a
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-20 18:18:32 +08:00
Daniel
f0f5b6a824
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-08-20 17:44:03 +08:00
Vanessa
1c3ebf7f75 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-20 16:58:10 +08:00
Vanessa
516d9aa52a 🎨 https://github.com/siyuan-note/siyuan/issues/15415 2025-08-20 12:09:37 +08:00
Vanessa
e7c90f4709 🎨 https://github.com/siyuan-note/siyuan/issues/15415 2025-08-20 12:08:47 +08:00
Vanessa
ca59b5f64c 🎨 https://github.com/siyuan-note/siyuan/issues/15574 2025-08-20 10:54:26 +08:00
Vanessa
6e590f2733 🎨 https://github.com/siyuan-note/siyuan/issues/15565 2025-08-19 21:11:50 +08:00
Vanessa
462469c490 🎨 https://github.com/siyuan-note/siyuan/issues/15573 2025-08-19 11:28:00 +08:00
Vanessa
dc90d05086 🎨 https://github.com/siyuan-note/siyuan/issues/15576 2025-08-19 11:20:30 +08:00
Vanessa
6564f0e138 Merge remote-tracking branch 'origin/dev' into dev 2025-08-15 11:28:15 +08:00
Vanessa
4cd439b771 🎨 https://github.com/siyuan-note/siyuan/issues/15578 2025-08-15 11:28:02 +08:00
Daniel
05f48e93d1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15581 2025-08-15 11:22:45 +08:00
Vanessa
4ec53db203 🎨 https://github.com/siyuan-note/siyuan/issues/15580 2025-08-15 11:17:41 +08:00
Vanessa
ae9f936f81 Merge remote-tracking branch 'origin/dev' into dev 2025-08-15 11:09:06 +08:00
Vanessa
5a6b764ed4 🎨 https://github.com/siyuan-note/siyuan/issues/15566 2025-08-15 11:08:53 +08:00
Daniel
6a814abeb9
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15579 2025-08-15 11:03:51 +08:00
Vanessa
eb7066ff3e 🎨 https://github.com/siyuan-note/siyuan/issues/15570 2025-08-14 17:10:08 +08:00
Vanessa
3dcda6b2e2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 16:16:21 +08:00
Vanessa
91b12ef67f 🎨 https://github.com/siyuan-note/siyuan/issues/15561 2025-08-14 16:16:07 +08:00
Daniel
ae54b3edc0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15572 2025-08-14 15:50:18 +08:00
Daniel
69737d6c4b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15561#issuecomment-3184746195 2025-08-14 12:42:56 +08:00
Vanessa
2b3405fcca 🎨 https://github.com/siyuan-note/siyuan/issues/15561 2025-08-14 12:13:21 +08:00
Vanessa
1a6b80b5af 🎨 https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 12:03:48 +08:00
Vanessa
2ddff2a5d3 🎨 https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 11:57:24 +08:00
Vanessa
1c6538bf97 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-14 11:41:56 +08:00
Vanessa
f084f3d34f Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 11:22:01 +08:00
Vanessa
1b9b7e1c83 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-14 11:21:48 +08:00
Daniel
699afec920
🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517 2025-08-14 11:19:47 +08:00
Vanessa
dd3f5cfacf Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 10:08:43 +08:00
Vanessa
f5468fead9 🎨 https://github.com/siyuan-note/siyuan/issues/15557 2025-08-14 10:08:30 +08:00
Daniel
57ac3a6687
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15567 2025-08-14 10:07:39 +08:00
Daniel
30b5473c76
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15567 2025-08-14 10:02:33 +08:00
Daniel
91207ba529
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15571 2025-08-14 09:54:20 +08:00
Daniel
04351d74bc
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-14 00:57:42 +08:00
Vanessa
b78616382b 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-14 00:50:18 +08:00
Vanessa
c9a68c7b1d Merge remote-tracking branch 'origin/dev' into dev 2025-08-14 00:22:43 +08:00
Vanessa
5e74bb89b9 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-14 00:22:27 +08:00
Daniel
176308d7d2
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15521 2025-08-14 00:00:57 +08:00
Daniel
b78e2edfb8
🎨 Improve av 2025-08-13 23:35:16 +08:00
Daniel
cd10072554
🎨 Improve av 2025-08-13 19:15:10 +08:00
Vanessa
1712d4be68 🎨 https://github.com/siyuan-note/siyuan/issues/15558 2025-08-13 19:07:12 +08:00
Vanessa
c2d127d8f7 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 19:02:44 +08:00
Vanessa
8739ae5625 🎨 https://github.com/siyuan-note/siyuan/issues/15562 2025-08-13 19:02:32 +08:00
Daniel
c3a9b0f77b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:20:45 +08:00
Vanessa
085c72add5 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 18:17:30 +08:00
Vanessa
780a7decd8 🎨 https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:17:17 +08:00
Daniel
5efe525e3c
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15561 2025-08-13 18:15:02 +08:00
Vanessa
3e033079bd Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 18:04:04 +08:00
Vanessa
8436c07a1a 🎨 https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 18:03:48 +08:00
Daniel
3d1d0c6def
🐛 https://github.com/siyuan-note/siyuan/issues/15550 2025-08-13 17:32:03 +08:00
Daniel
e0f1f789c3
🐛 https://github.com/siyuan-note/siyuan/issues/13261 2025-08-13 17:23:27 +08:00
Daniel
7595477257
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 17:02:00 +08:00
Daniel
6a9eb455fc
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 17:01:59 +08:00
Vanessa
d1b2309e4a Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 16:54:46 +08:00
Vanessa
5abc9c31b0 🎨 https://github.com/siyuan-note/siyuan/issues/15557 2025-08-13 16:54:32 +08:00
Daniel
469d9e24db
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 16:49:53 +08:00
Daniel
bce519ae99
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560 2025-08-13 16:38:19 +08:00
Vanessa
c64214e754 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 16:32:41 +08:00
Vanessa
8a2aafcad4 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 16:32:23 +08:00
Daniel
e4cb124ffd
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15560#issuecomment-3182691193 2025-08-13 16:29:31 +08:00
Daniel
e51e6d5662
🎨 Improve av 2025-08-13 13:42:45 +08:00
Daniel
6a0c0f8e1e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15559 2025-08-13 13:42:45 +08:00
Vanessa
d7c58357ea Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 12:09:01 +08:00
Vanessa
de670dfa8a 🎨 数据库分组划选 2025-08-13 12:08:46 +08:00
Daniel
6c3138b8bd
🎨 Improve av 2025-08-13 12:04:33 +08:00
Daniel
8d1693bd9b
🎨 Improve av 2025-08-13 11:48:44 +08:00
Daniel
db59bdf562
🎨 Improve av 2025-08-13 11:43:01 +08:00
Vanessa
34f1f6a3d4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 11:33:36 +08:00
Vanessa
17b5e9acdc 🎨 https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 11:33:22 +08:00
Daniel
418959d44a
🎨 Improve av 2025-08-13 11:21:29 +08:00
Daniel
68af39ba48
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15529 2025-08-13 11:18:26 +08:00
Daniel
dc39e18fc1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15555 2025-08-13 11:02:25 +08:00
Vanessa
e6a88e2ad2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-13 10:46:48 +08:00
Vanessa
18377d0e9f 🎨 https://github.com/siyuan-note/siyuan/issues/15554 2025-08-13 10:46:35 +08:00
Daniel
52cd7d0bfa
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 01:02:38 +08:00
Daniel
94d37ae47e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:55:48 +08:00
Daniel
1b9013ed0e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:38:00 +08:00
Daniel
be05b324d1
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15553 2025-08-13 00:33:14 +08:00
Daniel
0f48f94704
🎨 Improve av http://github.com/siyuan-note/siyuan/issues/15544 2025-08-13 00:11:38 +08:00
Vanessa
83e6f5d664 🎨 https://github.com/siyuan-note/siyuan/issues/15533 2025-08-12 23:37:32 +08:00
Vanessa
34b44dc558 Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 23:26:42 +08:00
Vanessa
97f74ea172 🎨 https://github.com/siyuan-note/siyuan/issues/15546 2025-08-12 23:26:19 +08:00
Daniel
7f004877ca
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15550 2025-08-12 22:28:52 +08:00
Daniel
8ba02f517c
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15549 2025-08-12 21:32:27 +08:00
Daniel
ff077158dc
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15549 2025-08-12 21:22:10 +08:00
Vanessa
bcbd895303 Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 18:20:48 +08:00
Vanessa
98a9635dd3 🎨 https://github.com/siyuan-note/siyuan/issues/15455 2025-08-12 18:20:33 +08:00
Jiangshuon
b1c0365e56
🎨 Imporve database image browsing (#15548) 2025-08-12 18:06:05 +08:00
Daniel
5becccc176
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/15543 https://github.com/siyuan-note/siyuan/issues/15540 2025-08-12 17:55:49 +08:00
Daniel
7e11be9d25
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 https://github.com/siyuan-note/siyuan/issues/15535 2025-08-12 11:59:24 +08:00
Daniel
c9530ea1c2
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 https://github.com/siyuan-note/siyuan/issues/15535 2025-08-12 11:50:43 +08:00
Daniel
1136c1c493
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-12 11:37:53 +08:00
Daniel
120b0c1e57
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-12 11:37:53 +08:00
Vanessa
e103b5c2f0 🎨 https://github.com/siyuan-note/siyuan/issues/15453 2025-08-12 11:28:22 +08:00
Vanessa
1edd35029e 🎨 https://github.com/siyuan-note/siyuan/issues/15483 2025-08-12 10:43:32 +08:00
Vanessa
ec15f672c3 🎨 https://github.com/siyuan-note/siyuan/issues/15516 2025-08-12 10:27:37 +08:00
Vanessa
a30f229ade 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-12 01:23:47 +08:00
Vanessa
729fe0674f Merge remote-tracking branch 'origin/dev' into dev 2025-08-12 00:59:54 +08:00
Vanessa
9a9e3aaba3 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-12 00:59:39 +08:00
Daniel
8ddac77915
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15520 2025-08-12 00:37:48 +08:00
Daniel
7b3ac79d78
🎨 Improve av 2025-08-12 00:37:48 +08:00
Vanessa
62dbc08b9a 🚨 2025-08-11 23:46:39 +08:00
Vanessa
52e748ef17 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 23:45:57 +08:00
Vanessa
135dd9889c 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-11 23:45:35 +08:00
Daniel
44831e464c
🎨 Improve av 2025-08-11 23:39:23 +08:00
Vanessa
e290d2a3fc 🎨 https://github.com/siyuan-note/siyuan/issues/15518 2025-08-11 23:17:13 +08:00
Vanessa
fec603487b Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 23:13:04 +08:00
Vanessa
2d774f1cef 🎨 https://github.com/siyuan-note/siyuan/issues/15525 2025-08-11 23:12:45 +08:00
Daniel
c3cd7b96a0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15533 2025-08-11 22:50:53 +08:00
Vanessa
aeef9aef1d 💄 移除菜单 2025-08-11 22:44:08 +08:00
Vanessa
7d5ef46fd4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 22:33:37 +08:00
Vanessa
23c6843803 🎨 https://github.com/siyuan-note/siyuan/issues/15526 2025-08-11 22:33:18 +08:00
Daniel
c7745e3092
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15536 2025-08-11 22:26:39 +08:00
Vanessa
f15aca19d7 🎨 https://github.com/siyuan-note/siyuan/issues/15538 2025-08-11 22:14:47 +08:00
Vanessa
9e46eec911 Merge remote-tracking branch 'origin/dev' into dev 2025-08-11 22:10:14 +08:00
Vanessa
9fb2f55979 🎨 https://github.com/siyuan-note/siyuan/issues/15530 2025-08-11 22:09:59 +08:00
Daniel
bbe2001366
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15540 2025-08-11 21:58:33 +08:00
Daniel
e9afbb6931
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15531 2025-08-11 21:48:19 +08:00
Daniel
93fdc69bec
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15527 2025-08-11 21:25:53 +08:00
Daniel
c3c467e3ee
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15534 2025-08-11 21:18:20 +08:00
Daniel
1479cb6c00
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15532 2025-08-11 20:51:57 +08:00
Daniel
e871f4913f
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15523 2025-08-11 09:44:38 +08:00
Daniel
31667b0964
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 01:18:13 +08:00
Daniel
7b8d163723
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 01:10:00 +08:00
Daniel
c640bfd91b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15524 2025-08-11 00:54:50 +08:00
Daniel
7ac0491a70
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-11 00:37:41 +08:00
Daniel
ffafbae979
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15522 2025-08-11 00:36:22 +08:00
Daniel
d47417a903
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-11 00:21:47 +08:00
Daniel
ac948ad3fb
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-10 23:50:23 +08:00
Daniel
a88d23f461
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 23:21:28 +08:00
Vanessa
93b5ca14c4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 18:22:14 +08:00
Vanessa
ff29ab920b 🎨 https://github.com/siyuan-note/siyuan/issues/15485 2025-08-10 18:22:01 +08:00
Daniel
7bd690ecec
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 18:21:51 +08:00
Vanessa
334e80f8d5 🎨 https://github.com/siyuan-note/siyuan/issues/15509 2025-08-10 18:15:10 +08:00
Vanessa
2f847b73ba Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 17:49:20 +08:00
Vanessa
62fe52fa47 🎨 https://github.com/siyuan-note/siyuan/issues/15506 2025-08-10 17:49:07 +08:00
Daniel
8bcb5de0c3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 17:45:46 +08:00
Vanessa
2d8b6c6edb Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 17:39:51 +08:00
Vanessa
5a1c885e76 🎨 https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 17:39:35 +08:00
Daniel
a664fe7f07
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 17:25:07 +08:00
Daniel
73b80d3c82
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15508 2025-08-10 16:55:36 +08:00
Vanessa
ae3f6b906f Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 16:51:33 +08:00
Vanessa
2b19d903b4 🎨 https://github.com/siyuan-note/siyuan/issues/15489 2025-08-10 16:51:18 +08:00
Daniel
35813e4b2a
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15508 2025-08-10 16:40:49 +08:00
Vanessa
9df352efdb Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 16:22:45 +08:00
Vanessa
3de6b66f0c 🎨 https://github.com/siyuan-note/siyuan/issues/15510 2025-08-10 16:22:32 +08:00
Daniel
1eb824ef8e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 16:22:10 +08:00
Daniel
1247f6735b
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 16:03:41 +08:00
Daniel
548ae028cc
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 16:02:59 +08:00
Daniel
0220f38d94
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 15:54:10 +08:00
Daniel
4154fd0150
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 15:49:22 +08:00
Daniel
a0e98ea35d
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 15:37:37 +08:00
Daniel
0deda92cac
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 15:30:08 +08:00
Daniel
22ba714020
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 12:16:37 +08:00
Daniel
fcd44f41da
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 12:16:37 +08:00
Vanessa
ac37d580f6 Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 12:10:56 +08:00
Vanessa
2cd76dc288 🎨 https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 12:10:39 +08:00
Daniel
7b358cfaa3
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15507 2025-08-10 11:33:59 +08:00
Daniel
de8eb72393
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/14511 2025-08-10 11:21:13 +08:00
Vanessa
aaf1d9896a 🎨 https://github.com/siyuan-note/siyuan/issues/15497 2025-08-10 10:41:30 +08:00
Vanessa
f2afd11a84 Merge remote-tracking branch 'origin/dev' into dev 2025-08-10 10:20:22 +08:00
Vanessa
86e4228a3c 🎨 2025-08-10 10:20:10 +08:00
Daniel
2415c7a81c
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15511 2025-08-10 10:04:14 +08:00
Daniel
f05a8b5d4e
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15512 2025-08-10 09:58:59 +08:00
Daniel
97684b411a
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15489 2025-08-09 22:43:23 +08:00
Vanessa
207eb6b086 🎨 https://github.com/siyuan-note/siyuan/issues/15494 2025-08-09 22:10:21 +08:00
Vanessa
9e72b8d91e 🎨 https://github.com/siyuan-note/siyuan/issues/15503 2025-08-09 22:02:28 +08:00
Vanessa
d75fac21aa 🎨 https://github.com/siyuan-note/siyuan/issues/15500 2025-08-09 21:48:48 +08:00
Daniel
a31e79001e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15500 2025-08-09 21:16:38 +08:00
Vanessa
7e7acf27cf 🎨 https://github.com/siyuan-note/siyuan/issues/15388 分组行重复时块标高亮错位 2025-08-09 21:07:48 +08:00
Vanessa
f0280bc537 Merge remote-tracking branch 'origin/dev' into dev 2025-08-09 21:06:32 +08:00
Vanessa
d7aa181eb9 🎨 https://github.com/siyuan-note/siyuan/issues/15388 分组行重复时块标高亮错位 2025-08-09 21:06:16 +08:00
Daniel
087d2522fe
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15496 2025-08-09 20:46:21 +08:00
Daniel
7b1b36d3ab
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15496 2025-08-09 20:39:12 +08:00
Daniel
51766ed0c0
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15496 2025-08-09 20:25:44 +08:00
Daniel
96346a94ad
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15498 2025-08-09 17:58:48 +08:00
Daniel
c1682895ef
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15498 2025-08-09 17:58:48 +08:00
Vanessa
c6f91f09c6 🐛 https://github.com/siyuan-note/siyuan/issues/15495 2025-08-09 17:46:06 +08:00
Vanessa
8754e8e5fd Merge remote-tracking branch 'origin/dev' into dev 2025-08-09 17:37:08 +08:00
Vanessa
7d478190bb 🐛 https://github.com/siyuan-note/siyuan/issues/15495 2025-08-09 17:36:55 +08:00
Daniel
a9c2ae7351
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15499 2025-08-09 17:10:41 +08:00
Vanessa
8ca9f119d0 Merge remote-tracking branch 'origin/dev' into dev 2025-08-09 16:30:37 +08:00
Vanessa
e6decd35cc 💄 https://github.com/siyuan-note/siyuan/issues/15497 2025-08-09 16:30:22 +08:00
Jeffrey Chen
ca4a8fac64
📝 Improve text (#15502) 2025-08-09 16:28:20 +08:00
Daniel
a783a3d26e
🎨 Improve av https://github.com/siyuan-note/siyuan/issues/15501 2025-08-09 16:16:58 +08:00
Daniel
2f6b5861ec
♻️ Refactor av rendering 2025-08-09 16:16:58 +08:00
Daniel
5bd101e31b
♻️ Refactor av rendering 2025-08-09 16:16:57 +08:00
Vanessa
3f9c7db2d3 Merge remote-tracking branch 'origin/dev' into dev 2025-08-09 16:06:55 +08:00
Vanessa
362e1536ba 💄 2025-08-09 16:06:35 +08:00
Daniel
6c88dcd087
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15492 2025-08-09 13:28:56 +08:00
Daniel
eba15bb41a
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15490 2025-08-09 11:47:18 +08:00
Daniel
580ecd617d
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15491 2025-08-09 11:24:44 +08:00
Vanessa
7b3acc642c 💄 https://github.com/siyuan-note/siyuan/issues/15488 2025-08-09 11:11:23 +08:00
Vanessa
a76c29f5c9 🎨 https://github.com/siyuan-note/siyuan/issues/15487 2025-08-09 10:53:48 +08:00
Vanessa
e9b41d881c Merge remote-tracking branch 'origin/dev' into dev 2025-08-09 10:43:22 +08:00
Vanessa
02196ef3d1 🎨 https://github.com/siyuan-note/siyuan/issues/14201 2025-08-09 10:43:08 +08:00
Daniel
07bc33cac7
⬆️ Upgrade lute 2025-08-09 10:30:53 +08:00
Daniel
7b95da0740
⬆️ Upgrade lute 2025-08-08 19:46:19 +08:00
Daniel
41b8271c5d
🎨 https://github.com/siyuan-note/siyuan/issues/15458 2025-08-08 18:32:52 +08:00
Daniel
ec7ca366ba
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15472 2025-08-08 18:18:44 +08:00
Daniel
a01c44a03d
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15478 2025-08-08 18:09:33 +08:00
Daniel
eb524b2e72
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15471 2025-08-08 16:59:26 +08:00
Daniel
72373ccff9
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15469 https://github.com/siyuan-note/siyuan/issues/15468 2025-08-08 16:51:11 +08:00
Vanessa
36c7a99311 🎨 https://github.com/siyuan-note/siyuan/issues/15476 2025-08-08 16:32:23 +08:00
Vanessa
e179a0a200 Merge remote-tracking branch 'origin/dev' into dev 2025-08-08 16:24:58 +08:00
Vanessa
5ad8b148a5 🎨 https://github.com/siyuan-note/siyuan/issues/15475 2025-08-08 16:24:42 +08:00
Daniel
30802ca97f
🐛 Improve av https://github.com/siyuan-note/siyuan/issues/15476 2025-08-08 16:23:43 +08:00
Vanessa
9f5f5e128b 💄 https://github.com/siyuan-note/siyuan/issues/15475 2025-08-08 16:19:15 +08:00
Vanessa
90296016e3 🎨 https://github.com/siyuan-note/siyuan/issues/15477 2025-08-08 16:01:07 +08:00
Vanessa
8b4e53d65d 🎨 https://github.com/siyuan-note/siyuan/issues/15470 2025-08-08 15:44:24 +08:00
Vanessa
eee43ae107 🎨 https://github.com/siyuan-note/siyuan/issues/15470 2025-08-08 15:41:57 +08:00
Vanessa
694e84bcb4 Merge remote-tracking branch 'origin/dev' into dev 2025-08-08 15:22:21 +08:00
Vanessa
6f132842a7 🎨 https://github.com/siyuan-note/siyuan/issues/15468 2025-08-08 15:22:05 +08:00
Daniel
683ba32918
🎨 Limit the database title to 512 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-08 15:12:35 +08:00
Vanessa
b40f8c898a 🎨 https://github.com/siyuan-note/siyuan/issues/15474 2025-08-08 12:59:00 +08:00
Vanessa
dae0cd0608 🎨 https://github.com/siyuan-note/siyuan/issues/15473 2025-08-08 12:54:51 +08:00
Vanessa
f5a36b9459 🎨 https://github.com/siyuan-note/siyuan/issues/15226 2025-08-08 12:15:26 +08:00
Vanessa
a5166bea39 🎨 https://github.com/siyuan-note/siyuan/issues/15443 2025-08-08 12:00:06 +08:00
Vanessa
851bc1750f Merge remote-tracking branch 'origin/dev' into dev 2025-08-08 11:48:54 +08:00
Vanessa
d3a3b5e7e4 🎨 https://github.com/siyuan-note/siyuan/issues/15459 2025-08-08 11:48:40 +08:00
Daniel
0309225ccc
⬆️ Upgrade lute 2025-08-08 09:56:54 +08:00
Daniel
634a211a7a
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-08 09:42:47 +08:00
Daniel
fc4938829f
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-08 09:40:20 +08:00
Daniel
0239128a29
♻️ Upgrade to Electron v37.2.6 https://github.com/siyuan-note/siyuan/issues/15410 2025-08-08 09:39:53 +08:00
Jeffrey Chen
2c8d9757df
🎨 Improve the style of exported PDF (#15463) 2025-08-07 21:43:12 +08:00
Vanessa
4855b522e3 Merge remote-tracking branch 'origin/dev' into dev 2025-08-07 21:31:35 +08:00
Vanessa
ffad6048fd 🎨 https://github.com/siyuan-note/siyuan/issues/15150 2025-08-07 21:31:18 +08:00
Daniel
f56ef490b1
⬆️ Upgrade lute 2025-08-07 21:29:15 +08:00
Daniel
99fca2f716
🧑‍💻 Add parameter imgTag for kernel API exportMdContent and copyStdMarkdown https://github.com/siyuan-note/siyuan/issues/15454 2025-08-07 21:29:14 +08:00
Vanessa
c2c927ecc2 Merge remote-tracking branch 'origin/dev' into dev 2025-08-07 20:04:10 +08:00
Vanessa
1d8c020aa7 🎨 https://github.com/siyuan-note/siyuan/issues/15226 2025-08-07 20:03:57 +08:00
Daniel
fe6fae1cdb
⬆️ Upgrade lute 2025-08-07 19:41:36 +08:00
Daniel
aecd230a61
🎨 Improve exporting markdown https://github.com/siyuan-note/siyuan/issues/15458 2025-08-07 19:41:23 +08:00
Daniel
2b4067df9a
⬆️ Upgrade lute 2025-08-07 17:49:46 +08:00
Daniel
a0fb8d694f
⬆️ Upgrade lute 2025-08-07 17:43:59 +08:00
Vanessa
0bea81578f 🎨 https://github.com/siyuan-note/siyuan/issues/15399 2025-08-07 12:01:20 +08:00
Vanessa
4d78010ee5 Merge remote-tracking branch 'origin/dev' into dev 2025-08-07 11:43:56 +08:00
Vanessa
ac3f7e272f ⬆️ 2025-08-07 11:43:43 +08:00
Daniel
3fda003401
🎨 Upload asset files to cloud supports focus use https://github.com/siyuan-note/siyuan/issues/15462 2025-08-07 11:09:07 +08:00
Daniel
0d3a2479cb
🎨 Limit the database title to 256 characters https://github.com/siyuan-note/siyuan/issues/15459 2025-08-07 10:35:40 +08:00
dependabot[bot]
3d9b0bfa6f
⬆️ Bump tmp from 0.2.3 to 0.2.4 in /app (#15460)
Bumps [tmp](https://github.com/raszi/node-tmp) from 0.2.3 to 0.2.4.
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: V <lly219@gmail.com>
2025-08-07 10:20:25 +08:00
Daniel
377f78ec66
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-06 17:04:11 +08:00
Daniel
d86f20bcdb
🎨 The database rollup field supports duplicating as a copy https://github.com/siyuan-note/siyuan/issues/15417 2025-08-06 16:58:30 +08:00
Daniel
f4ad69faa9
♻️ Upgrade to Electron v37.2.6 https://github.com/siyuan-note/siyuan/issues/15410 2025-08-06 16:47:34 +08:00
Vanessa
10f31a9274 Merge remote-tracking branch 'origin/dev' into dev 2025-08-06 16:41:49 +08:00
Vanessa
b8c10bb718 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-06 16:41:33 +08:00
Daniel
4a23e40561
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/10964 2025-08-06 12:08:55 +08:00
Daniel
92265f95c9
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:53:06 +08:00
Daniel
00d559f9d9
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:34:29 +08:00
Daniel
f2dda8b389
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:34:01 +08:00
Vanessa
bc16cd658f 🎨 https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:33:24 +08:00
Daniel
d67a041633
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:15:00 +08:00
Daniel
f6694810e2
🎨 The database rollup field supports using the template field https://github.com/siyuan-note/siyuan/issues/12384 2025-08-06 11:08:26 +08:00
Vanessa
511c174e65 🎨 https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 10:22:08 +08:00
Vanessa
0b1cb34fea Merge remote-tracking branch 'origin/dev' into dev 2025-08-06 10:12:29 +08:00
Vanessa
05a78c7cea 🎨 https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 10:12:16 +08:00
Daniel
d01dcad956
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 10:10:52 +08:00
Vanessa
6b79e543a4 🎨 https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 10:09:29 +08:00
Vanessa
3d0068f3fb 🎨 https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 10:04:17 +08:00
Vanessa
d782689572 Merge remote-tracking branch 'origin/dev' into dev 2025-08-06 09:54:11 +08:00
Vanessa
fadd3c2120 🎨 https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 09:53:58 +08:00
Daniel
f4699c9fad
♻️ Refactor av render 2025-08-06 09:52:53 +08:00
Daniel
34647490f2
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 09:51:30 +08:00
Daniel
6c0eed5d09
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15429 2025-08-06 09:18:40 +08:00
Daniel
3c6ce60525
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15430 2025-08-06 09:14:12 +08:00
Vanessa
10f408513d 🚨 2025-08-06 00:04:26 +08:00
Vanessa
69068b0c78 🎨 https://github.com/siyuan-note/siyuan/issues/15443 2025-08-06 00:03:45 +08:00
Daniel
501f657f7c
⬆️ Upgrade lute 2025-08-05 21:07:19 +08:00
Daniel
6ce0cbb0cb
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 21:01:05 +08:00
Vanessa
3b505a20f2 🎨 https://github.com/siyuan-note/siyuan/issues/15427 2025-08-05 20:50:50 +08:00
Vanessa
8b383d09a5 🎨 https://github.com/siyuan-note/siyuan/issues/15432 2025-08-05 19:49:18 +08:00
Vanessa
827eb214bf 🎨 https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 18:16:48 +08:00
Vanessa
e6243664a3 Merge remote-tracking branch 'origin/dev' into dev 2025-08-05 18:10:34 +08:00
Vanessa
b1f4443e5f 🎨 https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 18:10:22 +08:00
Daniel
7ac5b0010d
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 17:42:53 +08:00
Daniel
e2114dffd8
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 17:39:10 +08:00
Daniel
11f7ad6a70
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15443 2025-08-05 17:38:07 +08:00
Daniel
d3ec7aa4bb
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15426 2025-08-05 17:32:37 +08:00
Daniel
8d593833ab
🎨 Improve av 2025-08-05 17:24:16 +08:00
Daniel
037619368a
🎨 Improve av 2025-08-05 17:13:00 +08:00
Daniel
3afaa2551e
🎨 Improve av 2025-08-05 17:09:11 +08:00
Daniel
9098b3f874
🎨 Improve duplicate doc 2025-08-05 16:55:48 +08:00
Daniel
5d4ef9890f
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15425 2025-08-05 16:27:44 +08:00
Daniel
eeb0551230
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15432 2025-08-05 13:02:44 +08:00
Vanessa
0ab9f5c5b0 💄 https://github.com/siyuan-note/siyuan/issues/15434 2025-08-05 12:31:17 +08:00
Vanessa
3f8777be96 🎨 https://github.com/siyuan-note/siyuan/issues/15433 2025-08-05 12:28:10 +08:00
Daniel
0e5e32126b
🎨 Improve av grouping https://github.com/siyuan-note/siyuan/issues/15428 2025-08-05 11:26:25 +08:00
Daniel
5690081332
🎨 Improve data sync to avoid conflicts caused by folding block https://github.com/siyuan-note/siyuan/issues/15329#issuecomment-3152964043 2025-08-05 11:08:34 +08:00
Daniel
34e3dfe479
⬆️ Upgrade kernel deps 2025-08-05 10:53:49 +08:00
Vanessa
1549bd3f9f 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-04 23:32:47 +08:00
Vanessa
83800a7ff1 🎨 https://github.com/siyuan-note/siyuan/issues/15404 2025-08-04 22:37:46 +08:00
Vanessa
ee957ff9e2 🎨 https://github.com/siyuan-note/siyuan/issues/15143 2025-08-04 19:24:11 +08:00
Vanessa
35d60162d1 Merge remote-tracking branch 'origin/dev' into dev 2025-08-04 19:22:53 +08:00
Vanessa
adfbe0b452 🎨https://github.com/siyuan-note/siyuan/issues/11966 2025-08-04 19:22:37 +08:00
Daniel
bf465e5bbf
♻️ Move .sy data parser to https://github.com/siyuan-note/dataparser 2025-08-04 18:11:33 +08:00
Daniel
3caeeaf29d
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-04 11:24:46 +08:00
Daniel
9c99c6f8ef
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-04 11:15:23 +08:00
Daniel
bb989bcb35
🐛 Improve date filter 2025-08-04 11:09:36 +08:00
Daniel
2f01f3224d
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-04 10:47:21 +08:00
Vanessa
dc765676aa 🎨 https://github.com/siyuan-note/siyuan/issues/15361 2025-08-04 09:24:22 +08:00
Vanessa
f17288d1ca Merge remote-tracking branch 'origin/dev' into dev 2025-08-04 09:12:46 +08:00
Vanessa
ae42686ad4 🎨 https://github.com/siyuan-note/siyuan/pull/15382 2025-08-04 09:12:34 +08:00
Daniel
7a80c48977
🎨 https://github.com/siyuan-note/siyuan/issues/15414 2025-08-03 23:55:50 +08:00
Jeffrey Chen
aafae43a9f
Improve the style of the snackbar (#15382)
* 💄 Improve the style of the snackbar

* 💄 Improve the style of the snackbar
2025-08-03 23:19:08 +08:00
Daniel
1c8d1871dc
🎨 https://github.com/siyuan-note/siyuan/issues/15414 2025-08-03 12:14:20 +08:00
Daniel
ed2898a942
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 11:44:06 +08:00
Daniel
8e182e803c
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 11:34:04 +08:00
Vanessa
ca6088ac36 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 11:32:37 +08:00
Vanessa
a717029b84 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 11:10:58 +08:00
Vanessa
d9a3d2b150 Merge remote-tracking branch 'origin/dev' into dev 2025-08-03 11:08:02 +08:00
Vanessa
5fbc57a55a 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 11:07:47 +08:00
Daniel
564117575a
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 10:20:25 +08:00
Daniel
d115103f10
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 10:11:27 +08:00
Daniel
fedc074ade
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 10:06:59 +08:00
Vanessa
25678e401f Merge remote-tracking branch 'origin/dev' into dev 2025-08-03 10:04:48 +08:00
Vanessa
432d8547cc 🎨 https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 10:04:35 +08:00
Daniel
dba61a299c
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-03 10:02:24 +08:00
Daniel
eee6bd074c
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-02 18:22:21 +08:00
Daniel
46f81b93ed
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-02 18:17:54 +08:00
Daniel
f1bf15146a
🎨 Improve Add to Database https://github.com/siyuan-note/siyuan/issues/10659 2025-08-02 18:07:06 +08:00
Daniel
95a5b46800
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-02 17:49:30 +08:00
Daniel
ef80bbd230
♻️ Rename var 2025-08-02 17:12:25 +08:00
Vanessa
621bee1f14 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-08-02 12:21:51 +08:00
Vanessa
3b41b73367 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-08-02 11:54:35 +08:00
Daniel
f1feaf603e
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-08-02 11:36:30 +08:00
Vanessa
11d2741e68 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-08-02 11:34:55 +08:00
Vanessa
65a6145545 Merge remote-tracking branch 'origin/dev' into dev 2025-08-02 11:29:18 +08:00
Vanessa
deb781023a 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-08-02 11:29:02 +08:00
Daniel
b78ef33135
⬆️ Upgrade kernel deps 2025-08-02 11:26:43 +08:00
Daniel
8695d86cf1
🎨 Improve database field default filling https://github.com/siyuan-note/siyuan/issues/11966 2025-08-02 11:26:42 +08:00
Vanessa
141c139782 Merge remote-tracking branch 'origin/dev' into dev 2025-08-02 10:20:18 +08:00
Vanessa
75ff695dc9 🎨 https://github.com/siyuan-note/siyuan/issues/15388 2025-08-02 10:20:06 +08:00
Jeffrey Chen
2b9a2df233
📝 Improve the user guide Template snippet chapter code display (#15402)
https://github.com/siyuan-note/siyuan/pull/15345
2025-08-02 09:43:08 +08:00
Jeffrey Chen
9a89a0eb4c
🎨 Document supports copying as Markdown (#15397)
*  Document supports copying standard Markdown

*  Document supports copying as Markdown
2025-08-02 09:38:43 +08:00
Daniel
77ead023f8
recycle: Refactor getBlockDOM 2025-08-02 09:32:55 +08:00
Vanessa
30dbbf1231 🎨 https://github.com/siyuan-note/siyuan/issues/15396 2025-08-01 23:14:34 +08:00
Daniel
561d4cc891
🐛 The insertion position is wrong after converting the list to paragraph block in the floating window https://github.com/siyuan-note/siyuan/issues/15396 2025-08-01 22:52:49 +08:00
Daniel
be684aee76
🐛 The insertion position is wrong after converting the list to paragraph block in the floating window https://github.com/siyuan-note/siyuan/issues/15396 2025-08-01 22:52:49 +08:00
Vanessa
27f412658b Merge remote-tracking branch 'origin/dev' into dev 2025-08-01 22:49:19 +08:00
Vanessa
381a7b88ff 🎨 https://github.com/siyuan-note/siyuan/issues/15398 2025-08-01 22:49:04 +08:00
Daniel
d0f2fd173d
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-08-01 22:25:51 +08:00
Daniel
a90df6841c
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-08-01 22:07:35 +08:00
Vanessa
61bc821754 🎨 https://github.com/siyuan-note/siyuan/issues/15340 2025-08-01 21:56:20 +08:00
Vanessa
b126d34dde 🎨 https://github.com/siyuan-note/siyuan/issues/15330 经查看 lute 现在没有限制,因此前端也移除对其的限制 2025-08-01 21:36:29 +08:00
Vanessa
03b83d1247 Merge remote-tracking branch 'origin/dev' into dev 2025-08-01 21:05:14 +08:00
Vanessa
167cce0a05 🎨 https://github.com/siyuan-note/siyuan/issues/15407 2025-08-01 21:04:55 +08:00
Daniel
309a9995d8
♻️ Upgrade to Electron v37.2.5 https://github.com/siyuan-note/siyuan/issues/15410 2025-08-01 20:51:04 +08:00
Vanessa
a088cf8706 🎨 https://github.com/siyuan-note/siyuan/issues/15404 2025-08-01 20:14:12 +08:00
Jeffrey Chen
857a795189
Improve the line-height of the title blocks in the list (#15375)
* 💄 Improve the line-height of the title blocks in the list

fix https://github.com/siyuan-note/siyuan/issues/15003

* 💄 Improve the line-height of the title blocks in the list

fix https://github.com/siyuan-note/siyuan/issues/15003
2025-08-01 17:53:32 +08:00
Daniel
022a4e7d23
⬆️ Upgrade lute 2025-08-01 16:44:28 +08:00
Daniel
08b952f272
🐛 Find-replace incorrectly converts tags to text https://github.com/siyuan-note/siyuan/issues/15372 2025-08-01 16:12:31 +08:00
Daniel
55bc708582
🎨 Improve the status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-08-01 16:01:32 +08:00
Daniel
16d3b65b2a
🎨 Improve search for emojis in tags https://github.com/siyuan-note/siyuan/issues/15391 2025-08-01 10:56:08 +08:00
Daniel
211648b95e
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-08-01 10:25:56 +08:00
Vanessa
3d7191b13d 🎨 https://github.com/siyuan-note/siyuan/issues/15294 2025-07-31 19:26:56 +08:00
Vanessa
0203a482b3 Merge remote-tracking branch 'origin/dev' into dev 2025-07-30 17:39:19 +08:00
Vanessa
1b384980dc 🎨 https://github.com/siyuan-note/siyuan/pull/15386 2025-07-30 17:39:06 +08:00
Emptylight
ab92cbc184
refactor: Update highlight.js plugins (#15386) 2025-07-30 17:38:26 +08:00
Vanessa
459a35d0b3 Merge remote-tracking branch 'origin/dev' into dev 2025-07-30 17:36:15 +08:00
Vanessa
e4959774e8 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-30 17:35:53 +08:00
Daniel
de55ea9315
🎨 Improve fold heading editing https://github.com/siyuan-note/siyuan/issues/14349 Point 01 2025-07-30 17:22:55 +08:00
Jeffrey Chen
9e7426a6f4
💄 Improve the animation for opening dialog (#15383)
fix https://github.com/siyuan-note/siyuan/issues/15085
2025-07-30 17:22:40 +08:00
Daniel
2a07997ba2
🎨 Improve the status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-07-30 15:46:09 +08:00
Vanessa
c222e0d6f7 Merge remote-tracking branch 'origin/dev' into dev 2025-07-30 12:08:30 +08:00
Vanessa
a105227e65 🎨 https://github.com/siyuan-note/siyuan/issues/15389 2025-07-30 12:08:15 +08:00
Daniel
7569fec509
🎨 Improve status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-07-30 11:31:54 +08:00
Daniel
1fd3f92137
🎨 Improve status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-07-30 11:24:57 +08:00
Daniel
9da208ec52
🎨 Improve status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-07-30 11:23:26 +08:00
Daniel
2f57e57b92
🎨 Improve status bar index creation information prompt https://github.com/siyuan-note/siyuan/issues/15390 2025-07-30 11:10:26 +08:00
Daniel
b358d4b70f
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-30 10:54:33 +08:00
Daniel
f0ff16c60a
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-30 10:51:02 +08:00
Daniel
692665f100
🎨 Card view supports displaying field names https://github.com/siyuan-note/siyuan/issues/15180 2025-07-30 10:40:22 +08:00
Vanessa
78c3479fc3 🎨 https://github.com/siyuan-note/siyuan/issues/15341 2025-07-30 10:40:02 +08:00
Vanessa
789aed4aee 🎨 https://github.com/siyuan-note/siyuan/pull/15345 2025-07-30 10:05:25 +08:00
Vanessa
842dbb6863 🎨 https://github.com/siyuan-note/siyuan/pull/15110 2025-07-29 23:55:29 +08:00
Vanessa
48933e62f3 🎨 https://github.com/siyuan-note/siyuan/pull/15345 2025-07-29 21:41:49 +08:00
Achuan-2
009a68aa7e
Support code block highlighting template syntax and export code block templates as paragraphs (#15345)
*  feat: 优化模板编辑体验,支持使用代码块来存储模板语法

*  feat: 支持对template代码块进行高亮

- 渲染.action 块和{{}}块规则
- 渲染Markdown块
- 思源块属性设置语法

* Update third-languages.js

* Update third-languages.js

* Update third-languages.js

* Update third-languages.js

* Update third-languages.js:块属性支持高亮.action{}语法,调整relevance

* 支持渲染queryBlocks的sql语句和嵌入块sql语句

* Update third-languages.js

补充变量高亮:getHPathByID|getBlock|statBlock|runeCount|wordCount|toPrettyJson|

*  feat: 优化模板编辑体验,支持使用代码块来存储模板语法 #15345

导出时,增加识别`siyuan-template`代码块为模板

*  feat: 优化模板编辑体验,支持使用代码块来存储模板语法 #15345

代码块语言新增`siyuan-template`

* Update template.go

---------

Co-authored-by: D <845765@qq.com>
2025-07-29 21:36:34 +08:00
Jeffrey Chen
2994969286
Improve export preview mode CSS variable value filling (#15110)
* 改进 CSS 变量替换为实际值

* Chrome、Edge、SiYuan 桌面端不需要替换 CSS 变量

* 外观模式或主题改变之后,重新加载所有将 CSS 变量替换为实际值的导出预览

* 代码块之间没有间距

* 去掉一个空格

* 使用 ua.Mobile() 判断移动设备

* 重构
2025-07-29 21:33:40 +08:00
Daniel
449b537104
🐛 Find-replace incorrectly converts tags to text https://github.com/siyuan-note/siyuan/issues/15372 2025-07-29 20:47:12 +08:00
Vanessa
4554182d87 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 20:45:06 +08:00
Vanessa
227802b83c 🎨 https://github.com/siyuan-note/siyuan/issues/15336 2025-07-29 20:44:52 +08:00
Daniel
95dfaea666
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 15:52:30 +08:00
Daniel
f44f9dd5c0
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 15:52:04 +08:00
Daniel
feef48d624
🎨 https://github.com/siyuan-note/siyuan/issues/15377 2025-07-29 15:48:59 +08:00
Vanessa
bf9721bf40 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 15:43:13 +08:00
Vanessa
ba3bf8705e 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 15:42:57 +08:00
Daniel
8dd1585adb
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 15:38:21 +08:00
Daniel
c64d68c71d
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 14:15:50 +08:00
Daniel
548857dc4b
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 14:11:03 +08:00
Daniel
287edba74c
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 14:07:36 +08:00
Daniel
b138ff9d7f
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 14:02:54 +08:00
Daniel
1b07033cd3
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:54:15 +08:00
Daniel
e575324483
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:51:01 +08:00
Daniel
a6f5705681
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:44:17 +08:00
Daniel
1af2dba150
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:19:44 +08:00
Daniel
99a5d4c214
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:19:10 +08:00
Daniel
008cce474a
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 13:16:29 +08:00
Vanessa
445a738e74 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 12:03:53 +08:00
Vanessa
89f32a43f7 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 12:03:40 +08:00
Daniel
77fd025a04
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 12:01:39 +08:00
Daniel
18c6e7bcdc
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 12:01:39 +08:00
Vanessa
2ce3f00724 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 12:00:54 +08:00
Vanessa
1a918dd946 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 12:00:41 +08:00
Daniel
df73431112
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 11:05:12 +08:00
Vanessa
10364e281f Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 11:01:31 +08:00
Vanessa
f91e87b953 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 11:01:18 +08:00
Daniel
62288da3d9
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 10:43:47 +08:00
Vanessa
fa2ec80cb1 Merge remote-tracking branch 'origin/dev' into dev 2025-07-29 10:31:56 +08:00
Vanessa
8dac657846 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-29 10:31:41 +08:00
Daniel
f7cb4db291
🎨 Export preview mode supports focus use https://github.com/siyuan-note/siyuan/issues/15340 2025-07-29 09:51:48 +08:00
Daniel
1812e84219
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:58:34 +08:00
Daniel
05e495406d
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:53:17 +08:00
Vanessa
446c81cf80 Merge remote-tracking branch 'origin/dev' into dev 2025-07-28 23:52:42 +08:00
Vanessa
36b2299206 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:52:28 +08:00
Daniel
7906e8f516
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:48:24 +08:00
Daniel
396450a2ec
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:39:00 +08:00
Daniel
155b2de260
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:28:57 +08:00
Daniel
99cf987465
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 23:10:11 +08:00
Daniel
f7d28dc1de
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 22:53:04 +08:00
Daniel
0816925e76
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 22:44:56 +08:00
Daniel
49d233d92a
🎨 Export preview mode supports focus use https://github.com/siyuan-note/siyuan/issues/15340 2025-07-28 22:06:09 +08:00
Vanessa
81644059ac 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 12:42:32 +08:00
Daniel
e758739116
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 11:24:42 +08:00
Daniel
4694a8c6c1
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 11:17:27 +08:00
Daniel
400153319e
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 10:54:51 +08:00
Daniel
75b2ccfe82
⬆️ Upgrade lute 2025-07-28 10:31:04 +08:00
Vanessa
4ccdd38de0 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 10:22:40 +08:00
Vanessa
425882cda0 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 10:02:06 +08:00
Vanessa
99ad5a0f77 Merge remote-tracking branch 'origin/dev' into dev 2025-07-28 09:28:55 +08:00
Vanessa
a9a453e144 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-28 09:28:42 +08:00
Daniel
0f2e044c7e
🎨 Clean code 2025-07-27 20:26:42 +08:00
Daniel
9a72ef1472
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 20:26:32 +08:00
Daniel
08af24ae9e
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 20:14:18 +08:00
Daniel
f970f5c848
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 20:10:56 +08:00
Daniel
15a17393b3
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:50:14 +08:00
Daniel
cf0467a7ac
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:36:46 +08:00
Daniel
e91a8b0619
🎨 Clean code 2025-07-27 19:34:42 +08:00
Daniel
d0662b5fde
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:34:17 +08:00
Daniel
ff539bab03
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:30:08 +08:00
Vanessa
21acf690e7 Merge remote-tracking branch 'origin/dev' into dev 2025-07-27 19:10:57 +08:00
Vanessa
6d7637850a 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:10:43 +08:00
Daniel
fd89e77f37
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:07:52 +08:00
Daniel
9e819955ef
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 19:05:29 +08:00
Daniel
cd7c6fdb17
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 18:45:52 +08:00
Daniel
48c64f98f4
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 17:08:34 +08:00
Daniel
cff71aa720
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 17:08:22 +08:00
Vanessa
759c12be06 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 14:02:21 +08:00
Vanessa
fc67bcc9e8 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 11:46:06 +08:00
Vanessa
ccbcb4b809 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 11:38:58 +08:00
Vanessa
7308536ded 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 11:23:58 +08:00
Vanessa
de8da071d0 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-27 09:56:31 +08:00
Vanessa
a9f5cac024 Merge remote-tracking branch 'origin/dev' into dev 2025-07-26 22:50:44 +08:00
Vanessa
33d25372f7 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 22:50:24 +08:00
Daniel
cf6c905930
🎨 Export preview mode supports focus use https://github.com/siyuan-note/siyuan/issues/15340 2025-07-26 21:59:05 +08:00
Daniel
3cb666d397
🎨 Clean code 2025-07-26 21:39:02 +08:00
Daniel
d555eec852
Improve pasting performance for large amounts of content https://github.com/siyuan-note/siyuan/issues/15306 2025-07-26 21:35:17 +08:00
Daniel
7c692e8273
Improve pasting performance for large amounts of content https://github.com/siyuan-note/siyuan/issues/15306 2025-07-26 21:24:28 +08:00
Daniel
9d392bd663
🎨 Improve asset search highlighting https://github.com/siyuan-note/siyuan/issues/15370 2025-07-26 16:50:46 +08:00
Daniel
7476372054
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 16:42:50 +08:00
Daniel
3e0d825437
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 16:11:52 +08:00
Vanessa
19485ca720 Merge remote-tracking branch 'origin/dev' into dev 2025-07-26 16:02:43 +08:00
Vanessa
829fc886d4 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 16:02:10 +08:00
Daniel
7136967a73
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 11:54:19 +08:00
Vanessa
ed302633f6 Merge remote-tracking branch 'origin/dev' into dev 2025-07-26 11:31:09 +08:00
Vanessa
9ea5b148c7 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 11:30:57 +08:00
Daniel
e1471ff585
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 10:45:40 +08:00
Daniel
a76a520996
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 10:11:15 +08:00
Daniel
04587ca695
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-26 09:40:39 +08:00
Vanessa
ddb20a368d Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 23:18:53 +08:00
Vanessa
e492c973ac 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 23:18:38 +08:00
Daniel
f1f363d77b
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:36:02 +08:00
Daniel
3c0933beac
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:31:46 +08:00
Daniel
59d8db4f24
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:25:33 +08:00
Daniel
9cf009d9d9
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:09:03 +08:00
Daniel
2eadefed6f
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:07:38 +08:00
Vanessa
cbbca634f5 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:07:11 +08:00
Vanessa
49dd247b8a 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:04:47 +08:00
Vanessa
01a2e07dcc Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 22:02:00 +08:00
Vanessa
45aee043c8 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 22:01:41 +08:00
Daniel
da5f4bb42c
🎨 Re OCR popup prompt when Tesseract is not enabled https://github.com/siyuan-note/siyuan/issues/15367 2025-07-25 21:25:38 +08:00
Daniel
382cd6a8af
⬆️ Upgrade lute 2025-07-25 19:56:26 +08:00
Daniel
70d4af6e7c
⬆️ Upgrade lute 2025-07-25 19:47:10 +08:00
Vanessa
5f91cffc4d Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 19:43:26 +08:00
Vanessa
582cce1b92 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 19:43:06 +08:00
Daniel
70741fffcc
🎨 Re OCR popup prompt when Tesseract is not enabled https://github.com/siyuan-note/siyuan/issues/15367 2025-07-25 19:34:35 +08:00
Daniel
7787ac6e1d
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 19:17:58 +08:00
Daniel
b15489a4cf
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 19:06:38 +08:00
Daniel
0e8ce9ddf9
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 17:57:51 +08:00
Daniel
e7a8a9906e
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 17:01:38 +08:00
Daniel
06139eb3cc
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 16:47:17 +08:00
Daniel
33a1bedb41
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 16:34:30 +08:00
Daniel
49cc87381c
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 15:20:56 +08:00
Daniel
526bd76c4c
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 14:56:13 +08:00
Vanessa
0c0d02c6a6 Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 14:55:42 +08:00
Vanessa
8cb40edce3 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 14:55:27 +08:00
Daniel
acc2ba1cea
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 14:55:16 +08:00
Daniel
9ae527c9a5
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 14:48:48 +08:00
Daniel
917a5125af
🐛 The tray is generated repeatedly after the new window is locked and then entered https://github.com/siyuan-note/siyuan/issues/15357 2025-07-25 14:37:22 +08:00
Daniel
262957d4de
🎨 Improve auth 2025-07-25 14:37:21 +08:00
Vanessa
f3427dcf5f 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 13:21:47 +08:00
Vanessa
accf89a5ca Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 13:03:28 +08:00
Vanessa
c726af0494 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 13:03:08 +08:00
Daniel
94c70ae638
🎨 Improve auth 2025-07-25 12:27:45 +08:00
Daniel
ddba6b1fd8
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 12:10:39 +08:00
Daniel
cbddce4d25
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 12:05:33 +08:00
Daniel
0d5320f08b
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 11:56:57 +08:00
Vanessa
9d4c47ee87 Merge remote-tracking branch 'origin/dev' into dev 2025-07-25 11:53:10 +08:00
Vanessa
c5bfa68058 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-25 11:52:57 +08:00
Daniel
0abbe9ec21
🎨 Improve auth 2025-07-25 11:21:23 +08:00
Vanessa
61d08370dc 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 21:10:52 +08:00
Vanessa
2c5ea4bb45 Merge remote-tracking branch 'origin/dev' into dev 2025-07-24 18:33:19 +08:00
Vanessa
0d3978f407 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 18:33:07 +08:00
Daniel
546742b43c
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 17:56:24 +08:00
Daniel
9480403d2f
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 12:10:07 +08:00
Vanessa
bfc0daf6e5 Merge remote-tracking branch 'origin/dev' into dev 2025-07-24 12:04:10 +08:00
Vanessa
c339d1b9bc 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 12:03:57 +08:00
Daniel
10fa284a1b
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 11:50:28 +08:00
Daniel
10a760b97a
🐛 Dragging a file from the assets folder into the editor causes the kernel to exit https://github.com/siyuan-note/siyuan/issues/15355 2025-07-24 11:19:49 +08:00
Daniel
684286fc8a
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-24 11:05:29 +08:00
Daniel
54f2d8599e
🎨 Export preview mode supports focus use https://github.com/siyuan-note/siyuan/issues/15340 2025-07-24 10:58:48 +08:00
Vanessa
fc2e1030a5 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-23 23:26:32 +08:00
Vanessa
abcd7b3157 🎨 https://github.com/siyuan-note/siyuan/issues/10964 2025-07-23 21:46:57 +08:00
Vanessa
81b511042c Merge remote-tracking branch 'origin/dev' into dev 2025-07-23 21:42:55 +08:00
Vanessa
a89a2000f3 🎨 https://github.com/siyuan-note/siyuan/issues/15338 2025-07-23 21:42:37 +08:00
Daniel
534ad7a8cf
🎨 Database grouping by field https://github.com/siyuan-note/siyuan/issues/10964 2025-07-23 21:42:15 +08:00
Jeffrey Chen
be3db79688
🎨 Add data-id attribute to the buttons (#15052)
斜杠菜单中插件添加的选项、顶栏的插件菜单、顶栏的外观模式菜单,修正块引用锚文本的右键菜单

fix https://github.com/siyuan-note/siyuan/issues/12518
2025-07-23 17:53:25 +08:00
Daniel
963cbfe15f
🎨 Export preview mode supports focus use https://github.com/siyuan-note/siyuan/issues/15340 2025-07-23 17:23:17 +08:00
Vanessa
508eb93183 ♻️ https://github.com/siyuan-note/siyuan/pull/15347 2025-07-23 13:08:38 +08:00
Jeffrey Chen
c88f99646c
Replace the deprecated isSameNode method in DOM Level 4 with the === operator (#15347) 2025-07-23 12:21:59 +08:00
dependabot[bot]
a730a575d5
⬆️ Bump form-data from 4.0.2 to 4.0.4 in /app (#15349)
Bumps [form-data](https://github.com/form-data/form-data) from 4.0.2 to 4.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/master/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v4.0.2...v4.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 4.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-23 12:18:23 +08:00
Vanessa
76e1a4b169 🐛 https://github.com/siyuan-note/siyuan/pull/15324 切换是否显示行号异常 2025-07-23 12:11:33 +08:00
Jeffrey Chen
69987028ae
Improve code block line number rendering performance (#15324)
*  Improve code block line number rendering performance

fix https://github.com/siyuan-note/siyuan/issues/12715

*  Improve code block line number rendering performance

*  Improve code block line number rendering performance

* Revert " Improve code block line number rendering performance"

This reverts commit 603518f521.

* Revert " Improve code block line number rendering performance"

This reverts commit b69cef5f83.

*  Improve code block line number rendering performance
2025-07-23 11:48:09 +08:00
Daniel
76e4aad584
🎨 Improve backmention search https://github.com/siyuan-note/siyuan/issues/4699 2025-07-23 11:33:20 +08:00
198 changed files with 12135 additions and 8229 deletions

View file

@ -7,17 +7,17 @@
## NPM dependencies
Install pnpm: `npm install -g pnpm@10.13.1`
Install pnpm: `npm install -g pnpm@10.15.0`
<details>
<summary>For China mainland</summary>
Set the Electron mirror environment variable and install Electron:
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.2.3 -D`
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.3.1 -D`
* Windows:
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.2.3 -D`
* `pnpm install electron@37.3.1 -D`
NPM mirror:
@ -27,7 +27,7 @@ NPM mirror:
Enter the app folder and execute:
* `pnpm install electron@37.2.3 -D`
* `pnpm install electron@37.3.1 -D`
* `pnpm run dev`
* `pnpm run start`

View file

@ -7,17 +7,17 @@
## NPM 依赖
安装 pnpm`npm install -g pnpm@10.13.1`
安装 pnpm`npm install -g pnpm@10.15.0`
<details>
<summary>适用于中国大陆</summary>
设置 Electron 镜像环境变量并安装 Electron
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.2.3 -D`
* macOS/Linux`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.3.1 -D`
* Windows
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
* `pnpm install electron@37.2.3 -D`
* `pnpm install electron@37.3.1 -D`
NPM 镜像:
@ -27,7 +27,7 @@ NPM 镜像:
进入 app 文件夹执行:
* `pnpm install electron@37.2.3 -D`
* `pnpm install electron@37.3.1 -D`
* `pnpm run dev`
* `pnpm run start`

2
API.md
View file

@ -480,7 +480,7 @@ Move documents by `id`:
```
* `fromIDs`: Source docs' IDs
* `toID`: Target parent ID
* `toID`: Target parent doc's ID or notebook ID
* Return value
```json

View file

@ -478,7 +478,7 @@
```
* `fromIDs`:源文档 ID
* `toID`:目标父文档 ID
* `toID`:目标父文档 ID 或笔记本 ID
* 返回值
```json

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "تحسين الفهرس",
"vacuumDataIndexTip": "تحقق من فهرس البيانات، وحرر مساحة التخزين وحسّن أداء الفهرس",
"rebuildDataIndex": "إعادة بناء الفهرس",
"rebuildDataIndexTip": "إعادة بناء كاملة لفهرس البيانات، قد يستغرق ذلك بعض الوقت، يرجى الانتظار",
"displayFieldName": "عرض اسم الحقل",
"sortBySelectOption": "Nach Option sortieren",
"groupStep": "فاصل التجميع",
"groupRange": "نطاق التجميع",
"groupMethodDateRelative": "تاريخ نسبي",
"groupMethodDateDay": "يوم",
"groupMethodDateWeek": "أسبوع",
"groupMethodDateMonth": "شهر",
"groupMethodDateYear": "سنة",
"syncColWidth": "مزامنة عرض العمود",
"groupMethod": "طريقة التجميع",
"hideEmptyGroup": "إخفاء المجموعة الفارغة",
"hideEmptyGroup": "إخفاء المجموعات الفارغة",
"groups": "المجموعات",
"removeGroup": "إزالة المجموعة",
"contentBlock": "كتلة المحتوى",
@ -20,7 +33,7 @@
"small": "صغير",
"fitImage": "تعديل حجم الصورة تلقائيًا",
"showIcon": "عرض الأيقونة",
"showAllFieldsIcon": "عرض أيقونات الحقول",
"showAllEntriesIcons": "عرض أيقونات المدخلات",
"wrapAllFields": "التفاف الحقول تلقائيًا",
"gallery": "بطاقة",
"newTag": "علامة جديدة",
@ -129,7 +142,7 @@
"lastReviewTime": "وقت المراجعة الأخيرة",
"cardStatus": "وضع البطاقة",
"noSupportTip": "لا تدعم هذه الوظيفة استخدام طواقم البطاقات",
"insertRowTip": "تم تصفية المدخلات المضافة حديثا ويمكن مشاهدتها عن طريق إلغاء التصفية/البحث/الفرز",
"insertRowTip": "تم تصفية العنصر الجديد، قم بإلغاء التصفية أو تعديل إعدادات التجميع لعرضه",
"insertPhoto": "التقاط صورة وإدراجها",
"relativeToToday": "بالنسبة إلى اليوم",
"current": "هذا/هذه",
@ -422,7 +435,7 @@
"apiKey": "‫مفتاح API",
"apiKeyTip": "‫من المستحسن تعيين مفتاح API لـSiYuan بشكل منفصل للإدارة اللاحقة. إذا ترك هذا البند فارغاً، سيتم تعطيل الوظائف المتصلة بـAI",
"apiTimeout": "المهلة الزمنية",
"apiTimeoutTip": "المهلة الزمنية لتقديم طلب، الوحدة: ثانية",
"apiTimeoutTip": "مهلة الطلب",
"apiProxy": "وكيل الشبكة",
"apiProxyTip": "‫وكيل الشبكة الذي يبدأ الطلب، مثل <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "الطراز",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "بعد التمكين، تم عرض شريط التنقل في الكتل المضمنة؛ تم مجاهلة هذا الخيار عند شريط التنقل للكتل المضمنة في الكتل الخارقة ولا يظهر أبداً",
"appearanceMode": "وضع المظهر",
"editReadonly": "وضع القراءة فقط",
"editReadonlyTip": "بعد التمكين، سيقوم المحرر بتحميل المستند في وضع القراءة فقط",
"editReadonlyTip": "عند التمكين، سيكون المستند للقراءة فقط افتراضيًا",
"generateConflictDoc": "توليد مستندات التعارض عند ظهور تضاربات المزامنة",
"generateConflictDocTip": "بعد التمكين، سيتم إنشاء مستندات التعارض عند حدوث تضاربات المزامنة، بحيث يمكن فتحها وعرضها مباشرة. سيتم تسجيل مستندات التعارض في [تاريخ البيانات] سواء تمكين هذا الخيار أو عدم تمكينه",
"deleteOpConfirm": "⚠️ تأكيد عملية حذف",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "سيؤدي مسح مستودع البيانات إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة، هل أنت متأكد من المسح؟",
"purge": "مسح",
"plsChoose": "الرجاء الاختيار أولاً",
"clearMessage": "مقروء",
"freeSub": "الاشتراك التجريبي المجاني",
"sortByUpdateTimeDesc": "تنازلياً بوقت التحديث",
"sortByUpdateTimeAsc": "تصاعدياً بوقت التحديث",
@ -1122,6 +1134,8 @@
"fileTree19": "ولبعض نظم التشغيل قيود تقنية قد تحول دون النسخ اليدوي لبيانات مساحة العمل بعد وضع مستندات فرعية تزيد عن 7 مستويات",
"fileTree20": "حفظ بسطر واحد",
"fileTree21": "‫بعد التمكين، سيتم استخدام تنسيق JSON ذي السطر الواحد عند حفظ مستندات .sy وقاعدة بيانات .json، مما يقلل حجم الملف بحوالي 30٪ وتحسين كفاءة القراءة والكتابة بنسبة 50٪",
"fileTree22": "تنبيه ملف كبير",
"fileTree23": "إشعار عند تجاوز ملفات .sy أو قاعدة بيانات .json لهذا الحجم",
"export10": "‫على سبيل المثال <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>‬، إذا كان فارغاً، سيتم استخدام العلامة المائية من النص المخصص أو مسار ملف العلامة المائية.",
"export11": "طريقة معالجة محتوى المراجع عند التصدير",
"export12": "طريقة معالجة محتوى كتلة التضمين عند التصدير",
@ -1173,6 +1187,7 @@
"newFileTip": "الرجاء فتح دفتر الملاحظات أولاً",
"copyBlockRef": "نسخ كمرجع كتلة",
"copyBlockEmbed": "نسخ ككتلة تضمين",
"copyMarkdown": "نسخ كـ Markdown",
"linkLevel": "العمق",
"mark": "تمييز",
"splitLR": "تقسيم لليمين",
@ -1634,6 +1649,13 @@
"261": "اليوم",
"262": "غدًا",
"263": "التالي %d أيام",
"264": "الحقل [%s] فارغ"
"264": "الحقل [%s] فارغ",
"265": "خارج النطاق",
"266": "Tesseract OCR غير مثبت أو غير مهيأ، يرجى الرجوع إلى دليل المستخدم - قسم ملفات الموارد لإجراء الإعداد",
"267": "قاعدة بيانات غير مسماة",
"268": "يرجى ملاحظة أن الملف [%s] قد تجاوز بالفعل [%d MB]‎، وقد يؤدي ذلك إلى انخفاض الأداء",
"269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات [%s]",
"270": "يتم تحسين فهرس البيانات، يرجى الانتظار...",
"271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Index optimieren",
"vacuumDataIndexTip": "Datenindex prüfen, Speicherplatz freigeben und Indexleistung verbessern",
"rebuildDataIndex": "Index neu erstellen",
"rebuildDataIndexTip": "Kompletter Neuaufbau des Datenindex, dies kann einige Zeit dauern. Bitte warten",
"displayFieldName": "Feldnamen anzeigen",
"sortBySelectOption": "Nach Option sortieren",
"groupStep": "Gruppierungsintervall",
"groupRange": "Gruppierungsbereich",
"groupMethodDateRelative": "Relatives Datum",
"groupMethodDateDay": "Tag",
"groupMethodDateWeek": "Woche",
"groupMethodDateMonth": "Monat",
"groupMethodDateYear": "Jahr",
"syncColWidth": "Spaltenbreite synchronisieren",
"groupMethod": "Gruppierungsmethode",
"hideEmptyGroup": "Leere Gruppe ausblenden",
"hideEmptyGroup": "Leere Gruppen ausblenden",
"groups": "Gruppen",
"removeGroup": "Gruppe entfernen",
"contentBlock": "Inhaltsblock",
@ -20,7 +33,7 @@
"small": "Klein",
"fitImage": "Bildgröße automatisch anpassen",
"showIcon": "Symbol anzeigen",
"showAllFieldsIcon": "Feldsymbole anzeigen",
"showAllEntriesIcons": "Eintragssymbole anzeigen",
"wrapAllFields": "Felder automatisch umbrechen",
"gallery": "Karte",
"newTag": "Neuer Tag",
@ -129,7 +142,7 @@
"lastReviewTime": "Letzte Überprüfungszeit",
"cardStatus": "Kartenstatus",
"noSupportTip": "Diese Funktion unterstützt die Verwendung von Kartenstapeln nicht.",
"insertRowTip": "Die neu hinzugefügten Reihen wurden gefiltert und können eingesehen werden, indem das Filtern/Suchen/Sortieren aufgehoben wird.",
"insertRowTip": "Das neue Element wurde gefiltert, heben Sie die Filterung auf oder passen Sie die Gruppierungseinstellungen an, um es anzuzeigen",
"insertPhoto": "Foto aufnehmen und einfügen",
"relativeToToday": "Bezogen auf heute",
"current": "Aktuell",
@ -422,7 +435,7 @@
"apiKey": "API-Schlüssel",
"apiKeyTip": "Es wird empfohlen, einen API-Schlüssel getrennt für SiYuan zuzuweisen, um eine spätere Verwaltung zu ermöglichen. Wenn dieses Feld leer bleibt, werden AI-bezogene Funktionen deaktiviert.",
"apiTimeout": "Timeout",
"apiTimeoutTip": "Der Timeout-Zeitraum für die Initiierung einer Anfrage, Einheit: Sekunde",
"apiTimeoutTip": "Der Timeout-Zeitraum für die Initiierung einer Anfrage",
"apiProxy": "Netzwerk-Proxy",
"apiProxyTip": "Der Netzwerkproxy, der die Anfrage initiiert, z. B. <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Modell",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Nach der Aktivierung zeigen eingebettete Blöcke Breadcrumbs an, eingebettete Blöcke in Superblöcken ignorieren diese Option und zeigen niemals Breadcrumbs.",
"appearanceMode": "Darstellungsmodus",
"editReadonly": "Schreibgeschützter Modus",
"editReadonlyTip": "Nach der Aktivierung wird das Dokument im schreibgeschützten Modus geladen.",
"editReadonlyTip": "Nach der Aktivierung ist das Dokument standardmäßig schreibgeschützt.",
"generateConflictDoc": "Konfliktdokument generieren, wenn Synchronisationskonflikte auftreten.",
"generateConflictDocTip": "Nach der Aktivierung wird ein Konfliktdokument generiert, wenn ein Synchronisationskonflikt auftritt, sodass es direkt geöffnet und angezeigt werden kann. Egal ob aktiviert oder nicht, die [Datenhistorie] wird das Konfliktdokument aufzeichnen.",
"deleteOpConfirm": "⚠️ Bestätigung der Löschoperation",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "Das Bereinigen des Daten-Repo löscht alle nicht referenzierten Schnappschüsse und zugehörigen Datenobjekte vollständig. Sind Sie sicher, dass Sie bereinigen möchten?",
"purge": "Bereinigen",
"plsChoose": "Bitte zuerst auswählen",
"clearMessage": "Lesen",
"freeSub": "Kostenlose Testversion",
"sortByUpdateTimeDesc": "Absteigend nach Aktualisierungszeit",
"sortByUpdateTimeAsc": "Aufsteigend nach Aktualisierungszeit",
@ -1122,6 +1134,8 @@
"fileTree19": "Einige Betriebssysteme haben technische Einschränkungen, die das manuelle Kopieren von Arbeitsbereichsdaten nach der Erstellung von Unterdokumenten mit mehr als 7 Ebenen verhindern können",
"fileTree20": "Speichern mit einer einzigen Zeile",
"fileTree21": "Nach der Aktivierung wird beim Speichern von .sy-Dokumenten und Datenbank-.json-Dateien das Einzeilige JSON-Format verwendet, was die Dateigröße um etwa 30 % reduzieren und die Lese- und Schreibgeschwindigkeit um 50 % verbessern kann",
"fileTree22": "Großdatei-Warnung",
"fileTree23": "Benachrichtigen, wenn .sy-Dateien oder die Datenbank .json diese Größe überschreiten",
"export10": "Beispiel <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, wenn leer, verwenden Sie Wasserzeichentext oder den Pfad zur Wasserzeichen-Datei.",
"export11": "Inhaltsbehandlungsverfahren des Inhaltsreferenzblocks beim Exportieren",
"export12": "Inhaltsbehandlungsverfahren des Inhalteinbettungsblocks beim Exportieren",
@ -1173,6 +1187,7 @@
"newFileTip": "Bitte öffnen Sie zuerst ein Notizbuch",
"copyBlockRef": "Blockreferenz kopieren",
"copyBlockEmbed": "Blockeinbettung kopieren",
"copyMarkdown": "Als Markdown kopieren",
"linkLevel": "Tiefe",
"mark": "Markieren",
"splitLR": "Rechts aufteilen",
@ -1634,6 +1649,13 @@
"261": "Heute",
"262": "Morgen",
"263": "Nächste %d Tage",
"264": "Das Feld [%s] ist leer"
"264": "Das Feld [%s] ist leer",
"265": "Außerhalb des Bereichs",
"266": "Tesseract OCR ist nicht installiert oder konfiguriert, bitte lesen Sie das Benutzerhandbuch - Abschnitt Ressourcen-Dateien zur Konfiguration",
"267": "Unbenannte Datenbank",
"268": "Bitte beachten Sie, dass die Datei [%s] bereits [%d MB] überschritten hat, was die Leistung beeinträchtigen kann",
"269": "Dieser Block wurde bereits zur Datenbank [%s] hinzugefügt",
"270": "Datenindex wird optimiert, bitte warten...",
"271": "Datenindex-Optimierung abgeschlossen, [%s] Speicherplatz freigegeben"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Optimize Index",
"vacuumDataIndexTip": "Check data index, free up storage, and improve index performance",
"rebuildDataIndex": "Rebuild Index",
"rebuildDataIndexTip": "Fully rebuild the data index, which may take some time. Please wait",
"displayFieldName": "Display field name",
"sortBySelectOption": "Sort by option",
"groupStep": "Group interval",
"groupRange": "Group range",
"groupMethodDateRelative": "Relative date",
"groupMethodDateDay": "Day",
"groupMethodDateWeek": "Week",
"groupMethodDateMonth": "Month",
"groupMethodDateYear": "Year",
"syncColWidth": "Sync column width",
"groupMethod": "Grouping method",
"hideEmptyGroup": "Hide empty group",
"hideEmptyGroup": "Hide empty groups",
"groups": "Groups",
"removeGroup": "Remove group",
"contentBlock": "Content block",
@ -20,7 +33,7 @@
"small": "Small",
"fitImage": "Auto-fit image size",
"showIcon": "Show icon",
"showAllFieldsIcon": "Show field icons",
"showAllEntriesIcons": "Show entry icons",
"wrapAllFields": "Auto-wrap fields",
"gallery": "Card",
"newTag": "New tag",
@ -129,7 +142,7 @@
"lastReviewTime": "Last review time",
"cardStatus": "Card status",
"noSupportTip": "This function does not support the use of card decks",
"insertRowTip": "The newly added entries have been filtered and can be viewed by canceling filtering/searching/sorting",
"insertRowTip": "The new item has been filtered, cancel the filter or adjust the grouping settings to view it",
"insertPhoto": "Take a photo and insert it",
"relativeToToday": "Relative to today",
"current": "This",
@ -422,7 +435,7 @@
"apiKey": "API Key",
"apiKeyTip": "It is recommended to assign an API Key to SiYuan separately for subsequent management. If this item is left blank, AI-related functions will be disabled",
"apiTimeout": "Timeout",
"apiTimeoutTip": "The timeout period for initiating a request, unit: second",
"apiTimeoutTip": "The timeout period for initiating a request",
"apiProxy": "Network Proxy",
"apiProxyTip": "The network proxy that initiates the request, such as <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Model",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "When enabled, embed blocks will display breadcrumbs, embed blocks in super blocks ignore this option and never show breadcrumbs",
"appearanceMode": "Appearance Mode",
"editReadonly": "Read-only mode",
"editReadonlyTip": "When enabled, the editor will load the document in read-only mode",
"editReadonlyTip": "When enabled, the document will be read-only by default",
"generateConflictDoc": "Generate conflict documentation when syncing conflicts",
"generateConflictDocTip": "When enabled, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document",
"deleteOpConfirm": "⚠️ Delete operation confirmation",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "Purging the data repo will completely delete all unreferenced snapshots and related data objects, are you sure to purge?",
"purge": "Purge",
"plsChoose": "Please choose first",
"clearMessage": "Read",
"freeSub": "Free Trial Subscription",
"sortByUpdateTimeDesc": "Descending by update time",
"sortByUpdateTimeAsc": "Ascending by update time",
@ -1122,6 +1134,8 @@
"fileTree19": "Some operating systems have technical limitations that may prevent manual copying of workspace data after creating sub-documents greater than 7 levels",
"fileTree20": "Save with a single line",
"fileTree21": "When enabled, the single-line JSON format will be used when saving .sy docs and database .json files, which can reduce the file size by about 30% and improve read and write efficiency by 50%",
"fileTree22": "Large File Warning",
"fileTree23": "Notify when .sy files or database .json exceed this size",
"export10": "For example <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, if empty, use watermark text or watermark file path.",
"export11": "Content handling method of content ref block when exporting",
"export12": "Content handling method of content embed block when exporting",
@ -1173,6 +1187,7 @@
"newFileTip": "Please open a notebook first",
"copyBlockRef": "Copy block ref",
"copyBlockEmbed": "Copy block embed",
"copyMarkdown": "Copy as Markdown",
"linkLevel": "Depth",
"mark": "Mark",
"splitLR": "Split Right",
@ -1634,6 +1649,13 @@
"261": "Today",
"262": "Tomorrow",
"263": "Next %d days",
"264": "Field [%s] is empty"
"264": "Field [%s] is empty",
"265": "Out of range",
"266": "Tesseract OCR is not installed or configured, please refer to the User Guide - Assets section for configuration",
"267": "Unnamed database",
"268": "Please note that the file [%s] has already exceeded [%d MB], which may cause performance degradation",
"269": "This block has already been added to the database [%s]",
"270": "Optimizing data index, please wait...",
"271": "Data index optimization completed, [%s] disk space freed"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Optimizar índice",
"vacuumDataIndexTip": "Verifique el índice de datos, libere espacio y mejore el rendimiento del índice",
"rebuildDataIndex": "Reconstruir índice",
"rebuildDataIndexTip": "Reconstrucción completa del índice de datos, puede tardar, por favor espere",
"displayFieldName": "Mostrar nombre de campo",
"sortBySelectOption": "Ordenar por opción",
"groupStep": "Intervalo de agrupación",
"groupRange": "Rango de agrupación",
"groupMethodDateRelative": "Fecha relativa",
"groupMethodDateDay": "Día",
"groupMethodDateWeek": "Semana",
"groupMethodDateMonth": "Mes",
"groupMethodDateYear": "Año",
"syncColWidth": "Sincronizar ancho de columna",
"groupMethod": "Método de agrupación",
"hideEmptyGroup": "Ocultar grupo vacío",
"hideEmptyGroup": "Ocultar grupos vacíos",
"groups": "Grupos",
"removeGroup": "Eliminar grupo",
"contentBlock": "Bloque de contenido",
@ -20,7 +33,7 @@
"small": "Pequeño",
"fitImage": "Ajustar automáticamente el tamaño de la imagen",
"showIcon": "Mostrar ícono",
"showAllFieldsIcon": "Mostrar íconos de campos",
"showAllEntriesIcons": "Mostrar íconos de entradas",
"wrapAllFields": "Ajuste automático de campos",
"gallery": "Tarjeta",
"newTag": "Nueva etiqueta",
@ -129,7 +142,7 @@
"lastReviewTime": "Última hora de revisión",
"cardStatus": "Estado de la tarjeta",
"noSupportTip": "Esta función no admite el uso de paquetes de tarjetas",
"insertRowTip": "Las filas recién agregadas se han filtrado y se pueden ver cancelando el filtrado/búsqueda/clasificación",
"insertRowTip": "El nuevo elemento ha sido filtrado, cancele el filtro o ajuste la configuración de agrupación para verlo",
"insertPhoto": "Toma una foto e insértala",
"relativeToToday": "Relativa a hoy",
"current": "Esto",
@ -422,7 +435,7 @@
"apiKey": "Clave API",
"apiKeyTip": "Se recomienda asignar una clave API a SiYuan por separado para su posterior administración. Si este elemento se deja en blanco, las funciones relacionadas con la IA se desactivarán",
"apiTimeout": "Tiempo de espera",
"apiTimeoutTip": "El tiempo de espera para iniciar una solicitud, unidad: segundo",
"apiTimeoutTip": "El tiempo de espera para iniciar una solicitud",
"apiProxy": "Proxy web",
"apiProxyTip": "El proxy de red que inicia la solicitud, como <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Modelo",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Después de habilitar los bloques incrustados, se mostrarán migas de pan, incrustar bloques en superbloques ignora esta opción y nunca muestra migas de pan",
"appearanceMode": "Modo de apariencia",
"editReadonly": "Modo de solo lectura",
"editReadonlyTip": "Después de habilitarlo, el editor cargará el documento en modo de solo lectura",
"editReadonlyTip": "Después de habilitarlo, el documento será de solo lectura por defecto",
"generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
"generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto",
"deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",
@ -629,7 +642,6 @@
"purge": "Purgar",
"dataRepoPurgeTip": "Purga todas las instantáneas sin referencia y los objetos de datos relacionados",
"plsChoose": "Por favor, elija primero",
"clearMessage": "Leer",
"freeSub": "Suscripción de prueba gratuita",
"sortByUpdateTimeDesc": "Descendente por tiempo de actualización",
"sortByUpdateTimeAsc": "Ascendente por tiempo de actualización",
@ -1122,6 +1134,8 @@
"fileTree19": "Algunos sistemas operativos tienen limitaciones técnicas que pueden impedir la copia manual de los datos del espacio de trabajo después de crear subdocumentos de más de 7 niveles",
"fileTree20": "Guardar con una sola línea",
"fileTree21": "Después de habilitarlo, se utilizará el formato JSON de una sola línea al guardar documentos .sy y archivos .json de bases de datos, lo que puede reducir el tamaño del archivo en aproximadamente un 30 % y mejorar la eficiencia de lectura y escritura en un 50 %.",
"fileTree22": "Aviso de archivo grande",
"fileTree23": "Notificar cuando los archivos .sy o la base de datos .json superen este tamaño",
"export10": "Por ejemplo <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, si está vacío, utilice texto de marca de agua o ruta del archivo de marca de agua.",
"export11": "Método de manejo de contenido del bloque de referencia de contenido al exportar",
"export12": "Método de manejo de contenido del bloque de incrustación de contenido al exportar",
@ -1173,6 +1187,7 @@
"newFileTip": "Por favor, abra primero un cuaderno de notas",
"copyBlockRef": "Copiar bloque referencia",
"copyBlockEmbed": "Copiar bloque incrustado",
"copyMarkdown": "Copiar como Markdown",
"linkLevel": "Profundidad",
"mark": "Marca",
"splitLR": "Dividir a la derecha",
@ -1634,6 +1649,13 @@
"261": "Hoy",
"262": "Mañana",
"263": "Próximos %d días",
"264": "El campo [%s] está vacío"
"264": "El campo [%s] está vacío",
"265": "Fuera de rango",
"266": "Tesseract OCR no está instalado o configurado, consulte la Guía del Usuario - Sección de archivos de recursos para la configuración",
"267": "Base de datos sin nombre",
"268": "Atención: el archivo [%s] ya ha superado los [%d MB], lo que puede causar una disminución del rendimiento",
"269": "Este bloque ya ha sido añadido a la base de datos [%s]",
"270": "Optimizando el índice de datos, por favor espere...",
"271": "Optimización del índice de datos completada, se liberaron [%s] de espacio en disco"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Optimiser lindex",
"vacuumDataIndexTip": "Vérifiez lindex des données, libérez de lespace et améliorez les performances de lindex",
"rebuildDataIndex": "Reconstruire lindex",
"rebuildDataIndexTip": "Reconstruction complète de lindex des données, cela peut prendre du temps, veuillez patienter",
"displayFieldName": "Afficher le nom du champ",
"sortBySelectOption": "Trier par option",
"groupStep": "Intervalle de regroupement",
"groupRange": "Plage de regroupement",
"groupMethodDateRelative": "Date relative",
"groupMethodDateDay": "Jour",
"groupMethodDateWeek": "Semaine",
"groupMethodDateMonth": "Mois",
"groupMethodDateYear": "Année",
"syncColWidth": "Synchroniser la largeur de la colonne",
"groupMethod": "Méthode de regroupement",
"hideEmptyGroup": "Masquer le groupe vide",
"hideEmptyGroup": "Masquer les groupes vides",
"groups": "Groupes",
"removeGroup": "Supprimer le groupe",
"contentBlock": "Bloc de contenu",
@ -20,7 +33,7 @@
"small": "Petit",
"fitImage": "Ajuster automatiquement la taille de l'image",
"showIcon": "Afficher l'icône",
"showAllFieldsIcon": "Afficher les icônes des champs",
"showAllEntriesIcons": "Afficher les icônes des entrées",
"wrapAllFields": "Retour automatique des champs",
"gallery": "Carte",
"newTag": "Nouvelle étiquette",
@ -129,7 +142,7 @@
"lastReviewTime": "Heure de la dernière révision",
"cardStatus": "Statut de la carte",
"noSupportTip": "Cette fonction ne prend pas en charge l'utilisation de packages de cartes",
"insertRowTip": "Les lignes nouvellement ajoutées ont été filtrées et peuvent être visualisées en annulant le filtrage/recherche/tri",
"insertRowTip": "Le nouvel élément a été filtré, annulez le filtre ou ajustez les paramètres de regroupement pour le voir",
"insertPhoto": "Prendre une photo et l'insérer",
"relativeToToday": "Par rapport à aujourd'hui",
"current": "Ceci",
@ -422,7 +435,7 @@
"apiKey": "Clé API",
"apiKeyTip": "Il est recommandé d'attribuer une clé API à SiYuan séparément pour une gestion ultérieure. Si cet élément est laissé vide, les fonctions liées à l'IA seront désactivées",
"apiTimeout": "Délai d'expiration",
"apiTimeoutTip": "Le délai d'attente pour lancer une requête, unité : seconde",
"apiTimeoutTip": "Le délai d'attente pour lancer une requête",
"apiProxy": "Proxy Web",
"apiProxyTip": "Le proxy réseau qui lance la requête, tel que <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Modelo",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Après avoir activé l'intégration, les blocs afficheront le fil d'Ariane, intégrer des blocs dans des super blocs ignorent cette option et n'affichent jamais le fil d'Ariane",
"appearanceMode": "Mode d'apparence",
"editReadonly": "Mode lecture seule",
"editReadonlyTip": "Lorsqu'il est activé, l'éditeur charge le document en mode lecture seule",
"editReadonlyTip": "Lorsqu'il est activé, le document sera en lecture seule par défaut",
"generateConflictDoc": "Générer une documentation sur les conflits lors de la synchronisation des conflits",
"generateConflictDocTip": "Lorsqu'il est activé, un document de conflit sera généré lorsqu'un conflit de synchronisation se produit, afin qu'il puisse être ouvert et visualisé directement. Qu'il soit activé ou non, l'historique des données enregistrera le document de conflit",
"deleteOpConfirm": "⚠️ Supprimer la confirmation de l'opération",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "La purge du référentiel de données supprimera complètement tous les instantanés non référencés et les objets de données associés, êtes-vous sûr de purger ?",
"purge": "Purger",
"plsChoose": "Veuillez d'abord choisir",
"clearMessage": "Lire",
"freeSub": "Abonnement d'essai gratuit",
"sortByUpdateTimeDesc": "Descendant par heure de mise à jour",
"sortByUpdateTimeAsc": "Croissant par heure de mise à jour",
@ -1122,6 +1134,8 @@
"fileTree19": "Certains systèmes d'exploitation ont des limitations techniques qui peuvent empêcher la copie manuelle des données de l'espace de travail après la création de sous-documents supérieurs à 7 niveaux",
"fileTree20": "Enregistrer avec une seule ligne",
"fileTree21": "Après activation, le format JSON sur une seule ligne sera utilisé lors de l'enregistrement des documents .sy et des fichiers .json de base de données, ce qui peut réduire la taille du fichier d'environ 30 % et améliorer l'efficacité de lecture et d'écriture de 50 %",
"fileTree22": "Alerte de fichier volumineux",
"fileTree23": "Notifier lorsque les fichiers .sy ou la base de données .json dépassent cette taille",
"export10": "Par exemple <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, s'il est vide, utilisez le texte du filigrane ou le chemin du fichier du filigrane.",
"export11": "Traitement du contenu des blocs de référence lors de l'exportation",
"export12": "Gestion du contenu des blocs intégrés lors de l'exportation",
@ -1173,6 +1187,7 @@
"newFileTip": "Veuillez d'abord ouvrir un carnet de notes",
"copyBlockRef": "Copier bloc réf",
"copyBlockEmbed": "Copier le bloc en tant que bloc incorporé",
"copyMarkdown": "Copier comme Markdown",
"linkLevel": "Niveaux",
"mark": "Mark",
"splitLR": "Split Droit",
@ -1634,6 +1649,13 @@
"261": "Aujourd'hui",
"262": "Demain",
"263": "Les %d prochains jours",
"264": "Le champ [%s] est vide"
"264": "Le champ [%s] est vide",
"265": "Hors de portée",
"266": "Tesseract OCR n'est pas installé ou configuré, veuillez consulter le Guide de l'utilisateur - Section des fichiers de ressources pour la configuration",
"267": "Base de données sans nom",
"268": "Attention : le fichier [%s] a déjà dépassé [%d MB], ce qui peut entraîner une baisse des performances",
"269": "Ce bloc a déjà été ajouté à la base de données [%s]",
"270": "Optimisation de lindex des données en cours, veuillez patienter...",
"271": "Optimisation de lindex des données terminée, [%s] despace disque libéré"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "אופטימיזציית אינדקס",
"vacuumDataIndexTip": "בדוק את אינדקס הנתונים, שחרר שטח אחסון ושפר את ביצועי האינדקס",
"rebuildDataIndex": "בנה מחדש את האינדקס",
"rebuildDataIndexTip": "בנייה מחדש מלאה של אינדקס הנתונים, עשוי להימשך זמן, נא להמתין",
"displayFieldName": "הצג שם שדה",
"sortBySelectOption": "מיין לפי אפשרות",
"groupStep": "מרווח קיבוץ",
"groupRange": "טווח קיבוץ",
"groupMethodDateRelative": "תאריך יחסי",
"groupMethodDateDay": "יום",
"groupMethodDateWeek": "שבוע",
"groupMethodDateMonth": "חודש",
"groupMethodDateYear": "שנה",
"syncColWidth": "סנכרון רוחב עמודה",
"groupMethod": "שיטת קיבוץ",
"hideEmptyGroup": "הסתר קבוצה ריקה",
"hideEmptyGroup": "הסתר קבוצות ריקות",
"groups": "קבוצות",
"removeGroup": "הסר קבוצה",
"contentBlock": "בלוק תוכן",
@ -20,7 +33,7 @@
"small": "קטן",
"fitImage": "התאמה אוטומטית לגודל התמונה",
"showIcon": "הצג סמל",
"showAllFieldsIcon": "הצג סמלי שדות",
"showAllEntriesIcons": "הצג סמלי כניסות",
"wrapAllFields": "עטיפת שדות אוטומטית",
"gallery": "כרטיס",
"newTag": "תג חדש",
@ -129,7 +142,7 @@
"lastReviewTime": "זמן הסקירה האחרון",
"cardStatus": "סטטוס כרטיס",
"noSupportTip": "תכונה זו אינה תומכת בשימוש בערימות כרטיסים",
"insertRowTip": שורות שנוספו חדשות סוננו וניתן לראותן על ידי ביטול סינון/חיפוש/מיון",
"insertRowTip": פריט החדש סונן, בטל את הסינון או שנה את הגדרות הקיבוץ לצפייה",
"insertPhoto": "צלם תמונה והכנס אותה",
"relativeToToday": "יחסי להיום",
"current": "זה",
@ -422,7 +435,7 @@
"apiKey": "מפתח API",
"apiKeyTip": "מומלץ להקצות מפתח API לסִייוּן בנפרד לשם ניהול מאוחר יותר. אם פריט זה נשאר ריק, הפונקציות הקשורות ל-AI יידחו",
"apiTimeout": "זמן החזרה",
"apiTimeoutTip": "תקופת הזמן ליזום בקשה, יחידה: שנייה",
"apiTimeoutTip": "הבקשה פגה",
"apiProxy": "פרוקסי רשת",
"apiProxyTip": "הפרוקסי רשת המוזמן, כמו <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "מודל",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "לאחר הפעולה, בלוקים מוטמעים יראו נתיב, בלוקים מוטמעים בבלוקים עליוניים מתעלמים מהאפשרות הזו ולא יראו נתיבים",
"appearanceMode": "מצב מראה",
"editReadonly": "מצב קריאה בלבד",
"editReadonlyTip": "לאחר ההפעלה, העורך יטען את המסמך במצב קריאה בלבד",
"editReadonlyTip": "כאשר מופעל, המסמך יהיה לקריאה בלבד כברירת מחדל",
"generateConflictDoc": "צור תיעוד שהוקסם כאשר נוצרו סכסוכים",
"generateConflictDocTip": "לאחר ההפעלה, תיעוד סכסוך ייווצר כאשר מתהווה סכסוך סנכרון, כך שהוא יכול להיפתח ולהיות נצפה ישירות. בין אם מופעל ובין אם לא, היסטוריית הנתונים תקלוט את תיעוד הסכסוך",
"deleteOpConfirm": "⚠️ אישור פעולה מחיקה",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "ניקוי מאגר הנתונים ימחק לחלוטין את כל הצילומים הלא מתייחסים ואת האוביקטים הנתונים הקשורים, האם אתה בטוח לבצע ניקוי?",
"purge": "נקה",
"plsChoose": "אנא בחר קודם",
"clearMessage": "קרא",
"freeSub": "מנוי ניסיון חינם",
"sortByUpdateTimeDesc": "יורד לפי זמן עדכון",
"sortByUpdateTimeAsc": "עולה לפי זמן עדכון",
@ -1122,6 +1134,8 @@
"fileTree19": "חלק ממערכות ההפעלה יש הגבלות טכניות שעלולות למנוע העתקה ידנית של נתוני החלל העבודה לאחר יצירת תתי מסמכים גדולים מ-7 רמות",
"fileTree20": "שמור בשורה אחת",
"fileTree21": "לאחר הפעלת אפשרות זו, פורמט ה-JSON בשורה אחת ישמש בעת שמירת קבצי .sy ומסדי נתונים .json, מה שיכול להפחית את גודל הקובץ בכ-30% ולשפר את יעילות הקריאה והכתיבה ב-50%",
"fileTree22": "התראה על קובץ גדול",
"fileTree23": "הצג התראה כאשר קובץ .sy או מסד נתונים .json חורג מגודל זה",
"export10": "למשל <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, אם ריק, השתמש בטקסט סימן מים או בנתיב קובץ סימן מים.",
"export11": "שיטת טיפול תוכן של בלוק תוכן בעת הייצוא",
"export12": "שיטת טיפול תוכן של בלוק הטמעה בעת הייצוא",
@ -1173,6 +1187,7 @@
"newFileTip": "אנא פתח מחברת קודם",
"copyBlockRef": "העתק הפניה לבלוק",
"copyBlockEmbed": "העתק הטמעה לבלוק",
"copyMarkdown": "העתק כ-Markdown",
"linkLevel": "עומק",
"mark": "סמן",
"splitLR": "חלק ימינה",
@ -1634,6 +1649,13 @@
"261": "היום",
"262": "מחר",
"263": "ה-%d ימים הבאים",
"264": "השדה [%s] ריק"
"264": "השדה [%s] ריק",
"265": "מחוץ לטווח",
"266": "Tesseract OCR לא הותקן או הוגדר, אנא עיין במדריך למשתמש - פרק קבצי משאבים לצורך הגדרה",
"267": "מסד נתונים ללא שם",
"268": "שים לב שהקובץ [%s] כבר חרג מ-[%d MB], דבר שעלול לגרום לירידה בביצועים",
"269": "הבלוק נוסף כבר למסד הנתונים [%s]",
"270": "מתבצעת אופטימיזציה של אינדקס הנתונים, נא להמתין...",
"271": "אופטימיזציית אינדקס הנתונים הושלמה, שוחררו [%s] שטח דיסק"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Ottimizza indice",
"vacuumDataIndexTip": "Verifica l'indice dei dati, libera spazio e migliora le prestazioni dell'indice",
"rebuildDataIndex": "Ricostruisci indice",
"rebuildDataIndexTip": "Ricostruzione completa dell'indice dei dati, potrebbe richiedere tempo, attendere prego",
"displayFieldName": "Mostra nome campo",
"sortBySelectOption": "Ordina per opzione",
"groupStep": "Intervallo di raggruppamento",
"groupRange": "Intervallo di gruppo",
"groupMethodDateRelative": "Data relativa",
"groupMethodDateDay": "Giorno",
"groupMethodDateWeek": "Settimana",
"groupMethodDateMonth": "Mese",
"groupMethodDateYear": "Anno",
"syncColWidth": "Sincronizza larghezza colonna",
"groupMethod": "Metodo di raggruppamento",
"hideEmptyGroup": "Nascondi gruppo vuoto",
"hideEmptyGroup": "Nascondi gruppi vuoti",
"groups": "Gruppi",
"removeGroup": "Rimuovi gruppo",
"contentBlock": "Blocco di contenuto",
@ -20,7 +33,7 @@
"small": "Piccolo",
"fitImage": "Adatta automaticamente la dimensione dell'immagine",
"showIcon": "Mostra icona",
"showAllFieldsIcon": "Mostra icone dei campi",
"showAllEntriesIcons": "Mostra icone delle voci",
"wrapAllFields": "Avvolgi automaticamente i campi",
"gallery": "Scheda",
"newTag": "Nuova etichetta",
@ -129,7 +142,7 @@
"lastReviewTime": "Ultima revisione",
"cardStatus": "Stato della carta",
"noSupportTip": "Questa funzione non supporta l'uso di mazzi di carte",
"insertRowTip": "L'elemento aggiunto è stato filtrato, è possibile annullare filtro/ricerca/ordinamento per visualizzarlo",
"insertRowTip": "Il nuovo elemento è stato filtrato, annulla il filtro o modifica le impostazioni di raggruppamento per visualizzarlo",
"insertPhoto": "Scatta una foto e inseriscila",
"relativeToToday": "Relativo a oggi",
"current": "Questo",
@ -422,7 +435,7 @@
"apiKey": "Chiave API",
"apiKeyTip": "Si consiglia di assegnare una chiave API separata a SiYuan per una successiva gestione. Se questo campo è lasciato vuoto, le funzioni relative all'AI saranno disabilitate",
"apiTimeout": "Timeout",
"apiTimeoutTip": "Il periodo di timeout per l'invio di una richiesta, unità: secondi",
"apiTimeoutTip": "Il periodo di timeout per l'invio di una richiesta",
"apiProxy": "Proxy di rete",
"apiProxyTip": "Il proxy di rete che avvia la richiesta, ad esempio <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Modello",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Dopo l'abilitazione, i blocchi incorporati mostreranno i breadcrumb. I blocchi incorporati nei super blocchi ignorano questa opzione e non mostreranno mai breadcrumb",
"appearanceMode": "Modalità aspetto",
"editReadonly": "Modalità di sola lettura",
"editReadonlyTip": "Dopo l'abilitazione, l'editor caricherà il documento in modalità di sola lettura",
"editReadonlyTip": "Quando abilitato, il documento sarà in sola lettura per impostazione predefinita",
"generateConflictDoc": "Genera documento di conflitto quando si verificano conflitti di sincronizzazione",
"generateConflictDocTip": "Dopo l'abilitazione, verrà generato un documento di conflitto quando si verifica un conflitto di sincronizzazione, in modo che possa essere aperto e visualizzato direttamente. Sia che sia abilitato o meno, la [Cronologia dati] registrerà il documento di conflitto",
"deleteOpConfirm": "⚠️ Conferma operazione di eliminazione",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "La pulizia del repository dei dati eliminerà completamente tutti gli snapshot non referenziati e gli oggetti dati correlati, sei sicuro di voler pulire?",
"purge": "Pulisci",
"plsChoose": "Si prega di scegliere prima",
"clearMessage": "Segna come letto",
"freeSub": "Prova gratuita",
"sortByUpdateTimeDesc": "Discendente per ora di aggiornamento",
"sortByUpdateTimeAsc": "Ascendente per ora di aggiornamento",
@ -1122,6 +1134,8 @@
"fileTree19": "Alcuni sistemi operativi hanno limitazioni tecniche che possono impedire la copia manuale dei dati dell'area di lavoro dopo la creazione di sotto-documenti superiori a 7 livelli",
"fileTree20": "Salva con una singola riga",
"fileTree21": "Dopo l'abilitazione, il formato JSON a riga singola verrà utilizzato quando si salvano documenti .sy e file di database .json, il che può ridurre le dimensioni del file del 30% circa e migliorare l'efficienza di lettura e scrittura del 50%",
"fileTree22": "Avviso file di grandi dimensioni",
"fileTree23": "Notifica quando i file .sy e il database .json superano questa dimensione",
"export10": "Ad esempio <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, se vuoto, utilizza il testo della filigrana o il percorso del file della filigrana.",
"export11": "Metodo di gestione del contenuto del blocco di riferimento durante l'esportazione",
"export12": "Metodo di gestione del contenuto del blocco incorporato durante l'esportazione",
@ -1173,6 +1187,7 @@
"newFileTip": "Si prega di aprire prima un taccuino",
"copyBlockRef": "Copia riferimento blocco",
"copyBlockEmbed": "Copia incorporamento blocco",
"copyMarkdown": "Copia come Markdown",
"linkLevel": "Profondità",
"mark": "Segna",
"splitLR": "Dividi a destra",
@ -1634,6 +1649,13 @@
"261": "Oggi",
"262": "Domani",
"263": "Prossimi %d giorni",
"264": "Il campo [%s] è vuoto"
"264": "Il campo [%s] è vuoto",
"265": "Fuori intervallo",
"266": "Tesseract OCR non è installato o configurato, fare riferimento alla Guida utente - Sezione file di risorse per la configurazione",
"267": "Database senza nome",
"268": "Attenzione: il file [%s] ha già superato [%d MB], il che potrebbe causare un calo delle prestazioni",
"269": "Questo blocco è già stato aggiunto al database [%s]",
"270": "Ottimizzazione dell'indice dei dati in corso, attendere prego...",
"271": "Ottimizzazione dell'indice dei dati completata, liberati [%s] di spazio su disco"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "インデックスの最適化",
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
"rebuildDataIndex": "インデックスの再構築",
"rebuildDataIndexTip": "データインデックスを完全に再構築します。時間がかかる場合がありますのでお待ちください",
"displayFieldName": "フィールド名を表示",
"sortBySelectOption": "オプションで並べ替え",
"groupStep": "グループ間隔",
"groupRange": "グループ範囲",
"groupMethodDateRelative": "相対日付",
"groupMethodDateDay": "日",
"groupMethodDateWeek": "週",
"groupMethodDateMonth": "月",
"groupMethodDateYear": "年",
"syncColWidth": "列幅を同期",
"groupMethod": "グループ方法",
"hideEmptyGroup": "空のグループを隠す",
"hideEmptyGroup": "空のグループを非表示",
"groups": "グループ",
"removeGroup": "グループを削除",
"contentBlock": "コンテンツブロック",
@ -20,7 +33,7 @@
"small": "小",
"fitImage": "画像サイズを自動調整",
"showIcon": "アイコンを表示",
"showAllFieldsIcon": "フィールドアイコンを表示",
"showAllEntriesIcons": "エントリアイコンを表示",
"wrapAllFields": "フィールドを自動折り返し",
"gallery": "カード",
"newTag": "新しいタグ",
@ -129,7 +142,7 @@
"lastReviewTime": "最後の復習時間",
"cardStatus": "カードの状態",
"noSupportTip": "この機能はカードデッキの使用をサポートしていません",
"insertRowTip": "新しく追加された行はフィルタリングされており、フィルタリング/検索/並べ替えを解除すると表示されます",
"insertRowTip": "新しい項目はフィルタリングされています。フィルタリングまたはグループ設定を解除して確認してください",
"insertPhoto": "画像を挿入",
"relativeToToday": "今日からの相対的な期間",
"current": "現在",
@ -422,7 +435,7 @@
"apiKey": "API キー",
"apiKeyTip": "以降の管理のために SiYuan に API キーを個別に割り当てることをお勧めします。この項目を空白のままにすると AI 関連機能が無効になります",
"apiTimeout": "タイムアウト",
"apiTimeoutTip": "リクエストのタイムアウト時間 (単位: 秒)",
"apiTimeoutTip": "リクエストのタイムアウト時間",
"apiProxy": "ネットワークプロキシ",
"apiProxyTip": "リクエストを開始するネットワークプロキシ (例: <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>)",
"apiModel": "モデル",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "埋め込みブロックにパンくずリストを表示します<br>この設定にかかわらずスーパーブロック内の埋め込みブロックは常にパンくずリストが表示されません",
"appearanceMode": "表示モード",
"editReadonly": "読み取り専用モード",
"editReadonlyTip": "エディタが読み取り専用モードでドキュメントを読み込みます",
"editReadonlyTip": "有効にすると、ドキュメントはデフォルトで読み取り専用になります",
"generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
"generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます",
"deleteOpConfirm": "⚠️ 削除操作の確認",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "データリポジトリを消去すると、参照されていないすべてのスナップショットと関連するデータオブジェクトが完全に削除されます。消去してもよろしいですか?",
"purge": "消去",
"plsChoose": "最初にノートを選択してください",
"clearMessage": "既読",
"freeSub": "無料体験版",
"sortByUpdateTimeDesc": "更新時間 (降順)",
"sortByUpdateTimeAsc": "更新時間 (昇順)",
@ -1122,6 +1134,8 @@
"fileTree19": "一部のオペレーティングシステムでは、7レベルより深いサブドキュメントにワークスペースデータの手動コピーができない場合があります",
"fileTree20": "一行で保存",
"fileTree21": "ドキュメントとデータベースファイルを保存する際に改行を行わない JSON フォーマットを使用します。これによりファイルサイズが約 30% 削減され、読み書きの効率が 50% 向上します",
"fileTree22": "大きなファイルの警告",
"fileTree23": ".sy ドキュメントやデータベース .json がこのサイズを超えると通知します",
"export10": "例: <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code><br>空の場合は透かしテキストまたは透かし画像ファイルのパスを使用します",
"export11": "エクスポート時のブロック参照コンテンツの処理方法",
"export12": "エクスポート時の埋め込みブロックコンテンツの処理方法",
@ -1173,6 +1187,7 @@
"newFileTip": "最初にノートブックを開いてください",
"copyBlockRef": "ブロック参照としてコピー",
"copyBlockEmbed": "埋め込みブロックとしてコピー",
"copyMarkdown": "Markdown としてコピー",
"linkLevel": "深さ",
"mark": "ハイライト",
"splitLR": "右に分割",
@ -1634,6 +1649,13 @@
"261": "今日",
"262": "明日",
"263": "次の %d 日間",
"264": "フィールド [%s] の値が空です"
"264": "フィールド [%s] が空です",
"265": "範囲外",
"266": "Tesseract OCR がインストールされていないか、設定されていません。ユーザーガイド - リソースファイルセクションを参照して設定してください",
"267": "未命名のデータベース",
"268": "ファイル [%s] はすでに [%d MB] を超えており、パフォーマンスが低下する可能性があります",
"269": "このブロックはすでにデータベース [%s] に追加されています",
"270": "データインデックスを最適化しています。しばらくお待ちください...",
"271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Optymalizuj indeks",
"vacuumDataIndexTip": "Sprawdź indeks danych, zwolnij miejsce i popraw wydajność indeksu",
"rebuildDataIndex": "Odbuduj indeks",
"rebuildDataIndexTip": "Pełna odbudowa indeksu danych, może to potrwać, proszę czekać",
"displayFieldName": "Wyświetl nazwę pola",
"sortBySelectOption": "Sortuj według opcji",
"groupStep": "Odstęp grupowania",
"groupRange": "Zakres grupowania",
"groupMethodDateRelative": "Data względna",
"groupMethodDateDay": "Dzień",
"groupMethodDateWeek": "Tydzień",
"groupMethodDateMonth": "Miesiąc",
"groupMethodDateYear": "Rok",
"syncColWidth": "Synchronizuj szerokość kolumny",
"groupMethod": "Metoda grupowania",
"hideEmptyGroup": "Ukryj pustą grupę",
"hideEmptyGroup": "Ukryj puste grupy",
"groups": "Grupy",
"removeGroup": "Usuń grupę",
"contentBlock": "Blok treści",
@ -20,7 +33,7 @@
"small": "Mały",
"fitImage": "Automatyczne dopasowanie rozmiaru obrazu",
"showIcon": "Pokaż ikonę",
"showAllFieldsIcon": "Pokaż ikony pól",
"showAllEntriesIcons": "Pokaż ikony wpisów",
"wrapAllFields": "Automatyczne zawijanie pól",
"gallery": "Karta",
"newTag": "Nowy tag",
@ -129,7 +142,7 @@
"lastReviewTime": "Ostatni czas przeglądu",
"cardStatus": "Status karty",
"noSupportTip": "Ta funkcja nie wspiera użycia zestawów kart",
"insertRowTip": "Nowo dodane wiersze zostały przefiltrowane i mogą być wyświetlane po anulowaniu filtrowania/szukań/sortowań",
"insertRowTip": "Nowy element został przefiltrowany, anuluj filtrowanie lub ustawienia grupowania, aby wyświetlić",
"insertPhoto": "Zrób zdjęcie i wstaw je",
"relativeToToday": "W odniesieniu do dzisiaj",
"current": "Ten",
@ -422,7 +435,7 @@
"apiKey": "Klucz API",
"apiKeyTip": "Zaleca się przypisanie klucza API do SiYuan oddzielnie do późniejszego zarządzania. Jeśli ten element jest pusty, funkcje związane z AI będą wyłączone",
"apiTimeout": "Limit czasu",
"apiTimeoutTip": "Okres timeoutu dla inicjowania zapytania, jednostka: sekunda",
"apiTimeoutTip": "Okres timeoutu dla inicjowania zapytania",
"apiProxy": "Proxy sieciowe",
"apiProxyTip": "Proxy sieciowe, które inicjuje zapytanie, np. <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Model",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Po włączeniu wbudowane bloki będą wyświetlać okruszki, wbudowane bloki w super blokach ignorują tę opcję i nigdy nie pokazują okruszków",
"appearanceMode": "Tryb wyglądu",
"editReadonly": "Tryb tylko do odczytu",
"editReadonlyTip": "Po włączeniu edytor załaduje dokument w trybie tylko do odczytu",
"editReadonlyTip": "Po włączeniu dokument będzie domyślnie tylko do odczytu",
"generateConflictDoc": "Generuj dokument konfliktowy podczas synchronizacji konfliktów",
"generateConflictDocTip": "Po włączeniu, dokument konfliktowy zostanie wygenerowany, gdy wystąpi konflikt synchronizacji, aby można go było otworzyć i przeglądać bezpośrednio. Niezależnie od tego, czy włączone, [Historia danych] zarejestruje dokument konfliktowy",
"deleteOpConfirm": "⚠️ Potwierdzenie operacji usunięcia",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "Oczyszczenie repozytorium danych całkowicie usunie wszystkie nieodwołane zrzuty i powiązane obiekty danych, czy na pewno chcesz przeprowadzić oczyszczenie?",
"purge": "Oczyść",
"plsChoose": "Proszę najpierw wybrać",
"clearMessage": "Przeczytaj",
"freeSub": "Bezpłatna subskrypcja próbna",
"sortByUpdateTimeDesc": "Malejąco wg czasu aktualizacji",
"sortByUpdateTimeAsc": "Rosnąco wg czasu aktualizacji",
@ -1122,6 +1134,8 @@
"fileTree19": "Niektóre systemy operacyjne mają ograniczenia techniczne, które mogą uniemożliwić ręczne kopiowanie danych obszaru roboczego po utworzeniu poddokumentów głębszych niż 7 poziomów",
"fileTree20": "Zapisz w pojedynczej linii",
"fileTree21": "Po włączeniu, format JSON w pojedynczej linii będzie używany przy zapisywaniu .sy dokumentów i plików .json bazy danych, co może zmniejszyć rozmiar pliku o około 30% i poprawić wydajność odczytu i zapisu o 50%",
"fileTree22": "Powiadomienie o dużym pliku",
"fileTree23": "Powiadom, gdy plik .sy lub baza danych .json przekroczy ten rozmiar",
"export10": "Na przykład <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, jeśli jest puste, użyj tekstu znaków wodnych lub ścieżki pliku znaku wodnego.",
"export11": "Sposób obsługi treści bloku odniesienia podczas eksportu",
"export12": "Sposób obsługi treści bloku osadzonego podczas eksportu",
@ -1173,6 +1187,7 @@
"newFileTip": "Proszę najpierw otworzyć notes",
"copyBlockRef": "Skopiuj odniesienie do bloku",
"copyBlockEmbed": "Skopiuj blok osadzony",
"copyMarkdown": "Skopiuj jako Markdown",
"linkLevel": "Głębokość",
"mark": "Zaznacz",
"splitLR": "Podziel w prawo",
@ -1634,6 +1649,13 @@
"261": "Dzisiaj",
"262": "Jutro",
"263": "Następne %d dni",
"264": "Pole [%s] jest puste"
"264": "Pole [%s] jest puste",
"265": "Poza zakresem",
"266": "Tesseract OCR nie jest zainstalowany lub skonfigurowany, zapoznaj się z Podręcznikiem użytkownika - Sekcja plików zasobów, aby skonfigurować",
"267": "Nienazwana baza danych",
"268": "Uwaga: plik [%s] przekroczył już [%d MB], co może spowodować spadek wydajności",
"269": "Ten blok został już dodany do bazy danych [%s]",
"270": "Optymalizacja indeksu danych, proszę czekać...",
"271": "Optymalizacja indeksu danych zakończona, zwolniono [%s] miejsca na dysku"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Otimizar índice",
"vacuumDataIndexTip": "Verifique o índice de dados, libere espaço e melhore o desempenho do índice",
"rebuildDataIndex": "Reconstruir índice",
"rebuildDataIndexTip": "Reconstrução completa do índice de dados, pode demorar, por favor aguarde",
"displayFieldName": "Exibir nome do campo",
"sortBySelectOption": "Classificar por opção",
"groupStep": "Intervalo de agrupamento",
"groupRange": "Intervalo de grupo",
"groupMethodDateRelative": "Data relativa",
"groupMethodDateDay": "Dia",
"groupMethodDateWeek": "Semana",
"groupMethodDateMonth": "Mês",
"groupMethodDateYear": "Ano",
"syncColWidth": "Sincronizar largura da coluna",
"groupMethod": "Método de agrupamento",
"hideEmptyGroup": "Ocultar grupo vazio",
"hideEmptyGroup": "Ocultar grupos vazios",
"groups": "Grupos",
"removeGroup": "Remover grupo",
"contentBlock": "Bloco de conteúdo",
@ -20,7 +33,7 @@
"small": "Pequeno",
"fitImage": "Ajustar automaticamente o tamanho da imagem",
"showIcon": "Mostrar ícone",
"showAllFieldsIcon": "Mostrar ícones de campos",
"showAllEntriesIcons": "Mostrar ícones de entradas",
"wrapAllFields": "Quebrar automaticamente os campos",
"gallery": "Cartão",
"newTag": "Nova tag",
@ -129,7 +142,7 @@
"lastReviewTime": "Última hora de revisão",
"cardStatus": "Status do cartão",
"noSupportTip": "Esta função não suporta o uso de baralhos de cartas",
"insertRowTip": "As entradas recém-adicionadas foram filtradas e podem ser visualizadas cancelando o filtro/pesquisa/ordenação",
"insertRowTip": "O novo item foi filtrado, cancele o filtro ou ajuste a configuração de agrupamento para visualizar",
"insertPhoto": "Tirar uma foto e inserir",
"relativeToToday": "Relativo a hoje",
"current": "Este",
@ -422,7 +435,7 @@
"apiKey": "Chave API",
"apiKeyTip": "Recomenda-se atribuir uma Chave API separada ao SiYuan para gerenciamento subsequente. Se este item estiver em branco, as funções relacionadas à IA serão desativadas",
"apiTimeout": "Tempo limite",
"apiTimeoutTip": "O período de tempo limite para iniciar uma solicitação, unidade: segundo",
"apiTimeoutTip": "O período de tempo limite para iniciar uma solicitação",
"apiProxy": "Proxy de rede",
"apiProxyTip": "O proxy de rede que inicia a solicitação, como <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Modelo",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "Quando ativado, blocos incorporados exibirão navegação estrutural, blocos incorporados em super blocos ignoram esta opção e nunca mostram navegação estrutural",
"appearanceMode": "Modo de Aparência",
"editReadonly": "Modo somente leitura",
"editReadonlyTip": "Quando ativado, o editor carregará o documento em modo somente leitura",
"editReadonlyTip": "Quando ativado, o documento ficará somente leitura por padrão",
"generateConflictDoc": "Gerar documentação de conflito quando houver conflitos de sincronização",
"generateConflictDocTip": "Quando ativado, um documento de conflito será gerado quando ocorrer um conflito de sincronização, para que possa ser aberto e visualizado diretamente. Independentemente de estar ativado ou não, o [Histórico de Dados] registrará o documento de conflito",
"deleteOpConfirm": "⚠️ Confirmação de operação de exclusão",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "Limpar o repositório de dados excluirá completamente todos os instantâneos não referenciados e objetos de dados relacionados, tem certeza que deseja limpar?",
"purge": "Limpar",
"plsChoose": "Por favor, escolha primeiro",
"clearMessage": "Ler",
"freeSub": "Assinatura de Teste Gratuita",
"sortByUpdateTimeDesc": "Decrescente por hora de atualização",
"sortByUpdateTimeAsc": "Crescente por hora de atualização",
@ -1122,6 +1134,8 @@
"fileTree19": "Alguns sistemas operacionais têm limitações técnicas que podem impedir a cópia manual de dados do espaço de trabalho após a criação de subdocumentos maiores que 7 níveis",
"fileTree20": "Salvar com uma única linha",
"fileTree21": "Quando ativado, o formato JSON de linha única será usado ao salvar documentos .sy e arquivos .json de banco de dados, o que pode reduzir o tamanho do arquivo em cerca de 30% e melhorar a eficiência de leitura/gravação em 50%",
"fileTree22": "Aviso de arquivo grande",
"fileTree23": "Notificar quando arquivos .sy e banco de dados .json excederem este tamanho",
"export10": "Por exemplo <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, se vazio, use texto de marca d'água ou caminho do arquivo de marca d'água.",
"export11": "Método de manipulação de conteúdo do bloco de referência ao exportar",
"export12": "Método de manipulação de conteúdo do bloco incorporado ao exportar",
@ -1173,6 +1187,7 @@
"newFileTip": "Por favor, abra um bloco de notas primeiro",
"copyBlockRef": "Copiar referência de bloco",
"copyBlockEmbed": "Copiar bloco incorporado",
"copyMarkdown": "Copiar como Markdown",
"linkLevel": "Profundidade",
"mark": "Marca",
"splitLR": "Dividir à Direita",
@ -1634,6 +1649,13 @@
"261": "Hoje",
"262": "Amanhã",
"263": "Próximos %d dias",
"264": "O campo [%s] está vazio"
"264": "O campo [%s] está vazio",
"265": "Fora do intervalo",
"266": "Tesseract OCR não está instalado ou configurado, consulte o Guia do Usuário - Seção de Arquivos de Recursos para configuração",
"267": "Banco de dados sem nome",
"268": "Atenção: o arquivo [%s] já excedeu [%d MB], o que pode causar queda de desempenho",
"269": "Este bloco já foi adicionado ao banco de dados [%s]",
"270": "Otimizando o índice de dados, por favor aguarde...",
"271": "Otimização do índice de dados concluída, [%s] de espaço liberado"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "Оптимизация индекса",
"vacuumDataIndexTip": "Проверить индекс данных, освободить место и повысить производительность индекса",
"rebuildDataIndex": "Перестроить индекс",
"rebuildDataIndexTip": "Полная перестройка индекса данных, это может занять некоторое время, пожалуйста, подождите",
"displayFieldName": "Показать имя поля",
"sortBySelectOption": "Сортировать по опции",
"groupStep": "Интервал группировки",
"groupRange": "Диапазон группировки",
"groupMethodDateRelative": "Относительная дата",
"groupMethodDateDay": "День",
"groupMethodDateWeek": "Неделя",
"groupMethodDateMonth": "Месяц",
"groupMethodDateYear": "Год",
"syncColWidth": "Синхронизация ширины столбца",
"groupMethod": "Способ группировки",
"hideEmptyGroup": "Скрыть пустую группу",
"hideEmptyGroup": "Скрыть пустые группы",
"groups": "Группы",
"removeGroup": "Удалить группу",
"contentBlock": "Блок контента",
@ -20,7 +33,7 @@
"small": "Маленький",
"fitImage": "Автоматическая подгонка размера изображения",
"showIcon": "Показать значок",
"showAllFieldsIcon": "Показать значки полей",
"showAllEntriesIcons": "Показать значки записей",
"wrapAllFields": "Автоматический перенос полей",
"gallery": "Карточка",
"newTag": "Новый тег",
@ -129,7 +142,7 @@
"lastReviewTime": "Время последнего обзора",
"cardStatus": "Статус карточки",
"noSupportTip": "Эта функция не поддерживает использование колод карточек",
"insertRowTip": "Новые добавленные строки отфильтрованы. Чтобы увидеть их, отмените фильтрацию/поиск/сортировку",
"insertRowTip": "Новый элемент был отфильтрован, отмените фильтрацию или настройку группировки для просмотра",
"insertPhoto": "Сделать фотографию и вставить её",
"relativeToToday": "Относительно сегодня",
"current": "Этот",
@ -422,7 +435,7 @@
"apiKey": "API ключ",
"apiKeyTip": "Рекомендуется назначить отдельный API ключ для SiYuan для последующего управления. Если этот пункт оставить пустым, функции, связанные с ИИ, будут отключены",
"apiTimeout": "Тайм-аут",
"apiTimeoutTip": "Период времени для инициации запроса, единица: секунда",
"apiTimeoutTip": "Период времени для инициации запроса",
"apiProxy": "Сетевой прокси",
"apiProxyTip": "Сетевой прокси, который инициирует запрос, например, <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "Модель",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "После включения вложенные блоки будут отображать крошки, вложенные блоки в супер блоках игнорируют эту опцию и никогда не показывают крошки",
"appearanceMode": "Режим внешнего вида",
"editReadonly": "Режим только для чтения",
"editReadonlyTip": "После включения редактор загрузит документ в режиме только для чтения",
"editReadonlyTip": "После включения документ будет по умолчанию только для чтения",
"generateConflictDoc": "Создавать документацию конфликтов при возникновении конфликтов синхронизации",
"generateConflictDocTip": "После включения при возникновении конфликта синхронизации будет генерироваться документ конфликта, чтобы его можно было открывать и просматривать напрямую. Независимо от включения или нет, [История данных] зарегистрирует документ конфликта",
"deleteOpConfirm": "⚠️ Подтверждение операции удаления",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "Очистка репозитория данных полностью удалит все нереференсированные снимки и связанные объекты данных, вы уверены, что хотите очистить?",
"purge": "Очистить",
"plsChoose": "Пожалуйста, выберите сначала",
"clearMessage": "Читать",
"freeSub": "Бесплатная пробная подписка",
"sortByUpdateTimeDesc": "По убыванию времени обновления",
"sortByUpdateTimeAsc": "По возрастанию времени обновления",
@ -1122,6 +1134,8 @@
"fileTree19": "Некоторые операционные системы имеют технические ограничения, которые могут препятствовать ручному копированию данных рабочего пространства после создания поддокументов глубже 7 уровней",
"fileTree20": "Сохранять в однострочном формате",
"fileTree21": "После включения однострочный формат JSON будет использоваться при сохранении .sy документов и файлов баз данных .json, что может снизить размер файла примерно на 30% и улучшить эффективность чтения и записи на 50%",
"fileTree22": "Уведомление о большом файле",
"fileTree23": "Появится уведомление, если размер файла .sy или базы данных .json превышает этот предел",
"export10": "Например <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code>, если пусто, использовать текст водяного знака или путь к файлу водяного знака.",
"export11": "Обработка блока ссылок при экспорте",
"export12": "Обработка блока встроенного контента при экспорте",
@ -1173,6 +1187,7 @@
"newFileTip": "Пожалуйста, сначала откройте блокнот",
"copyBlockRef": "Скопировать ссылку на блок",
"copyBlockEmbed": "Скопировать встроенный блок",
"copyMarkdown": "Скопировать как Markdown",
"linkLevel": "Глубина",
"mark": "Значить",
"splitLR": "Разделить направо",
@ -1634,6 +1649,13 @@
"261": "Сегодня",
"262": "Завтра",
"263": "Следующие %d дней",
"264": "Поле [%s] имеет пустое значение"
"264": "Поле [%s] пусто",
"265": "Вне диапазона",
"266": "Tesseract OCR не установлен или не настроен, пожалуйста, обратитесь к Руководству пользователя - Раздел ресурсов для настройки",
"267": "База данных не названа",
"268": "Обратите внимание, что файл [%s] уже превышает [%d МБ], это может привести к снижению производительности",
"269": "Этот блок уже добавлен в базу данных [%s]",
"270": "Оптимизация индекса данных, пожалуйста, подождите...",
"271": "Оптимизация индекса данных завершена, освобождено [%s] дискового пространства"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "優化索引",
"vacuumDataIndexTip": "校驗資料索引,釋放儲存空間並提升索引效能",
"rebuildDataIndex": "重建索引",
"rebuildDataIndexTip": "完全重建資料索引,較為耗時,請耐心等待",
"displayFieldName": "顯示欄位名稱",
"sortBySelectOption": "按選項排序",
"groupStep": "分組間隔",
"groupRange": "分組範圍",
"groupMethodDateRelative": "相對日期",
"groupMethodDateDay": "天",
"groupMethodDateWeek": "週",
"groupMethodDateMonth": "月",
"groupMethodDateYear": "年",
"syncColWidth": "同步列寬",
"groupMethod": "分組方式",
"hideEmptyGroup": "隱藏空白分組",
"hideEmptyGroup": "隱藏無條目分組",
"groups": "分組",
"removeGroup": "移除分組",
"contentBlock": "內容塊",
@ -20,7 +33,7 @@
"small": "小",
"fitImage": "自動調整圖片大小",
"showIcon": "顯示圖標",
"showAllFieldsIcon": "顯示字段圖標",
"showAllEntriesIcons": "顯示條目圖標",
"wrapAllFields": "字段自動換行",
"gallery": "卡片",
"newTag": "新建標籤",
@ -129,7 +142,7 @@
"lastReviewTime": "最後複習時間",
"cardStatus": "卡片狀態",
"noSupportTip": "此功能不支援卡包使用",
"insertRowTip": "新增條目已被過濾,可取消過濾/搜尋/排序進行查看",
"insertRowTip": "新增條目已被過濾,可取消過濾或分組設置後進行查看",
"insertPhoto": "拍照並插入",
"relativeToToday": "相對於今天",
"current": "當前",
@ -422,7 +435,7 @@
"apiKey": "API Key",
"apiKeyTip": "建議為思源單獨分配 API Key 以便於後續管理。該項留空則禁用 AI 相關功能",
"apiTimeout": "超時時間",
"apiTimeoutTip": "發起請求的超時時間,單位:秒",
"apiTimeoutTip": "發起請求的超時時間",
"apiProxy": "網絡代理",
"apiProxyTip": "發起請求的網絡代理,如 <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "模型",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "啟用後嵌入塊將顯示導覽路徑,在超級塊中的嵌入塊忽略該選項,始終不顯示導覽路徑",
"appearanceMode": "外觀模式",
"editReadonly": "只讀模式",
"editReadonlyTip": "啟用後編輯器將以只讀模式載入文檔",
"editReadonlyTip": "啟用後文檔將預設鎖定編輯",
"generateConflictDoc": "同步衝突時生成衝突文檔",
"generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔",
"deleteOpConfirm": "⚠️ Delete operation confirmation",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "清理資料倉庫會徹底刪除所有未引用的快照和相關資料對象,確定進行清理嗎?",
"purge": "清理",
"plsChoose": "請先進行選擇",
"clearMessage": "已讀",
"freeSub": "免費試用訂閱",
"sortByUpdateTimeDesc": "更新時間降序",
"sortByUpdateTimeAsc": "更新時間升序",
@ -1122,6 +1134,8 @@
"fileTree19": "一些操作系統存在技術限制導致建立大於 7 層的子文檔後可能無法正常手動複製工作空間資料",
"fileTree20": "使用單行保存",
"fileTree21": "啟用後儲存 .sy 文件和資料庫 .json 時將使用單行 JSON 格式,大約能減少 30% 檔案大小並提升 50% 讀寫效率",
"fileTree22": "超大檔案提醒",
"fileTree23": ".sy 文件和資料庫 .json 超過該大小時彈出通知提醒",
"export10": "例如 <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code> ,為空時使用水印文字或浮水印檔案路徑。",
"export11": "匯出時關於塊引用內容的處理方式",
"export12": "匯出時關於嵌入塊內容的處理方式",
@ -1173,6 +1187,7 @@
"newFileTip": "請先打開一個筆記本",
"copyBlockRef": "複製為塊引用",
"copyBlockEmbed": "複製為嵌入塊",
"copyMarkdown": "複製為 Markdown",
"linkLevel": "層級",
"mark": "標記",
"splitLR": "向右並排顯示",
@ -1634,6 +1649,13 @@
"261": "今天",
"262": "明天",
"263": "未來 %d 天",
"264": "字段 [%s] 值為空"
"264": "字段 [%s] 為空",
"265": "不在範圍內",
"266": "Tesseract OCR 未安裝或未配置,請參考 用戶指南-資料文件 章節進行配置",
"267": "未命名資料庫",
"268": "請注意該檔案 [%s] 已經超過 [%d MB],可能會導致效能下降",
"269": "該塊已經添加到資料庫 [%s] 中",
"270": "正在優化資料索引,請稍等...",
"271": "資料索引優化完畢,共釋放 [%s] 磁碟空間"
}
}

View file

@ -1,7 +1,20 @@
{
"vacuumDataIndex": "优化索引",
"vacuumDataIndexTip": "校验数据索引,释放存储空间并提升索引性能",
"rebuildDataIndex": "重建索引",
"rebuildDataIndexTip": "完全重建数据索引,较为耗时,请耐心等待",
"displayFieldName": "显示字段名称",
"sortBySelectOption": "按选项排序",
"groupStep": "分组间隔",
"groupRange": "分组范围",
"groupMethodDateRelative": "相对日期",
"groupMethodDateDay": "天",
"groupMethodDateWeek": "周",
"groupMethodDateMonth": "月",
"groupMethodDateYear": "年",
"syncColWidth": "同步列宽",
"groupMethod": "分组方式",
"hideEmptyGroup": "隐藏空白分组",
"hideEmptyGroup": "隐藏无条目分组",
"groups": "分组",
"removeGroup": "移除分组",
"contentBlock": "内容块",
@ -20,7 +33,7 @@
"small": "小",
"fitImage": "自适应图片大小",
"showIcon": "显示图标",
"showAllFieldsIcon": "显示字段图标",
"showAllEntriesIcons": "显示条目图标",
"wrapAllFields": "字段自动换行",
"gallery": "卡片",
"newTag": "新建标签",
@ -129,7 +142,7 @@
"lastReviewTime": "最后复习时间",
"cardStatus": "卡片状态",
"noSupportTip": "该功能不支持卡包使用",
"insertRowTip": "新增条目已被过滤,可取消过滤/搜索/排序进行查看",
"insertRowTip": "新增条目已被过滤,可取消过滤或分组设置后进行查看",
"insertPhoto": "拍照并插入",
"relativeToToday": "相对于今天",
"current": "当前",
@ -422,7 +435,7 @@
"apiKey": "API Key",
"apiKeyTip": "建议为思源单独分配 API Key 以便于后续管理。该项留空则禁用 AI 相关功能",
"apiTimeout": "超时时间",
"apiTimeoutTip": "发起请求的超时时间,单位:秒",
"apiTimeoutTip": "发起请求的超时时间",
"apiProxy": "网络代理",
"apiProxyTip": "发起请求的网络代理,如 <code class='fn__code'>socks://user:pass@127.0.0.1:1080</code>",
"apiModel": "模型",
@ -546,7 +559,7 @@
"embedBlockBreadcrumbTip": "启用后嵌入块将显示面包屑,在超级块中的嵌入块忽略该选项,始终不显示面包屑",
"appearanceMode": "外观模式",
"editReadonly": "只读模式",
"editReadonlyTip": "启用后编辑器将以只读模式载入文档",
"editReadonlyTip": "启用后文档将默认锁定编辑",
"generateConflictDoc": "同步冲突时生成冲突文档",
"generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档",
"deleteOpConfirm": "⚠️ 删除操作确认",
@ -629,7 +642,6 @@
"dataRepoPurgeConfirm": "清理数据仓库会彻底删除所有未引用的快照和相关数据对象,确定进行清理吗?",
"purge": "清理",
"plsChoose": "请先进行选择",
"clearMessage": "已读",
"freeSub": "免费试用订阅",
"sortByUpdateTimeDesc": "更新时间降序",
"sortByUpdateTimeAsc": "更新时间升序",
@ -1122,6 +1134,8 @@
"fileTree19": "一些操作系统存在技术限制导致创建大于 7 层的子文档后可能无法正常手动复制工作空间数据",
"fileTree20": "使用单行保存",
"fileTree21": "启用后保存 .sy 文档和数据库 .json 时将使用单行 JSON 格式,大约能减少 30% 文件大小并提升 50% 读写效率",
"fileTree22": "超大文件提醒",
"fileTree23": ".sy 文档和数据库 .json 超过该大小时弹出通知提醒",
"export10": "例如 <code class='fn__code'>&lt;span style=\"color: #fff;background-color: black;padding: 4px;border-radius: 5px;float:right;\"&gt;SiYuan&lt;/span&gt;</code> ,为空时使用水印文本或水印文件路径。",
"export11": "导出时关于块引用内容的处理方式",
"export12": "导出时关于嵌入块内容的处理方式",
@ -1173,6 +1187,7 @@
"newFileTip": "请先打开一个笔记本",
"copyBlockRef": "复制为块引用",
"copyBlockEmbed": "复制为嵌入块",
"copyMarkdown": "复制为 Markdown",
"linkLevel": "层级",
"mark": "标记",
"splitLR": "向右分屏",
@ -1634,6 +1649,13 @@
"261": "今天",
"262": "明天",
"263": "未来 %d 天",
"264": "字段 [%s] 值为空"
"264": "字段 [%s] 为空",
"265": "不在范围内",
"266": "Tesseract OCR 未安装或未配置,请参考 用户指南-资源文件 章节进行配置",
"267": "未命名数据库",
"268": "请注意该文件 [%s] 已经超过 [%d MB],可能会导致性能下降",
"269": "该块已经添加到数据库 [%s] 中",
"270": "正在优化数据索引,请稍等...",
"271": "数据索引优化完毕,共释放 [%s] 磁盘空间"
}
}

View file

@ -9,7 +9,7 @@
<Identity Name="89C2A984.SiYuan"
ProcessorArchitecture="x64"
Publisher="CN=087C656E-C1D9-42D8-8807-CED45A74FC0F"
Version="3.2.1.0"/>
Version="3.3.0.0"/>
<Properties>
<DisplayName>SiYuan</DisplayName>
<PublisherDisplayName>云南链滴科技有限公司</PublisherDisplayName>

View file

@ -0,0 +1,93 @@
## Overview
This version supports database grouping by field and improves many details.
Please note:
* Old versions cannot open new version databases. If you installed the mobile version from a store, it is recommended to wait for the new version to be available in the store before updating the desktop version
* The multi-select field value of the database template has changed from a string to a string array. Please refer to [here](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948) for adaptation
## Changelogs
Below are the detailed changes in this version.
### Feature
* [Database grouping by field](https://github.com/siyuan-note/siyuan/issues/10964)
### Enhancement
* [Improve `Add to Database`](https://github.com/siyuan-note/siyuan/issues/10659)
* [Improve database field default filling](https://github.com/siyuan-note/siyuan/issues/11966)
* [The database rollup field supports using the template field](https://github.com/siyuan-note/siyuan/issues/12384)
* [Display title when flashcard is a document](https://github.com/siyuan-note/siyuan/issues/14201)
* [Improve the database block binding](https://github.com/siyuan-note/siyuan/issues/14511)
* [Improve export preview mode CSS variable value filling](https://github.com/siyuan-note/siyuan/pull/15110)
* [Card view supports displaying field names](https://github.com/siyuan-note/siyuan/issues/15180)
* [Improve document title carriage return processing](https://github.com/siyuan-note/siyuan/issues/15294)
* [Improve pasting performance for large amounts of content](https://github.com/siyuan-note/siyuan/issues/15306)
* [Improve the line number display when custom code block](https://github.com/siyuan-note/siyuan/pull/15324)
* [Improve data sync to avoid conflicts caused by folding block](https://github.com/siyuan-note/siyuan/issues/15329)
* [Deleting a block no longer adds an empty block to the beginning of the doc in some cases](https://github.com/siyuan-note/siyuan/issues/15336)
* [Improve template search highlighting](https://github.com/siyuan-note/siyuan/issues/15338)
* [Export preview mode supports focus use](https://github.com/siyuan-note/siyuan/issues/15340)
* [Code blocks retain attributes when exporting preview](https://github.com/siyuan-note/siyuan/issues/15343)
* [Support code block highlighting template syntax and export code block templates as paragraphs](https://github.com/siyuan-note/siyuan/pull/15345)
* [`Re OCR` popup prompt when Tesseract is not enabled](https://github.com/siyuan-note/siyuan/issues/15367)
* [Improve `<br>` input parsing](https://github.com/siyuan-note/siyuan/issues/15373)
* [Update plugins of highlight.js](https://github.com/siyuan-note/siyuan/pull/15386)
* [Improve card view display](https://github.com/siyuan-note/siyuan/issues/15389)
* [Improve the status bar index creation information prompt](https://github.com/siyuan-note/siyuan/issues/15390)
* [Improve search for emojis in tags](https://github.com/siyuan-note/siyuan/issues/15391)
* [Document supports copying as Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
* [The database rollup field supports duplicating as a copy](https://github.com/siyuan-note/siyuan/issues/15417)
* [Improve HTML clipping](https://github.com/siyuan-note/siyuan/issues/15438)
* [Alert users when .sy file or database .json exceed 8MB](https://github.com/siyuan-note/siyuan/issues/15451)
* [Limit the database title to 512 characters](https://github.com/siyuan-note/siyuan/issues/15459)
* [`Upload asset files to cloud` supports focus use](https://github.com/siyuan-note/siyuan/issues/15462)
* [Improve the style of exporting PDF](https://github.com/siyuan-note/siyuan/pull/15463)
* [Parse `<img>` tags when pasting](https://github.com/siyuan-note/siyuan/issues/15464)
* [The database template field supports using other template fields](https://github.com/siyuan-note/siyuan/issues/15517)
* [Improve database `Drag vertically to fill value`](https://github.com/siyuan-note/siyuan/issues/15518)
* [Tab switching improvements](https://github.com/siyuan-note/siyuan/issues/15546)
* [Filter hidden columns when browsing the current view image of a database table](https://github.com/siyuan-note/siyuan/pull/15548)
* [Database drag and drop, performance and interaction optimization](https://github.com/siyuan-note/siyuan/issues/15552)
* [Remove highlighting when database filter conditions do not perform filter calculations](https://github.com/siyuan-note/siyuan/issues/15558)
* [Improve database template field to use multiple-select field](https://github.com/siyuan-note/siyuan/issues/15575)
* [Improve parsing `<img>` tags when importing](https://github.com/siyuan-note/siyuan/issues/15638)
* [The database rollup field supports using the updated/created field](https://github.com/siyuan-note/siyuan/issues/15662)
* [Manually optimize the data index to reduce space usage and improve performance](https://github.com/siyuan-note/siyuan/issues/15663)
* [Improved database attribute panel](https://github.com/siyuan-note/siyuan/issues/15664)
* [Improve focus positioning when exiting folded blocks](https://github.com/siyuan-note/siyuan/issues/15670)
### Bugfix
* [Database select fields will lose options if options are added too quickly](https://github.com/siyuan-note/siyuan/issues/13261)
* [Inline formulas are not rendered when superblock is canceled](https://github.com/siyuan-note/siyuan/issues/15341)
* [Dragging a file from the assets folder into the editor causes the kernel to exit](https://github.com/siyuan-note/siyuan/issues/15355)
* [The tray is generated repeatedly after the new window is locked and then entered](https://github.com/siyuan-note/siyuan/issues/15357)
* [Find-replace incorrectly converts tags to text](https://github.com/siyuan-note/siyuan/issues/15372)
* [The insertion position is wrong after converting the list to paragraph block in the floating window](https://github.com/siyuan-note/siyuan/issues/15396)
* [Formula-related editor status abnormal](https://github.com/siyuan-note/siyuan/issues/15554)
* [Incorrect results for database rollup field filtering](https://github.com/siyuan-note/siyuan/issues/15608)
### Refactor
* [Upgrade to Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
### Development
* [Add plugin function `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
* [Add plugin function `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
* [Add parameter `imgTag` for kernel API `exportMdContent` and `copyStdMarkdown`](https://github.com/siyuan-note/siyuan/issues/15454)
* [Adjust `addTopBar` and `addStatusBar` from `onload` lifecycle to `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
* [Add plugin function `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
* [Add plugin event bus `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
* [`/api/block/getBlockKramdown` link/image URLs are no longer encoded with spaces](https://github.com/siyuan-note/siyuan/issues/15611)
* [Improve kernel API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
* [Add plugin function `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
## Download
* [B3log](https://b3log.org/siyuan/en/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,93 @@
## 概述
該版本支援了資料庫按字段分組並改進了大量細節。
請注意:
* 舊版無法開啟新版的資料庫,如果你使用的行動端是在商店安裝的,建議等商店上架新版本後再更新桌面端
* 資料庫範本的多選欄位值從字串變更為字串數組,請參考[這裡](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948)進行適配
## 變更記錄
以下是此版本中的詳細變更。
### 引入特性
* [資料庫依欄位分組](https://github.com/siyuan-note/siyuan/issues/10964)
### 改進功能
* [改進「加入資料庫」](https://github.com/siyuan-note/siyuan/issues/10659)
* [改進資料庫欄位預設填入](https://github.com/siyuan-note/siyuan/issues/11966)
* [資料庫匯總欄位支援使用範本欄位](https://github.com/siyuan-note/siyuan/issues/12384)
* [閃卡為文件時顯示標題](https://github.com/siyuan-note/siyuan/issues/14201)
* [改進資料庫區塊綁定](https://github.com/siyuan-note/siyuan/issues/14511)
* [改進匯出預覽模式 CSS 變數值填色](https://github.com/siyuan-note/siyuan/pull/15110)
* [卡片視圖支援顯示欄位名稱](https://github.com/siyuan-note/siyuan/issues/15180)
* [改進文件標題回車處理](https://github.com/siyuan-note/siyuan/issues/15294)
* [提升大量內容貼上效能](https://github.com/siyuan-note/siyuan/issues/15306)
* [改進自訂程式碼區塊行號顯示](https://github.com/siyuan-note/siyuan/pull/15324)
* [改善資料同步,避免因折疊塊導致的衝突](https://github.com/siyuan-note/siyuan/issues/15329)
* [刪除區塊時在某些情況下不再在文件開頭新增空區塊](https://github.com/siyuan-note/siyuan/issues/15336)
* [改進範本搜尋高亮](https://github.com/siyuan-note/siyuan/issues/15338)
* [匯出預覽模式支援聚焦使用](https://github.com/siyuan-note/siyuan/issues/15340)
* [匯出預覽時程式碼區塊保留屬性](https://github.com/siyuan-note/siyuan/issues/15343)
* [支援程式碼區塊高亮模板語法並將程式碼區塊範本匯出為段落](https://github.com/siyuan-note/siyuan/pull/15345)
* [「重新 OCR」在 Tesseract 未啟用時彈出視窗提示](https://github.com/siyuan-note/siyuan/issues/15367)
* [改進 `<br>` 輸入解析](https://github.com/siyuan-note/siyuan/issues/15373)
* [更新 highlight.js 插件](https://github.com/siyuan-note/siyuan/pull/15386)
* [改進卡片視圖顯示](https://github.com/siyuan-note/siyuan/issues/15389)
* [改進狀態列索引建立資訊提示](https://github.com/siyuan-note/siyuan/issues/15390)
* [改進標籤中表情符號的搜尋](https://github.com/siyuan-note/siyuan/issues/15391)
* [文件支援複製為 Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
* [資料庫匯總欄位支援複製為副本](https://github.com/siyuan-note/siyuan/issues/15417)
* [改進 HTML 剪藏](https://github.com/siyuan-note/siyuan/issues/15438)
* [當 .sy 檔案或資料庫 .json 超過 8MB 時提醒使用者](https://github.com/siyuan-note/siyuan/issues/15451)
* [限制資料庫標題為 512 個字元](https://github.com/siyuan-note/siyuan/issues/15459)
* [「上傳資源檔案到雲端」支援聚焦使用](https://github.com/siyuan-note/siyuan/issues/15462)
* [改進匯出 PDF 樣式](https://github.com/siyuan-note/siyuan/pull/15463)
* [貼上時解析 `<img>` 標籤](https://github.com/siyuan-note/siyuan/issues/15464)
* [資料庫範本欄位支援使用其他範本欄位](https://github.com/siyuan-note/siyuan/issues/15517)
* [改進資料庫「垂直拖曳填充值」](https://github.com/siyuan-note/siyuan/issues/15518)
* [標籤頁切換改進](https://github.com/siyuan-note/siyuan/issues/15546)
* [瀏覽資料庫表格目前視圖圖片時過濾隱藏列](https://github.com/siyuan-note/siyuan/pull/15548)
* [資料庫拖曳、效能與互動最佳化](https://github.com/siyuan-note/siyuan/issues/15552)
* [資料庫篩選條件未進行篩選計算時移除高亮](https://github.com/siyuan-note/siyuan/issues/15558)
* [改進資料庫範本欄位使用多重選取欄位](https://github.com/siyuan-note/siyuan/issues/15575)
* [改進導入時 `<img>` 標籤解析](https://github.com/siyuan-note/siyuan/issues/15638)
* [資料庫匯總欄位支援使用更新時間/建立時間欄位](https://github.com/siyuan-note/siyuan/issues/15662)
* [手動最佳化資料索引以減少空間佔用並提升效能](https://github.com/siyuan-note/siyuan/issues/15663)
* [改進資料庫屬性面板](https://github.com/siyuan-note/siyuan/issues/15664)
* [退出折疊塊時改進聚焦定位](https://github.com/siyuan-note/siyuan/issues/15670)
### 修復缺陷
* [資料庫選擇欄位若新增選項過快會遺失選項](https://github.com/siyuan-note/siyuan/issues/13261)
* [取消超級區塊時行內公式未渲染](https://github.com/siyuan-note/siyuan/issues/15341)
* [從資源資料夾拖曳檔案到編輯器導致內核退出](https://github.com/siyuan-note/siyuan/issues/15355)
* [新視窗鎖定後再進入會重複產生托盤](https://github.com/siyuan-note/siyuan/issues/15357)
* [尋找替換會錯誤地將標籤轉換為文字](https://github.com/siyuan-note/siyuan/issues/15372)
* [浮窗中將清單轉為段落區塊後插入位置錯誤](https://github.com/siyuan-note/siyuan/issues/15396)
* [公式相關編輯器狀態異常](https://github.com/siyuan-note/siyuan/issues/15554)
* [資料庫匯總欄位篩選結果不正確](https://github.com/siyuan-note/siyuan/issues/15608)
### 開發重構
* [升級至 Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
### 開發者
* [新增外掛程式 `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
* [新增外掛程式 `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
* [內核 API `exportMdContent` 和 `copyStdMarkdown` 新增參數 `imgTag`](https://github.com/siyuan-note/siyuan/issues/15454)
* [將 `addTopBar` 和 `addStatusBar` 從 `onload` 生命週期調整到 `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
* [新增外掛程式 `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
* [新增外掛事件匯流排 `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
* [`/api/block/getBlockKramdown` 連結/圖片 URL 不再用空格編碼](https://github.com/siyuan-note/siyuan/issues/15611)
* [改進內核 API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
* [新增外掛程式 `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
## 下載
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -0,0 +1,93 @@
## 概述
该版本支持了数据库按字段分组并改进了大量细节。
请注意:
* 旧版本无法打开新版本的数据库,如果你使用的移动端是在商店安装的,建议等商店上架新版本后再更新桌面端
* 数据库模板的多选字段值从字符串变更为字符串数组,请参考[这里](https://github.com/siyuan-note/siyuan/issues/15575#issuecomment-3210963948)进行适配
## 变更记录
以下是此版本中的详细变更。
### 引入特性
* [数据库按字段分组](https://github.com/siyuan-note/siyuan/issues/10964)
### 改进功能
* [改进“添加到数据库”](https://github.com/siyuan-note/siyuan/issues/10659)
* [改进数据库字段默认填充](https://github.com/siyuan-note/siyuan/issues/11966)
* [数据库汇总字段支持使用模板字段](https://github.com/siyuan-note/siyuan/issues/12384)
* [闪卡为文档时显示标题](https://github.com/siyuan-note/siyuan/issues/14201)
* [改进数据库块绑定](https://github.com/siyuan-note/siyuan/issues/14511)
* [改进导出预览模式 CSS 变量值填充](https://github.com/siyuan-note/siyuan/pull/15110)
* [卡片视图支持显示字段名](https://github.com/siyuan-note/siyuan/issues/15180)
* [改进文档标题回车处理](https://github.com/siyuan-note/siyuan/issues/15294)
* [提升大量内容粘贴性能](https://github.com/siyuan-note/siyuan/issues/15306)
* [改进自定义代码块行号显示](https://github.com/siyuan-note/siyuan/pull/15324)
* [改进数据同步,避免因折叠块导致的冲突](https://github.com/siyuan-note/siyuan/issues/15329)
* [删除块时在某些情况下不再在文档开头添加空块](https://github.com/siyuan-note/siyuan/issues/15336)
* [改进模板搜索高亮](https://github.com/siyuan-note/siyuan/issues/15338)
* [导出预览模式支持聚焦使用](https://github.com/siyuan-note/siyuan/issues/15340)
* [导出预览时代码块保留属性](https://github.com/siyuan-note/siyuan/issues/15343)
* [支持代码块高亮模板语法并将代码块模板导出为段落](https://github.com/siyuan-note/siyuan/pull/15345)
* [“重新 OCR”在 Tesseract 未启用时弹窗提示](https://github.com/siyuan-note/siyuan/issues/15367)
* [改进 `<br>` 输入解析](https://github.com/siyuan-note/siyuan/issues/15373)
* [更新 highlight.js 插件](https://github.com/siyuan-note/siyuan/pull/15386)
* [改进卡片视图显示](https://github.com/siyuan-note/siyuan/issues/15389)
* [改进状态栏索引创建信息提示](https://github.com/siyuan-note/siyuan/issues/15390)
* [改进标签中表情符号的搜索](https://github.com/siyuan-note/siyuan/issues/15391)
* [文档支持复制为 Markdown](https://github.com/siyuan-note/siyuan/pull/15397)
* [数据库汇总字段支持复制为副本](https://github.com/siyuan-note/siyuan/issues/15417)
* [改进 HTML 剪藏](https://github.com/siyuan-note/siyuan/issues/15438)
* [当 .sy 文件或数据库 .json 超过 8MB 时提醒用户](https://github.com/siyuan-note/siyuan/issues/15451)
* [限制数据库标题为 512 个字符](https://github.com/siyuan-note/siyuan/issues/15459)
* [“上传资源文件到云端”支持聚焦使用](https://github.com/siyuan-note/siyuan/issues/15462)
* [改进导出 PDF 样式](https://github.com/siyuan-note/siyuan/pull/15463)
* [粘贴时解析 `<img>` 标签](https://github.com/siyuan-note/siyuan/issues/15464)
* [数据库模板字段支持使用其他模板字段](https://github.com/siyuan-note/siyuan/issues/15517)
* [改进数据库“垂直拖动填充值”](https://github.com/siyuan-note/siyuan/issues/15518)
* [标签页切换改进](https://github.com/siyuan-note/siyuan/issues/15546)
* [浏览数据库表当前视图图片时过滤隐藏列](https://github.com/siyuan-note/siyuan/pull/15548)
* [数据库拖拽、性能与交互优化](https://github.com/siyuan-note/siyuan/issues/15552)
* [数据库筛选条件未进行筛选计算时移除高亮](https://github.com/siyuan-note/siyuan/issues/15558)
* [改进数据库模板字段使用多选字段](https://github.com/siyuan-note/siyuan/issues/15575)
* [改进导入时 `<img>` 标签解析](https://github.com/siyuan-note/siyuan/issues/15638)
* [数据库汇总字段支持使用更新时间/创建时间字段](https://github.com/siyuan-note/siyuan/issues/15662)
* [手动优化数据索引以减少空间占用并提升性能](https://github.com/siyuan-note/siyuan/issues/15663)
* [改进数据库属性面板](https://github.com/siyuan-note/siyuan/issues/15664)
* [退出折叠块时改进聚焦定位](https://github.com/siyuan-note/siyuan/issues/15670)
### 修复缺陷
* [数据库选择字段若添加选项过快会丢失选项](https://github.com/siyuan-note/siyuan/issues/13261)
* [取消超级块时行内公式未渲染](https://github.com/siyuan-note/siyuan/issues/15341)
* [从资源文件夹拖动文件到编辑器导致内核退出](https://github.com/siyuan-note/siyuan/issues/15355)
* [新窗口锁定后再进入会重复生成托盘](https://github.com/siyuan-note/siyuan/issues/15357)
* [查找替换会错误地将标签转换为文本](https://github.com/siyuan-note/siyuan/issues/15372)
* [浮窗中将列表转为段落块后插入位置错误](https://github.com/siyuan-note/siyuan/issues/15396)
* [公式相关编辑器状态异常](https://github.com/siyuan-note/siyuan/issues/15554)
* [数据库汇总字段筛选结果不正确](https://github.com/siyuan-note/siyuan/issues/15608)
### 开发重构
* [升级至 Electron v37.3.1](https://github.com/siyuan-note/siyuan/issues/15410)
### 开发者
* [新增插件函数 `IProtyleOptions.handleEmptyContent`](https://github.com/siyuan-note/siyuan/issues/15398)
* [新增插件函数 `getActiveTab`](https://github.com/siyuan-note/siyuan/issues/15415)
* [内核 API `exportMdContent` 和 `copyStdMarkdown` 新增参数 `imgTag`](https://github.com/siyuan-note/siyuan/issues/15454)
* [将 `addTopBar` 和 `addStatusBar` 从 `onload` 生命周期调整到 `onLayoutReady`](https://github.com/siyuan-note/siyuan/issues/15455)
* [新增插件函数 `hideMessage`](https://github.com/siyuan-note/siyuan/issues/15485)
* [新增插件事件总线 `switch-protyle-mode`](https://github.com/siyuan-note/siyuan/issues/15516)
* [`/api/block/getBlockKramdown` 链接/图片 URL 不再用空格编码](https://github.com/siyuan-note/siyuan/issues/15611)
* [改进内核 API `/api/filetree/moveDocsByID`](https://github.com/siyuan-note/siyuan/issues/15616)
* [新增插件函数 `getActiveEditor`](https://github.com/siyuan-note/siyuan/issues/15641)
## 下载
* [B3log](https://b3log.org/siyuan/download.html)
* [GitHub](https://github.com/siyuan-note/siyuan/releases)

View file

@ -678,6 +678,10 @@ for (let i = argStart; i < process.argv.length; i++) {
app.whenReady().then(() => {
const resetTrayMenu = (tray, lang, mainWindow) => {
if (!mainWindow || mainWindow.isDestroyed()) {
return;
}
const trayMenuTemplate = [{
label: mainWindow.isVisible() ? lang.hideWindow : lang.showWindow, click: () => {
showHideWindow(tray, lang, mainWindow);
@ -726,6 +730,10 @@ app.whenReady().then(() => {
}
};
const showHideWindow = (tray, lang, mainWindow) => {
if (!mainWindow || mainWindow.isDestroyed()) {
return;
}
if (!mainWindow.isVisible()) {
if (mainWindow.isMinimized()) {
mainWindow.restore();
@ -1113,23 +1121,24 @@ app.whenReady().then(() => {
if (exitWS) {
return;
}
let tray;
if ("win32" === process.platform || "linux" === process.platform) {
// 系统托盘
tray = new Tray(path.join(appDir, "stage", "icon-large.png"));
tray.setToolTip(`${path.basename(data.workspaceDir)} - SiYuan v${appVer}`);
const mainWindow = getWindowByContentId(event.sender.id);
if (!mainWindow) {
return;
}
resetTrayMenu(tray, data.languages, mainWindow);
tray.on("click", () => {
showHideWindow(tray, data.languages, mainWindow);
});
}
workspaces.find(item => {
if (!item.workspaceDir) {
item.workspaceDir = data.workspaceDir;
let tray;
if ("win32" === process.platform || "linux" === process.platform) {
// 系统托盘
tray = new Tray(path.join(appDir, "stage", "icon-large.png"));
tray.setToolTip(`${path.basename(data.workspaceDir)} - SiYuan v${appVer}`);
const mainWindow = getWindowByContentId(event.sender.id);
if (!mainWindow || mainWindow.isDestroyed()) {
return;
}
resetTrayMenu(tray, data.languages, mainWindow);
tray.on("click", () => {
showHideWindow(tray, data.languages, mainWindow);
});
}
item.tray = tray;
return true;
}

View file

@ -6,7 +6,7 @@
"id": "20201204184532-3qm9l8n",
"title": "Template snippet",
"type": "doc",
"updated": "20250331163727"
"updated": "20250801152837"
},
"Children": [
{
@ -57,7 +57,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20210104091444-jy56z0p",
"updated": "20250331163727"
"updated": "20250801152821"
},
"Children": [
{
@ -215,7 +215,7 @@
"ListData": {},
"Properties": {
"id": "20210104091444-mwbvc9m",
"updated": "20250331163727"
"updated": "20250801152821"
},
"Children": [
{
@ -421,7 +421,7 @@
},
"Properties": {
"id": "20210121193829-wfzsf6m",
"updated": "20250331163727"
"updated": "20250801152749"
},
"Children": [
{
@ -454,7 +454,7 @@
"Properties": {
"id": "20241213215602-dk7iion",
"style": "line-height: 22px;",
"updated": "20250331163727"
"updated": "20250801152749"
},
"Children": [
{
@ -462,11 +462,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{$today := now | date \"20060102150405\"}\n.action{$blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\"}\n"
"Data": ".action{ $today := now | date \"20060102150405\" }\n.action{ $blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -485,7 +486,7 @@
},
"Properties": {
"id": "20250331163529-vixv1we",
"updated": "20250331163604"
"updated": "20250801152801"
},
"Children": [
{
@ -517,7 +518,7 @@
"IsFencedCodeBlock": true,
"Properties": {
"id": "20250331163550-2r69a54",
"updated": "20250331163604"
"updated": "20250801152801"
},
"Children": [
{
@ -525,11 +526,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{getBlock \"20250331163529-vixv1we\"}\n"
"Data": ".action{ getBlock \"20250331163529-vixv1we\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -548,7 +550,7 @@
},
"Properties": {
"id": "20210504093232-vukp34t",
"updated": "20241224162810"
"updated": "20250801152807"
},
"Children": [
{
@ -581,7 +583,7 @@
"Properties": {
"id": "20241213215606-a1mq6zf",
"style": "line-height: 22px;",
"updated": "20241224162810"
"updated": "20250801152807"
},
"Children": [
{
@ -589,11 +591,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySpans \"SELECT * FROM spans LIMIT ?\" \"3\"}\n"
"Data": ".action{ querySpans \"SELECT * FROM spans LIMIT ?\" \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -612,7 +615,7 @@
},
"Properties": {
"id": "20241213214939-he4wmcd",
"updated": "20241213214939"
"updated": "20250801152813"
},
"Children": [
{
@ -645,7 +648,7 @@
"Properties": {
"id": "20241213215554-rox3jk7",
"style": "line-height: 22px;",
"updated": "20241213215554"
"updated": "20250801152813"
},
"Children": [
{
@ -653,11 +656,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySQL \"SELECT * FROM refs LIMIT 3\"}\n"
"Data": ".action{ querySQL \"SELECT * FROM refs LIMIT 3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -676,7 +680,7 @@
},
"Properties": {
"id": "20241212102027-j293sei",
"updated": "20241213215714"
"updated": "20250801152821"
},
"Children": [
{
@ -709,7 +713,7 @@
"Properties": {
"id": "20241213215714-u0j3i4k",
"style": "line-height: 22px;",
"updated": "20241213215714"
"updated": "20250801152821"
},
"Children": [
{
@ -717,11 +721,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -1411,7 +1416,8 @@
"Type": "NodeHeading",
"HeadingLevel": 2,
"Properties": {
"id": "20210104091444-xz57sof"
"id": "20210104091444-xz57sof",
"updated": "20250801152837"
},
"Children": [
{
@ -1428,36 +1434,26 @@
"ID": "20210104091444-cclnk66",
"Type": "NodeCodeBlock",
"IsFencedCodeBlock": true,
"CodeBlockFenceChar": 96,
"CodeBlockFenceLen": 3,
"CodeBlockOpenFence": "YGBg",
"CodeBlockInfo": "cGxhaW50ZXh0",
"CodeBlockCloseFence": "YGBg",
"Properties": {
"id": "20210104091444-cclnk66"
"id": "20210104091444-cclnk66",
"updated": "20250801152837"
},
"Children": [
{
"Type": "NodeCodeBlockFenceOpenMarker",
"Data": "```",
"CodeBlockFenceLen": 3
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "cGxhaW50ZXh0"
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"ID": "20220307092214-3y1eex2",
"Type": "NodeCodeBlockCode",
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\nToday is `.action{now | date \"2006-01-02\"}`.\n\n* `.action{$before}` days have passed since `2020-02-19`\n* There are `.action{$after}` days left from `2048-02-19`\n",
"Properties": {
"id": "20220307092214-3y1eex2"
}
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\nToday is `.action{ now | date \"2006-01-02\" }`.\n\n* `.action{ $before }` days have passed since `2020-02-19`\n* There are `.action{ $after }` days left from `2048-02-19`\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
"Data": "```",
"CodeBlockFenceLen": 3
"Data": "```"
}
]
},

View file

@ -7,7 +7,7 @@
"id": "20230405172236-pg3l9eu",
"title": "Performance Optimization",
"type": "doc",
"updated": "20240420104851"
"updated": "20250825114750"
},
"Children": [
{
@ -379,7 +379,7 @@
"HeadingLevel": 3,
"Properties": {
"id": "20230405172238-v4hbjbe",
"updated": "20230405172238"
"updated": "20250825114750"
},
"Children": [
{
@ -637,6 +637,62 @@
]
}
]
},
{
"ID": "20250825114750-j9t49j2",
"Type": "NodeHeading",
"HeadingLevel": 3,
"Properties": {
"id": "20250825114750-j9t49j2",
"updated": "20250825114750"
},
"Children": [
{
"Type": "NodeText",
"Data": "Optimizing the Index"
}
]
},
{
"ID": "20250825114750-qtm8i82",
"Type": "NodeParagraph",
"Properties": {
"id": "20250825114750-qtm8i82",
"updated": "20250825114750"
},
"Children": [
{
"Type": "NodeText",
"Data": "It is recommended to regularly optimize the index by going to "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "Settings"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "About"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "Optimize Index"
},
{
"Type": "NodeText",
"Data": "."
}
]
}
]
}

View file

@ -6,7 +6,7 @@
"id": "20201204181006-7bkppue",
"title": "模板片段",
"type": "doc",
"updated": "20250331163228"
"updated": "20250801152724"
},
"Children": [
{
@ -69,7 +69,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20210104091309-fhb549c",
"updated": "20250331163228"
"updated": "20250801152510"
},
"Children": [
{
@ -237,7 +237,7 @@
"ListData": {},
"Properties": {
"id": "20210104091309-gjkg3u5",
"updated": "20250331163228"
"updated": "20250801152510"
},
"Children": [
{
@ -443,7 +443,7 @@
},
"Properties": {
"id": "20210121193601-uwo8s5h",
"updated": "20250331163052"
"updated": "20250801152331"
},
"Children": [
{
@ -476,7 +476,7 @@
"Properties": {
"id": "20210604111446-p6vadfc",
"style": "line-height: 22px;",
"updated": "20250331163052"
"updated": "20250801152331"
},
"Children": [
{
@ -484,11 +484,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{$today := now | date \"20060102150405\"}\n.action{$blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\"}\n"
"Data": ".action{ $today := now | date \"20060102150405\" }\n.action{ $blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -507,7 +508,7 @@
},
"Properties": {
"id": "20250331162928-53comqi",
"updated": "20250331163228"
"updated": "20250801152339"
},
"Children": [
{
@ -539,7 +540,7 @@
"IsFencedCodeBlock": true,
"Properties": {
"id": "20250331163038-6j2ttlc",
"updated": "20250331163228"
"updated": "20250801152339"
},
"Children": [
{
@ -547,11 +548,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{getBlock \"20250331162928-53comqi\"}\n"
"Data": ".action{ getBlock \"20250331162928-53comqi\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -570,7 +572,7 @@
},
"Properties": {
"id": "20210504093313-4aoyxd0",
"updated": "20241224162826"
"updated": "20250801152509"
},
"Children": [
{
@ -603,7 +605,7 @@
"Properties": {
"id": "20241213215337-rhkoc8k",
"style": "line-height: 22px;",
"updated": "20241224162826"
"updated": "20250801152509"
},
"Children": [
{
@ -611,11 +613,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySpans \"SELECT * FROM spans LIMIT ?\" \"3\"}\n"
"Data": ".action{ querySpans \"SELECT * FROM spans LIMIT ?\" \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -634,7 +637,7 @@
},
"Properties": {
"id": "20241213214733-ro4xcjm",
"updated": "20241213215421"
"updated": "20250801152510"
},
"Children": [
{
@ -667,7 +670,7 @@
"Properties": {
"id": "20241213215240-f33bsqs",
"style": "line-height: 22px;",
"updated": "20241213215421"
"updated": "20250801152510"
},
"Children": [
{
@ -675,11 +678,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySQL \"SELECT * FROM refs LIMIT 3\"}\n"
"Data": ".action{ querySQL \"SELECT * FROM refs LIMIT 3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -698,7 +702,7 @@
},
"Properties": {
"id": "20241212101708-0euo6is",
"updated": "20241213215655"
"updated": "20250801152415"
},
"Children": [
{
@ -731,7 +735,7 @@
"Properties": {
"id": "20241212101810-6ffociu",
"style": "line-height: 22px;",
"updated": "20241213215655"
"updated": "20250801152415"
},
"Children": [
{
@ -739,11 +743,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -1433,7 +1438,8 @@
"Type": "NodeHeading",
"HeadingLevel": 2,
"Properties": {
"id": "20210104091309-2p68yju"
"id": "20210104091309-2p68yju",
"updated": "20250801152724"
},
"Children": [
{
@ -1450,36 +1456,26 @@
"ID": "20210104091309-9ppkq6j",
"Type": "NodeCodeBlock",
"IsFencedCodeBlock": true,
"CodeBlockFenceChar": 96,
"CodeBlockFenceLen": 3,
"CodeBlockOpenFence": "YGBg",
"CodeBlockInfo": "cGxhaW50ZXh0",
"CodeBlockCloseFence": "YGBg",
"Properties": {
"id": "20210104091309-9ppkq6j"
"id": "20210104091309-9ppkq6j",
"updated": "20250801152724"
},
"Children": [
{
"Type": "NodeCodeBlockFenceOpenMarker",
"Data": "```",
"CodeBlockFenceLen": 3
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "cGxhaW50ZXh0"
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"ID": "20220307091943-k77h7sb",
"Type": "NodeCodeBlockCode",
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今天是 `.action{now | date \"2006-01-02\"}`。\n\n* 距离 `2020-02-19` 已经过去 `.action{$before}` 天\n* 距离 `2048-02-19` 还剩 `.action{$after}` 天\n",
"Properties": {
"id": "20220307091943-k77h7sb"
}
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今天是 `.action{ now | date \"2006-01-02\" }`。\n\n* 距离 `2020-02-19` 已经过去 `.action{ $before }` 天\n* 距离 `2048-02-19` 还剩 `.action{ $after }` 天\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
"Data": "```",
"CodeBlockFenceLen": 3
"Data": "```"
}
]
},

View file

@ -7,7 +7,7 @@
"id": "20230405155631-leo4vc6",
"title": "性能优化",
"type": "doc",
"updated": "20240420104842"
"updated": "20250825114628"
},
"Children": [
{
@ -375,7 +375,7 @@
"HeadingLevel": 3,
"Properties": {
"id": "20230405171407-ltaakx8",
"updated": "20230405171419"
"updated": "20250825114421"
},
"Children": [
{
@ -633,6 +633,62 @@
]
}
]
},
{
"ID": "20250825114421-fq73tbi",
"Type": "NodeHeading",
"HeadingLevel": 3,
"Properties": {
"id": "20250825114421-fq73tbi",
"updated": "20250825114628"
},
"Children": [
{
"Type": "NodeText",
"Data": "优化索引"
}
]
},
{
"ID": "20250825114436-jm8dekc",
"Type": "NodeParagraph",
"Properties": {
"id": "20250825114436-jm8dekc",
"updated": "20250825114628"
},
"Children": [
{
"Type": "NodeText",
"Data": "建议定期执行优化索引 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "设置"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "关于"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "优化索引"
},
{
"Type": "NodeText",
"Data": "​。"
}
]
}
]
}

View file

@ -6,7 +6,7 @@
"id": "20211226123004-dplpw0o",
"title": "範本片段",
"type": "doc",
"updated": "20250331163725"
"updated": "20250801152721"
},
"Children": [
{
@ -53,7 +53,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20211226123024-eyagqur",
"updated": "20250331163725"
"updated": "20250801152602"
},
"Children": [
{
@ -208,7 +208,7 @@
"ListData": {},
"Properties": {
"id": "20211226123024-pjvw31z",
"updated": "20250331163725"
"updated": "20250801152602"
},
"Children": [
{
@ -414,7 +414,7 @@
},
"Properties": {
"id": "20211226123024-e42d7xq",
"updated": "20250331163725"
"updated": "20250801152535"
},
"Children": [
{
@ -447,7 +447,7 @@
"Properties": {
"id": "20241213215519-mfgruqs",
"style": "line-height: 22px;",
"updated": "20250331163725"
"updated": "20250801152535"
},
"Children": [
{
@ -455,11 +455,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{$today := now | date \"20060102150405\"}\n.action{$blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\"}\n"
"Data": ".action{ $today := now | date \"20060102150405\" }\n.action{ $blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -478,7 +479,7 @@
},
"Properties": {
"id": "20250331163425-s5u08ng",
"updated": "20250331163515"
"updated": "20250801152542"
},
"Children": [
{
@ -510,7 +511,7 @@
"IsFencedCodeBlock": true,
"Properties": {
"id": "20250331163435-irjmxt9",
"updated": "20250331163452"
"updated": "20250801152542"
},
"Children": [
{
@ -518,11 +519,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{getBlock \"20250331163425-s5u08ng\"}\n"
"Data": ".action{ getBlock \"20250331163425-s5u08ng\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -541,7 +543,7 @@
},
"Properties": {
"id": "20211226123024-69kddle",
"updated": "20241224162821"
"updated": "20250801152548"
},
"Children": [
{
@ -574,7 +576,7 @@
"Properties": {
"id": "20241213215524-9an3khb",
"style": "line-height: 22px;",
"updated": "20241224162821"
"updated": "20250801152548"
},
"Children": [
{
@ -582,11 +584,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySpans \"SELECT * FROM spans LIMIT ?\" \"3\"}\n"
"Data": ".action{ querySpans \"SELECT * FROM spans LIMIT ?\" \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -605,7 +608,7 @@
},
"Properties": {
"id": "20241213214930-4votv1n",
"updated": "20241213214930"
"updated": "20250801152554"
},
"Children": [
{
@ -638,7 +641,7 @@
"Properties": {
"id": "20241213215530-f2iwrjz",
"style": "line-height: 22px;",
"updated": "20241213215530"
"updated": "20250801152554"
},
"Children": [
{
@ -646,11 +649,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySQL \"SELECT * FROM refs LIMIT 3\"}\n"
"Data": ".action{ querySQL \"SELECT * FROM refs LIMIT 3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -669,7 +673,7 @@
},
"Properties": {
"id": "20241212102019-gassjqt",
"updated": "20241213215707"
"updated": "20250801152602"
},
"Children": [
{
@ -702,7 +706,7 @@
"Properties": {
"id": "20241213215707-lxpmd6b",
"style": "line-height: 22px;",
"updated": "20241213215707"
"updated": "20250801152602"
},
"Children": [
{
@ -710,11 +714,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -1401,7 +1406,7 @@
"HeadingLevel": 2,
"Properties": {
"id": "20211226123024-yrgnp4o",
"updated": "20211225221841"
"updated": "20250801152721"
},
"Children": [
{
@ -1416,7 +1421,7 @@
"IsFencedCodeBlock": true,
"Properties": {
"id": "20211226123024-s56q5uh",
"updated": "20211225221841"
"updated": "20250801152721"
},
"Children": [
{
@ -1425,15 +1430,11 @@
},
{
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "cGxhaW50ZXh0"
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"ID": "20220307092237-cf60m2o",
"Type": "NodeCodeBlockCode",
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今天是 `.action{now | date \"2006-01-02\"}`。\n\n* 距離 `2020-02-19` 已經過去 `.action{$before}` 天\n* 距離 `2048-02-19` 還剩 `.action{$after}` 天\n",
"Properties": {
"id": "20220307092237-cf60m2o"
}
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今天是 `.action{ now | date \"2006-01-02\" }`。\n\n* 距離 `2020-02-19` 已經過去 `.action{ $before }` 天\n* 距離 `2048-02-19` 還剩 `.action{ $after }` 天\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",

View file

@ -7,7 +7,7 @@
"id": "20230405172131-yb16aax",
"title": "性能最佳化",
"type": "doc",
"updated": "20240420104915"
"updated": "20250825114942"
},
"Children": [
{
@ -379,7 +379,7 @@
"HeadingLevel": 3,
"Properties": {
"id": "20230405172204-kitngfu",
"updated": "20230405172204"
"updated": "20250825114815"
},
"Children": [
{
@ -637,6 +637,62 @@
]
}
]
},
{
"ID": "20250825114815-of1bnnd",
"Type": "NodeHeading",
"HeadingLevel": 3,
"Properties": {
"id": "20250825114815-of1bnnd",
"updated": "20250825114942"
},
"Children": [
{
"Type": "NodeText",
"Data": "優化索引"
}
]
},
{
"ID": "20250825114815-ck2ln4u",
"Type": "NodeParagraph",
"Properties": {
"id": "20250825114815-ck2ln4u",
"updated": "20250825114936"
},
"Children": [
{
"Type": "NodeText",
"Data": "建議定期執行最佳化索引 "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "設定"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "關於"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "優化索引"
},
{
"Type": "NodeText",
"Data": "​。"
}
]
}
]
}

View file

@ -7,7 +7,7 @@
"id": "20240530101000-6x9ivi7",
"title": "テンプレートスニペット",
"type": "doc",
"updated": "20250331163729"
"updated": "20250801152939"
},
"Children": [
{
@ -66,7 +66,7 @@
"Properties": {
"ID": "20240530101000-5nvn9ad",
"id": "20240530101000-pi05yzt",
"updated": "20250331163729"
"updated": "20250801152922"
},
"Children": [
{
@ -226,7 +226,7 @@
"ListData": {},
"Properties": {
"id": "20240530101000-by5hqnb",
"updated": "20250331163729"
"updated": "20250801152922"
},
"Children": [
{
@ -432,7 +432,7 @@
},
"Properties": {
"id": "20240530101000-0y2zlji",
"updated": "20250331163729"
"updated": "20250801152859"
},
"Children": [
{
@ -465,7 +465,7 @@
"Properties": {
"id": "20241213215628-5gixpmp",
"style": "line-height: 22px;",
"updated": "20250331163729"
"updated": "20250801152859"
},
"Children": [
{
@ -473,11 +473,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{$today := now | date \"20060102150405\"}\n.action{$blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\"}\n"
"Data": ".action{ $today := now | date \"20060102150405\" }\n.action{ $blocks := queryBlocks \"SELECT * FROM blocks WHERE content LIKE '?' AND updated \u003e '?' LIMIT ?\" \"%foo%\" $today \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -496,7 +497,7 @@
},
"Properties": {
"id": "20250331163610-n3e9zft",
"updated": "20250331163642"
"updated": "20250801152903"
},
"Children": [
{
@ -528,7 +529,7 @@
"IsFencedCodeBlock": true,
"Properties": {
"id": "20250331163621-j4iofxv",
"updated": "20250331163642"
"updated": "20250801152903"
},
"Children": [
{
@ -536,11 +537,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{getBlock \"20250331163610-n3e9zft\"}\n"
"Data": ".action{ getBlock \"20250331163610-n3e9zft\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -559,7 +561,7 @@
},
"Properties": {
"id": "20240530101000-238ctfi",
"updated": "20241224162728"
"updated": "20250801152909"
},
"Children": [
{
@ -592,7 +594,7 @@
"Properties": {
"id": "20241213215619-gkqs282",
"style": "line-height: 22px;",
"updated": "20241224162728"
"updated": "20250801152909"
},
"Children": [
{
@ -600,11 +602,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySpans \"SELECT * FROM spans LIMIT ?\" \"3\"}\n"
"Data": ".action{ querySpans \"SELECT * FROM spans LIMIT ?\" \"3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -623,7 +626,7 @@
},
"Properties": {
"id": "20241213215009-qrtc56j",
"updated": "20241213215009"
"updated": "20250801152915"
},
"Children": [
{
@ -656,7 +659,7 @@
"Properties": {
"id": "20241213215633-69ltmv1",
"style": "line-height: 22px;",
"updated": "20241213215633"
"updated": "20250801152915"
},
"Children": [
{
@ -664,11 +667,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": " .action{querySQL \"SELECT * FROM refs LIMIT 3\"}\n"
"Data": ".action{ querySQL \"SELECT * FROM refs LIMIT 3\" }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -687,7 +691,7 @@
},
"Properties": {
"id": "20241212102033-rn9u6t8",
"updated": "20241213215720"
"updated": "20250801152922"
},
"Children": [
{
@ -720,7 +724,7 @@
"Properties": {
"id": "20241213215720-ueqpsna",
"style": "line-height: 22px;",
"updated": "20241213215720"
"updated": "20250801152922"
},
"Children": [
{
@ -728,11 +732,12 @@
"Data": "```"
},
{
"Type": "NodeCodeBlockFenceInfoMarker"
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{ (statBlock .id).RuneCount} .action{ (statBlock .id).WordCount}\n"
"Data": ".action{ (statBlock .id).RuneCount }\n.action{ (statBlock .id).WordCount }\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",
@ -1422,7 +1427,7 @@
"Properties": {
"ID": "20240530101000-h8k78jq",
"id": "20240530101000-3jhyboz",
"updated": "20240530101000"
"updated": "20250801152939"
},
"Children": [
{
@ -1436,9 +1441,8 @@
"Type": "NodeCodeBlock",
"IsFencedCodeBlock": true,
"Properties": {
"ID": "20240530101000-3sja27a",
"id": "20240530101000-v44hxz6",
"updated": "20240530101000"
"updated": "20250801152939"
},
"Children": [
{
@ -1447,11 +1451,11 @@
},
{
"Type": "NodeCodeBlockFenceInfoMarker",
"CodeBlockInfo": "cGxhaW50ZXh0"
"CodeBlockInfo": "dGVtcGxhdGU="
},
{
"Type": "NodeCodeBlockCode",
"Data": ".action{$before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24)}\n\n.action{$after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24)}\n今日は `.action{now | date \"2006-01-02\"}` 日です。\n\n* `2020-02-19` 日から `.action{$before}` 日経過しました\n* `2048-02-19` 日まであと `.action{$after}` 日です\n"
"Data": ".action{ $before := (div (now.Sub (toDate \"2006-01-02\" \"2020-02-19\")).Hours 24) }\n.action{ $after := (div ((toDate \"2006-01-02\" \"2048-02-19\").Sub now).Hours 24) }\n今日は `.action{ now | date \"2006-01-02\" }` 日です。\n\n* `2020-02-19` 日から `.action{ $before }` 日経過しました\n* `2048-02-19` 日まであと `.action{ $after }` 日です\n"
},
{
"Type": "NodeCodeBlockFenceCloseMarker",

View file

@ -8,7 +8,7 @@
"id": "20240530101000-flot1gj",
"title": "パフォーマンスの最適化",
"type": "doc",
"updated": "20250115145306"
"updated": "20250825115021"
},
"Children": [
{
@ -421,7 +421,7 @@
"Properties": {
"ID": "20240530101000-utjkzhs",
"id": "20240530101000-9doivgv",
"updated": "20250115145306"
"updated": "20250825114907"
},
"Children": [
{
@ -755,12 +755,60 @@
]
},
{
"ID": "20240530101000-9swho08",
"ID": "20250825114907-tkuwv3h",
"Type": "NodeHeading",
"HeadingLevel": 3,
"Properties": {
"id": "20250825114907-tkuwv3h",
"updated": "20250825115021"
},
"Children": [
{
"Type": "NodeText",
"Data": "インデックスの最適化"
}
]
},
{
"ID": "20250825114907-av6973u",
"Type": "NodeParagraph",
"Properties": {
"ID": "20240530101000-ugpv1is",
"id": "20240530101000-9swho08"
}
"id": "20250825114907-av6973u",
"updated": "20250825115021"
},
"Children": [
{
"Type": "NodeText",
"Data": ""
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "設定"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "バージョン情報"
},
{
"Type": "NodeText",
"Data": " - "
},
{
"Type": "NodeTextMark",
"TextMarkType": "kbd",
"TextMarkTextContent": "インデックスの最適化"
},
{
"Type": "NodeText",
"Data": " から、定期的にインデックスを最適化することをお勧めします。"
}
]
}
]
}

View file

@ -1,10 +1,10 @@
{
"name": "SiYuan",
"version": "3.2.1",
"version": "3.3.0",
"description": "Refactor your thinking",
"homepage": "https://b3log.org/siyuan",
"main": "./electron/main.js",
"packageManager": "pnpm@10.13.1",
"packageManager": "pnpm@10.15.0",
"scripts": {
"lint": "eslint . --fix --cache",
"dev": "webpack --mode development",
@ -58,7 +58,7 @@
"clean-webpack-plugin": "^4.0.0",
"css-loader": "^7.1.2",
"dayjs": "^1.11.5",
"electron": "37.2.3",
"electron": "37.3.1",
"electron-builder": "26.0.12",
"encoding": "^0.1.13",
"esbuild-loader": "^3.0.1",

6568
app/pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -255,7 +255,7 @@ export const AIActions = (elements: Element[], protyle: IProtyle) => {
});
element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(element)) {
while (target && (target !== element)) {
if (target.classList.contains("b3-list-item__action")) {
const subItem = window.siyuan.storage[Constants.LOCAL_AI][target.parentElement.dataset.index];
editDialog(subItem.name, subItem.memo);

View file

@ -6,12 +6,16 @@
margin-top: 4px !important;
margin-bottom: 4px !important;
&:hover .av__views .block__icon {
opacity: 1;
&:hover {
.av__views .block__icon,
.av__group-icon--hover {
opacity: 1;
}
}
&--touch {
.av__views .block__icon,
.av__group-icon--hover,
.av__row--footer .av__calc {
opacity: 1;
}
@ -35,7 +39,7 @@
&__pulse {
width: 70%;
height: 23px;
height: 22px;
display: block;
position: relative;
overflow: hidden;
@ -56,8 +60,7 @@
}
&__header {
top: -43px;
z-index: 2;
position: relative;
.layout-tab-bar {
background-color: transparent;
@ -128,10 +131,6 @@
overflow: auto hidden;
}
&__body {
float: left;
}
&__row {
display: flex;
border-bottom: 1px solid var(--b3-theme-surface-lighter);
@ -257,6 +256,7 @@
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: 16px;
width: 100%;
margin-top: 8px;
&--top {
margin-top: 16px;
@ -397,11 +397,6 @@
border-right: 0;
min-height: calc(1.625em + 4px);
&:not([data-dtype="block"])[data-empty="true"] {
padding: 0 4px;
min-height: auto;
}
&:hover {
background-color: var(--b3-list-hover);
border-radius: var(--b3-border-radius);
@ -418,26 +413,66 @@
cursor: default;
}
&[data-dtype="mAsset"],
&[data-dtype="mSelect"],
&[data-dtype="select"] {
margin-left: -2px;
&[data-dtype="mAsset"] .av__cellassetimg:first-child,
&[data-dtype="mAsset"] .b3-chip:first-child,
&[data-dtype="mSelect"] .b3-chip:first-child,
&[data-dtype="select"] .b3-chip:first-child {
margin-left: 0;
}
}
&--edit .av__cell {
padding: 2px 4px !important;
min-height: calc(1.625em + 4px) !important;
&--edit .av__gallery-field[data-empty="true"] .av__gallery-tip {
display: block;
}
&[data-dtype="mAsset"][data-empty="true"],
&[data-dtype="mSelect"][data-empty="true"],
&[data-dtype="select"][data-empty="true"] {
margin-left: 0;
}
&:not(.av__gallery-fields--edit) [data-empty="true"] {
display: none;
}
}
&[data-empty="true"] .av__gallery-tip {
display: flex;
}
&-field {
position: relative;
}
&-name {
opacity: 0.38;
padding: 2px 4px;
width: 100%;
white-space: normal;
box-sizing: border-box;
}
&-tip {
box-sizing: border-box;
display: none;
opacity: 0.38;
padding: 2px 4px;
width: 100%;
position: absolute;
top: 0;
}
&-tip,
&-name {
img:first-child, svg:first-child, svg.ariaLabel {
height: 1.625em;
width: calc(1.625em - 10px);
margin: 0 5px 0 0;
font-size: 1em;
vertical-align: bottom;
}
img:first-child {
height: calc(1.625em - 10px);
float: left;
margin-top: 5px;
}
span:first-child {
width: calc(1.9em - 10px);
margin: 0 5px 0 0;
height: 1.625em;
font-size: .85em;
}
}
@ -473,26 +508,6 @@
z-index: 2;
}
&-tip {
display: none;
align-items: center;
opacity: 0.38;
img, svg {
height: calc(1.625em - 10px);
width: calc(1.625em - 10px);
margin: 0 5px 0 0;
font-size: 1em;
}
span {
width: calc(1.9em - 10px);
margin: 0 5px 0 0;
height: 1.625em;
font-size: .85em;
}
}
&-item, &-add {
&.dragover__left::after,
&.dragover__right::after {
@ -574,23 +589,6 @@
color: var(--b3-protyle-inline-blockref-color);
}
.b3-menu__avemoji {
display: inline-block;
font-size: 1em;
line-height: 1.625;
height: auto;
margin: 0 5px 0 -4px;
vertical-align: top;
img {
height: calc(1.625em - 8px);
font-size: 1em;
width: calc(1.625em - 8px);
float: left;
margin: 4px 0;
}
}
&[data-wrap="true"] {
white-space: pre-wrap;
}
@ -599,7 +597,7 @@
white-space: nowrap;
}
&[data-block-id] > .block__icon[data-type="copy"] {
&[data-dtype="block"] > .block__icon[data-type="copy"] {
display: none;
}
@ -679,10 +677,10 @@
}
&--relation {
margin-left: 12px;
margin-right: 12px;
&:first-child {
margin-left: 0;
&:last-child {
margin-right: 0;
}
}
@ -794,8 +792,8 @@
position: relative;
.b3-menu {
min-width: 200px;
max-width: 50vw;
min-width: 290px;
max-width: 290px;
&__item .b3-chip {
max-width: 100%;
@ -835,6 +833,7 @@
&__label {
overflow: hidden;
min-height: 30px;
}
&__icon.fn__grab {
@ -911,6 +910,68 @@
}
}
}
&__group {
&-title {
position: sticky;
left: 0;
clear: both;
padding: 16px 0 8px 0;
display: flex;
align-items: center;
.b3-chip {
padding: 2px 6px;
line-height: calc(1.625em - 6px);
font-size: 87.5%;
}
& + .av__body .av__gallery {
margin-top: 0;
}
}
&-counter {
font-size: 87.5%;
color: var(--b3-theme-on-surface-light);
margin: 0 8px;
}
&-icon {
cursor: pointer;
color: var(--b3-theme-on-surface-light);
transition: var(--b3-transition), opacity 0.3s cubic-bezier(0, 0, 0.2, 1) 0ms;
border-radius: var(--b3-border-radius);
&:hover {
color: var(--b3-theme-on-background);
background-color: var(--b3-list-icon-hover);
}
svg {
padding: 5px;
float: left;
width: calc(1.625em - 12px);
height: calc(1.625em - 12px);
transition: transform 0.15s cubic-bezier(0, 0, 0.2, 1);
font-size: 87.5%;
}
&--hover {
opacity: 0;
svg {
padding: 4px;
width: calc(1.625em - 10px);
height: calc(1.625em - 10px);
}
}
}
&-arrow--open {
transform: rotate(90deg);
}
}
}
img.av__cellassetimg {
@ -922,3 +983,21 @@ img.av__cellassetimg {
font-size: inherit;
cursor: zoom-in;
}
.av__cell,
.custom-attr__avvalue {
.b3-menu__avemoji {
font-size: 1em;
line-height: 1.625;
height: auto;
margin: 0 5px 0 -4px;
vertical-align: top;
img {
height: calc(1.625em - 8px);
font-size: 1em;
width: calc(1.625em - 8px);
margin: 4px 0;
}
}
}

View file

@ -28,6 +28,14 @@
&[data-type="select"] {
padding-left: 6px;
}
span.b3-menu__avemoji {
line-height: 26px;
img {
margin-top: 6px;
}
}
}
&__avheader {

View file

@ -174,7 +174,7 @@
padding: 0 4px;
flex-shrink: 0;
border-radius: var(--b3-border-radius);
display: flex;
display: inline-flex;
align-items: center;
justify-content: center;

View file

@ -267,6 +267,10 @@
opacity: .38;
cursor: not-allowed;
}
&--hidden {
opacity: .38;
}
}
&__action {
@ -281,6 +285,10 @@
box-sizing: border-box;
translate: var(--b3-transition);
&--show {
opacity: 1;
}
&:hover {
color: var(--b3-theme-on-background);
background-color: var(--b3-list-icon-hover);
@ -296,6 +304,13 @@
min-width: 84px;
}
&__labels {
font-size: 12px;
margin-bottom: 4px;
line-height: 20px;
color: var(--b3-theme-on-surface);
}
&__icon {
align-self: center;
height: 14px;

View file

@ -1,10 +1,14 @@
.b3-snackbar {
margin-bottom: 16px;
position: relative;
transition: transform 256ms cubic-bezier(.45, .05, .55, .95) 0ms;
text-align: right;
justify-self: end;
font-size: var(--b3-font-size);
pointer-events: auto;
&:not(:first-child) {
margin-top: 16px;
}
&--hide {
transform: translate3d(calc(20vw + 48px), 0, 0);
@ -12,7 +16,7 @@
&s {
position: fixed;
right: 12px;
right: 30px;
top: 22px;
// 不能设置死否则右键菜单会被遮盖 z-index: 999999;
max-height: calc(100vh - 32px);
@ -20,22 +24,14 @@
flex-direction: column;
transform: translate3d(calc(20vw + 48px), 0, 0);
transition: transform .15s cubic-bezier(.4, 0, 1, 1) 0ms;
pointer-events: none;
&--show {
transform: translate3d(0, 0, 0) !important;
}
& > .b3-button {
align-self: flex-end;
margin-right: 18px;
}
& > .fn__flex-1 {
padding: 0 18px 0 18px;
&::-webkit-scrollbar {
display: none;
}
& > .fn__flex-1::-webkit-scrollbar {
display: none;
}
}

View file

@ -183,7 +183,29 @@
line-height: calc(1.625em + 8px);
& ~ [data-type="NodeHeading"] {
line-height: 1em;
&.h1 {
line-height: calc(1.625em / 1.75);
}
&.h2 {
line-height: calc(1.625em / 1.55);
}
&.h3 {
line-height: calc(1.625em / 1.38);
}
&.h4 {
line-height: calc(1.625em / 1.25);
}
&.h5 {
line-height: calc(1.625em / 1.13);
}
&.h6 {
line-height: 1.625em;
}
& > [spellcheck] {
min-height: 1em;
@ -783,6 +805,10 @@
opacity: 0;
}
&:hover .av__group-icon--hover {
display: none;
}
.av__row--footer .av__calc:hover,
.av__cell--header:hover {
background-color: transparent;
@ -797,7 +823,7 @@
}
}
.av__row .av__cell[data-block-id] > .block__icon[data-type="copy"] {
.av__row .av__cell[data-dtype="block"] > .block__icon[data-type="copy"] {
display: flex;
}
}

View file

@ -31,7 +31,7 @@ export const initBlockPopover = (app: App) => {
if (aElement) {
let tooltipClass = "";
let tip = aElement.getAttribute("aria-label") || "";
if (aElement.classList.contains("av__cell")) {
if (aElement.classList.contains("av__cell") && !aElement.classList.contains("ariaLabel")) {
if (aElement.classList.contains("av__cell--header")) {
const textElement = aElement.querySelector(".av__celltext");
const desc = aElement.getAttribute("data-desc");
@ -49,6 +49,7 @@ export const initBlockPopover = (app: App) => {
tooltipClass = "href";
}
}
tip = "";
if (!tip && aElement.dataset.wrap !== "true" && event.target.dataset.type !== "block-more" && !hasClosestByClassName(event.target, "block__icon")) {
aElement.style.overflow = "auto";
if (aElement.scrollWidth > aElement.clientWidth + 2) {
@ -117,7 +118,7 @@ export const initBlockPopover = (app: App) => {
const boxData = response.data.boxInfo;
const tip = `${boxData.name} <small class='ft__on-surface'>${boxData.hSize}</small>${boxData.docCount !== 0 ? window.siyuan.languages.includeSubFile.replace("x", boxData.docCount) : ""}<br>${window.siyuan.languages.modifiedAt} ${boxData.hMtime}<br>${window.siyuan.languages.createdAt} ${boxData.hCtime}`;
const scopeNotebookItemElement = hasClosestByClassName(event.target, "b3-list-item__text");
if (notebookItemElement && scopeNotebookItemElement && notebookItemElement.isSameNode(scopeNotebookItemElement)) {
if (notebookItemElement && scopeNotebookItemElement && (notebookItemElement === scopeNotebookItemElement)) {
showTooltip(tip, notebookItemElement);
}
if (scopeNotebookItemElement &&
@ -242,7 +243,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
if (!popoverTargetElement && linkElement && linkElement.getAttribute("data-href")?.startsWith("siyuan://blocks")) {
popoverTargetElement = linkElement;
}
if (!popoverTargetElement || (popoverTargetElement && window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement))) {
if (!popoverTargetElement || (popoverTargetElement && window.siyuan.menus.menu.data && window.siyuan.menus.menu.data === popoverTargetElement)) {
// 移动到弹窗的 loading 元素上,但经过 settimeout 后 loading 已经被移除了
// https://ld246.com/article/1673596577519/comment/1673767749885#comments
let targetElement = target;
@ -308,7 +309,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
}
});
if (hasToolbar) {
break;
break;
}
item.destroy();
}
@ -356,7 +357,7 @@ const getTarget = (event: MouseEvent & { target: HTMLElement }, aElement: false
};
export const showPopover = async (app: App, showRef = false) => {
if (!popoverTargetElement || window.siyuan.menus.menu.data?.isSameNode(popoverTargetElement)) {
if (!popoverTargetElement || (window.siyuan.menus.menu.data && window.siyuan.menus.menu.data === popoverTargetElement)) {
return;
}
let refDefs: IRefDefs[] = [];

View file

@ -10,6 +10,7 @@ import {blockRender} from "../protyle/render/blockRender";
import {fetchPost, fetchSyncPost} from "../util/fetch";
import {openFileById} from "../editor/util";
import {openMobileFileById} from "../mobile/editor";
import {mathRender} from "../protyle/render/mathRender";
export const cancelSB = async (protyle: IProtyle, nodeElement: Element, range?: Range) => {
const doOperations: IOperation[] = [];
@ -73,6 +74,7 @@ export const cancelSB = async (protyle: IProtyle, nodeElement: Element, range?:
});
previousId = item.getAttribute("data-node-id");
});
mathRender(protyle.wysiwyg.element);
// 超级块内嵌入块无面包屑,需重新渲染 https://github.com/siyuan-note/siyuan/issues/7574
doOperations.forEach(item => {
const element = protyle.wysiwyg.element.querySelector(`[data-node-id="${item.id}"]`);

View file

@ -23,6 +23,7 @@ import {globalCommand} from "./global";
import {getDisplayName, getNotebookName, getTopPaths, movePathTo, moveToPath, pathPosix} from "../../../util/pathName";
import {hintMoveBlock} from "../../../protyle/hint/extend";
import {fetchSyncPost} from "../../../util/fetch";
import {focusByRange} from "../../../protyle/util/selection";
export const commandPanel = (app: App) => {
const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : undefined;
@ -41,7 +42,12 @@ export const commandPanel = (app: App) => {
<kbd>${window.siyuan.languages.enterKey}/${window.siyuan.languages.click}</kbd> ${window.siyuan.languages.confirm}
<kbd>Esc</kbd> ${window.siyuan.languages.close}
</div>
</div>`
</div>`,
destroyCallback() {
if (range) {
focusByRange(range);
}
},
});
dialog.element.setAttribute("data-key", Constants.DIALOG_COMMANDPANEL);
const listElement = dialog.element.querySelector("#commands");

View file

@ -16,7 +16,7 @@ import {
import {newFile} from "../../util/newFile";
import {Constants} from "../../constants";
import {openSetting} from "../../config";
import {getInstanceById} from "../../layout/util";
import {getInstanceById, saveLayout} from "../../layout/util";
import {getActiveTab, getDockByType, switchTabByIndex} from "../../layout/tabUtil";
import {Tab} from "../../layout/Tab";
import {Editor} from "../../editor";
@ -80,7 +80,7 @@ import {bindAVPanelKeydown} from "../../protyle/render/av/keydown";
const switchDialogEvent = (app: App, event: MouseEvent) => {
event.preventDefault();
let target = event.target as HTMLElement;
while (!target.isSameNode(switchDialog.element)) {
while (target !== switchDialog.element) {
if (target.classList.contains("b3-list-item")) {
const currentType = target.getAttribute("data-type");
if (currentType) {
@ -490,6 +490,7 @@ const editKeydown = (app: App, event: KeyboardEvent) => {
}
if (matchHotKey(window.siyuan.config.keymap.editor.general.preview.custom, event)) {
setEditMode(protyle, "preview");
saveLayout();
event.preventDefault();
return true;
}
@ -497,11 +498,16 @@ const editKeydown = (app: App, event: KeyboardEvent) => {
setEditMode(protyle, "wysiwyg");
protyle.scroll.lastScrollTop = 0;
fetchPost("/api/filetree/getDoc", {
id: protyle.block.parentID,
size: window.siyuan.config.editor.dynamicLoadBlocks,
id: protyle.block.id,
size: protyle.block.id === protyle.block.rootID ? window.siyuan.config.editor.dynamicLoadBlocks : Constants.SIZE_GET_MAX,
}, getResponse => {
onGet({data: getResponse, protyle});
onGet({
data: getResponse,
protyle,
action: protyle.block.id === protyle.block.rootID ? [Constants.CB_GET_FOCUS, Constants.CB_GET_HTML, Constants.CB_GET_UNUNDO] : [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS, Constants.CB_GET_UNUNDO, Constants.CB_GET_HTML]
});
});
saveLayout();
event.preventDefault();
return true;
}

View file

@ -6,6 +6,7 @@ import {getAllTabs} from "../../layout/getAll";
import {App} from "../../index";
import {Constants} from "../../constants";
import {matchHotKey} from "../../protyle/util/hotKey";
import {isWindow} from "../../util/functions";
export const windowKeyUp = (app: App, event: KeyboardEvent) => {
window.siyuan.ctrlIsPressed = false;
@ -22,37 +23,52 @@ export const windowKeyUp = (app: App, event: KeyboardEvent) => {
let currentLiElement = switchDialog.element.querySelector(".b3-list-item--focus");
currentLiElement.classList.remove("b3-list-item--focus");
if (matchHotKey(window.siyuan.config.keymap.general.goToEditTabPrev.custom, event)) {
if (currentLiElement.previousElementSibling) {
currentLiElement.previousElementSibling.classList.add("b3-list-item--focus");
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
currentLiElement.removeAttribute("data-original");
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.lastElementChild) {
currentLiElement.parentElement.nextElementSibling.lastElementChild.classList.add("b3-list-item--focus");
} else {
currentLiElement.parentElement.lastElementChild.classList.add("b3-list-item--focus");
while (true) {
if (currentLiElement.previousElementSibling) {
currentLiElement = currentLiElement.previousElementSibling;
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.removeAttribute("data-original");
currentLiElement = currentLiElement.parentElement.lastElementChild;
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.lastElementChild) {
currentLiElement = currentLiElement.parentElement.nextElementSibling.lastElementChild;
} else {
currentLiElement = currentLiElement.parentElement.lastElementChild;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement = currentLiElement.parentElement.previousElementSibling.lastElementChild;
} else if (isWindow()) {
currentLiElement = currentLiElement.parentElement.lastElementChild;
}
if (currentLiElement.getBoundingClientRect().height !== 0) {
break;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement.parentElement.previousElementSibling.lastElementChild.classList.add("b3-list-item--focus");
}
currentLiElement.classList.add("b3-list-item--focus");
} else {
if (currentLiElement.nextElementSibling) {
currentLiElement.nextElementSibling.classList.add("b3-list-item--focus");
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
currentLiElement.removeAttribute("data-original");
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.firstElementChild) {
currentLiElement.parentElement.nextElementSibling.firstElementChild.classList.add("b3-list-item--focus");
} else {
currentLiElement.parentElement.firstElementChild.classList.add("b3-list-item--focus");
while (true) {
if (currentLiElement.nextElementSibling) {
currentLiElement = currentLiElement.nextElementSibling;
} else if (currentLiElement.getAttribute("data-original")) {
currentLiElement.removeAttribute("data-original");
currentLiElement = currentLiElement.parentElement.firstElementChild;
} else if (currentLiElement.parentElement.nextElementSibling) {
if (currentLiElement.parentElement.nextElementSibling.firstElementChild) {
currentLiElement = currentLiElement.parentElement.nextElementSibling.firstElementChild;
} else {
currentLiElement = currentLiElement.parentElement.firstElementChild;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement = currentLiElement.parentElement.previousElementSibling.firstElementChild;
} else if (isWindow()) {
currentLiElement = currentLiElement.parentElement.firstElementChild;
}
if (currentLiElement.getBoundingClientRect().height !== 0) {
break;
}
} else if (currentLiElement.parentElement.previousElementSibling) {
currentLiElement.parentElement.previousElementSibling.firstElementChild.classList.add("b3-list-item--focus");
}
currentLiElement.classList.add("b3-list-item--focus");
}
currentLiElement = switchDialog.element.querySelector(".b3-list-item--focus");
if (currentLiElement) {
const rootId = currentLiElement.getAttribute("data-node-id");
if (rootId) {

View file

@ -111,7 +111,7 @@ export const windowMouseMove = (event: MouseEvent, mouseIsEnter: boolean) => {
const allModels = getAllModels();
let findNode = false;
allModels.editor.find(item => {
if (item.editor.protyle.wysiwyg.element.isSameNode(eventPath0)) {
if (item.editor.protyle.wysiwyg.element === eventPath0) {
item.editor.protyle.gutter.render(item.editor.protyle, targetBlockElement, item.editor.protyle.wysiwyg.element, rowElement);
findNode = true;
return true;
@ -134,7 +134,7 @@ export const windowMouseMove = (event: MouseEvent, mouseIsEnter: boolean) => {
if (!findNode) {
allModels.backlink.find(item => {
item.editors.find(eItem => {
if (eItem.protyle.wysiwyg.element.isSameNode(eventPath0)) {
if (eItem.protyle.wysiwyg.element === eventPath0) {
eItem.protyle.gutter.render(eItem.protyle, targetBlockElement, eItem.protyle.wysiwyg.element, rowElement);
findNode = true;
return true;

View file

@ -71,7 +71,7 @@ export const makeCard = (app: App, ids: string[]) => {
dialog.element.setAttribute("data-key", Constants.DIALOG_MAKECARD);
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(dialog.element)) {
while (target && target !== dialog.element) {
const type = target.getAttribute("data-type");
if (type === "create") {
let msgId = "";

View file

@ -150,8 +150,8 @@ export const genCardHTML = (options: {
const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard: ICard) => {
fetchPost("/api/block/getDocInfo", {
id,
}, (response) => {
protyle.wysiwyg.renderCustom(response.data.ial);
}, (docResponse) => {
protyle.wysiwyg.renderCustom(docResponse.data.ial);
fetchPost("/api/filetree/getDoc", {
id,
mode: 0,
@ -163,6 +163,8 @@ const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard:
protyle,
action: response.data.rootID === response.data.id ? [Constants.CB_GET_HTML] : [Constants.CB_GET_ALL, Constants.CB_GET_HTML],
afterCB: () => {
protyle.title.element.removeAttribute("data-render");
protyle.title.render(protyle, docResponse);
let hasHide = false;
if (!window.siyuan.config.flashcard.superBlock &&
!window.siyuan.config.flashcard.heading &&
@ -199,7 +201,7 @@ const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard:
if (btnIndex < 2) {
return;
}
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex-1];
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex - 1];
});
actionElements[1].classList.remove("fn__none");
} else {
@ -250,6 +252,8 @@ export const bindCardEvent = async (options: {
background: false,
gutter: true,
breadcrumbDocName: true,
title: true,
hideTitleOnZoom: true,
},
typewriterMode: false
});
@ -418,7 +422,7 @@ export const bindCardEvent = async (options: {
if (btnIndex < 2) {
return;
}
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex-1];
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex - 1];
});
options.cardsData.unreviewedOldCardCount--;
options.cardsData.unreviewedNewCardCount++;
@ -650,7 +654,7 @@ export const bindCardEvent = async (options: {
if (btnIndex < 2) {
return;
}
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex-1];
element.previousElementSibling.textContent = currentCard.nextDues[btnIndex - 1];
});
actionElements[1].classList.remove("fn__none");
emitEvent(options.app, currentCard, type);

View file

@ -115,7 +115,7 @@ export const viewCards = (app: App, deckID: string, title: string, deckType: "Tr
return;
}
let target = event.target as HTMLElement;
while (target && !dialog.element.isSameNode(target)) {
while (target && (dialog.element !== target)) {
const type = target.getAttribute("data-type");
if (type === "close") {
dialog.destroy();

View file

@ -156,6 +156,26 @@ export const about = {
<input class="b3-text-field fn__flex-center fn__size200" min="1" type="number" id="retentionIndexesDaily" value="${window.siyuan.config.repo.retentionIndexesDaily}">
</div>
</div>
<div class="fn__flex b3-label config__item">
<div class="fn__flex-1">
${window.siyuan.languages.vacuumDataIndex}
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
</div>
<div class="fn__space"></div>
<button id="vacuumDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
</button>
</div>
<div class="fn__flex b3-label config__item">
<div class="fn__flex-1">
${window.siyuan.languages.rebuildDataIndex}
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
</div>
<div class="fn__space"></div>
<button id="rebuildDataIndex" class="b3-button b3-button--outline fn__size200 fn__flex-center">
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
</button>
</div>
<div class="fn__flex b3-label config__item">
<div class="fn__flex-1">
${window.siyuan.languages.systemLog}
@ -234,6 +254,12 @@ ${checkUpdateHTML}
about.element.querySelector("#tokenTip").innerHTML = window.siyuan.languages.about14.replace("${token}", window.siyuan.config.api.token);
});
});
about.element.querySelector("#vacuumDataIndex").addEventListener("click", () => {
fetchPost("/api/system/vacuumDataIndex", {}, () => {});
});
about.element.querySelector("#rebuildDataIndex").addEventListener("click", () => {
fetchPost("/api/system/rebuildDataIndex", {}, () => {});
});
about.element.querySelector("#exportLog").addEventListener("click", () => {
fetchPost("/api/system/exportLog", {}, (response) => {
openByMobile(response.data.zip);

View file

@ -20,7 +20,11 @@ export const ai = {
<div class="b3-label">
${window.siyuan.languages.apiTimeout}
<div class="fn__hr"></div>
<input class="b3-text-field fn__flex-center fn__block" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
<div class="fn__flex">
<input class="b3-text-field fn__flex-1" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
<span class="fn__space"></span>
<span class="ft__on-surface fn__flex-center">s</span>
</div>
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
</div>
<div class="b3-label">
@ -98,7 +102,11 @@ export const ai = {
<div class="b3-label__text">${window.siyuan.languages.apiTimeoutTip}</div>
</div>
<span class="fn__space"></span>
<input class="b3-text-field fn__flex-center fn__size200" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
<div class="fn__size200 fn__flex-center fn__flex">
<input class="b3-text-field fn__flex-1" type="number" step="1" min="5" max="600" id="apiTimeout" value="${window.siyuan.config.ai.openAI.apiTimeout}"/>
<span class="fn__space"></span>
<span class="ft__on-surface fn__flex-center">s</span>
</div>
</div>
<div class="fn__flex b3-label">
<div class="fn__flex-1">

View file

@ -263,6 +263,7 @@ export const appearance = {
});
return;
}
window.siyuan.config.appearance = data;
if (appearance.element) {
const modeElement = appearance.element.querySelector("#mode") as HTMLSelectElement;

View file

@ -52,6 +52,18 @@ export const fileTree = {
<span class="fn__space"></span>
<input class="b3-switch fn__flex-center" id="useSingleLineSave" type="checkbox"${window.siyuan.config.fileTree.useSingleLineSave ? " checked" : ""}/>
</label>
<div class="fn__flex b3-label config__item">
<div class="fn__flex-1">
${window.siyuan.languages.fileTree22}
<div class="b3-label__text">${window.siyuan.languages.fileTree23}</div>
</div>
<span class="fn__space"></span>
<div class="fn__size200 fn__flex-center fn__flex">
<input class="b3-text-field fn__flex-1" id="largeFileWarningSize" type="number" min="2" max="10240" value="${window.siyuan.config.fileTree.largeFileWarningSize}">
<span class="fn__space"></span>
<span class="ft__on-surface fn__flex-center">MB</span>
</div>
</div>
<div class="fn__flex b3-label config__item">
<div class="fn__flex-1">
${window.siyuan.languages.fileTree16}
@ -113,6 +125,7 @@ export const fileTree = {
allowCreateDeeper: (fileTree.element.querySelector("#allowCreateDeeper") as HTMLInputElement).checked,
removeDocWithoutConfirm: (fileTree.element.querySelector("#removeDocWithoutConfirm") as HTMLInputElement).checked,
useSingleLineSave: (fileTree.element.querySelector("#useSingleLineSave") as HTMLInputElement).checked,
largeFileWarningSize: parseInt((fileTree.element.querySelector("#largeFileWarningSize") as HTMLInputElement).value),
maxListCount: parseInt((fileTree.element.querySelector("#maxListCount") as HTMLInputElement).value),
maxOpenTabCount: inputMaxOpenTabCount,
}, response => {

View file

@ -20,6 +20,7 @@ import {publish} from "./publish";
import {App} from "../index";
import {isHuawei, isInHarmony} from "../protyle/util/compatibility";
import {Constants} from "../constants";
import {focusByRange} from "../protyle/util/selection";
/// #endif
export const genItemPanel = (type: string, containerElement: Element, app: App) => {
@ -107,6 +108,10 @@ export const openSetting = (app: App) => {
if (exitDialog) {
return exitDialog;
}
let range: Range;
if (getSelection().rangeCount > 0) {
range = getSelection().getRangeAt(0);
}
const dialog = new Dialog({
content: `<div class="fn__flex-1 fn__flex config__panel" style="overflow: hidden;position: relative">
<ul class="b3-tab-bar b3-list b3-list--background">
@ -152,6 +157,11 @@ export const openSetting = (app: App) => {
</div>`,
width: "90vw",
height: "90vh",
destroyCallback() {
if (range) {
focusByRange(range);
}
},
});
dialog.element.setAttribute("data-key", Constants.DIALOG_SETTING);

View file

@ -475,7 +475,7 @@ export const keymap = {
hasConflict = true;
}
Array.from(keymap.element.querySelectorAll("label.b3-list-item input")).find((inputItem: HTMLElement) => {
if (!inputItem.isSameNode(this) && inputItem.getAttribute("data-value") === keymapStr) {
if ((inputItem !== this) && inputItem.getAttribute("data-value") === keymapStr) {
const inputValueList = inputItem.getAttribute("data-key").split(Constants.ZWSP);
if (inputValueList[1] === "list") {
inputValueList[1] = "list1";

View file

@ -33,7 +33,7 @@ export const initConfigSearch = (element: HTMLElement, app: App) => {
// 文档树
getLang(["selectOpen", "tabLimit", "fileTree", "fileTree2", "fileTree3", "fileTree4", "fileTree5",
"fileTree6", "fileTree7", "fileTree8", "fileTree9", "fileTree10", "fileTree12", "fileTree13", "fileTree15",
"fileTree16", "fileTree17", "fileTree21"]),
"fileTree16", "fileTree17", "fileTree18", "fileTree19", "fileTree20", "fileTree21", "fileTree22", "fileTree23"]),
// 闪卡
getLang(["riffCard", "flashcardNewCardLimit", "flashcardNewCardLimitTip", "flashcardReviewCardLimit",
@ -101,8 +101,8 @@ export const initConfigSearch = (element: HTMLElement, app: App) => {
"systemLog", "importKey", "genKey", "genKeyByPW", "copyKey", "resetRepo", "systemLogTip", "export",
"downloadLatestVer", "safeQuit", "directConnection", "siyuanNote", "key", "password", "copied", "resetRepoTip",
"autoDownloadUpdatePkg", "autoDownloadUpdatePkgTip", "networkProxy", "keyPlaceholder", "initRepoKeyTip",
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays",
"dataRepoAutoPurgeRetentionIndexesDaily"]),
"dataRepoPurge", "dataRepoPurgeTip", "dataRepoAutoPurgeIndexRetentionDays", "dataRepoAutoPurgeRetentionIndexesDaily",
"vacuumDataIndex", "vacuumDataIndexTip", "rebuildDataIndex", "rebuildDataIndexTip"]),
];
const inputElement = element.querySelector(".b3-form__icon input") as HTMLInputElement;
/// #if !BROWSER

View file

@ -114,7 +114,7 @@ export const openSnippets = () => {
dialog.element.setAttribute("data-key", Constants.DIALOG_SNIPPETS);
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(dialog.element)) {
while (target && target !== dialog.element) {
if (target.id === "addCodeSnippetCSS" || target.id === "addCodeSnippetJS") {
target.parentElement.insertAdjacentHTML("afterend", genSnippet({
type: target.id === "addCodeSnippetCSS" ? "css" : "js",

View file

@ -225,6 +225,7 @@ export abstract class Constants {
public static readonly DIALOG_SAVEWORKSPACE = "dialog-saveworkspace"; // 保存工作空间
// timeout
public static readonly TIMEOUT_OPENDIALOG = 50;
public static readonly TIMEOUT_DBLCLICK = 190;
public static readonly TIMEOUT_INPUT = 256;
public static readonly TIMEOUT_LOAD = 300;
@ -758,7 +759,7 @@ export abstract class Constants {
// common: "bash", "c", "csharp", "cpp", "css", "diff", "go", "xml", "json", "java", "javascript", "kotlin", "less", "lua", "makefile", "markdown", "objectivec", "php", "php-template", "perl", "plaintext", "python", "python-repl", "r", "ruby", "rust", "scss", "sql", "shell", "swift", "ini", "typescript", "vbnet", "yaml", "properties", "1c", "armasm", "avrasm", "actionscript", "ada", "angelscript", "accesslog", "apache", "applescript", "arcade", "arduino", "asciidoc", "aspectj", "abnf", "autohotkey", "autoit", "awk", "basic", "bnf", "dos", "brainfuck", "cal", "cmake", "csp", "cos", "capnproto", "ceylon", "clean", "clojure", "clojure-repl", "coffeescript", "coq", "crystal", "d", "dns", "dart", "delphi", "dts", "django", "dockerfile", "dust", "erb", "elixir", "elm", "erlang", "erlang-repl", "excel", "ebnf", "fsharp", "fix", "flix", "fortran", "gcode", "gams", "gauss", "glsl", "gml", "gherkin", "golo", "gradle", "groovy", "haml", "hsp", "http", "handlebars", "haskell", "haxe", "hy", "irpf90", "isbl", "inform7", "x86asm", "jboss-cli", "julia", "julia-repl", "ldif", "llvm", "lsl", "latex", "lasso", "leaf", "lisp", "livecodeserver", "livescript", "mel", "mipsasm", "matlab", "maxima", "mercury", "axapta", "routeros", "mizar", "mojolicious", "monkey", "moonscript", "n1ql", "nsis", "nestedtext", "nginx", "nim", "nix", "node-repl", "ocaml", "openscad", "ruleslanguage", "oxygene", "pf", "parser3", "pony", "pgsql", "powershell", "processing", "prolog", "protobuf", "puppet", "purebasic", "profile", "q", "qml", "reasonml", "rib", "rsl", "roboconf", "sas", "sml", "sqf", "step21", "scala", "scheme", "scilab", "smali", "smalltalk", "stan", "stata", "stylus", "subunit", "tp", "taggerscript", "tcl", "tap", "thrift", "twig", "vbscript", "vbscript-html", "vhdl", "vala", "verilog", "vim", "wasm", "mathematica", "wren", "xl", "xquery", "zephir", "crmsh", "dsconfig", "graphql",
// third: "yul", "solidity", "abap", "hlsl", "gdscript"
public static readonly ALIAS_CODE_LANGUAGES: string[] = [
"js", "ts", "html", "toml", "c#", "bat",
"js", "ts", "html", "toml", "c#", "bat"
];
public static readonly SIYUAN_RENDER_CODE_LANGUAGES: string[] = [
"abc", "plantuml", "mermaid", "flowchart", "echarts", "mindmap", "graphviz", "math"

View file

@ -25,7 +25,7 @@ export const confirmDialog = (title: string, text: string,
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
const isDispatch = typeof event.detail === "string";
while (target && !target.isSameNode(dialog.element) || isDispatch) {
while (target && target !== dialog.element || isDispatch) {
if (target.id === "cancelDialogConfirmBtn" || (isDispatch && event.detail=== "Escape")) {
if (cancel) {
cancel(dialog);

View file

@ -78,7 +78,7 @@ left:${left || "auto"};top:${top || "auto"}">
} else {
setTimeout(() => {
this.element.classList.add("b3-dialog--open");
});
}, Constants.TIMEOUT_OPENDIALOG);
}
/// #if !MOBILE
moveResize(this.element.querySelector(".b3-dialog__container"), options.resizeCallback);
@ -110,8 +110,9 @@ left:${left || "auto"};top:${top || "auto"}">
public bindInput(inputElement: HTMLInputElement | HTMLTextAreaElement, enterEvent?: () => void, bindEnter = true) {
inputElement.focus();
let timeStamp: number;
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
if (event.isComposing) {
if (event.isComposing || event.repeat) {
event.preventDefault();
return;
}
@ -122,6 +123,10 @@ left:${left || "auto"};top:${top || "auto"}">
return;
}
if (!event.shiftKey && isNotCtrl(event) && event.key === "Enter" && enterEvent && bindEnter) {
if (timeStamp && event.timeStamp - timeStamp < 124) {
return;
}
timeStamp = event.timeStamp;
enterEvent();
event.preventDefault();
event.stopPropagation();

View file

@ -3,8 +3,7 @@ import {Constants} from "../constants";
export const initMessage = () => {
const messageElement = document.getElementById("message");
messageElement.innerHTML = `<div class="fn__flex-1"></div>
<button class="b3-button ft__smaller fn__none">${window.siyuan.languages.clearMessage}</button>`;
messageElement.innerHTML = '<div class="fn__flex-1"></div>';
messageElement.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isEqualNode(messageElement)) {
@ -12,13 +11,6 @@ export const initMessage = () => {
hideMessage(target.parentElement.getAttribute("data-id"));
event.preventDefault();
break;
} else if (target.isSameNode(messageElement.lastElementChild)) {
target.parentElement.classList.remove("b3-snackbars--show");
setTimeout(() => {
target.parentElement.firstElementChild.innerHTML = "";
}, Constants.TIMEOUT_INPUT);
event.preventDefault();
break;
} else if (target.tagName === "A" || target.tagName === "BUTTON") {
break;
} else if (target.classList.contains("b3-snackbar")) {
@ -45,7 +37,7 @@ export const showMessage = (message: string, timeout = 6000, type = "info", mess
if (!messagesElement) {
let tempMessages = document.getElementById("tempMessage");
if (!tempMessages) {
document.body.insertAdjacentHTML("beforeend", `<div style="top: 22px;position: fixed;z-index: 100;right: 12px;line-height: 20px;word-break: break-word;display: flex;flex-direction: column;align-items: flex-end;"
document.body.insertAdjacentHTML("beforeend", `<div style="font-size: 14px;top: 22px;position: fixed;z-index: 100;right: 30px;line-height: 20px;word-break: break-word;display: flex;flex-direction: column;align-items: flex-end;"
id="tempMessage"></div>`);
tempMessages = document.getElementById("tempMessage");
}

View file

@ -386,7 +386,7 @@ export const transactionError = () => {
export const refreshFileTree = (cb?: () => void) => {
window.siyuan.storage[Constants.LOCAL_FILEPOSITION] = {};
setStorageVal(Constants.LOCAL_FILEPOSITION, window.siyuan.storage[Constants.LOCAL_FILEPOSITION]);
fetchPost("/api/filetree/refreshFiletree", {}, () => {
fetchPost("/api/system/rebuildDataIndex", {}, () => {
if (cb) {
cb();
}

View file

@ -16,7 +16,7 @@ export const historyKeydown = (event: KeyboardEvent, dialog: Dialog) => {
currentItem = items[items.length - 1];
} else {
items.find((item, index) => {
if (item.isSameNode(currentItem)) {
if (item === currentItem) {
if (event.key === "ArrowUp") {
if (index === 0) {
currentItem = items[items.length - 1];

View file

@ -128,7 +128,7 @@ export class Tab {
// 按 esc 取消的时候应该还原在 dragover 时交换的 tab
this.parent.children.forEach((item, index) => {
const currentElement = this.headElement.parentElement.children[index];
if (!item.headElement.isSameNode(currentElement)) {
if (item.headElement !== currentElement) {
if (index === 0) {
this.headElement.parentElement.firstElementChild.before(item.headElement);
} else {

View file

@ -170,7 +170,7 @@ export class Wnd {
if (!window.siyuan.currentDragOverTabHeadersElement) {
window.siyuan.currentDragOverTabHeadersElement = it;
} else {
if (!window.siyuan.currentDragOverTabHeadersElement.isSameNode(it)) {
if (window.siyuan.currentDragOverTabHeadersElement !== it) {
window.siyuan.currentDragOverTabHeadersElement.classList.remove("layout-tab-bars--drag");
window.siyuan.currentDragOverTabHeadersElement.querySelectorAll(".layout-tab-bar li[data-clone='true']").forEach(item => {
item.remove();
@ -220,7 +220,7 @@ export class Wnd {
return;
}
it.classList.remove("layout-tab-bars--drag");
if (!newTabHeaderElement.isSameNode(oldTabHeaderElement) &&
if (newTabHeaderElement !== oldTabHeaderElement &&
((oldTabHeaderElement.classList.contains("item--pin") && newTabHeaderElement.classList.contains("item--pin")) ||
(!oldTabHeaderElement.classList.contains("item--pin") && !newTabHeaderElement.classList.contains("item--pin")))) {
const rect = newTabHeaderElement.getClientRects()[0];
@ -816,7 +816,7 @@ export class Wnd {
if (item.headElement.classList.contains("item--focus")) {
let latestHeadElement: HTMLElement;
Array.from(item.headElement.parentElement.children).forEach((headItem: HTMLElement) => {
if (!headItem.isSameNode(item.headElement) &&
if (headItem !== item.headElement &&
headItem.style.maxWidth !== "0px" // 不对比已移除但还在动画效果中的元素 https://github.com/siyuan-note/siyuan/issues/7878
) {
if (!latestHeadElement) {

View file

@ -278,7 +278,7 @@ export class Backlink extends Model {
this.setFocus();
let target = event.target as HTMLElement;
while (target && !target.isEqualNode(this.element)) {
if (target.classList.contains("block__icon") && target.parentElement.parentElement.isSameNode(this.element)) {
if (target.classList.contains("block__icon") && target.parentElement.parentElement === this.element) {
const type = target.getAttribute("data-type");
switch (type) {
case "refresh":
@ -433,7 +433,7 @@ export class Backlink extends Model {
if (svgElement.classList.contains("b3-list-item__arrow--open")) {
svgElement.classList.remove("b3-list-item__arrow--open");
this.editors.find((item, index) => {
if (item.protyle.block.rootID === docId && liElement.nextElementSibling && item.protyle.element.isSameNode(liElement.nextElementSibling)) {
if (item.protyle.block.rootID === docId && liElement.nextElementSibling && item.protyle.element === liElement.nextElementSibling) {
item.destroy();
this.editors.splice(index, 1);
liElement.nextElementSibling.remove();

View file

@ -178,7 +178,7 @@ export class Outline extends Model {
break;
}
break;
} else if (this.blockId && (target.isSameNode(this.headerElement.nextElementSibling) || target.classList.contains("block__icons"))) {
} else if (this.blockId && (target === this.headerElement.nextElementSibling || target.classList.contains("block__icons"))) {
openFileById({
app: options.app,
id: this.blockId,
@ -269,7 +269,7 @@ export class Outline extends Model {
this.element.querySelectorAll(".dragover__top, .dragover__bottom, .dragover, .dragover__current").forEach(item => {
item.classList.remove("dragover__top", "dragover__bottom", "dragover", "dragover__current");
});
if (selectItem.isSameNode(item)) {
if (selectItem === item) {
selectItem.classList.add("dragover__current");
return;
}

View file

@ -186,13 +186,13 @@ export class Dock {
const targetItem = hasClosestByClassName(moveEvent.target as HTMLElement, "dock__item") ||
hasClosestByClassName(moveEvent.target as HTMLElement, "dock__items") as HTMLElement ||
hasClosestByClassName(moveEvent.target as HTMLElement, "dock__item--space") as HTMLElement;
if (targetItem && selectItem && targetItem.isSameNode(selectItem)) {
if (targetItem && selectItem && targetItem === selectItem) {
if (selectItem.classList.contains("dock__item--space")) {
const selectRect = selectItem.getBoundingClientRect();
if (selectItem.parentElement.id === "dockBottom") {
if (moveEvent.clientX < selectRect.right && moveEvent.clientX > selectRect.right - 40) {
const lastFirstElement = selectItem.nextElementSibling.firstElementChild;
if (lastFirstElement && lastFirstElement.isSameNode(item)) {
if (lastFirstElement && lastFirstElement === item) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
@ -202,7 +202,7 @@ export class Dock {
} else {
if (moveEvent.clientY < selectRect.bottom && moveEvent.clientY > selectRect.bottom - 40) {
const lastFirstElement = selectItem.nextElementSibling.firstElementChild;
if (lastFirstElement && lastFirstElement.isSameNode(item)) {
if (lastFirstElement && lastFirstElement === item) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
@ -211,7 +211,7 @@ export class Dock {
}
}
} else if (selectItem.classList.contains("dock__item--pin")) {
if (item.nextElementSibling?.isSameNode(selectItem)) {
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
@ -221,14 +221,14 @@ export class Dock {
const selectRect = selectItem.getBoundingClientRect();
if (selectItem.parentElement.parentElement.id === "dockBottom") {
if (selectRect.left + selectRect.width / 2 > moveEvent.clientX) {
if (item.nextElementSibling?.isSameNode(selectItem)) {
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
selectItem.before(moveItem);
}
} else {
if (item.previousElementSibling?.isSameNode(selectItem)) {
if (item.previousElementSibling && item.previousElementSibling === selectItem) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
@ -237,14 +237,14 @@ export class Dock {
}
} else {
if (selectRect.top + selectRect.height / 2 > moveEvent.clientY) {
if (item.nextElementSibling?.isSameNode(selectItem)) {
if (item.nextElementSibling && item.nextElementSibling === selectItem) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
selectItem.before(moveItem);
}
} else {
if (item.previousElementSibling?.isSameNode(selectItem)) {
if (item.previousElementSibling && item.previousElementSibling === selectItem) {
moveItem.classList.add("fn__none");
} else {
moveItem.classList.remove("fn__none");
@ -266,8 +266,8 @@ export class Dock {
}
return;
}
if (!targetItem || targetItem.style.position === "fixed" || targetItem.isSameNode(item) || targetItem.id === "dockMoveItem") {
if (targetItem && targetItem.isSameNode(item)) {
if (!targetItem || targetItem.style.position === "fixed" || (targetItem === item) || targetItem.id === "dockMoveItem") {
if (targetItem && targetItem === item) {
moveItem.classList.add("fn__none");
}
return;
@ -295,7 +295,7 @@ export class Dock {
} else if (moveItem.parentElement.parentElement.id === "dockRight") {
dock = window.siyuan.layout.rightDock;
}
dock.add(moveItem.parentElement.isSameNode(dock.element.firstElementChild) ? 0 : 1, item, moveItem.previousElementSibling?.getAttribute("data-type"));
dock.add(moveItem.parentElement === dock.element.firstElementChild ? 0 : 1, item, moveItem.previousElementSibling?.getAttribute("data-type"));
}
moveItem.remove();
};

View file

@ -134,6 +134,7 @@ export const initBar = (app: App) => {
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.element.setAttribute("data-name", "barmode");
window.siyuan.menus.menu.append(new MenuItem({
id: "themeLight",
label: window.siyuan.languages.themeLight,
icon: "iconLight",
current: window.siyuan.config.appearance.mode === 0 && !window.siyuan.config.appearance.modeOS,
@ -142,6 +143,7 @@ export const initBar = (app: App) => {
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "themeDark",
label: window.siyuan.languages.themeDark,
current: window.siyuan.config.appearance.mode === 1 && !window.siyuan.config.appearance.modeOS,
icon: "iconDark",
@ -150,6 +152,7 @@ export const initBar = (app: App) => {
}
}).element);
window.siyuan.menus.menu.append(new MenuItem({
id: "themeOS",
label: window.siyuan.languages.themeOS,
current: window.siyuan.config.appearance.modeOS,
icon: "iconMode",

View file

@ -667,7 +667,9 @@ export const resizeTopBar = () => {
return;
}
const dragElement = toolbarElement.querySelector("#drag") as HTMLElement;
if (!dragElement) {
return;
}
dragElement.style.padding = "";
const barMoreElement = toolbarElement.querySelector("#barMore");
barMoreElement.classList.remove("fn__none");
@ -857,17 +859,17 @@ export const addResize = (obj: Layout | Wnd) => {
if (previousNowSize < 8 || nextNowSize < 8) {
return;
}
if (window.siyuan.layout.leftDock?.layout.element.isSameNode(previousElement) &&
if (window.siyuan.layout.leftDock && window.siyuan.layout.leftDock.layout.element === previousElement &&
previousNowSize < getMinSize(previousElement) &&
// https://github.com/siyuan-note/siyuan/issues/10506
previousNowSize < previousSize) {
return;
}
if (window.siyuan.layout.rightDock?.layout.element.isSameNode(nextElement) &&
if (window.siyuan.layout.rightDock && window.siyuan.layout.rightDock.layout.element === nextElement &&
nextNowSize < getMinSize(nextElement) && nextNowSize < nextSize) {
return;
}
if (window.siyuan.layout.bottomDock?.layout.element.isSameNode(nextElement) &&
if (window.siyuan.layout.bottomDock && window.siyuan.layout.bottomDock.layout.element === nextElement &&
nextNowSize < 64 && nextNowSize < nextSize) {
return;
}

View file

@ -42,7 +42,7 @@ export class Menu {
}
const subMenuElement = itemElement.querySelector(".b3-menu__submenu") as HTMLElement;
this.element.querySelectorAll(".b3-menu__item--show").forEach((item) => {
if (!item.contains(itemElement) && !item.isSameNode(itemElement) && !itemElement.contains(item)) {
if (!item.contains(itemElement) && item !== itemElement && !itemElement.contains(item)) {
item.classList.remove("b3-menu__item--show");
}
});

View file

@ -6,7 +6,7 @@ import {getSearch, isMobile, isValidAttrName} from "../util/functions";
import {isLocalPath, movePathTo, moveToPath, pathPosix} from "../util/pathName";
import {MenuItem} from "./Menu";
import {saveExport} from "../protyle/export";
import {isInAndroid, isInHarmony, openByMobile} from "../protyle/util/compatibility";
import {isInAndroid, isInHarmony, openByMobile, writeText} from "../protyle/util/compatibility";
import {fetchPost, fetchSyncPost} from "../util/fetch";
import {hideMessage, showMessage} from "../dialog/message";
import {Dialog} from "../dialog";
@ -259,7 +259,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
if (typeof event.detail === "string") {
target = dialog.element.querySelector(`.item--full[data-type="${event.detail}"]`);
}
while (!target.isSameNode(dialog.element)) {
while (target !== dialog.element) {
const type = target.dataset.action;
if (target.classList.contains("item--full")) {
target.parentElement.querySelector(".item--focus").classList.remove("item--focus");
@ -380,8 +380,8 @@ export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?:
});
};
export const copySubMenu = (ids: string[], accelerator = true, focusElement?: Element) => {
return [{
export const copySubMenu = (ids: string[], accelerator = true, focusElement?: Element, stdMarkdownId?: string) => {
const menuItems = [{
id: "copyBlockRef",
iconHTML: "",
accelerator: accelerator ? window.siyuan.config.keymap.editor.general.copyBlockRef.custom : undefined,
@ -448,6 +448,32 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El
}
}
}];
if (stdMarkdownId) {
menuItems.push({
id: "copyMarkdown",
iconHTML: "",
label: window.siyuan.languages.copyMarkdown,
accelerator: undefined,
click: async () => {
const response = await fetchSyncPost("/api/export/exportMdContent", {
id: stdMarkdownId,
refMode: 3,
embedMode: 1,
yfm: false,
fillCSSVar: false,
adjustHeadingLevel: false
});
const text = response.data.content;
writeText(text);
if (focusElement) {
focusBlock(focusElement);
}
}
});
}
return menuItems;
};
export const exportMd = (id: string) => {

View file

@ -447,7 +447,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
const paths: string[] = [];
Array.from(liElement.parentElement.children).forEach((item) => {
if (item.tagName === "LI") {
if (item.isSameNode(liElement)) {
if (item === liElement) {
paths.push(undefined);
}
paths.push(item.getAttribute("data-path"));
@ -472,7 +472,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
Array.from(liElement.parentElement.children).forEach((item) => {
if (item.tagName === "LI") {
paths.push(item.getAttribute("data-path"));
if (item.isSameNode(liElement)) {
if (item === liElement) {
paths.push(undefined);
}
}

View file

@ -66,6 +66,7 @@ import {showMessage} from "../dialog/message";
import {img3115} from "../boot/compatibleVersion";
import {hideTooltip} from "../dialog/tooltip";
import {clearSelect} from "../protyle/util/clearSelect";
import {scrollCenter} from "../util/highlightById";
const renderAssetList = (element: Element, k: string, position: IPosition, exts: string[] = []) => {
fetchPost("/api/search/searchAsset", {
@ -620,7 +621,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
}
});
window.siyuan.menus.menu.append(new MenuItem({
id: "iconRefresh",
id: "turnInto",
label: window.siyuan.languages.turnInto,
icon: "iconRefresh",
submenu
@ -1020,7 +1021,7 @@ export const zoomOut = (options: {
}
focusBlock(showElement);
const resizeObserver = new ResizeObserver(() => {
showElement.scrollIntoView();
scrollCenter(options.protyle, focusElement, true, "smooth");
});
resizeObserver.observe(options.protyle.wysiwyg.element);
setTimeout(() => {
@ -2142,7 +2143,7 @@ export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement:
if (prueTrElement) {
const tbodyElement = nodeElement.querySelector("tbody");
const theadElement = nodeElement.querySelector("thead");
while (!prueTrElement.isSameNode(theadElement.lastElementChild)) {
while (prueTrElement !== theadElement.lastElementChild) {
tbodyElement.insertAdjacentElement("afterbegin", theadElement.lastElementChild);
}
}

View file

@ -352,7 +352,7 @@ const initSearchEvent = (app: App, element: Element, config: Config.IUILayoutTab
const localSearch = window.siyuan.storage[Constants.LOCAL_SEARCHASSET] as ISearchAssetOption;
element.addEventListener("click", (event: MouseEvent) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(element)) {
while (target && (target !== element)) {
const type = target.getAttribute("data-type");
if (type === "replaceHistory") {
toggleReplaceHistory(target.nextElementSibling as HTMLInputElement);

View file

@ -94,6 +94,22 @@ export const initAbout = () => {
<input class="b3-text-field fn__block" style="padding-right: 64px;" id="retentionIndexesDaily" min="1" type="number" class="b3-text-field" value="${window.siyuan.config.repo.retentionIndexesDaily}">
<div class="b3-label__text">${window.siyuan.languages.dataRepoAutoPurgeRetentionIndexesDaily}</div>
</div>
<div class="b3-label">
${window.siyuan.languages.vacuumDataIndex}
<div class="fn__hr"></div>
<button class="b3-button b3-button--outline fn__block" id="vacuumDataIndex">
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.vacuumDataIndex}
</button>
<div class="b3-label__text">${window.siyuan.languages.vacuumDataIndexTip}</div>
</div>
<div class="b3-label">
${window.siyuan.languages.rebuildDataIndex}
<div class="fn__hr"></div>
<button class="b3-button b3-button--outline fn__block" id="rebuildDataIndex">
<svg><use xlink:href="#iconRefresh"></use></svg>${window.siyuan.languages.rebuildDataIndex}
</button>
<div class="b3-label__text">${window.siyuan.languages.rebuildDataIndexTip}</div>
</div>
<div class="b3-label">
${window.siyuan.languages.systemLog}
<div class="fn__hr"></div>
@ -182,7 +198,7 @@ export const initAbout = () => {
const importKeyElement = modelMainElement.querySelector("#importKey");
modelMainElement.firstElementChild.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
while (target && !target.isSameNode(modelMainElement)) {
while (target && (target !== modelMainElement)) {
if (target.id === "authCode") {
setAccessAuthCode();
event.preventDefault();
@ -283,6 +299,16 @@ export const initAbout = () => {
event.preventDefault();
event.stopPropagation();
break;
} else if (target.id === "vacuumDataIndex") {
fetchPost("/api/system/vacuumDataIndex", {}, () => {});
event.preventDefault();
event.stopPropagation();
break;
} else if (target.id === "rebuildDataIndex") {
fetchPost("/api/system/rebuildDataIndex", {}, () => {});
event.preventDefault();
event.stopPropagation();
break;
} else if (target.id === "exportLog") {
fetchPost("/api/system/exportLog", {}, (response) => {
openByMobile(response.data.zip);

View file

@ -135,7 +135,7 @@ ${renewHTML}<div class="fn__hr--b"></div>`;
if (typeof event.detail !== "number") {
target = event.detail;
}
while (target && !target.isSameNode(modelMainElement)) {
while (target && target !== modelMainElement) {
if (target.getAttribute("data-action") === "iOSPay") {
iOSPurchase(target.getAttribute("data-type"));
event.preventDefault();

View file

@ -30,6 +30,16 @@ export const initFileTree = () => {
<span class="fn__space"></span>
<input class="b3-switch fn__flex-center" id="useSingleLineSave" type="checkbox"${window.siyuan.config.fileTree.useSingleLineSave ? " checked" : ""}/>
</label>
<div class="b3-label">
${window.siyuan.languages.fileTree22}
<span class="fn__hr"></span>
<div class="fn__flex">
<input class="b3-text-field fn__flex-1" id="largeFileWarningSize" type="number" min="2" max="10240" value="${window.siyuan.config.fileTree.largeFileWarningSize}">
<span class="fn__space"></span>
<span class="ft__on-surface fn__flex-center">MB</span>
</div>
<div class="b3-label__text">${window.siyuan.languages.fileTree23}</div>
</div>
<div class="b3-label">
${window.siyuan.languages.fileTree16}
<span class="fn__hr"></span>
@ -69,6 +79,7 @@ export const initFileTree = () => {
allowCreateDeeper: (modelMainElement.querySelector("#allowCreateDeeper") as HTMLInputElement).checked,
removeDocWithoutConfirm: (modelMainElement.querySelector("#removeDocWithoutConfirm") as HTMLInputElement).checked,
useSingleLineSave: (modelMainElement.querySelector("#useSingleLineSave") as HTMLInputElement).checked,
largeFileWarningSize: parseInt((modelMainElement.querySelector("#largeFileWarningSize") as HTMLInputElement).value),
maxListCount: parseInt((modelMainElement.querySelector("#maxListCount") as HTMLInputElement).value),
maxOpenTabCount: window.siyuan.config.fileTree.maxOpenTabCount,
}, response => {

View file

@ -1,6 +1,6 @@
import {confirmDialog} from "../dialog/confirmDialog";
import {Plugin} from "./index";
import {showMessage} from "../dialog/message";
import {hideMessage, showMessage} from "../dialog/message";
import {Dialog} from "../dialog";
import {fetchGet, fetchPost, fetchSyncPost} from "../util/fetch";
import {getBackend, getFrontend} from "../util/functions";
@ -19,7 +19,7 @@ import {Protyle} from "../protyle";
import {openMobileFileById} from "../mobile/editor";
import {lockScreen, exitSiYuan} from "../dialog/processSystem";
import {Model} from "../layout/Model";
import {getDockByType} from "../layout/tabUtil";
import {getActiveTab, getDockByType} from "../layout/tabUtil";
/// #if !MOBILE
import {getAllModels} from "../layout/getAll";
/// #endif
@ -29,6 +29,7 @@ import {openAttr, openFileAttr} from "../menus/commonMenuItem";
import {globalCommand} from "../boot/globalEvent/command/global";
import {exportLayout} from "../layout/util";
import {saveScroll} from "../protyle/scroll/saveScroll";
import {hasClosestByClassName} from "../protyle/util/hasClosest";
let openTab;
let openWindow;
@ -212,11 +213,47 @@ const saveLayout = (cb: () => void) => {
/// #endif
};
const getActiveEditor = (wndActive = true) => {
let editor;
/// #if !MOBILE
const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : null;
const allEditor = getAllEditor();
if (range) {
editor = allEditor.find(item => {
if (item.protyle.element.contains(range.startContainer)) {
return true;
}
});
}
if (!editor) {
editor = allEditor.find(item => {
if (hasClosestByClassName(item.protyle.element, "layout__wnd--active", true)) {
return true;
}
});
}
if (!editor && !wndActive) {
let activeTime = 0;
allEditor.forEach(item => {
const headerElement = item.protyle?.model.parent.headElement;
if (headerElement && headerElement.classList.contains("item--focus") && parseInt(headerElement.dataset.activetime) > activeTime) {
activeTime = parseInt(headerElement.dataset.activetime);
editor = item;
}
});
}
/// #else
editor = window.siyuan.mobile.popEditor || window.siyuan.mobile.editor;
/// #endif
return editor;
};
export const API = {
adaptHotkey: updateHotkeyTip,
confirm: confirmDialog,
Constants,
showMessage,
hideMessage,
fetchPost,
fetchSyncPost,
fetchGet,
@ -235,8 +272,10 @@ export const API = {
Setting,
getAllEditor,
/// #if !MOBILE
getActiveTab,
getAllModels,
/// #endif
getActiveEditor,
platformUtils,
openSetting,
openAttributePanel,

View file

@ -6,7 +6,7 @@ import {isMobile, isWindow} from "../util/functions";
import {Custom} from "../layout/dock/Custom";
import {getAllModels} from "../layout/getAll";
import {Tab} from "../layout/Tab";
import {setPanelFocus} from "../layout/util";
import {resizeTopBar, setPanelFocus} from "../layout/util";
import {getDockByType} from "../layout/tabUtil";
///#else
import {MobileCustom} from "../mobile/dock/MobileCustom";
@ -155,8 +155,19 @@ export class Plugin {
}
public addIcons(svg: string) {
document.body.insertAdjacentHTML("afterbegin", `<svg data-name="${this.name}" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
const svgElement = document.querySelector(`svg[data-name="${this.name}"] defs`);
if (svgElement) {
svgElement.insertAdjacentHTML("afterbegin", svg);
} else {
const lastSvgElement = document.querySelector("body > svg:last-of-type");
if (lastSvgElement) {
lastSvgElement.insertAdjacentHTML("afterend", `<svg data-name="${this.name}" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
<defs>${svg}</defs></svg>`);
} else {
document.body.insertAdjacentHTML("afterbegin", `<svg data-name="${this.name}" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
<defs>${svg}</defs></svg>`);
}
}
}
public addTopBar(options: {
@ -183,6 +194,17 @@ export class Plugin {
iconElement.innerHTML = options.icon.startsWith("icon") ? `<svg><use xlink:href="#${options.icon}"></use></svg>` : options.icon;
iconElement.addEventListener("click", options.callback);
iconElement.setAttribute("data-location", options.position || "right");
resizeTopBar();
}
if (isMobile() && window.siyuan.storage) {
if (!window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(iconElement.id)) {
document.querySelector("#menuAbout")?.after(iconElement);
}
} else if (!isWindow() && window.siyuan.storage) {
if (window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(iconElement.id)) {
iconElement.classList.add("fn__none");
}
document.querySelector("#" + (iconElement.getAttribute("data-location") === "right" ? "barPlugins" : "drag"))?.before(iconElement);
}
this.topBarIcons.push(iconElement);
return iconElement;
@ -195,6 +217,14 @@ export class Plugin {
/// #if !MOBILE
options.element.setAttribute("data-location", options.position || "right");
this.statusBarIcons.push(options.element);
const statusElement = document.getElementById("status");
if (statusElement) {
if (options.element.getAttribute("data-location") === "right") {
statusElement.insertAdjacentElement("beforeend", options.element);
} else {
statusElement.insertAdjacentElement("afterbegin", options.element);
}
}
return options.element;
/// #endif
}

View file

@ -9,7 +9,7 @@ import {getFrontend, isMobile, isWindow} from "../util/functions";
import {Constants} from "../constants";
import {uninstall} from "./uninstall";
import {setStorageVal} from "../protyle/util/compatibility";
import { getAllEditor } from "../layout/getAll";
import {getAllEditor} from "../layout/getAll";
const requireFunc = (key: string) => {
const modules = {
@ -92,7 +92,7 @@ export const loadPlugin = async (app: App, item: IPluginData) => {
afterLoadPlugin(plugin);
saveLayout();
getAllEditor().forEach(editor => {
editor.protyle.toolbar.update(editor.protyle);
editor.protyle.toolbar.update(editor.protyle);
});
return plugin;
};
@ -129,6 +129,9 @@ export const afterLoadPlugin = (plugin: Plugin) => {
if (!isWindow() || isMobile()) {
plugin.topBarIcons.forEach(element => {
if (document.contains(element)) {
return;
}
if (isMobile()) {
if (!window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(element.id)) {
document.querySelector("#menuAbout").after(element);
@ -144,6 +147,9 @@ export const afterLoadPlugin = (plugin: Plugin) => {
/// #if !MOBILE
resizeTopBar();
plugin.statusBarIcons.forEach(element => {
if (document.contains(element)) {
return;
}
const statusElement = document.getElementById("status");
if (element.getAttribute("data-location") === "right") {
statusElement.insertAdjacentElement("beforeend", element);
@ -167,7 +173,7 @@ export const afterLoadPlugin = (plugin: Plugin) => {
updateDock(dockItem, index, plugin, "Bottom");
});
Object.keys(plugin.docks).forEach(key => {
if (window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name] && window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key]) {
if (window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name] && window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key]) {
plugin.docks[key].config = window.siyuan.storage[Constants.LOCAL_PLUGIN_DOCKS][plugin.name][key];
}
const dock = plugin.docks[key];

View file

@ -9,24 +9,32 @@ import {Constants} from "../constants";
export const openTopBarMenu = (app: App, target?: Element) => {
const menu = new Menu("topBarPlugin");
/// #if !MOBILE
menu.addItem({
icon: "iconSettings",
label: window.siyuan.languages.manage,
ignore: isHuawei() || window.siyuan.config.readonly,
click() {
openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click"));
}
});
menu.addSeparator(undefined, isHuawei() || window.siyuan.config.readonly);
menu.addItem({
id: "manage",
icon: "iconSettings",
label: window.siyuan.languages.manage,
ignore: isHuawei() || window.siyuan.config.readonly,
click() {
openSetting(app).element.querySelector('.b3-tab-bar [data-name="bazaar"]').dispatchEvent(new CustomEvent("click"));
}
});
menu.addSeparator({id: "separator_1"}, isHuawei() || window.siyuan.config.readonly);
/// #endif
let hasPlugin = false;
app.plugins.forEach((plugin) => {
// @ts-ignore
const hasSetting = plugin.setting || plugin.__proto__.hasOwnProperty("openSetting");
let hasTopBar = false;
plugin.topBarIcons.forEach(item => {
for (let i = 0; i < plugin.topBarIcons.length; i++) {
const item = plugin.topBarIcons[i];
if (!document.contains(item)) {
plugin.topBarIcons.splice(i, 1);
i--;
continue;
}
const hasUnpin = window.siyuan.storage[Constants.LOCAL_PLUGINTOPUNPIN].includes(item.id);
const submenu = [{
id: hasUnpin ? "pin" : "unpin",
icon: hasUnpin ? "iconPin" : "iconUnpin",
label: hasUnpin ? window.siyuan.languages.pin : window.siyuan.languages.unpin,
click() {
@ -43,6 +51,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
}];
if (hasSetting) {
submenu.push({
id: "config",
icon: "iconSettings",
label: window.siyuan.languages.config,
click() {
@ -53,6 +62,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
const itemLabel = target ? item.getAttribute("aria-label") : item.textContent.trim();
if (!target) {
submenu.push({
id: "play",
icon: "iconPlay",
label: itemLabel,
click() {
@ -62,6 +72,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
});
}
const menuOption: IMenu = {
id: item.id,
icon: "iconInfo",
label: itemLabel,
click: target ? () => {
@ -80,10 +91,11 @@ export const openTopBarMenu = (app: App, target?: Element) => {
menu.addItem(menuOption);
hasPlugin = true;
hasTopBar = true;
});
}
if (!hasTopBar && hasSetting) {
hasPlugin = true;
menu.addItem({
id: plugin.name,
icon: "iconSettings",
label: plugin.displayName,
click() {
@ -97,6 +109,7 @@ export const openTopBarMenu = (app: App, target?: Element) => {
window.siyuan.menus.menu.element.querySelector(".b3-menu__separator")?.remove();
} else {
menu.addItem({
id: "emptyContent",
iconHTML: "",
type: "readonly",
label: window.siyuan.languages.emptyContent,

View file

@ -32,9 +32,12 @@ export const uninstall = (app: App, name: string, isUninstall = false) => {
});
/// #endif
// rm topBar
plugin.topBarIcons.forEach(item => {
for (let i = 0; i < plugin.topBarIcons.length; i++) {
const item = plugin.topBarIcons[i];
item.remove();
});
plugin.topBarIcons.splice(i, 1);
i--;
}
/// #if !MOBILE
resizeTopBar();
// rm statusBar
@ -62,6 +65,8 @@ export const uninstall = (app: App, name: string, isUninstall = false) => {
});
// rm plugin
app.plugins.splice(index, 1);
// rm icons
document.querySelector(`svg[data-name="${plugin.name}"]`)?.remove();
// rm protyle toolbar
getAllEditor().forEach(editor => {
editor.protyle.toolbar.update(editor.protyle);

View file

@ -26,7 +26,7 @@ export const net2LocalAssets = (protyle: IProtyle, type: "Assets" | "Img") => {
/// #else
getAllEditor().forEach(item => {
if (item.protyle.block.rootID === protyle.block.rootID) {
reloadProtyle(item.protyle, item.protyle.element.isSameNode(protyle.element));
reloadProtyle(item.protyle, item.protyle.element === protyle.element);
}
});
/// #endif
@ -95,7 +95,7 @@ export const fullscreen = (element: Element, btnElement?: Element) => {
window.siyuan.editorIsFullscreen = !isFullscreen;
}
getAllModels().editor.forEach(item => {
if (!element.isSameNode(item.element)) {
if (element !== item.element) {
if (window.siyuan.editorIsFullscreen) {
if (item.element.classList.contains("fullscreen")) {
item.element.classList.remove("fullscreen");

View file

@ -363,7 +363,7 @@ ${padHTML}
click() {
if (!needSubscribe()) {
confirmDialog("📦 " + window.siyuan.languages.uploadAssets2CDN, window.siyuan.languages.uploadAssets2CDNConfirmTip, () => {
fetchPost("/api/asset/uploadCloud", {id: protyle.block.parentID});
fetchPost("/api/asset/uploadCloud", {id: protyle.block.id});
});
}
}
@ -444,10 +444,14 @@ ${padHTML}
setEditMode(protyle, "wysiwyg");
protyle.scroll.lastScrollTop = 0;
fetchPost("/api/filetree/getDoc", {
id: protyle.block.parentID,
size: window.siyuan.config.editor.dynamicLoadBlocks,
id: protyle.block.id,
size: protyle.block.id === protyle.block.rootID ? window.siyuan.config.editor.dynamicLoadBlocks : Constants.SIZE_GET_MAX,
}, getResponse => {
onGet({data: getResponse, protyle});
onGet({
data: getResponse,
protyle,
action: protyle.block.id === protyle.block.rootID ? [Constants.CB_GET_FOCUS, Constants.CB_GET_HTML, Constants.CB_GET_UNUNDO] : [Constants.CB_GET_ALL, Constants.CB_GET_FOCUS, Constants.CB_GET_UNUNDO, Constants.CB_GET_HTML]
});
});
/// #if !MOBILE
saveLayout();

View file

@ -85,7 +85,7 @@ const getSnippetCSS = () => {
let snippetCSS = "";
document.querySelectorAll("style").forEach((item) => {
if (item.id.startsWith("snippet")) {
snippetCSS += item.innerHTML;
snippetCSS += item.outerHTML;
}
});
return snippetCSS;
@ -182,8 +182,8 @@ const renderPDF = async (id: string) => {
}
${await setInlineStyle(false)}
${await getPluginStyle()}
${getSnippetCSS()}
</style>
${getSnippetCSS()}
</head>
<body style="-webkit-print-color-adjust: exact;">
<div id="action">
@ -676,8 +676,8 @@ const onExport = async (data: IWebSocketData, filePath: string, exportOption: IE
body {font-family: var(--b3-font-family);background-color: var(--b3-theme-background);color: var(--b3-theme-on-background)}
${await setInlineStyle(false)}
${await getPluginStyle()}
${getSnippetCSS()}
</style>
${getSnippetCSS()}
</head>
<body>
<div class="${["htmlmd", "word"].includes(exportOption.type) ? "b3-typography" : "protyle-wysiwyg" + (window.siyuan.config.editor.displayBookmarkIcon ? " protyle-wysiwyg--attr" : "")}"

View file

@ -95,16 +95,30 @@ export class Gutter {
}
});
if (avElement.querySelector('.block__icon[data-type="av-sort"]')?.classList.contains("block__icon--active")) {
event.preventDefault();
event.stopPropagation();
return;
const bodyElements = avElement.querySelectorAll(".av__body");
if (bodyElements.length === 1) {
event.preventDefault();
event.stopPropagation();
return;
} else if (["template", "created", "updated"].includes(bodyElements[0].getAttribute("data-dtype"))) {
event.preventDefault();
event.stopPropagation();
return;
}
}
const rowElement = avElement.querySelector(`.av__body${buttonElement.dataset.groupId ? `[data-group-id="${buttonElement.dataset.groupId}"]` : ""} .av__row[data-id="${buttonElement.dataset.rowId}"]`);
if (!rowElement.classList.contains("av__row--select")) {
avElement.querySelectorAll(".av__row--select:not(.av__row--header)").forEach(item => {
item.classList.remove("av__row--select");
item.querySelector("use").setAttribute("xlink:href", "#iconUncheck");
});
}
const rowElement = avElement.querySelector(`.av__row[data-id="${buttonElement.dataset.rowId}"]`);
rowElement.classList.add("av__row--select");
rowElement.querySelector(".av__firstcol use").setAttribute("xlink:href", "#iconCheck");
updateHeader(rowElement as HTMLElement);
avElement.querySelectorAll(".av__row--select:not(.av__row--header)").forEach(item => {
selectIds.push(item.getAttribute("data-id"));
const groupId = (hasClosestByClassName(item, "av__body") as HTMLElement)?.dataset.groupId || "";
selectIds.push(item.getAttribute("data-id") + (groupId ? "@" + groupId : ""));
selectElements.push(item);
});
} else {
@ -269,16 +283,19 @@ export class Gutter {
const srcIDs = [Lute.NewNodeID()];
const previousID = event.altKey ? (rowElement.previousElementSibling.getAttribute("data-id") || "") : buttonElement.dataset.rowId;
const newUpdated = dayjs().format("YYYYMMDDHHmmss");
const groupID = rowElement.parentElement.getAttribute("data-group-id");
transaction(protyle, [{
action: "insertAttrViewBlock",
avID,
previousID,
srcs: [{
itemID: Lute.NewNodeID(),
id: srcIDs[0],
isDetached: true,
content: ""
}],
blockID: id,
groupID,
}, {
action: "doUpdateUpdated",
id,
@ -292,7 +309,7 @@ export class Gutter {
id,
data: blockElement.getAttribute("updated")
}]);
insertAttrViewBlockAnimation(protyle, blockElement, srcIDs, previousID, avID);
insertAttrViewBlockAnimation({protyle, blockElement, srcIDs, previousId: previousID, groupID});
if (event.altKey) {
this.element.querySelectorAll("button").forEach(item => {
item.dataset.rowId = srcIDs[0];
@ -553,17 +570,13 @@ export class Gutter {
public renderMultipleMenu(protyle: IProtyle, selectsElement: Element[]) {
let isList = false;
let isContinue = false;
let hasEmbedBlock = false;
selectsElement.find((item, index) => {
if (item.classList.contains("li")) {
isList = true;
return true;
}
if (item.classList.contains("sb") || item.classList.contains("p")) {
hasEmbedBlock = true;
}
if (item.nextElementSibling && selectsElement[index + 1] &&
item.nextElementSibling.isSameNode(selectsElement[index + 1])) {
item.nextElementSibling === selectsElement[index + 1]) {
isContinue = true;
} else if (index !== selectsElement.length - 1) {
isContinue = false;
@ -610,19 +623,16 @@ export class Gutter {
type: "Blocks2Blockquote"
}));
}
// 多选引用转换为块的时候 id 不一致
if (!hasEmbedBlock) {
turnIntoSubmenu.push(this.turnsInto({
menuId: "paragraph",
icon: "iconParagraph",
label: window.siyuan.languages.paragraph,
accelerator: window.siyuan.config.keymap.editor.heading.paragraph.custom,
protyle,
selectsElement,
type: "Blocks2Ps",
isContinue
}));
}
turnIntoSubmenu.push(this.turnsInto({
menuId: "paragraph",
icon: "iconParagraph",
label: window.siyuan.languages.paragraph,
accelerator: window.siyuan.config.keymap.editor.heading.paragraph.custom,
protyle,
selectsElement,
type: "Blocks2Ps",
isContinue
}));
turnIntoSubmenu.push(this.turnsInto({
menuId: "heading1",
icon: "iconH1",
@ -2302,17 +2312,18 @@ export class Gutter {
let dataNodeId = nodeElement.getAttribute("data-node-id");
if (type === "NodeAttributeView" && target) {
const rowElement = hasClosestByClassName(target, "av__row");
if (rowElement && !rowElement.classList.contains("av__row--header")) {
if (rowElement && !rowElement.classList.contains("av__row--header") && rowElement.dataset.id) {
element = rowElement;
const bodyElement = hasClosestByClassName(rowElement, "av__body") as HTMLElement;
let iconAriaLabel = isMac() ? window.siyuan.languages.rowTip : window.siyuan.languages.rowTip.replace("⇧", "Shift+");
if (protyle.disabled) {
iconAriaLabel = window.siyuan.languages.rowTip.substring(0, window.siyuan.languages.rowTip.indexOf("<br"));
} else if (rowElement.querySelector('[data-dtype="block"]')?.getAttribute("data-detached") === "true") {
iconAriaLabel = window.siyuan.languages.rowTip.substring(0, window.siyuan.languages.rowTip.lastIndexOf("<br"));
}
html = `<button data-type="NodeAttributeViewRowMenu" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" class="ariaLabel" data-position="parentW" aria-label="${iconAriaLabel}"><svg><use xlink:href="#iconDrag"></use></svg><span ${protyle.disabled ? "" : 'draggable="true" class="fn__grab"'}></span></button>`;
html = `<button data-type="NodeAttributeViewRowMenu" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" data-group-id="${bodyElement.dataset.groupId || ""}" class="ariaLabel" data-position="parentW" aria-label="${iconAriaLabel}"><svg><use xlink:href="#iconDrag"></use></svg><span ${protyle.disabled ? "" : 'draggable="true" class="fn__grab"'}></span></button>`;
if (!protyle.disabled) {
html = `<button data-type="NodeAttributeViewRow" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" class="ariaLabel" data-position="parentW" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>${html}`;
html = `<button data-type="NodeAttributeViewRow" data-node-id="${dataNodeId}" data-row-id="${rowElement.dataset.id}" data-group-id="${bodyElement.dataset.groupId || ""}" class="ariaLabel" data-position="parentW" aria-label="${isMac() ? window.siyuan.languages.addBelowAbove : window.siyuan.languages.addBelowAbove.replace("⌥", "Alt+")}"><svg><use xlink:href="#iconAdd"></use></svg></button>${html}`;
}
break;
}
@ -2329,7 +2340,7 @@ export class Gutter {
listItem = undefined;
}
// 标题必须显示
if (!topElement.isSameNode(nodeElement) && type !== "NodeHeading") {
if (topElement !== nodeElement && type !== "NodeHeading") {
nodeElement = topElement;
parentElement = hasClosestBlock(nodeElement.parentElement);
type = nodeElement.getAttribute("data-type");

View file

@ -140,8 +140,8 @@ export class Title {
event.stopPropagation();
}
} else if (event.key === "Enter") {
const editElment = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
if (editElment && editElment.textContent === "" && !protyle.wysiwyg.element.firstElementChild.classList.contains("av")) {
const editElement = getContenteditableElement(protyle.wysiwyg.element.firstElementChild);
if (editElement && editElement.textContent === "" && editElement.getAttribute("placeholder")) {
// 配合提示文本使用,避免提示文本挤压到第二个块中
focusBlock(protyle.wysiwyg.element.firstElementChild, protyle.wysiwyg.element);
} else {
@ -344,6 +344,13 @@ export class Title {
if (this.element.getAttribute("data-render") === "true") {
return false;
}
if (protyle.options.render.hideTitleOnZoom) {
if (protyle.block.showAll) {
this.element.classList.add("fn__none");
} else {
this.element.classList.remove("fn__none");
}
}
this.element.setAttribute("data-node-id", protyle.block.rootID);
if (response.data.ial[Constants.CUSTOM_RIFF_DECKS]) {
this.element.setAttribute(Constants.CUSTOM_RIFF_DECKS, response.data.ial[Constants.CUSTOM_RIFF_DECKS]);

View file

@ -42,7 +42,7 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => {
label: window.siyuan.languages.copy,
icon: "iconCopy",
type: "submenu",
submenu: copySubMenu([protyle.block.rootID])
submenu: copySubMenu([protyle.block.rootID], true, undefined, protyle.block.showAll ? protyle.block.id : protyle.block.rootID)
}).element);
if (!protyle.disabled) {
window.siyuan.menus.menu.append(movePathToMenu([protyle.path]));

View file

@ -332,6 +332,7 @@ export const hintSlash = (key: string, protyle: IProtyle) => {
plugin.protyleSlash.forEach(slash => {
allList.push({
filter: slash.filter,
id: slash.id,
value: `plugin${Constants.ZWSP}${plugin.name}${Constants.ZWSP}${slash.id}`,
html: slash.html
});
@ -564,7 +565,7 @@ export const hintMoveBlock = (pathString: string, sourceElements: Element[], pro
item.parentElement) {
topSourceElement = getTopAloneElement(item);
sideElement = topSourceElement.nextElementSibling || topSourceElement.previousElementSibling;
if (topSourceElement.isSameNode(item)) {
if (topSourceElement === item) {
topSourceElement = undefined;
}
}

View file

@ -439,7 +439,7 @@ ${genHintItemHTML(item)}
if (!rowElement) {
return;
}
const previousID = cellElement.dataset.blockId;
const previousID = rowElement.dataset.id;
const avID = nodeElement.getAttribute("data-av-id");
let tempElement = document.createElement("div");
tempElement.innerHTML = value.replace(/<mark>/g, "").replace(/<\/mark>/g, "");
@ -727,7 +727,7 @@ ${genHintItemHTML(item)}
focusByRange(range);
this.genEmojiHTML(protyle);
return;
} else if (value.indexOf("style") > -1) {
} else if (value.startsWith("style")) {
range.deleteContents();
this.fixImageCursor(range);
nodeElement.setAttribute("style", value.split(Constants.ZWSP)[1] || "");
@ -858,7 +858,11 @@ ${genHintItemHTML(item)}
focusBlock(nodeElement);
} else if (nodeElement.classList.contains("av")) {
avRender(nodeElement, protyle, () => {
(nodeElement.querySelector(".av__title") as HTMLInputElement).focus();
const titleHTMLElement = nodeElement.querySelector(".av__title") as HTMLInputElement;
titleHTMLElement.focus();
range.setStart(titleHTMLElement, 0);
range.collapse(true);
focusByRange(range);
});
} else {
focusByWbr(nodeElement, range);

View file

@ -48,6 +48,7 @@ import {getAllModels} from "../layout/getAll";
import {isSupportCSSHL} from "./render/searchMarkRender";
import {renderAVAttribute} from "./render/av/blockAttr";
import {genEmptyElement} from "../block/util";
import {zoomOut} from "../menus/protyle";
export class Protyle {
@ -147,7 +148,7 @@ export class Protyle {
}
break;
case "refreshAttributeView":
Array.from(this.protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${data.data.id}"]`)).forEach((item: HTMLElement) => {
Array.from(this.protyle.wysiwyg.element.querySelectorAll(`.av[data-av-id="${data.data.id}"]`)).forEach((item: HTMLElement) => {
item.removeAttribute("data-render");
avRender(item, this.protyle);
});
@ -159,9 +160,7 @@ export class Protyle {
break;
case "transactions":
data.data[0].doOperations.find((item: IOperation) => {
if (!this.protyle.preview.element.classList.contains("fn__none") &&
item.action !== "updateAttrs" // 预览模式下点击只读
) {
if (!this.protyle.preview.element.classList.contains("fn__none")) {
this.protyle.preview.render(this.protyle);
} else if (options.backlinkData && ["delete", "move"].includes(item.action)) {
// 只对特定情况刷新,否则展开、编辑等操作刷新会频繁
@ -179,16 +178,28 @@ export class Protyle {
// 反链面板移除元素后,文档为空
if (this.protyle.wysiwyg.element.childElementCount === 0 && this.protyle.block.parentID &&
!(item.action === "delete" && typeof item.data?.createEmptyParagraph === "boolean" && !item.data.createEmptyParagraph)) {
const newID = Lute.NewNodeID();
const emptyElement = genEmptyElement(false, false, newID);
this.protyle.wysiwyg.element.append(emptyElement);
transaction(this.protyle, [{
action: "insert",
data: emptyElement.outerHTML,
id: newID,
parentID: this.protyle.block.parentID
}]);
this.protyle.undo.clear();
if (item.action === "delete" && this.protyle.block.showAll) {
if (this.protyle.options.handleEmptyContent) {
this.protyle.options.handleEmptyContent();
} else {
zoomOut({
protyle: this.protyle,
id: this.protyle.block.rootID,
focusId: this.protyle.block.id
});
}
} else {
const newID = Lute.NewNodeID();
const emptyElement = genEmptyElement(false, false, newID);
this.protyle.wysiwyg.element.append(emptyElement);
transaction(this.protyle, [{
action: "insert",
data: emptyElement.outerHTML,
id: newID,
parentID: this.protyle.block.parentID
}]);
this.protyle.undo.clear();
}
}
}
});

View file

@ -184,7 +184,7 @@ export class Preview {
}
this.mdTimeoutId = window.setTimeout(() => {
fetchPost("/api/export/preview", {
id: protyle.block.parentID || protyle.options.blockId,
id: protyle.block.id || protyle.options.blockId || protyle.block.parentID,
}, response => {
const oldScrollTop = protyle.preview.previewElement.scrollTop;
protyle.preview.previewElement.innerHTML = response.data.html;
@ -277,14 +277,17 @@ export class Preview {
this.processZHTable(copyElement);
} else if (type === "yuque") {
fetchPost("/api/lute/copyStdMarkdown", {
id: protyle.block.rootID,
id: protyle.block.id || protyle.options.blockId || protyle.block.parentID,
assetsDestSpace2Underscore: true,
fillCSSVar: true,
adjustHeadingLevel: true,
}, (response) => {
writeText(response.data);
showMessage(`${window.siyuan.languages.pasteToYuque}`);
});
return;
}
// 防止背景色被粘贴到公众号中
copyElement.style.backgroundColor = "#fff";
// 代码背景

View file

@ -1,10 +1,11 @@
import {Menu} from "../../../plugin/Menu";
import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../../util/hasClosest";
import {hasClosestBlock, hasClosestByClassName} from "../../util/hasClosest";
import {transaction} from "../../wysiwyg/transaction";
import {openEditorTab} from "../../../menus/util";
import {openFileAttr} from "../../../menus/commonMenuItem";
import {
addDragFill, cellValueIsEmpty,
addDragFill,
cellValueIsEmpty,
genCellValueByElement,
getCellText,
getTypeByCellElement,
@ -47,100 +48,11 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
return false;
}
const loadMoreElement = hasClosestByAttribute(event.target, "data-type", "av-load-more");
if (loadMoreElement && !hasClosestByAttribute(event.target, "data-type", "set-page-size")) {
const rowFooterElement = blockElement.querySelector(".av__row--footer") as HTMLElement;
if (rowFooterElement) {
rowFooterElement.style.transform = "";
}
blockElement.removeAttribute("data-render");
blockElement.dataset.pageSize = (parseInt(blockElement.dataset.pageSize) + parseInt(blockElement.querySelector('[data-type="set-page-size"]').getAttribute("data-size"))).toString();
avRender(blockElement, protyle);
event.preventDefault();
event.stopPropagation();
return true;
}
const firstColElement = hasClosestByClassName(event.target, "av__firstcol");
if (firstColElement) {
window.siyuan.menus.menu.remove();
selectRow(firstColElement, "toggle");
event.preventDefault();
event.stopPropagation();
return true;
}
const imgElement = hasClosestByClassName(event.target, "av__cellassetimg");
if (imgElement) {
previewAttrViewImages(
removeCompressURL((imgElement as HTMLImageElement).getAttribute("src")),
blockElement.getAttribute("data-av-id"),
blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
(blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement)?.value.trim() || ""
);
event.preventDefault();
event.stopPropagation();
return true;
}
if (event.shiftKey) {
const rowElement = hasClosestByClassName(event.target, "av__row");
if (rowElement && !rowElement.classList.contains("av__row--header")) {
selectRow(rowElement.querySelector(".av__firstcol"), "toggle");
event.preventDefault();
event.stopPropagation();
return true;
}
}
const copyElement = hasClosestByAttribute(event.target, "data-type", "copy");
if (copyElement) {
writeText(getCellText(hasClosestByClassName(copyElement, "av__cell")));
showMessage(window.siyuan.languages.copied);
event.preventDefault();
event.stopPropagation();
return true;
}
const searchIconElement = hasClosestByAttribute(event.target, "data-type", "av-search-icon");
if (searchIconElement) {
const searchElement = blockElement.querySelector('input[data-type="av-search"]') as HTMLInputElement;
searchElement.style.width = "128px";
searchElement.style.paddingLeft = "";
searchElement.style.paddingRight = "";
const viewsElement = hasClosestByClassName(searchElement, "av__views");
if (viewsElement) {
viewsElement.classList.add("av__views--show");
}
setTimeout(() => {
searchElement.focus();
}, Constants.TIMEOUT_TRANSITION);
event.preventDefault();
event.stopPropagation();
return true;
}
const viewItemElement = hasClosestByClassName(event.target, "item");
if (viewItemElement && viewItemElement.parentElement.classList.contains("layout-tab-bar")) {
if (viewItemElement.classList.contains("item--focus")) {
openViewMenu({protyle, blockElement, element: viewItemElement});
} else {
transaction(protyle, [{
action: "setAttrViewBlockView",
blockID: blockElement.getAttribute("data-node-id"),
id: viewItemElement.dataset.id,
avID: blockElement.getAttribute("data-av-id"),
}]);
}
event.preventDefault();
event.stopPropagation();
return true;
}
if (protyle.disabled) {
return false;
}
const viewType = blockElement.getAttribute("data-av-type") as TAVView;
let target = event.target;
while (target && !target.isEqualNode(blockElement)) {
const type = target.getAttribute("data-type");
if (type === "av-header-add") {
if (type === "av-header-add" && !protyle.disabled) {
const addMenu = addCol(protyle, blockElement);
const addRect = target.getBoundingClientRect();
addMenu.open({
@ -151,42 +63,48 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-header-more") {
} else if (type === "av-header-more" && !protyle.disabled) {
openMenuPanel({protyle, blockElement, type: "properties"});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-add-more") {
insertRows(blockElement, protyle, 1, undefined);
} else if (type === "av-add-more" && !protyle.disabled) {
insertRows({
blockElement,
protyle,
count: 1,
previousID: "",
groupID: blockElement.querySelector(".av__body")?.getAttribute("data-group-id") || ""
});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-more") {
} else if (type === "av-more" && !protyle.disabled) {
openMenuPanel({protyle, blockElement, type: "config"});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-switcher") {
} else if (type === "av-switcher" && !protyle.disabled) {
openMenuPanel({protyle, blockElement, type: "switcher"});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-sort") {
} else if (type === "av-sort" && !protyle.disabled) {
openMenuPanel({protyle, blockElement, type: "sorts"});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-filter") {
} else if (type === "av-filter" && !protyle.disabled) {
openMenuPanel({protyle, blockElement, type: "filters"});
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-add") {
} else if (type === "av-add" && !protyle.disabled) {
addView(protyle, blockElement);
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "block-more") {
} else if (type === "block-more" && !protyle.disabled) {
window.siyuan.menus.menu.remove();
protyle.toolbar.range = document.createRange();
protyle.toolbar.range.selectNodeContents(target);
@ -199,7 +117,7 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "set-page-size") {
} else if (type === "set-page-size" && !protyle.disabled) {
setPageSize({
target,
protyle,
@ -209,20 +127,36 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-add-bottom") {
insertRows(blockElement, protyle, 1,
blockElement.querySelector(".av__row--util")?.previousElementSibling?.getAttribute("data-id") ||
target.previousElementSibling?.getAttribute("data-id") || undefined
);
} else if (type === "av-add-bottom" && !protyle.disabled) {
const bodyElement = hasClosestByClassName(target, "av__body");
insertRows({
blockElement, protyle,
count: 1,
previousID: (bodyElement && bodyElement.querySelector(".av__row--util")?.previousElementSibling?.getAttribute("data-id")) ||
target.previousElementSibling?.getAttribute("data-id") || undefined,
groupID: bodyElement ? bodyElement.getAttribute("data-group-id") : ""
});
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__cell--header")) {
} else if (type === "av-add-top" && !protyle.disabled) {
const titleElement = hasClosestByClassName(target, "av__group-title");
insertRows({
blockElement,
protyle,
count: 1,
previousID: "",
groupID: titleElement ? titleElement.nextElementSibling.getAttribute("data-group-id") : ""
});
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__cell--header") && !protyle.disabled) {
showColMenu(protyle, blockElement, target);
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__cell")) {
} else if (target.classList.contains("av__cell") && !protyle.disabled) {
if (!hasClosestByClassName(target, "av__row--header")) {
if (target.querySelector(".av__pulse")) {
return;
@ -258,14 +192,14 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__calc")) {
} else if (target.classList.contains("av__calc") && !protyle.disabled) {
openCalcMenu(protyle, target, undefined, event.clientX - 64);
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("b3-menu__avemoji")) {
} else if (target.classList.contains("b3-menu__avemoji") && !protyle.disabled) {
const rect = target.getBoundingClientRect();
openEmojiPanel(target.parentElement.getAttribute("data-block-id"), "doc", {
openEmojiPanel(target.nextElementSibling.getAttribute("data-id"), "doc", {
x: rect.left,
y: rect.bottom,
h: rect.height,
@ -276,12 +210,12 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-gallery-edit") {
} else if (type === "av-gallery-edit" && !protyle.disabled) {
editGalleryItem(target);
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-gallery-more") {
} else if (type === "av-gallery-more" && !protyle.disabled) {
const rect = target.getBoundingClientRect();
openGalleryItemMenu({
target,
@ -294,6 +228,101 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-group-fold") {
if (target.getAttribute("data-folding") !== "true") {
target.setAttribute("data-folding", "true");
const isOpen = target.firstElementChild.classList.contains("av__group-arrow--open");
transaction(protyle, [{
action: "foldAttrViewGroup",
avID: blockElement.dataset.avId,
blockID: blockElement.dataset.nodeId,
id: target.dataset.id,
data: isOpen
}], [{
action: "foldAttrViewGroup",
avID: blockElement.dataset.avId,
blockID: blockElement.dataset.nodeId,
id: target.dataset.id,
data: !isOpen
}]);
if (isOpen) {
target.firstElementChild.classList.remove("av__group-arrow--open");
target.parentElement.nextElementSibling.classList.add("fn__none");
} else {
target.firstElementChild.classList.add("av__group-arrow--open");
target.parentElement.nextElementSibling.classList.remove("fn__none");
}
}
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-load-more") {
blockElement.querySelectorAll(".av__row--footer").forEach((item: HTMLElement) => {
item.style.transform = "";
});
blockElement.removeAttribute("data-render");
const bodyElement = hasClosestByClassName(target, "av__body") as HTMLElement;
bodyElement.dataset.pageSize = (parseInt(bodyElement.dataset.pageSize) + parseInt(bodyElement.querySelector('[data-type="set-page-size"]').getAttribute("data-size"))).toString();
avRender(blockElement, protyle);
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__firstcol")) {
window.siyuan.menus.menu.remove();
selectRow(target, "toggle");
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("item") && target.parentElement.classList.contains("layout-tab-bar")) {
if (target.classList.contains("item--focus")) {
openViewMenu({protyle, blockElement, element: target});
} else {
transaction(protyle, [{
action: "setAttrViewBlockView",
blockID: blockElement.getAttribute("data-node-id"),
id: target.dataset.id,
avID: blockElement.getAttribute("data-av-id"),
}]);
}
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__cellassetimg")) {
previewAttrViewImages(
removeCompressURL((target as HTMLImageElement).getAttribute("src")),
blockElement.getAttribute("data-av-id"),
blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
(blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement)?.value.trim() || ""
);
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__row") && event.shiftKey && !target.classList.contains("av__row--header")) {
selectRow(target.querySelector(".av__firstcol"), "toggle");
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "copy") {
writeText(getCellText(hasClosestByClassName(target, "av__cell")));
showMessage(window.siyuan.languages.copied);
event.preventDefault();
event.stopPropagation();
return true;
} else if (type === "av-search-icon") {
const searchElement = blockElement.querySelector('input[data-type="av-search"]') as HTMLInputElement;
searchElement.style.width = "128px";
searchElement.style.paddingLeft = "";
searchElement.style.paddingRight = "";
const viewsElement = hasClosestByClassName(searchElement, "av__views");
if (viewsElement) {
viewsElement.classList.add("av__views--show");
}
setTimeout(() => {
searchElement.focus();
}, Constants.TIMEOUT_TRANSITION);
event.preventDefault();
event.stopPropagation();
return true;
}
target = target.parentElement;
}
@ -326,8 +355,8 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
}
const menu = new Menu();
const rowElements = blockElement.querySelectorAll(".av__row--select:not(.av__row--header), .av__gallery-item--select");
const keyCellElement = rowElements[0].querySelector(".av__cell[data-block-id]") as HTMLElement;
const ids = Array.from(rowElements).map(item => item.getAttribute("data-id"));
const keyCellElement = rowElements[0].querySelector('.av__cell[data-dtype="block"]') as HTMLElement;
const ids = Array.from(rowElements).map(item => item.querySelector('[data-dtype="block"] .av__celltext').getAttribute("data-id"));
if (rowElements.length === 1 && keyCellElement.getAttribute("data-detached") !== "true") {
/// #if !MOBILE
const blockId = ids[0];
@ -540,21 +569,26 @@ export const avContextmenu = (protyle: IProtyle, rowElement: HTMLElement, positi
const sourceIds: string[] = [];
rowElements.forEach(item => {
const rowId = item.getAttribute("data-id");
const blockValue = genCellValueByElement("block", item.querySelector(".av__cell[data-block-id]"));
const blockValue = genCellValueByElement("block", item.querySelector('.av__cell[data-dtype="block"]'));
srcs.push({
itemID: Lute.NewNodeID(),
content: blockValue.block.content,
id: rowId,
id: blockValue.block.id || "",
isDetached: blockValue.isDetached,
});
sourceIds.push(rowId);
});
const avID = listItemElement.dataset.avId;
const viewID = listItemElement.dataset.viewId;
transaction(protyle, [{
action: "insertAttrViewBlock",
ignoreDefaultFill: viewID ? false : true,
viewID,
avID,
ignoreFillFilter: true,
srcs,
blockID: listItemElement.dataset.blockId
context: {ignoreTip: "true"},
blockID: listItemElement.dataset.blockId,
groupID: rowElement.parentElement.getAttribute("data-group-id")
}, {
action: "doUpdateUpdated",
id: listItemElement.dataset.blockId,
@ -580,15 +614,27 @@ ${window.siyuan.languages[avType === "table" ? "insertRowBefore" : "insertItemBe
bind(element) {
const inputElement = element.querySelector("input");
element.addEventListener("click", () => {
if (document.activeElement.isSameNode(inputElement)) {
if (document.activeElement === inputElement) {
return;
}
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].previousElementSibling.getAttribute("data-id"));
insertRows({
blockElement,
protyle,
count: parseInt(inputElement.value),
previousID: rowElements[0].previousElementSibling.getAttribute("data-id"),
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
});
menu.close();
});
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
if (!event.isComposing && event.key === "Enter") {
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].previousElementSibling.getAttribute("data-id"));
insertRows({
blockElement,
protyle,
count: parseInt(inputElement.value),
previousID: rowElements[0].previousElementSibling.getAttribute("data-id"),
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
});
menu.close();
}
});
@ -603,15 +649,27 @@ ${window.siyuan.languages[avType === "table" ? "insertRowAfter" : "insertItemAft
bind(element) {
const inputElement = element.querySelector("input");
element.addEventListener("click", () => {
if (document.activeElement.isSameNode(inputElement)) {
if (document.activeElement === inputElement) {
return;
}
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].getAttribute("data-id"));
insertRows({
blockElement,
protyle,
count: parseInt(inputElement.value),
previousID: rowElements[0].getAttribute("data-id"),
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
});
menu.close();
});
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
if (!event.isComposing && event.key === "Enter") {
insertRows(blockElement, protyle, parseInt(inputElement.value), rowElements[0].getAttribute("data-id"));
insertRows({
blockElement,
protyle,
count: parseInt(inputElement.value),
previousID: rowElements[0].getAttribute("data-id"),
groupID: rowElements[0].parentElement.getAttribute("data-group-id")
});
menu.close();
}
});
@ -660,11 +718,11 @@ ${window.siyuan.languages[avType === "table" ? "insertRowAfter" : "insertItemAft
const selectElements: HTMLElement[] = Array.from(blockElement.querySelectorAll(`.av__gallery-item--select .av__cell[data-field-id="${cellElement.dataset.fieldId}"]`));
const type = cellElement.getAttribute("data-dtype") as TAVCol;
if (!["updated", "created"].includes(type)) {
const iconElement = cellElement.querySelector(".av__gallery-tip").firstElementChild.cloneNode(true) as HTMLElement;
const iconElement = cellElement.parentElement.querySelector(".av__gallery-tip, .av__gallery-name").firstElementChild.cloneNode(true) as HTMLElement;
iconElement.classList.add("b3-menu__icon");
editAttrSubmenu.push({
iconHTML: iconElement.outerHTML,
label: escapeHtml(cellElement.getAttribute("aria-label")),
label: escapeHtml(cellElement.getAttribute("aria-label").split('<div class="ft__on-surface">')[0]),
click() {
rowElement.querySelector(".av__gallery-fields").classList.add("av__gallery-fields--edit");
rowElement.querySelector('[data-type="av-gallery-edit"]').setAttribute("aria-label", window.siyuan.languages.hideEmptyFields);
@ -712,6 +770,10 @@ export const updateAVName = (protyle: IProtyle, blockElement: Element) => {
if (newData === nameElement.dataset.title.trim()) {
return;
}
if (newData.length > Constants.SIZE_TITLE) {
showMessage(window.siyuan.languages["_kernel"]["106"]);
return false;
}
const newUpdated = dayjs().format("YYYYMMDDHHmmss");
transaction(protyle, [{
action: "setAttrViewName",
@ -734,8 +796,8 @@ export const updateAVName = (protyle: IProtyle, blockElement: Element) => {
nameElement.dataset.title = newData;
// 当前页面不能进行推送,否则光标会乱跳
Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => {
if (blockElement.isSameNode(item)) {
Array.from(protyle.wysiwyg.element.querySelectorAll(`.av[data-av-id="${avId}"]`)).forEach((item: HTMLElement) => {
if (blockElement === item) {
return;
}
const titleElement = item.querySelector(".av__title") as HTMLElement;
@ -768,9 +830,14 @@ export const updateAttrViewCellAnimation = (cellElement: HTMLElement, value: IAV
const viewType = blockElement.getAttribute("data-av-type") as TAVView;
const iconElement = cellElement.querySelector(".b3-menu__avemoji");
if (viewType === "gallery") {
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false, viewType) +
cellElement.querySelector(".av__gallery-tip").outerHTML;
cellElement.setAttribute("data-empty", cellValueIsEmpty(value).toString());
if (value.type === "checkbox") {
value.checkbox = {
checked: value.checkbox?.checked || false,
content: cellElement.getAttribute("aria-label").split('<div class="ft__on-surface">')[0],
};
}
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false, viewType);
cellElement.parentElement.setAttribute("data-empty", cellValueIsEmpty(value).toString());
} else {
cellElement.innerHTML = renderCell(value, 0, iconElement ? !iconElement.classList.contains("fn__none") : false);
}

View file

@ -10,6 +10,7 @@ export const addFilesToDatabase = (fileLiElements: Element[]) => {
const id = item.getAttribute("data-node-id");
if (id) {
srcs.push({
itemID: Lute.NewNodeID(),
id,
isDetached: false
});
@ -18,10 +19,12 @@ export const addFilesToDatabase = (fileLiElements: Element[]) => {
if (srcs.length > 0) {
openSearchAV("", fileLiElements[0] as HTMLElement, (listItemElement) => {
const avID = listItemElement.dataset.avId;
const viewID = listItemElement.dataset.viewId;
transaction(undefined, [{
action: "insertAttrViewBlock",
ignoreDefaultFill: viewID ? false : true,
viewID,
avID,
ignoreFillFilter: true,
srcs,
blockID: listItemElement.dataset.blockId
}, {
@ -37,11 +40,14 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
if ((range && protyle.title?.editElement?.contains(range.startContainer)) || type === "title") {
openSearchAV("", protyle.breadcrumb.element, (listItemElement) => {
const avID = listItemElement.dataset.avId;
const viewID = listItemElement.dataset.viewId;
transaction(protyle, [{
action: "insertAttrViewBlock",
ignoreDefaultFill: viewID ? false : true,
viewID,
avID,
ignoreFillFilter: true,
srcs: [{
itemID: Lute.NewNodeID(),
id: protyle.block.rootID,
isDetached: false
}],
@ -83,15 +89,18 @@ export const addEditorToDatabase = (protyle: IProtyle, range: Range, type?: stri
ids.forEach(item => {
srcIDs.push(item);
srcs.push({
itemID: Lute.NewNodeID(),
id: item,
isDetached: false
});
});
const avID = listItemElement.dataset.avId;
const viewID = listItemElement.dataset.viewId;
transaction(protyle, [{
action: "insertAttrViewBlock",
ignoreDefaultFill: viewID ? false : true,
viewID,
avID,
ignoreFillFilter: true,
srcs,
blockID: listItemElement.dataset.blockId
}, {

View file

@ -21,7 +21,7 @@ import {renameAsset} from "../../../editor/rename";
import * as dayjs from "dayjs";
import {getColId} from "./col";
import {getFieldIdByCellElement} from "./row";
import {getCompressURL} from "../../../util/image";
import {getCompressURL, removeCompressURL} from "../../../util/image";
export const bindAssetEvent = (options: {
protyle: IProtyle,
@ -197,7 +197,7 @@ export const editAssetItem = (options: {
index: number,
rect: DOMRect
}) => {
const linkAddress = options.content;
const linkAddress = removeCompressURL(options.content);
const type = options.type as "image" | "file";
const menu = new Menu("av-asset-edit", () => {
if ((!textElements[1] && textElements[0].value === linkAddress) ||

View file

@ -4,7 +4,7 @@ import {escapeAriaLabel, escapeAttr, escapeHtml} from "../../../util/escape";
import * as dayjs from "dayjs";
import {popTextCell, updateCellsValue} from "./cell";
import {hasClosestBlock, hasClosestByAttribute, hasClosestByClassName} from "../../util/hasClosest";
import {unicode2Emoji} from "../../../emoji";
import {openEmojiPanel, unicode2Emoji} from "../../../emoji";
import {transaction} from "../../wysiwyg/transaction";
import {openMenuPanel} from "./openMenuPanel";
import {uploadFiles} from "../../upload";
@ -20,12 +20,13 @@ import {getCompressURL} from "../../../util/image";
const genAVRollupHTML = (value: IAVCellValue) => {
let html = "";
const dataValue: IAVCellDateValue = value[value.type as "date"];
switch (value.type) {
case "block":
if (value?.isDetached) {
html = `<span data-id="${value.block?.id}">${value.block?.content || window.siyuan.languages.untitled}</span>`;
html = `<span>${value.block?.content || window.siyuan.languages.untitled}</span>`;
} else {
html = `<span data-type="block-ref" data-id="${value.block?.id}" data-subtype="s" class="av__celltext--ref">${value.block?.content || window.siyuan.languages.untitled}</span>`;
html = `<span data-type="block-ref" data-id="${value.block.id}" data-subtype="s" class="av__celltext--ref">${value.block?.content || window.siyuan.languages.untitled}</span>`;
}
break;
case "text":
@ -35,11 +36,17 @@ const genAVRollupHTML = (value: IAVCellValue) => {
html = value.number.formattedContent || value.number.content.toString();
break;
case "date":
if (value[value.type] && value[value.type].isNotEmpty) {
html = dayjs(value[value.type].content).format(value[value.type].isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm");
}
if (value[value.type] && value[value.type].hasEndDate && value[value.type].isNotEmpty && value[value.type].isNotEmpty2) {
html += `<svg class="av__cellicon"><use xlink:href="#iconForward"></use></svg>${dayjs(value[value.type].content2).format(value[value.type].isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm")}`;
case "updated":
case "created":
if (dataValue.formattedContent) {
html = dataValue.formattedContent;
} else {
if (dataValue && dataValue.isNotEmpty) {
html = dayjs(dataValue.content).format(dataValue.isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm");
}
if (dataValue && dataValue.hasEndDate && dataValue.isNotEmpty && dataValue.isNotEmpty2) {
html = `<svg class="av__cellicon"><use xlink:href="#iconForward"></use></svg>${dayjs(dataValue.content2).format(dataValue.isNotTime ? "YYYY-MM-DD" : "YYYY-MM-DD HH:mm")}`;
}
}
if (html) {
html = `<span class="av__celltext">${html}</span>`;
@ -62,7 +69,7 @@ export const genAVValueHTML = (value: IAVCellValue) => {
let html = "";
switch (value.type) {
case "block":
html = `<input value="${escapeAttr(value.block.content)}" type="text" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">`;
html = `<input data-id="${value.block.id}" value="${escapeAttr(value.block.content)}" type="text" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">`;
break;
case "text":
html = `<textarea style="resize: vertical" rows="${(value.text?.content || "").split("\n").length}" class="b3-text-field b3-text-field--text fn__flex-1" placeholder="${window.siyuan.languages.empty}">${value.text?.content || ""}</textarea>`;
@ -127,13 +134,14 @@ export const genAVValueHTML = (value: IAVCellValue) => {
<a ${value.email.content ? `href="mailto:${value.email.content}"` : ""} target="_blank" aria-label="${window.siyuan.languages.openBy}" class="block__icon block__icon--show fn__flex-center b3-tooltips__w b3-tooltips"><svg><use xlink:href="#iconEmail"></use></svg></a>`;
break;
case "relation":
value?.relation?.contents?.forEach((item) => {
value?.relation?.contents?.forEach((item, index) => {
if (item && item.block) {
const rowID = value.relation.blockIDs[index];
if (item?.isDetached) {
html += `<span class="av__cell--relation"><span> </span><span class="av__celltext" data-id="${item.block?.id}">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
html += `<span data-row-id="${rowID}" class="av__cell--relation"><span class="b3-menu__avemoji"></span><span class="av__celltext">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
} else {
// data-block-id 用于更新 emoji
html += `<span class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
html += `<span data-row-id="${rowID}" class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
}
}
});
@ -143,9 +151,9 @@ export const genAVValueHTML = (value: IAVCellValue) => {
break;
case "rollup":
value?.rollup?.contents?.forEach((item) => {
const rollupText = ["select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? genAVValueHTML(item) : genAVRollupHTML(item);
const rollupText = ["template", "select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? genAVValueHTML(item) : genAVRollupHTML(item);
if (rollupText) {
html += rollupText + ",&nbsp;";
html += rollupText.replace("fn__flex-1", "") + ",&nbsp;";
}
});
if (html && html.endsWith(",&nbsp;")) {
@ -189,7 +197,7 @@ export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IPr
<span class="fn__ellipsis">${table.avName || window.siyuan.languages.database}</span>
</div>
<div class="fn__flex-1"></div>
<span data-type="remove" class="block__icon block__icon--warning block__icon--show b3-tooltips__w b3-tooltips" aria-label="${window.siyuan.languages.removeAV}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
<span data-type="remove" data-row-id="${table.keyValues && table.keyValues[0].values[0].blockID}" class="block__icon block__icon--warning block__icon--show b3-tooltips__w b3-tooltips" aria-label="${window.siyuan.languages.removeAV}"><svg><use xlink:href="#iconTrashcan"></use></svg></span>
</div>`;
table.keyValues?.forEach(item => {
innerHTML += `<div class="block__icons av__row" data-id="${id}" data-col-id="${item.key.id}">
@ -198,7 +206,7 @@ export const renderAVAttribute = (element: HTMLElement, id: string, protyle: IPr
${item.key.icon ? unicode2Emoji(item.key.icon, "block__logoicon", true) : `<svg class="block__logoicon"><use xlink:href="#${getColIconByType(item.key.type)}"></use></svg>`}
<span>${escapeHtml(item.key.name)}</span>
</div>
<div data-av-id="${table.avID}" data-col-id="${item.values[0].keyID}" data-block-id="${item.values[0].blockID}" data-id="${item.values[0].id}" data-type="${item.values[0].type}"
<div data-av-id="${table.avID}" data-col-id="${item.values[0].keyID}" data-row-id="${item.values[0].blockID}" data-id="${item.values[0].id}" data-type="${item.values[0].type}"
data-options="${item.key?.options ? escapeAttr(JSON.stringify(item.key.options)) : "[]"}"
${["text", "number", "date", "url", "phone", "template", "email"].includes(item.values[0].type) ? "" : `placeholder="${window.siyuan.languages.empty}"`}
class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"].includes(item.values[0].type) ? "" : " custom-attr__avvalue"}${["created", "updated"].includes(item.values[0].type) ? " custom-attr__avvalue--readonly" : ""}">${genAVValueHTML(item.values[0])}</div>
@ -211,7 +219,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
if (element.innerHTML) {
// 防止 blockElement 找不到
element.querySelector(`div[data-node-id="${id}"][data-av-id="${table.avID}"]`).innerHTML = innerHTML;
element.querySelector(`[data-node-id="${id}"][data-av-id="${table.avID}"]`).innerHTML = innerHTML;
}
});
if (element.innerHTML === "") {
@ -298,11 +306,11 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
if (!targetElement) {
targetElement = hasClosestByClassName(document.elementFromPoint(event.clientX, event.clientY - 1), "av__row");
}
if (!targetElement || targetElement.isSameNode(window.siyuan.dragElement) || !dragBlockElement) {
if (!targetElement || targetElement === window.siyuan.dragElement || !dragBlockElement) {
return;
}
const targetBlockElement = hasClosestBlock(targetElement);
if (!targetBlockElement || !targetBlockElement.isSameNode(dragBlockElement)) {
if (!targetBlockElement || targetBlockElement !== dragBlockElement) {
return;
}
event.preventDefault();
@ -359,11 +367,11 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
if (blockElement) {
transaction(protyle, [{
action: "removeAttrViewBlock",
srcIDs: [id],
srcIDs: [removeElement.dataset.rowId],
avID: blockElement.dataset.avId,
}, {
action: "doUpdateUpdated",
id,
id: removeElement.dataset.rowId,
data: dayjs().format("YYYYMMDDHHmmss"),
}]);
blockElement.remove();
@ -424,7 +432,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
value = {
block: {
content: item.value,
id: item.parentElement.dataset.blockId,
id: item.dataset.id,
},
isDetached: false
};
@ -432,7 +440,7 @@ class="fn__flex-1 fn__flex${["url", "text", "number", "email", "phone", "block"]
fetchPost("/api/av/setAttributeViewBlockAttr", {
avID: item.parentElement.dataset.avId,
keyID: item.parentElement.dataset.colId,
rowID: item.parentElement.dataset.blockId,
rowID: item.parentElement.dataset.rowId,
value
}, (setResponse) => {
if (type === "number") {
@ -455,13 +463,26 @@ const openEdit = (protyle: IProtyle, element: HTMLElement, event: MouseEvent) =>
if (!blockElement) {
return;
}
while (target && !element.isSameNode(target)) {
while (target && element !== target) {
const type = target.getAttribute("data-type");
if (target.classList.contains("av__celltext--url") || target.classList.contains("av__cellassetimg")) {
if (target.classList.contains("b3-menu__avemoji")) {
const rect = target.getBoundingClientRect();
openEmojiPanel(target.nextElementSibling.getAttribute("data-id"), "doc", {
x: rect.left,
y: rect.bottom,
h: rect.height,
w: rect.width,
}, (unicode) => {
target.innerHTML = unicode2Emoji(unicode || window.siyuan.storage[Constants.LOCAL_IMAGES].file);
}, target.querySelector("img"));
event.preventDefault();
event.stopPropagation();
return true;
} else if (target.classList.contains("av__celltext--url") || target.classList.contains("av__cellassetimg")) {
if (event.type === "contextmenu" || (!target.dataset.url && target.tagName !== "IMG")) {
let index = 0;
Array.from(target.parentElement.children).find((item, i) => {
if (item.isSameNode(target)) {
if (item === target) {
index = i;
return true;
}

View file

@ -108,7 +108,7 @@ export const genCellValueByElement = (colType: TAVCol, cellElement: HTMLElement)
const contents: IAVCellValue[] = [];
Array.from(cellElement.querySelectorAll(".av__cell--relation")).forEach((relationItem: HTMLElement) => {
const item = relationItem.querySelector(".av__celltext") as HTMLElement;
blockIDs.push(item.dataset.id);
blockIDs.push(relationItem.dataset.rowId);
contents.push({
isDetached: !item.classList.contains("av__celltext--ref"),
block: {
@ -195,6 +195,9 @@ const transformCellValue = (colType: TAVCol, value: IAVCellValue): IAVCellValue
content: getCellValueContent(value).toString(),
color: "1"
}];
if (!newValue.mSelect[0].content) {
newValue.mSelect = [];
}
} else if (colType === "rollup") {
newValue.rollup = {contents: [value]};
} else if (colType === "checkbox") {
@ -204,7 +207,7 @@ const transformCellValue = (colType: TAVCol, value: IAVCellValue): IAVCellValue
} else if (colType === "relation") {
if (value.type === "block") {
newValue.relation = {
blockIDs: [value.block.id],
blockIDs: [value.blockID],
contents: [value]
};
} else {
@ -380,7 +383,7 @@ export const genCellValue = (colType: TAVCol, value: string | any) => {
}
}
if (colType === "block") {
if (typeof value === "object" && value.id) {
if (typeof value === "object" && value && value.id) {
cellValue.isDetached = false;
} else {
cellValue.isDetached = true;
@ -427,15 +430,19 @@ export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Eleme
// 属性面板
return;
}
const avHeaderRect = blockElement.querySelector(".av__row--header").getBoundingClientRect();
const bodyElement = hasClosestByClassName(cellElement, "av__body");
if (!bodyElement) {
return;
}
const avHeaderRect = bodyElement.querySelector(".av__row--header").getBoundingClientRect();
if (avHeaderRect.bottom > cellRect.top) {
const contentElement = hasClosestByClassName(blockElement, "protyle-content", true);
if (contentElement) {
contentElement.scrollTop = contentElement.scrollTop + cellRect.top - avHeaderRect.bottom;
}
} else {
const footerElement = blockElement.querySelector(".av__row--footer");
if (footerElement.querySelector(".av__calc--ashow")) {
const footerElement = bodyElement.querySelector(".av__row--footer");
if (footerElement?.querySelector(".av__calc--ashow")) {
const avFooterRect = footerElement.getBoundingClientRect();
if (avFooterRect.top < cellRect.bottom) {
const contentElement = hasClosestByClassName(blockElement, "protyle-content", true);
@ -457,7 +464,7 @@ export const cellScrollIntoView = (blockElement: HTMLElement, cellElement: Eleme
};
export const getTypeByCellElement = (cellElement: Element) => {
if (cellElement.parentElement.classList.contains("av__gallery-fields")) {
if (cellElement.parentElement.classList.contains("av__gallery-field")) {
return cellElement.getAttribute("data-dtype") as TAVCol;
}
const scrollElement = hasClosestByClassName(cellElement, "av__scroll");
@ -743,9 +750,9 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va
const cellId = item.dataset.id; // 刚创建时无 id更新需和 oldValue 保持一致
const colId = getColId(item, viewType);
text += getCellText(item) + ((cellElements[elementIndex + 1] && item.nextElementSibling && item.nextElementSibling.isSameNode(cellElements[elementIndex + 1])) ? "\t" : "\n\n");
text += getCellText(item) + ((cellElements[elementIndex + 1] && item.nextElementSibling && item.nextElementSibling === cellElements[elementIndex + 1]) ? "\t" : "\n\n");
const oldValue = genCellValueByElement(type, item);
if (elementIndex === 0 || !cellElements[elementIndex - 1].isSameNode(item.previousElementSibling)) {
if (elementIndex === 0 || cellElements[elementIndex - 1] !== item.previousElementSibling) {
json.push([]);
}
json[json.length - 1].push(oldValue);
@ -909,13 +916,10 @@ export const renderCellAttr = (cellElement: Element, value: IAVCellValue) => {
cellElement.classList.add("av__cell-uncheck");
}
} else if (value.type === "block") {
if (value.block.id) {
// 不能设置为空,否则编辑后会临时无 id
cellElement.setAttribute("data-block-id", value.block.id);
}
if (value.isDetached) {
cellElement.setAttribute("data-detached", "true");
} else {
cellElement.querySelector(".av__celltext").setAttribute("data-id", value.block.id);
cellElement.removeAttribute("data-detached");
}
}
@ -977,13 +981,13 @@ export const renderCell = (cellValue: IAVCellValue, rowIndex = 0, showIcon = tru
});
} else if (cellValue.type === "checkbox") {
text += `<div class="fn__flex"><svg class="av__checkbox"><use xlink:href="#icon${cellValue?.checkbox?.checked ? "Check" : "Uncheck"}"></use></svg>`;
if (type === "gallery") {
text += `<span class="fn__space"></span>${window.siyuan.languages.checkbox}`;
if (type === "gallery" && cellValue?.checkbox?.content) {
text += `<span class="fn__space"></span>${cellValue?.checkbox?.content}`;
}
text += "</div>";
} else if (cellValue.type === "rollup") {
cellValue?.rollup?.contents?.forEach((item) => {
const rollupText = ["select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? renderCell(item, rowIndex, showIcon, type) : renderRollup(item);
const rollupText = ["template", "select", "mSelect", "mAsset", "checkbox", "relation"].includes(item.type) ? renderCell(item, rowIndex, showIcon, type) : renderRollup(item);
if (rollupText) {
text += rollupText + ", ";
}
@ -992,13 +996,14 @@ export const renderCell = (cellValue: IAVCellValue, rowIndex = 0, showIcon = tru
text = text.substring(0, text.length - 2);
}
} else if (cellValue.type === "relation") {
cellValue?.relation?.contents?.forEach((item) => {
cellValue?.relation?.contents?.forEach((item, index) => {
if (item && item.block) {
const rowID = cellValue.relation.blockIDs[index];
if (item?.isDetached) {
text += `<span class="av__cell--relation"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}"></span><span class="av__celltext" data-id="${item.block?.id}">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
text += `<span data-row-id="${rowID}" class="av__cell--relation"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}"></span><span class="av__celltext">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
} else {
// data-block-id 用于更新 emoji
text += `<span class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
text += `<span data-row-id="${rowID}" class="av__cell--relation" data-block-id="${item.block.id}"><span class="b3-menu__avemoji${showIcon ? "" : " fn__none"}" data-unicode="${item.block.icon || ""}">${unicode2Emoji(item.block.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file)}</span><span data-type="block-ref" data-id="${item.block.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(item.block.content || window.siyuan.languages.untitled)}</span></span>`;
}
}
});
@ -1032,14 +1037,14 @@ const renderRollup = (cellValue: IAVCellValue) => {
}
} else if (cellValue.type === "block") {
if (cellValue?.isDetached) {
text = `<span class="av__celltext" data-id="${cellValue.block?.id}">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
text = `<span class="av__celltext">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
} else {
text = `<span data-type="block-ref" data-id="${cellValue.block?.id}" data-subtype="s" class="av__celltext av__celltext--ref">${Lute.EscapeHTMLStr(cellValue.block?.content || window.siyuan.languages.untitled)}</span>`;
}
} else if (cellValue.type === "number") {
text = cellValue?.number.formattedContent || cellValue?.number.content.toString() || "";
} else if (cellValue.type === "date") {
const dataValue = cellValue ? cellValue.date : null;
} else if (["date", "updated", "created"].includes(cellValue.type)) {
const dataValue = cellValue ? cellValue[cellValue.type as "date"] : null;
if (dataValue.formattedContent) {
text = dataValue.formattedContent;
} else {
@ -1104,7 +1109,7 @@ export const getPositionByCellElement = (cellElement: HTMLElement) => {
export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, originData: {
[key: string]: IAVCellValue[]
}, originCellIds: string[]) => {
}, originCellIds: string[], activeElement: Element) => {
nodeElement.querySelector(".av__drag-fill")?.remove();
const newData: { [key: string]: Array<IAVCellValue & { colId?: string, element?: HTMLElement }> } = {};
nodeElement.querySelectorAll(".av__cell--active").forEach((item: HTMLElement) => {
@ -1130,6 +1135,7 @@ export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement,
const undoOperations: IOperation[] = [];
const avID = nodeElement.dataset.avId;
const originKeys = Object.keys(originData);
const showIcon = activeElement.querySelector(".b3-menu__avemoji") ? true : false;
Object.keys(newData).forEach((rowID, index) => {
newData[rowID].forEach((item, cellIndex) => {
if (["rollup", "template", "created", "updated"].includes(item.type) ||
@ -1152,8 +1158,7 @@ export const dragFillCellsValue = (protyle: IProtyle, nodeElement: HTMLElement,
rowID,
data
});
const iconElement = item.element.querySelector(".b3-menu__avemoji");
item.element.innerHTML = renderCell(data, 0, iconElement ? !iconElement.classList.contains("fn__none") : false);
item.element.innerHTML = renderCell(data, 0, showIcon);
renderCellAttr(item.element, data);
delete item.colId;
delete item.element;
@ -1179,6 +1184,10 @@ export const addDragFill = (cellElement: Element) => {
}
cellElement.classList.add("av__cell--active");
if (!cellElement.querySelector(".av__drag-fill")) {
const cellType = cellElement.getAttribute("data-dtype") as TAVCol;
if (["template", "rollup", "lineNumber", "created", "updated"].includes(cellType)) {
return;
}
cellElement.insertAdjacentHTML("beforeend", `<div aria-label="${window.siyuan.languages.dragFill}" class="av__drag-fill ariaLabel"></div>`);
}
};

View file

@ -200,7 +200,7 @@ export const getEditHTML = (options: {
<svg class="b3-menu__icon" style=""><use xlink:href="#iconCopy"></use></svg>
<span class="b3-menu__label">${window.siyuan.languages.duplicate}</span>
</button>
<button class="b3-menu__item" data-type="removeCol">
<button class="b3-menu__item b3-menu__item--warning" data-type="removeCol">
<svg class="b3-menu__icon" style=""><use xlink:href="#iconTrashcan"></use></svg>
<span class="b3-menu__label">${window.siyuan.languages.delete}</span>
</button>`;
@ -571,20 +571,19 @@ const addAttrViewColAnimation = (options: {
}
const nodeId = options.blockElement.getAttribute("data-node-id");
if (options.blockElement.classList.contains("av")) {
options.blockElement.querySelectorAll(".av__row").forEach((item, index) => {
options.blockElement.querySelectorAll(".av__row").forEach((item) => {
let previousElement;
if (options.previousID) {
previousElement = item.querySelector(`[data-col-id="${options.previousID}"]`);
} else {
previousElement = item.lastElementChild.previousElementSibling;
previousElement = item.querySelector(".av__cell").previousElementSibling;
}
let html = "";
if (index === 0) {
// av__pulse 用于检测是否新增,和 render 中 isPulse 配合弹出菜单
if (item.classList.contains("av__row--header")) {
html = `<div class="av__cell av__cell--header" draggable="true" data-icon="${options.icon || ""}" data-col-id="${options.id}" data-dtype="${options.type}" data-wrap="false" style="width: 200px;">
${options.icon ? unicode2Emoji(options.icon, "av__cellheadericon", true) : `<svg class="av__cellheadericon"><use xlink:href="#${getColIconByType(options.type)}"></use></svg>`}
<span class="av__celltext fn__flex-1">${options.name}</span>
<div class="av__widthdrag av__pulse"></div>
<div class="av__widthdrag"></div>
</div>`;
} else {
html = '<div class="av__cell" style="width: 200px"><span class="av__pulse"></span></div>';
@ -806,7 +805,9 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
return true;
}
});
let empty = false;
if (!filter) {
empty = true;
filter = {
column: colId,
operator: getDefaultOperatorByType(type),
@ -815,6 +816,7 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
avData.view.filters.push(filter);
}
setFilter({
empty,
filter,
protyle,
data: avData,
@ -1015,7 +1017,7 @@ export const showColMenu = (protyle: IProtyle, blockElement: Element, cellElemen
dialog.element.addEventListener("click", (event) => {
let target = event.target as HTMLElement;
const isDispatch = typeof event.detail === "string";
while (target && !target.isSameNode(dialog.element) || isDispatch) {
while (target && target !== dialog.element || isDispatch) {
const action = target.getAttribute("data-action");
if (action === "delete" || (isDispatch && event.detail === "Enter")) {
removeColByMenu({
@ -1816,7 +1818,7 @@ const genColDataByType = (type: TAVCol, id: string, name: string) => {
template: "",
type,
width: "",
wrap: false,
wrap: undefined,
calc: null
};
return colData;

View file

@ -75,7 +75,8 @@ export const setFilter = async (options: {
protyle: IProtyle,
data: IAV,
target: HTMLElement,
blockElement: Element
blockElement: Element,
empty: boolean
}) => {
let rectTarget = options.target.getBoundingClientRect();
if (rectTarget.height === 0) {
@ -175,7 +176,7 @@ export const setFilter = async (options: {
return true;
}
});
if (isSame || !hasMatch) {
if (!options.empty && (isSame || !hasMatch)) {
return;
}
transaction(options.protyle, [{
@ -598,6 +599,7 @@ export const addFilter = (options: {
setPosition(options.menuElement, options.tabRect.right - options.menuElement.clientWidth, options.tabRect.bottom, options.tabRect.height);
const filterElement = options.menuElement.querySelector(`[data-id="${column.id}"] .b3-chip`) as HTMLElement;
setFilter({
empty: true,
filter,
protyle: options.protyle,
data: options.data,
@ -648,12 +650,16 @@ export const getFiltersHTML = (data: IAV) => {
${filter.relativeDate2.direction ? filter.relativeDate2.count : ""}
${window.siyuan.languages[["day", "week", "month", "year"][filter.relativeDate2.unit]]}`;
}
} else if (filterValue && filterValue[filterValue.type as "date"]?.content) {
dateValue = dayjs(filterValue[filterValue.type as "date"].content).format("YYYY-MM-DD");
dateValue2 = dayjs(filterValue[filterValue.type as "date"].content2).format("YYYY-MM-DD");
} else if (filterValue) {
if (filterValue[filterValue.type as "date"]?.content) {
dateValue = dayjs(filterValue[filterValue.type as "date"].content).format("YYYY-MM-DD");
}
if (filterValue && filterValue[filterValue.type as "date"]?.content2) {
dateValue2 = dayjs(filterValue[filterValue.type as "date"].content2).format("YYYY-MM-DD");
}
}
if (dateValue) {
if (filter.operator === "Is between") {
if (filter.operator === "Is between" && dateValue2) {
filterText = ` ${window.siyuan.languages.filterOperatorIsBetween} ${dateValue} ${dateValue2}`;
} else if ("=" === filter.operator) {
filterText = `: ${dateValue}`;
@ -691,24 +697,25 @@ export const getFiltersHTML = (data: IAV) => {
filterText = `${filterValue.number.content}`;
}
} else if (["text", "block", "url", "phone", "email", "relation", "template"].includes(filterValue.type) && filterValue[filterValue.type as "text"]) {
const content = filterValue[filterValue.type as "text"].content ||
filterValue.relation?.blockIDs[0] || "";
if (["=", "Contains"].includes(filter.operator)) {
filterText = `: ${content}`;
} else if (filter.operator === "Does not contains") {
filterText = ` ${window.siyuan.languages.filterOperatorDoesNotContain} ${content}`;
} else if (filter.operator === "!=") {
filterText = ` ${window.siyuan.languages.filterOperatorIsNot} ${content}`;
} else if ("Starts with" === filter.operator) {
filterText = ` ${window.siyuan.languages.filterOperatorStartsWith} ${content}`;
} else if ("Ends with" === filter.operator) {
filterText = ` ${window.siyuan.languages.filterOperatorEndsWith} ${content}`;
} else if ([">", "<"].includes(filter.operator)) {
filterText = ` ${filter.operator} ${content}`;
} else if (">=" === filter.operator) {
filterText = `${content}`;
} else if ("<=" === filter.operator) {
filterText = `${content}`;
const content = filterValue[filterValue.type as "text"].content || filterValue.relation?.blockIDs[0] || "";
if (content) {
if (["=", "Contains"].includes(filter.operator)) {
filterText = `: ${content}`;
} else if (filter.operator === "Does not contains") {
filterText = ` ${window.siyuan.languages.filterOperatorDoesNotContain} ${content}`;
} else if (filter.operator === "!=") {
filterText = ` ${window.siyuan.languages.filterOperatorIsNot} ${content}`;
} else if ("Starts with" === filter.operator) {
filterText = ` ${window.siyuan.languages.filterOperatorStartsWith} ${content}`;
} else if ("Ends with" === filter.operator) {
filterText = ` ${window.siyuan.languages.filterOperatorEndsWith} ${content}`;
} else if ([">", "<"].includes(filter.operator)) {
filterText = ` ${filter.operator} ${content}`;
} else if (">=" === filter.operator) {
filterText = `${content}`;
} else if ("<=" === filter.operator) {
filterText = `${content}`;
}
}
}
filterHTML += `<span data-type="setFilter" class="b3-chip${filterText ? " b3-chip--primary" : ""}">
@ -743,7 +750,7 @@ ${html}
<svg class="b3-menu__icon"><use xlink:href="#iconAdd"></use></svg>
<span class="b3-menu__label">${window.siyuan.languages.addFilter}</span>
</button>
<button class="b3-menu__item${html ? "" : " fn__none"}" data-type="removeFilters">
<button class="b3-menu__item b3-menu__item--warning${html ? "" : " fn__none"}" data-type="removeFilters">
<svg class="b3-menu__icon"><use xlink:href="#iconTrashcan"></use></svg>
<span class="b3-menu__label">${window.siyuan.languages.removeFilters}</span>
</button>

View file

@ -1,135 +1,97 @@
import {showMessage} from "../../../../dialog/message";
import {
genCellValueByElement,
getTypeByCellElement,
renderCell,
renderCellAttr
} from "../cell";
import {genCellValue, getTypeByCellElement, renderCell, renderCellAttr} from "../cell";
import {fetchPost} from "../../../../util/fetch";
import {setPage} from "../row";
import {Constants} from "../../../../constants";
import {clearSelect} from "../../../util/clearSelect";
export const insertGalleryItemAnimation = (options: {
blockElement: HTMLElement;
protyle: IProtyle;
srcIDs: string[];
previousId: string;
groupID?: string
}) => {
if ((options.blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement).value !== "") {
showMessage(window.siyuan.languages.insertRowTip);
return;
(options.blockElement.querySelector('[data-type="av-search"]') as HTMLInputElement).value = "";
const groupQuery = options.groupID ? `.av__body[data-group-id="${options.groupID}"] ` : "";
let sideItemElement = options.previousId ? options.blockElement.querySelector(groupQuery + `.av__gallery-item[data-id="${options.previousId}"]`) : options.blockElement.querySelector(groupQuery + ".av__gallery-item");
const hasSort = options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active");
if (hasSort) {
sideItemElement = options.blockElement.querySelector(groupQuery + ".av__gallery-add").previousElementSibling;
}
const avId = options.blockElement.getAttribute("data-av-id");
const sideItemElement = options.previousId ? options.blockElement.querySelector(`.av__gallery-item[data-id="${options.previousId}"]`) : options.blockElement.querySelector(".av__gallery-item");
const bodyElement = options.blockElement.querySelector(`.av__body[data-group-id="${options.groupID}"] `);
if (bodyElement && ["updated", "created"].includes(bodyElement.getAttribute("data-dtype")) &&
bodyElement.getAttribute("data-content") !== "_@today@_") {
sideItemElement = options.blockElement.querySelector('.av__body[data-content="_@today@_"] .av__gallery-add')?.previousElementSibling;
if (!sideItemElement) {
return;
}
}
let cellsHTML = "";
sideItemElement?.querySelectorAll(".av__cell").forEach((item: HTMLElement) => {
let lineNumber = 1;
const fieldType = getTypeByCellElement(item);
if (fieldType === "lineNumber") {
const lineNumberValue = item.querySelector(".av__celltext")?.getAttribute("data-value");
if (lineNumberValue) {
lineNumber = parseInt(lineNumberValue);
}
}
const cellHTML = `<div class="av__cell${fieldType === "checkbox" ? " av__cell-uncheck" : ""}"
data-field-id="${item.dataset.fieldId}"
data-wrap="${item.dataset.wrap}"
data-dtype="${item.dataset.dtype}"
${fieldType === "block" ? ' data-detached="true"' : ""}>${renderCell(genCellValue(fieldType, null), lineNumber, false, "gallery")}</div>`;
if (item.previousElementSibling.classList.contains("av__gallery-name")) {
cellsHTML += `<div class="av__gallery-field av__gallery-field--name" data-empty="${item.parentElement.dataset.empty}">
${item.previousElementSibling.outerHTML}
${cellHTML}
</div>`;
} else {
cellsHTML += `<div class="av__gallery-field" data-empty="${item.parentElement.dataset.empty}">
${item.previousElementSibling.outerHTML}
${cellHTML}
</div>`;
}
});
clearSelect(["galleryItem"], options.blockElement);
let html = "";
let needUpdate = "";
if (options.blockElement.querySelector('.av__views [data-type="av-sort"]').classList.contains("block__icon--active") &&
!options.blockElement.querySelector('[data-type="av-load-more"]').classList.contains("fn__none")) {
needUpdate = ' data-need-update="true"';
}
const coverClass = sideItemElement?.querySelector(".av__gallery-cover")?.className || "fn__none";
options.srcIDs.forEach((id) => {
html += `<div class="av__gallery-item"${needUpdate} data-type="ghost" data-id="${id}">
options.srcIDs.forEach(() => {
html += `<div class="av__gallery-item" data-type="ghost">
<div class="${coverClass}"><span style="width: 100%;height: 100%;border-radius: var(--b3-border-radius) var(--b3-border-radius) 0 0;" class="av__pulse"></span></div>
<div class="av__gallery-fields"><span class="av__pulse"></span></div>
<div class="av__gallery-fields">${cellsHTML}</div>
</div>`;
});
if (options.previousId && sideItemElement) {
if (sideItemElement) {
sideItemElement.insertAdjacentHTML("afterend", html);
} else {
options.blockElement.querySelector(".av__gallery").insertAdjacentHTML("afterbegin", html);
options.blockElement.querySelector(groupQuery + ".av__gallery")?.insertAdjacentHTML("afterbegin", html);
}
const currentItemElement = options.blockElement.querySelector(`.av__gallery-item[data-id="${options.srcIDs[0]}"]`);
fetchPost("/api/av/getAttributeViewFilterSort", {
id: avId,
blockID: options.blockElement.getAttribute("data-node-id")
fetchPost("/api/av/getAttributeViewAddingBlockDefaultValues", {
avID: options.blockElement.getAttribute("data-av-id"),
viewID: options.blockElement.getAttribute(Constants.CUSTOM_SY_AV_VIEW),
groupID: options.groupID,
previousID: options.previousId,
}, (response) => {
// https://github.com/siyuan-note/siyuan/issues/10517
let hideTextCell = false;
response.data.filters.find((item: IAVFilter) => {
const itemCellElement = options.blockElement.querySelector(`.av__cell[data-field-id="${item.column}"]`);
if (!itemCellElement) {
return;
}
const filterType = itemCellElement.getAttribute("data-dtype");
if (item.value && filterType !== item.value.type) {
return;
}
if (["relation", "rollup", "template"].includes(filterType)) {
hideTextCell = true;
return true;
}
// 根据后台计算出显示与否的结果进行标识,以便于在 refreshAV 中更新 UI
if (["created", "updated"].includes(filterType)) {
currentItemElement.setAttribute("data-need-update", "true");
} else {
response.data.sorts.find((sortItem: IAVSort) => {
if (sortItem.column === item.column) {
currentItemElement.setAttribute("data-need-update", "true");
return true;
if (response.data.values) {
let popCellElement: HTMLElement;
const updateIds = Object.keys(response.data.values);
options.blockElement.querySelectorAll('[data-type="ghost"]').forEach(rowItem => {
rowItem.querySelectorAll(".av__cell").forEach((cellItem: HTMLElement) => {
if (!popCellElement && cellItem.getAttribute("data-detached") === "true") {
popCellElement = cellItem;
}
if (updateIds.includes(cellItem.dataset.fieldId)) {
const cellValue = response.data.values[cellItem.dataset.fieldId];
if (cellValue.type === "checkbox" && cellItem.parentElement.querySelector(".av__gallery-tip")) {
cellValue.checkbox.content = cellItem.getAttribute("aria-label").split('<div class="ft__on-surface">')[0];
}
cellItem.innerHTML = renderCell(cellValue, undefined, false, "gallery");
renderCellAttr(cellItem, cellValue);
}
});
}
// 当空或非空外,需要根据值进行判断
let isRenderValue = true;
if (item.operator !== "Is empty" && item.operator !== "Is not empty") {
switch (item.value.type) {
case "select":
case "mSelect":
if (!item.value.mSelect || item.value.mSelect.length === 0) {
isRenderValue = false;
}
break;
case "block":
if (!item.value.block || !item.value.block.content) {
isRenderValue = false;
}
break;
case "number":
if (!item.value.number || !item.value.number.isNotEmpty) {
isRenderValue = false;
}
break;
case "date":
case "created":
case "updated":
if (!item.value[item.value.type] || !item.value[item.value.type].isNotEmpty) {
isRenderValue = false;
}
break;
case "mAsset":
if (!item.value.mAsset || item.value.mAsset.length === 0) {
isRenderValue = false;
}
break;
case "checkbox":
if (!item.value.checkbox) {
isRenderValue = false;
}
break;
case "text":
case "url":
case "phone":
case "email":
if (!item.value[item.value.type] || !item.value[item.value.type].content) {
isRenderValue = false;
}
break;
}
}
if (sideItemElement.classList.contains("av__row") && isRenderValue) {
const sideItemCellElement = sideItemElement.querySelector(`.av__cell[data-field-id="${item.column}"]`) as HTMLElement;
const cellElement = currentItemElement.querySelector(`.av__cell[data-field-id="${item.column}"]`);
const cellValue = genCellValueByElement(getTypeByCellElement(sideItemCellElement), sideItemCellElement);
const iconElement = cellElement.querySelector(".b3-menu__avemoji");
cellElement.innerHTML = renderCell(cellValue, undefined,
iconElement ? !iconElement.classList.contains("fn__none") : false, "gallery");
renderCellAttr(cellElement, cellValue);
}
});
if (hideTextCell) {
currentItemElement.remove();
showMessage(window.siyuan.languages.insertRowTip);
});
}
setPage(options.blockElement);
});

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