collabdocchat 2.0.5 → 2.0.7
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/fix-ports.js +71 -0
- package/src/components/knowledge-modal.js +14 -13
- package/src/components/optimized-poll-detail.js +19 -18
- package/src/main.js +3 -2
- package/src/pages/admin-dashboard.js +256 -255
- package/src/pages/login.js +9 -8
- package/src/pages/optimized-backup-view.js +2 -1
- package/src/pages/optimized-knowledge-view.js +2 -1
- package/src/pages/optimized-task-detail.js +38 -37
- package/src/pages/optimized-workflow-view.js +2 -1
- package/src/pages/simplified-workflows.js +62 -61
- package/src/pages/user-dashboard.js +82 -81
- package/src/services/api.js +5 -4
- package/src/services/auth.js +2 -1
- package/src/services/websocket.js +13 -12
- package/src/styles/collaboration-modern.js +10 -9
- package/src/utils/ai-assistant.js +76 -75
- package/src/utils/chat-enhancements.js +20 -19
- package/src/utils/collaboration-enhancer.js +86 -85
- package/src/utils/feature-integrator.js +80 -79
- package/src/utils/onboarding-guide.js +84 -83
- package/src/utils/performance.js +11 -10
- package/src/utils/permission-manager.js +41 -40
- package/src/utils/responsive-handler.js +24 -23
- package/src/utils/theme-manager.js +39 -38
- package/src/utils/ui-enhancements-loader.js +32 -31
package/package.json
CHANGED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = path.dirname(__filename);
|
|
7
|
+
|
|
8
|
+
// 递归查找所有 .js 文件
|
|
9
|
+
function findJsFiles(dir, fileList = []) {
|
|
10
|
+
const files = fs.readdirSync(dir);
|
|
11
|
+
|
|
12
|
+
files.forEach(file => {
|
|
13
|
+
const filePath = path.join(dir, file);
|
|
14
|
+
const stat = fs.statSync(filePath);
|
|
15
|
+
|
|
16
|
+
if (stat.isDirectory()) {
|
|
17
|
+
if (file !== 'node_modules' && file !== '.git') {
|
|
18
|
+
findJsFiles(filePath, fileList);
|
|
19
|
+
}
|
|
20
|
+
} else if (file.endsWith('.js')) {
|
|
21
|
+
fileList.push(filePath);
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return fileList;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 替换文件中的端口
|
|
29
|
+
function replacePort(filePath) {
|
|
30
|
+
try {
|
|
31
|
+
let content = fs.readFileSync(filePath, 'utf8');
|
|
32
|
+
const originalContent = content;
|
|
33
|
+
|
|
34
|
+
// 替换所有 8765 端口为 3000
|
|
35
|
+
content = content.replace(/http:\/\/localhost:8765/g, 'http://localhost:3000');
|
|
36
|
+
content = content.replace(/ws:\/\/localhost:8765/g, 'ws://localhost:3000');
|
|
37
|
+
|
|
38
|
+
if (content !== originalContent) {
|
|
39
|
+
fs.writeFileSync(filePath, content, 'utf8');
|
|
40
|
+
console.log(`✅ 已修复: ${filePath}`);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error(`❌ 处理失败: ${filePath}`, error.message);
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// 主函数
|
|
51
|
+
function main() {
|
|
52
|
+
console.log('🔍 开始扫描并修复端口配置...\n');
|
|
53
|
+
|
|
54
|
+
const projectRoot = path.join(__dirname, '..');
|
|
55
|
+
const srcDir = path.join(projectRoot, 'src');
|
|
56
|
+
const jsFiles = findJsFiles(srcDir);
|
|
57
|
+
|
|
58
|
+
console.log(`📁 找到 ${jsFiles.length} 个 JavaScript 文件\n`);
|
|
59
|
+
|
|
60
|
+
let fixedCount = 0;
|
|
61
|
+
jsFiles.forEach(file => {
|
|
62
|
+
if (replacePort(file)) {
|
|
63
|
+
fixedCount++;
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
console.log(`\n✅ 修复完成!共修复 ${fixedCount} 个文件`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
main();
|
|
71
|
+
|
|
@@ -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>�?创建知识库文�?/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,7 +83,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
|
|
|
83
83
|
document.body.appendChild(modal);
|
|
84
84
|
addKnowledgeModalStyles();
|
|
85
85
|
|
|
86
|
-
// 初始�?Quill 编辑�? const Quill = window.Quill;
|
|
86
|
+
// 初始�?Quill 编辑�? const Quill = window.Quill;
|
|
87
87
|
const quill = new Quill('#kbContentEditor', {
|
|
88
88
|
theme: 'snow',
|
|
89
89
|
modules: {
|
|
@@ -153,7 +153,7 @@ export function showCreateKnowledgeModal(currentGroup, apiService, container, cu
|
|
|
153
153
|
|
|
154
154
|
const result = await response.json();
|
|
155
155
|
if (result.success) {
|
|
156
|
-
alert(publish ? '发布成功�? : '保存成功�?);
|
|
156
|
+
alert(publish ? '发布成功�? : '保存成功�?);
|
|
157
157
|
closeModal();
|
|
158
158
|
// 触发自定义事件通知刷新
|
|
159
159
|
window.dispatchEvent(new CustomEvent('knowledgeUpdated', {
|
|
@@ -185,7 +185,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
|
|
|
185
185
|
modal.innerHTML = `
|
|
186
186
|
<div class="modal-content knowledge-modal-content">
|
|
187
187
|
<div class="modal-header">
|
|
188
|
-
<h3>✏️ 编辑知识库文�?/h3>
|
|
188
|
+
<h3>✏️ 编辑知识库文�?/h3>
|
|
189
189
|
<button class="modal-close" id="closeKnowledgeModal">×</button>
|
|
190
190
|
</div>
|
|
191
191
|
|
|
@@ -201,7 +201,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
|
|
|
201
201
|
</div>
|
|
202
202
|
|
|
203
203
|
<div class="form-group">
|
|
204
|
-
<label>标签(用逗号分隔�?/label>
|
|
204
|
+
<label>标签(用逗号分隔�?/label>
|
|
205
205
|
<input type="text" id="kbTags" value="${kb.tags ? kb.tags.join(', ') : ''}">
|
|
206
206
|
</div>
|
|
207
207
|
|
|
@@ -219,7 +219,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
|
|
|
219
219
|
<span class="option-icon">🔒</span>
|
|
220
220
|
<div>
|
|
221
221
|
<strong>私有</strong>
|
|
222
|
-
<p>仅自己可�?/p>
|
|
222
|
+
<p>仅自己可�?/p>
|
|
223
223
|
</div>
|
|
224
224
|
</div>
|
|
225
225
|
</label>
|
|
@@ -257,7 +257,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
|
|
|
257
257
|
document.body.appendChild(modal);
|
|
258
258
|
addKnowledgeModalStyles();
|
|
259
259
|
|
|
260
|
-
// 初始化编辑器并设置内�? const Quill = window.Quill;
|
|
260
|
+
// 初始化编辑器并设置内�? const Quill = window.Quill;
|
|
261
261
|
const quill = new Quill('#kbContentEditor', {
|
|
262
262
|
theme: 'snow',
|
|
263
263
|
modules: {
|
|
@@ -327,7 +327,7 @@ export async function showEditKnowledgeModal(kbId, currentGroup, apiService, con
|
|
|
327
327
|
|
|
328
328
|
const result = await response.json();
|
|
329
329
|
if (result.success) {
|
|
330
|
-
alert('更新成功�?);
|
|
330
|
+
alert('更新成功�?);
|
|
331
331
|
closeModal();
|
|
332
332
|
// 触发自定义事件通知刷新
|
|
333
333
|
window.dispatchEvent(new CustomEvent('knowledgeUpdated', {
|
|
@@ -481,3 +481,4 @@ function addKnowledgeModalStyles() {
|
|
|
481
481
|
document.head.appendChild(style);
|
|
482
482
|
}
|
|
483
483
|
|
|
484
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
2
|
* 优化后的投票详情界面
|
|
3
|
-
* 美化投票结果展示,提升用户体�? */
|
|
3
|
+
* 美化投票结果展示,提升用户体�? */
|
|
4
4
|
|
|
5
5
|
export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
6
6
|
const totalMembers = assignedMembers.length;
|
|
@@ -42,25 +42,25 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
42
42
|
👥
|
|
43
43
|
</div>
|
|
44
44
|
<div class="stat-info">
|
|
45
|
-
<div class="stat-label">总人�?/div>
|
|
45
|
+
<div class="stat-label">总人�?/div>
|
|
46
46
|
<div class="stat-value">${totalMembers}</div>
|
|
47
47
|
</div>
|
|
48
48
|
</div>
|
|
49
49
|
|
|
50
50
|
<div class="poll-stat-card">
|
|
51
51
|
<div class="stat-icon" style="background: linear-gradient(135deg, #10b981 0%, #059669 100%);">
|
|
52
|
-
�? </div>
|
|
52
|
+
�? </div>
|
|
53
53
|
<div class="stat-info">
|
|
54
|
-
<div class="stat-label">已投�?/div>
|
|
54
|
+
<div class="stat-label">已投�?/div>
|
|
55
55
|
<div class="stat-value">${votedCount}</div>
|
|
56
56
|
</div>
|
|
57
57
|
</div>
|
|
58
58
|
|
|
59
59
|
<div class="poll-stat-card">
|
|
60
60
|
<div class="stat-icon" style="background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);">
|
|
61
|
-
�? </div>
|
|
61
|
+
�? </div>
|
|
62
62
|
<div class="stat-info">
|
|
63
|
-
<div class="stat-label">未投�?/div>
|
|
63
|
+
<div class="stat-label">未投�?/div>
|
|
64
64
|
<div class="stat-value">${notVotedCount}</div>
|
|
65
65
|
</div>
|
|
66
66
|
</div>
|
|
@@ -70,7 +70,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
70
70
|
📈
|
|
71
71
|
</div>
|
|
72
72
|
<div class="stat-info">
|
|
73
|
-
<div class="stat-label">投票�?/div>
|
|
73
|
+
<div class="stat-label">投票�?/div>
|
|
74
74
|
<div class="stat-value">${voteRate}%</div>
|
|
75
75
|
</div>
|
|
76
76
|
</div>
|
|
@@ -92,7 +92,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
92
92
|
|
|
93
93
|
<!-- 投票选项结果 -->
|
|
94
94
|
<div class="poll-options-section">
|
|
95
|
-
<h3>🗳�?投票结果</h3>
|
|
95
|
+
<h3>🗳�?投票结果</h3>
|
|
96
96
|
<div class="poll-options-list">
|
|
97
97
|
${pollOptions.map((option, index) => {
|
|
98
98
|
const voteCount = Array.isArray(option.votes) ? option.votes.length : Number(option.votes || 0);
|
|
@@ -112,7 +112,7 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
112
112
|
<div class="option-stats">
|
|
113
113
|
<div class="option-votes">
|
|
114
114
|
<span class="votes-count">${voteCount}</span>
|
|
115
|
-
<span class="votes-label">�?/span>
|
|
115
|
+
<span class="votes-label">�?/span>
|
|
116
116
|
</div>
|
|
117
117
|
<div class="option-percentage">${percentage}%</div>
|
|
118
118
|
</div>
|
|
@@ -129,9 +129,9 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
129
129
|
${voteCount > 0 ? `
|
|
130
130
|
<div class="voters-list">
|
|
131
131
|
<div class="voters-header">
|
|
132
|
-
<span>投票成员�?/span>
|
|
132
|
+
<span>投票成员�?/span>
|
|
133
133
|
<button class="btn-toggle-voters" onclick="toggleVoters(${index})">
|
|
134
|
-
<span id="voters-toggle-${index}">展开 �?/span>
|
|
134
|
+
<span id="voters-toggle-${index}">展开 �?/span>
|
|
135
135
|
</button>
|
|
136
136
|
</div>
|
|
137
137
|
<div class="voters-content hidden" id="voters-${index}">
|
|
@@ -160,16 +160,16 @@ export function renderOptimizedPollDetail(task, assignedMembers) {
|
|
|
160
160
|
</div>
|
|
161
161
|
</div>
|
|
162
162
|
|
|
163
|
-
<!-- 未投票成�?-->
|
|
163
|
+
<!-- 未投票成�?-->
|
|
164
164
|
${notVotedCount > 0 ? `
|
|
165
165
|
<div class="not-voted-section">
|
|
166
|
-
<h3>�?未投票成�?(${notVotedCount})</h3>
|
|
166
|
+
<h3>�?未投票成�?(${notVotedCount})</h3>
|
|
167
167
|
<div class="not-voted-list">
|
|
168
168
|
${assignedMembers.filter(member => !votedMembers.has(String(member.id))).map(member => `
|
|
169
169
|
<div class="not-voted-item">
|
|
170
170
|
<div class="member-avatar">${member.username[0].toUpperCase()}</div>
|
|
171
171
|
<div class="member-name">${member.username}</div>
|
|
172
|
-
<div class="not-voted-badge">未投�?/div>
|
|
172
|
+
<div class="not-voted-badge">未投�?/div>
|
|
173
173
|
</div>
|
|
174
174
|
`).join('')}
|
|
175
175
|
</div>
|
|
@@ -614,7 +614,7 @@ export function addPollDetailStyles() {
|
|
|
614
614
|
font-weight: 600;
|
|
615
615
|
}
|
|
616
616
|
|
|
617
|
-
/* 简单投票表单样�?*/
|
|
617
|
+
/* 简单投票表单样�?*/
|
|
618
618
|
.poll-form-simple {
|
|
619
619
|
background: var(--bg-dark);
|
|
620
620
|
border: 2px solid var(--border);
|
|
@@ -711,11 +711,12 @@ window.toggleVoters = function(index) {
|
|
|
711
711
|
if (content && toggle) {
|
|
712
712
|
if (content.classList.contains('hidden')) {
|
|
713
713
|
content.classList.remove('hidden');
|
|
714
|
-
toggle.textContent = '收起 �?;
|
|
714
|
+
toggle.textContent = '收起 �?;
|
|
715
715
|
} else {
|
|
716
716
|
content.classList.add('hidden');
|
|
717
|
-
toggle.textContent = '展开 �?;
|
|
717
|
+
toggle.textContent = '展开 �?;
|
|
718
718
|
}
|
|
719
719
|
}
|
|
720
720
|
};
|
|
721
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
|
+
|