collabdocchat 2.0.3 → 2.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "collabdocchat",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "开源的实时协作文档聊天平台 - 集成任务管理、多人文档编辑、智能点名功能",
5
5
  "main": "./server/index.js",
6
6
  "type": "module",
@@ -446,3 +446,4 @@ documents.forEach(doc => {
446
446
 
447
447
  console.log('\n💡 提示: 查看 KNOWLEDGE_BASE.md 了解完整文档结构');
448
448
 
449
+
@@ -211,3 +211,4 @@ if (hasErrors) {
211
211
  process.exit(0);
212
212
  }
213
213
 
214
+
@@ -11,23 +11,23 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
11
11
  modal.innerHTML = `
12
12
  <div class="modal-content knowledge-modal-content">
13
13
  <div class="modal-header">
14
- <h3>✨ 创建知识库文档</h3>
14
+ <h3>�?创建知识库文�?/h3>
15
15
  <button class="modal-close" id="closeKnowledgeModal">×</button>
16
16
  </div>
17
17
 
18
18
  <form id="createKnowledgeForm">
19
19
  <div class="form-group">
20
20
  <label>标题 *</label>
21
- <input type="text" id="kbTitle" placeholder="请输入文档标题" required>
21
+ <input type="text" id="kbTitle" placeholder="请输入文档标�? required>
22
22
  </div>
23
23
 
24
24
  <div class="form-group">
25
25
  <label>分类</label>
26
- <input type="text" id="kbCategory" placeholder="例如:技术文档、使用指南">
26
+ <input type="text" id="kbCategory" placeholder="例如:技术文档、使用指�?>
27
27
  </div>
28
28
 
29
29
  <div class="form-group">
30
- <label>标签(用逗号分隔)</label>
30
+ <label>标签(用逗号分隔�?/label>
31
31
  <input type="text" id="kbTags" placeholder="例如:API, 教程, 入门">
32
32
  </div>
33
33
 
@@ -45,7 +45,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
45
45
  <span class="option-icon">🔒</span>
46
46
  <div>
47
47
  <strong>私有</strong>
48
- <p>仅自己可见</p>
48
+ <p>仅自己可�?/p>
49
49
  </div>
50
50
  </div>
51
51
  </label>
@@ -83,8 +83,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
83
83
  document.body.appendChild(modal);
84
84
  addKnowledgeModalStyles();
85
85
 
86
- // 初始化 Quill 编辑器
87
- const Quill = window.Quill;
86
+ // 初始�?Quill 编辑�? const Quill = window.Quill;
88
87
  const quill = new Quill('#kbContentEditor', {
89
88
  theme: 'snow',
90
89
  modules: {
@@ -134,7 +133,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
134
133
 
135
134
  try {
136
135
  const token = localStorage.getItem('token');
137
- const response = await fetch('http://localhost:8765/api/knowledge', {
136
+ const response = await fetch('http://localhost:3000/api/knowledge', {
138
137
  method: 'POST',
139
138
  headers: {
140
139
  'Content-Type': 'application/json',
@@ -154,7 +153,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
154
153
 
155
154
  const result = await response.json();
156
155
  if (result.success) {
157
- alert(publish ? '发布成功!' : '保存成功!');
156
+ alert(publish ? '发布成功�? : '保存成功�?);
158
157
  closeModal();
159
158
  // 触发自定义事件通知刷新
160
159
  window.dispatchEvent(new CustomEvent('knowledgeUpdated', {
@@ -173,7 +172,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
173
172
  export async function showEditKnowledgeModal(kbId, currentGroup, apiService, container, currentUserId) {
174
173
  try {
175
174
  const token = localStorage.getItem('token');
176
- const response = await fetch(`http://localhost:8765/api/knowledge/${kbId}`, {
175
+ const response = await fetch(`http://localhost:3000/api/knowledge/${kbId}`, {
177
176
  headers: { 'Authorization': `Bearer ${token}` }
178
177
  });
179
178
  const result = await response.json();
@@ -186,7 +185,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
186
185
  modal.innerHTML = `
187
186
  <div class="modal-content knowledge-modal-content">
188
187
  <div class="modal-header">
189
- <h3>✏️ 编辑知识库文档</h3>
188
+ <h3>✏️ 编辑知识库文�?/h3>
190
189
  <button class="modal-close" id="closeKnowledgeModal">×</button>
191
190
  </div>
192
191
 
@@ -202,7 +201,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
202
201
  </div>
203
202
 
204
203
  <div class="form-group">
205
- <label>标签(用逗号分隔)</label>
204
+ <label>标签(用逗号分隔�?/label>
206
205
  <input type="text" id="kbTags" value="${kb.tags ? kb.tags.join(', ') : ''}">
207
206
  </div>
208
207
 
@@ -220,7 +219,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
220
219
  <span class="option-icon">🔒</span>
221
220
  <div>
222
221
  <strong>私有</strong>
223
- <p>仅自己可见</p>
222
+ <p>仅自己可�?/p>
224
223
  </div>
225
224
  </div>
226
225
  </label>
@@ -258,8 +257,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
258
257
  document.body.appendChild(modal);
259
258
  addKnowledgeModalStyles();
260
259
 
261
- // 初始化编辑器并设置内容
262
- const Quill = window.Quill;
260
+ // 初始化编辑器并设置内�? const Quill = window.Quill;
263
261
  const quill = new Quill('#kbContentEditor', {
264
262
  theme: 'snow',
265
263
  modules: {
@@ -311,7 +309,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
311
309
 
312
310
  try {
313
311
  const token = localStorage.getItem('token');
314
- const response = await fetch(`http://localhost:8765/api/knowledge/${kbId}`, {
312
+ const response = await fetch(`http://localhost:3000/api/knowledge/${kbId}`, {
315
313
  method: 'PUT',
316
314
  headers: {
317
315
  'Content-Type': 'application/json',
@@ -329,7 +327,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
329
327
 
330
328
  const result = await response.json();
331
329
  if (result.success) {
332
- alert('更新成功!');
330
+ alert('更新成功�?);
333
331
  closeModal();
334
332
  // 触发自定义事件通知刷新
335
333
  window.dispatchEvent(new CustomEvent('knowledgeUpdated', {
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * 优化后的投票详情界面
3
- * 美化投票结果展示,提升用户体验
4
- */
3
+ * 美化投票结果展示,提升用户体�? */
5
4
 
6
5
  export function renderOptimizedPollDetail(task, assignedMembers) {
7
6
  const totalMembers = assignedMembers.length;
@@ -43,27 +42,25 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
43
42
  👥
44
43
  </div>
45
44
  <div class="stat-info">
46
- <div class="stat-label">总人数</div>
45
+ <div class="stat-label">总人�?/div>
47
46
  <div class="stat-value">${totalMembers}</div>
48
47
  </div>
49
48
  </div>
50
49
 
51
50
  <div class="poll-stat-card">
52
51
  <div class="stat-icon" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%);">
53
-
54
- </div>
52
+ �? </div>
55
53
  <div class="stat-info">
56
- <div class="stat-label">已投票</div>
54
+ <div class="stat-label">已投�?/div>
57
55
  <div class="stat-value">${votedCount}</div>
58
56
  </div>
59
57
  </div>
60
58
 
61
59
  <div class="poll-stat-card">
62
60
  <div class="stat-icon" style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);">
63
-
64
- </div>
61
+ �? </div>
65
62
  <div class="stat-info">
66
- <div class="stat-label">未投票</div>
63
+ <div class="stat-label">未投�?/div>
67
64
  <div class="stat-value">${notVotedCount}</div>
68
65
  </div>
69
66
  </div>
@@ -73,7 +70,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
73
70
  📈
74
71
  </div>
75
72
  <div class="stat-info">
76
- <div class="stat-label">投票率</div>
73
+ <div class="stat-label">投票�?/div>
77
74
  <div class="stat-value">${voteRate}%</div>
78
75
  </div>
79
76
  </div>
@@ -95,7 +92,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
95
92
 
96
93
  <!-- 投票选项结果 -->
97
94
  <div class="poll-options-section">
98
- <h3>🗳️ 投票结果</h3>
95
+ <h3>🗳�?投票结果</h3>
99
96
  <div class="poll-options-list">
100
97
  ${pollOptions.map((option, index) => {
101
98
  const voteCount = Array.isArray(option.votes) ? option.votes.length : Number(option.votes || 0);
@@ -115,7 +112,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
115
112
  <div class="option-stats">
116
113
  <div class="option-votes">
117
114
  <span class="votes-count">${voteCount}</span>
118
- <span class="votes-label">票</span>
115
+ <span class="votes-label">�?/span>
119
116
  </div>
120
117
  <div class="option-percentage">${percentage}%</div>
121
118
  </div>
@@ -132,9 +129,9 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
132
129
  ${voteCount > 0 ? `
133
130
  <div class="voters-list">
134
131
  <div class="voters-header">
135
- <span>投票成员:</span>
132
+ <span>投票成员�?/span>
136
133
  <button class="btn-toggle-voters" onclick="toggleVoters(${index})">
137
- <span id="voters-toggle-${index}">展开 ▼</span>
134
+ <span id="voters-toggle-${index}">展开 �?/span>
138
135
  </button>
139
136
  </div>
140
137
  <div class="voters-content hidden" id="voters-${index}">
@@ -163,16 +160,16 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
163
160
  </div>
164
161
  </div>
165
162
 
166
- <!-- 未投票成员 -->
163
+ <!-- 未投票成�?-->
167
164
  ${notVotedCount > 0 ? `
168
165
  <div class="not-voted-section">
169
- <h3>⏳ 未投票成员 (${notVotedCount})</h3>
166
+ <h3>�?未投票成�?(${notVotedCount})</h3>
170
167
  <div class="not-voted-list">
171
168
  ${assignedMembers.filter(member => !votedMembers.has(String(member.id))).map(member => `
172
169
  <div class="not-voted-item">
173
170
  <div class="member-avatar">${member.username[0].toUpperCase()}</div>
174
171
  <div class="member-name">${member.username}</div>
175
- <div class="not-voted-badge">未投票</div>
172
+ <div class="not-voted-badge">未投�?/div>
176
173
  </div>
177
174
  `).join('')}
178
175
  </div>
@@ -617,7 +614,7 @@ export function addPollDetailStyles() {
617
614
  font-weight: 600;
618
615
  }
619
616
 
620
- /* 简单投票表单样式 */
617
+ /* 简单投票表单样�?*/
621
618
  .poll-form-simple {
622
619
  background: var(--bg-dark);
623
620
  border: 2px solid var(--border);
@@ -714,10 +711,10 @@ window.toggleVoters = function(index) {
714
711
  if (content && toggle) {
715
712
  if (content.classList.contains('hidden')) {
716
713
  content.classList.remove('hidden');
717
- toggle.textContent = '收起 ▲';
714
+ toggle.textContent = '收起 �?;
718
715
  } else {
719
716
  content.classList.add('hidden');
720
- toggle.textContent = '展开 ▼';
717
+ toggle.textContent = '展开 �?;
721
718
  }
722
719
  }
723
720
  };
package/src/main.js CHANGED
@@ -12,7 +12,7 @@ class App {
12
12
  this.wsService = new WebSocketService();
13
13
  this.currentUser = null;
14
14
 
15
- // 初始化响应式处理器
15
+ // 初始化响应式处理�?
16
16
  this.responsiveHandler = new ResponsiveHandler();
17
17
 
18
18
  this.init();