collabdocchat 2.4.4 → 2.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/package.json +2 -2
  2. package/scripts/add-button-hover.js +2 -0
  3. package/scripts/add-missing-braces.js +27 -0
  4. package/scripts/add-missing-functions.js +2 -0
  5. package/scripts/add-more-features.js +2 -0
  6. package/scripts/add-user-functions.js +2 -0
  7. package/scripts/auto-publish.js +2 -0
  8. package/scripts/beautify-buttons.js +2 -0
  9. package/scripts/beautify-ui.js +2 -0
  10. package/scripts/check-brackets.js +50 -0
  11. package/scripts/check-encoding.js +2 -0
  12. package/scripts/check-syntax.js +2 -0
  13. package/scripts/delete-orphan-block.js +27 -0
  14. package/scripts/find-buttons.js +2 -0
  15. package/scripts/find-duplicate.js +2 -0
  16. package/scripts/find-extra-brace.js +63 -0
  17. package/scripts/find-sidebar-buttons.js +2 -0
  18. package/scripts/fix-file-end.js +46 -0
  19. package/scripts/fix-help.js +2 -0
  20. package/scripts/fix-issues-step1.js +2 -0
  21. package/scripts/fix-issues-step2.js +2 -0
  22. package/scripts/fix-issues-step3.js +2 -0
  23. package/scripts/fix-issues-step4.js +2 -0
  24. package/scripts/fix-optimized-views.js +2 -0
  25. package/scripts/fix-settings.js +2 -0
  26. package/scripts/fix-syntax-error.js +38 -0
  27. package/scripts/fix-workflow.js +2 -0
  28. package/scripts/refactor-step1.js +2 -0
  29. package/scripts/refactor-step2.js +2 -0
  30. package/scripts/refactor-step3.js +2 -0
  31. package/scripts/refactor-step4.js +2 -0
  32. package/scripts/refactor-step5.js +2 -0
  33. package/scripts/refactor-step6.js +2 -0
  34. package/scripts/refactor-step7.js +2 -0
  35. package/scripts/remove-orphan-code.js +57 -0
  36. package/scripts/update-port-user.js +2 -0
  37. package/scripts/update-port.js +2 -0
  38. package/server/index.js +4 -0
  39. package/server/index.js.bak +97 -0
  40. package/server/models/Document.js +5 -0
  41. package/server/models/KnowledgeBase.js +259 -254
  42. package/server/models/Poll.js +97 -0
  43. package/server/routes/ai.js +391 -327
  44. package/server/routes/audit.js +61 -0
  45. package/server/routes/documents.js +74 -5
  46. package/server/routes/export.js +171 -10
  47. package/server/routes/files.js +27 -4
  48. package/server/routes/knowledge.js +31 -22
  49. package/server/routes/messages.js +142 -0
  50. package/server/routes/polls.js +241 -0
  51. package/server/routes/tasks.js +1 -0
  52. package/server/routes/workflows.js +27 -0
  53. package/server/utils/auditLogger.js +268 -238
  54. package/src/pages/admin-dashboard.js +1431 -335
  55. package/src/pages/admin-dashboard.js.audit-optimize.bak +4134 -0
  56. package/src/pages/admin-dashboard.js.bak +4041 -0
  57. package/src/pages/admin-dashboard.js.broken.bak +4099 -0
  58. package/src/pages/admin-dashboard.js.comprehensive.bak +4099 -0
  59. package/src/pages/admin-dashboard.js.escape.bak +4099 -0
  60. package/src/pages/admin-dashboard.js.final-final-fix.bak +4099 -0
  61. package/src/pages/admin-dashboard.js.final-fix.bak +4099 -0
  62. package/src/pages/admin-dashboard.js.final.bak +4099 -0
  63. package/src/pages/admin-dashboard.js.indent-fix.bak +4099 -0
  64. package/src/pages/admin-dashboard.js.last-fix.bak +4099 -0
  65. package/src/pages/admin-dashboard.js.line595-fix.bak +4099 -0
  66. package/src/pages/admin-dashboard.js.pre-manual-fix.bak +4099 -0
  67. package/src/pages/admin-dashboard.js.syntax.bak +4099 -0
  68. package/src/pages/admin-dashboard.js.test.bak +4099 -0
  69. package/src/pages/optimized-task-detail-original.js +838 -0
  70. package/src/pages/optimized-task-detail.js +324 -22
  71. package/src/pages/optimized-task-detail.js.bak +1162 -0
  72. package/src/pages/poll-detail-enhanced.js +394 -0
  73. package/src/pages/update-poll-display.js +380 -0
  74. package/src/pages/user-dashboard.js +1860 -1006
  75. package/src/services/api.js +326 -265
  76. package/src/services/auth.js +54 -54
  77. package/src/services/websocket.js +88 -80
  78. package/src/pages/simplified-workflows.js +0 -652
  79. package/src/utils/ai-assistant.js +0 -1384
@@ -0,0 +1,380 @@
1
+ // 更新脚本:将增强的投票显示功能集成到任务详情页面
2
+ // 使用方法:在 optimized-task-detail.js 中引入此模块
3
+
4
+ // 1. 在 renderOptimizedTaskDetail 函数中,将:
5
+ // ${task.poll ? renderPollResults(task.poll) : ''}
6
+ // 替换为:
7
+ // ${task.poll ? renderPollResultsEnhanced(task.poll) : ''}
8
+
9
+ // 2. 在 addTaskDetailStyles 函数调用后,添加:
10
+ // addPollEnhancedStyles();
11
+
12
+ // 3. 替换 renderPollResults 函数为以下增强版本:
13
+
14
+ function renderPollResultsEnhanced(poll) {
15
+ if (!poll || !poll.options) return '';
16
+
17
+ const totalVotes = poll.options.reduce((sum, opt) => sum + (opt.votes || 0), 0);
18
+
19
+ // 获取所有已投票成员
20
+ const votedMembers = new Set();
21
+ poll.options.forEach(option => {
22
+ if (option.voters) {
23
+ option.voters.forEach(voter => {
24
+ const voterName = typeof voter === 'string' ? voter : voter.username;
25
+ votedMembers.add(voterName);
26
+ });
27
+ }
28
+ });
29
+
30
+ return `
31
+ <div class="task-poll-card-modern">
32
+ <h3 class="card-title-modern">
33
+ <span class="card-icon">📊</span> 投票结果
34
+ </h3>
35
+ <div class="poll-question-modern">${poll.question || '投票'}</div>
36
+
37
+ <!-- 投票统计摘要 -->
38
+ <div class="poll-stats-summary">
39
+ <div class="poll-stat-item">
40
+ <span class="poll-stat-icon">✅</span>
41
+ <span class="poll-stat-label">已投票:</span>
42
+ <span class="poll-stat-value">${votedMembers.size}人</span>
43
+ </div>
44
+ <div class="poll-stat-item">
45
+ <span class="poll-stat-icon">⏳</span>
46
+ <span class="poll-stat-label">未投票:</span>
47
+ <span class="poll-stat-value">${(poll.totalMembers || 0) - votedMembers.size}人</span>
48
+ </div>
49
+ <div class="poll-stat-item">
50
+ <span class="poll-stat-icon">📊</span>
51
+ <span class="poll-stat-label">总票数:</span>
52
+ <span class="poll-stat-value">${totalVotes}票</span>
53
+ </div>
54
+ </div>
55
+
56
+ <!-- 投票选项列表 -->
57
+ <div class="poll-options-modern">
58
+ ${poll.options.map((option, index) => {
59
+ const percentage = totalVotes > 0 ? Math.round((option.votes || 0) / totalVotes * 100) : 0;
60
+ const voters = option.voters || [];
61
+ return `
62
+ <div class="poll-option-modern">
63
+ <div class="poll-option-header-modern">
64
+ <span class="poll-option-text-modern">${option.text}</span>
65
+ <span class="poll-option-count-modern">${option.votes || 0} 票 (${percentage}%)</span>
66
+ </div>
67
+ <div class="poll-option-bar-modern">
68
+ <div class="poll-option-fill-modern" style="width: ${percentage}%"></div>
69
+ </div>
70
+ ${voters.length > 0 ? `
71
+ <div class="poll-voters-list">
72
+ <div class="poll-voters-header">
73
+ <span class="poll-voters-icon">👥</span>
74
+ <span class="poll-voters-title">投票成员 (${voters.length}人):</span>
75
+ </div>
76
+ <div class="poll-voters-tags">
77
+ ${voters.map(voter => {
78
+ const voterName = typeof voter === 'string' ? voter : voter.username;
79
+ return `
80
+ <span class="poll-voter-tag">
81
+ <span class="voter-avatar">${voterName ? voterName[0].toUpperCase() : '?'}</span>
82
+ <span class="voter-name">${voterName || '未知用户'}</span>
83
+ </span>
84
+ `;
85
+ }).join('')}
86
+ </div>
87
+ </div>
88
+ ` : `
89
+ <div class="poll-voters-empty">
90
+ <span class="empty-icon">📭</span>
91
+ <span class="empty-text">暂无人投票</span>
92
+ </div>
93
+ `}
94
+ </div>
95
+ `;
96
+ }).join('')}
97
+ </div>
98
+
99
+ <!-- 未投票成员列表 -->
100
+ ${renderUnvotedMembers(poll, votedMembers)}
101
+ </div>
102
+ `;
103
+ }
104
+
105
+ // 4. 添加新函数 renderUnvotedMembers:
106
+
107
+ function renderUnvotedMembers(poll, votedMembers) {
108
+ if (!poll.allMembers || poll.allMembers.length === 0) return '';
109
+
110
+ const unvotedMembers = poll.allMembers.filter(member => {
111
+ const memberName = typeof member === 'string' ? member : member.username;
112
+ return !votedMembers.has(memberName);
113
+ });
114
+
115
+ if (unvotedMembers.length === 0) {
116
+ return `
117
+ <div class="poll-unvoted-section all-voted">
118
+ <div class="poll-unvoted-header">
119
+ <span class="unvoted-icon">✅</span>
120
+ <span class="unvoted-title">所有成员已完成投票</span>
121
+ </div>
122
+ </div>
123
+ `;
124
+ }
125
+
126
+ return `
127
+ <div class="poll-unvoted-section">
128
+ <div class="poll-unvoted-header">
129
+ <span class="unvoted-icon">⚠️</span>
130
+ <span class="unvoted-title">未投票成员 (${unvotedMembers.length}人):</span>
131
+ </div>
132
+ <div class="poll-unvoted-list">
133
+ ${unvotedMembers.map(member => {
134
+ const memberName = typeof member === 'string' ? member : member.username;
135
+ return `
136
+ <span class="poll-unvoted-tag">
137
+ <span class="unvoted-avatar">${memberName ? memberName[0].toUpperCase() : '?'}</span>
138
+ <span class="unvoted-name">${memberName || '未知用户'}</span>
139
+ <span class="unvoted-status">未投票</span>
140
+ </span>
141
+ `;
142
+ }).join('')}
143
+ </div>
144
+ </div>
145
+ `;
146
+ }
147
+
148
+ // 5. 在 addTaskDetailStyles 函数的 style.textContent 末尾添加以下样式:
149
+
150
+ const pollEnhancedStyles = `
151
+ /* 投票统计摘要 */
152
+ .poll-stats-summary {
153
+ display: grid;
154
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
155
+ gap: 12px;
156
+ margin-bottom: 24px;
157
+ padding: 16px;
158
+ background: linear-gradient(135deg, rgba(99,102,241,0.05) 0%, rgba(139,92,246,0.05) 100%);
159
+ border-radius: 12px;
160
+ border: 1px solid var(--border);
161
+ }
162
+
163
+ .poll-stat-item {
164
+ display: flex;
165
+ align-items: center;
166
+ gap: 8px;
167
+ padding: 12px;
168
+ background: var(--bg-dark);
169
+ border-radius: 8px;
170
+ border: 1px solid var(--border);
171
+ transition: all 0.3s ease;
172
+ }
173
+
174
+ .poll-stat-item:hover {
175
+ transform: translateY(-2px);
176
+ box-shadow: 0 4px 12px rgba(99,102,241,0.2);
177
+ border-color: var(--primary);
178
+ }
179
+
180
+ .poll-stat-icon {
181
+ font-size: 20px;
182
+ flex-shrink: 0;
183
+ }
184
+
185
+ .poll-stat-label {
186
+ font-size: 13px;
187
+ color: var(--text-secondary);
188
+ font-weight: 600;
189
+ }
190
+
191
+ .poll-stat-value {
192
+ font-size: 16px;
193
+ color: var(--text-primary);
194
+ font-weight: 700;
195
+ margin-left: auto;
196
+ }
197
+
198
+ /* 投票成员列表 */
199
+ .poll-voters-list {
200
+ margin-top: 16px;
201
+ padding-top: 16px;
202
+ border-top: 1px solid var(--border);
203
+ }
204
+
205
+ .poll-voters-header {
206
+ display: flex;
207
+ align-items: center;
208
+ gap: 8px;
209
+ margin-bottom: 12px;
210
+ font-size: 13px;
211
+ color: var(--text-secondary);
212
+ font-weight: 600;
213
+ }
214
+
215
+ .poll-voters-icon {
216
+ font-size: 16px;
217
+ }
218
+
219
+ .poll-voters-title {
220
+ flex: 1;
221
+ }
222
+
223
+ .poll-voters-tags {
224
+ display: flex;
225
+ flex-wrap: wrap;
226
+ gap: 8px;
227
+ }
228
+
229
+ .poll-voter-tag {
230
+ display: inline-flex;
231
+ align-items: center;
232
+ gap: 8px;
233
+ padding: 6px 12px;
234
+ background: linear-gradient(135deg, rgba(99,102,241,0.1) 0%, rgba(139,92,246,0.1) 100%);
235
+ border: 1px solid rgba(99,102,241,0.3);
236
+ border-radius: 20px;
237
+ transition: all 0.3s ease;
238
+ cursor: default;
239
+ }
240
+
241
+ .poll-voter-tag:hover {
242
+ background: linear-gradient(135deg, rgba(99,102,241,0.2) 0%, rgba(139,92,246,0.2) 100%);
243
+ border-color: var(--primary);
244
+ transform: scale(1.05);
245
+ }
246
+
247
+ .voter-avatar {
248
+ width: 24px;
249
+ height: 24px;
250
+ border-radius: 50%;
251
+ background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
252
+ display: flex;
253
+ align-items: center;
254
+ justify-content: center;
255
+ font-size: 12px;
256
+ font-weight: 700;
257
+ color: white;
258
+ flex-shrink: 0;
259
+ }
260
+
261
+ .voter-name {
262
+ font-size: 13px;
263
+ font-weight: 600;
264
+ color: var(--text-primary);
265
+ }
266
+
267
+ /* 空状态 */
268
+ .poll-voters-empty {
269
+ display: flex;
270
+ align-items: center;
271
+ justify-content: center;
272
+ gap: 8px;
273
+ padding: 16px;
274
+ margin-top: 12px;
275
+ background: rgba(239,68,68,0.05);
276
+ border: 1px dashed rgba(239,68,68,0.3);
277
+ border-radius: 8px;
278
+ color: var(--text-secondary);
279
+ font-size: 13px;
280
+ }
281
+
282
+ .empty-icon {
283
+ font-size: 18px;
284
+ }
285
+
286
+ .empty-text {
287
+ font-weight: 500;
288
+ }
289
+
290
+ /* 未投票成员区域 */
291
+ .poll-unvoted-section {
292
+ margin-top: 24px;
293
+ padding: 20px;
294
+ background: linear-gradient(135deg, rgba(239,68,68,0.05) 0%, rgba(220,38,38,0.05) 100%);
295
+ border: 1px solid rgba(239,68,68,0.2);
296
+ border-radius: 12px;
297
+ }
298
+
299
+ .poll-unvoted-section.all-voted {
300
+ background: linear-gradient(135deg, rgba(16,185,129,0.05) 0%, rgba(5,150,105,0.05) 100%);
301
+ border-color: rgba(16,185,129,0.3);
302
+ }
303
+
304
+ .poll-unvoted-header {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 10px;
308
+ margin-bottom: 16px;
309
+ font-size: 15px;
310
+ font-weight: 700;
311
+ color: var(--text-primary);
312
+ }
313
+
314
+ .unvoted-icon {
315
+ font-size: 20px;
316
+ }
317
+
318
+ .unvoted-title {
319
+ flex: 1;
320
+ }
321
+
322
+ .poll-unvoted-list {
323
+ display: flex;
324
+ flex-wrap: wrap;
325
+ gap: 10px;
326
+ }
327
+
328
+ .poll-unvoted-tag {
329
+ display: inline-flex;
330
+ align-items: center;
331
+ gap: 8px;
332
+ padding: 8px 14px;
333
+ background: var(--bg-dark);
334
+ border: 2px solid rgba(239,68,68,0.3);
335
+ border-radius: 20px;
336
+ transition: all 0.3s ease;
337
+ cursor: default;
338
+ }
339
+
340
+ .poll-unvoted-tag:hover {
341
+ background: rgba(239,68,68,0.1);
342
+ border-color: var(--danger);
343
+ transform: scale(1.05);
344
+ }
345
+
346
+ .unvoted-avatar {
347
+ width: 28px;
348
+ height: 28px;
349
+ border-radius: 50%;
350
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
351
+ display: flex;
352
+ align-items: center;
353
+ justify-content: center;
354
+ font-size: 13px;
355
+ font-weight: 700;
356
+ color: white;
357
+ flex-shrink: 0;
358
+ }
359
+
360
+ .unvoted-name {
361
+ font-size: 14px;
362
+ font-weight: 600;
363
+ color: var(--text-primary);
364
+ }
365
+
366
+ .unvoted-status {
367
+ font-size: 11px;
368
+ font-weight: 600;
369
+ color: var(--danger);
370
+ background: rgba(239,68,68,0.1);
371
+ padding: 2px 8px;
372
+ border-radius: 10px;
373
+ }
374
+ `;
375
+
376
+ console.log('投票详情增强模块已加载');
377
+ console.log('请按照注释中的说明更新 optimized-task-detail.js 文件');
378
+
379
+
380
+