collabdocchat 2.0.4 → 2.0.6
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 +1 -1
- package/scripts/generate-docs.js +1 -0
- package/scripts/pre-publish-check.js +1 -0
- package/src/components/knowledge-modal.js +17 -18
- package/src/components/optimized-poll-detail.js +19 -21
- package/src/main.js +3 -2
- package/src/pages/admin-dashboard.js +283 -325
- package/src/pages/login.js +9 -8
- package/src/pages/optimized-backup-view.js +34 -36
- package/src/pages/optimized-knowledge-view.js +36 -42
- package/src/pages/optimized-task-detail.js +38 -43
- package/src/pages/optimized-workflow-view.js +66 -82
- package/src/pages/simplified-workflows.js +67 -66
- package/src/pages/user-dashboard.js +97 -112
- package/src/services/api.js +5 -7
- package/src/services/auth.js +2 -1
- package/src/services/websocket.js +13 -15
- package/src/styles/collaboration-modern.js +10 -11
- package/src/utils/ai-assistant.js +76 -90
- package/src/utils/chat-enhancements.js +20 -19
- package/src/utils/collaboration-enhancer.js +86 -127
- package/src/utils/feature-integrator.js +80 -94
- package/src/utils/onboarding-guide.js +84 -94
- package/src/utils/performance.js +11 -10
- package/src/utils/permission-manager.js +41 -59
- package/src/utils/responsive-handler.js +24 -23
- package/src/utils/theme-manager.js +39 -50
- package/src/utils/ui-enhancements-loader.js +32 -41
package/package.json
CHANGED
package/scripts/generate-docs.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
2
|
* 知识库创建和编辑功能
|
|
3
3
|
*/
|
|
4
4
|
|
|
@@ -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
|
|
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="
|
|
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
|
|
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
|
|
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
|
-
//
|
|
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:
|
|
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:
|
|
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>✏️
|
|
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
|
|
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
|
|
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:
|
|
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', {
|
|
@@ -483,3 +481,4 @@ function addKnowledgeModalStyles() {
|
|
|
483
481
|
document.head.appendChild(style);
|
|
484
482
|
}
|
|
485
483
|
|
|
484
|
+
|
|
@@ -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"
|
|
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"
|
|
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"
|
|
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"
|
|
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
|
|
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"
|
|
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
|
|
132
|
+
<span>投票成员�?/span>
|
|
136
133
|
<button class="btn-toggle-voters" onclick="toggleVoters(${index})">
|
|
137
|
-
<span id="voters-toggle-${index}">展开
|
|
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
|
|
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"
|
|
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,11 +711,12 @@ 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
|
};
|
|
724
721
|
|
|
722
|
+
|
package/src/main.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import './styles/main.css';
|
|
1
|
+
import './styles/main.css';
|
|
2
2
|
import { AuthService } from './services/auth.js';
|
|
3
3
|
import { WebSocketService } from './services/websocket.js';
|
|
4
4
|
import { renderLoginPage } from './pages/login.js';
|
|
@@ -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();
|
|
@@ -56,3 +56,4 @@ class App {
|
|
|
56
56
|
new App();
|
|
57
57
|
|
|
58
58
|
|
|
59
|
+
|