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
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 功能集成�? * 将所有增强功能集成到仪表板中
|
|
1
|
+
/**
|
|
2
|
+
* 功能集成�? * 将所有增强功能集成到仪表板中
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { ChatEnhancements, OnlineStatusManager, MessageNotificationManager } from './chat-enhancements.js';
|
|
@@ -15,15 +15,15 @@ export class FeatureIntegrator {
|
|
|
15
15
|
this.wsService = wsService;
|
|
16
16
|
this.user = user;
|
|
17
17
|
|
|
18
|
-
// 初始化各个功能模�? this.chatEnhancements = new ChatEnhancements(apiService, wsService, user.id || user._id);
|
|
18
|
+
// 初始化各个功能模�? this.chatEnhancements = new ChatEnhancements(apiService, wsService, user.id || user._id);
|
|
19
19
|
this.onlineStatus = new OnlineStatusManager(wsService);
|
|
20
20
|
this.notifications = new MessageNotificationManager();
|
|
21
21
|
this.aiAssistant = new AIAssistant(apiService);
|
|
22
22
|
this.collaboration = new CollaborationEnhancer(apiService, wsService);
|
|
23
23
|
|
|
24
|
-
// 初始化主�? themeManager.init();
|
|
24
|
+
// 初始化主�? themeManager.init();
|
|
25
25
|
|
|
26
|
-
// 设置在线状态监�? this.onlineStatus.setupListeners();
|
|
26
|
+
// 设置在线状态监�? this.onlineStatus.setupListeners();
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
@@ -36,7 +36,7 @@ export class FeatureIntegrator {
|
|
|
36
36
|
<span class="icon">⚙️</span> 设置
|
|
37
37
|
</button>
|
|
38
38
|
<button class="nav-item" data-view="help">
|
|
39
|
-
<span class="icon">�?/span> 帮助
|
|
39
|
+
<span class="icon">�?/span> 帮助
|
|
40
40
|
</button>
|
|
41
41
|
</div>
|
|
42
42
|
`;
|
|
@@ -45,7 +45,7 @@ export class FeatureIntegrator {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
* 渲染设置页面(优化后的卡片式布局�? */
|
|
48
|
+
* 渲染设置页面(优化后的卡片式布局�? */
|
|
49
49
|
renderSettingsView(container) {
|
|
50
50
|
container.innerHTML = `
|
|
51
51
|
<div class="view-header">
|
|
@@ -56,51 +56,51 @@ export class FeatureIntegrator {
|
|
|
56
56
|
<div class="setting-card" data-setting="theme">
|
|
57
57
|
<div class="setting-icon">🎨</div>
|
|
58
58
|
<h3>主题设置</h3>
|
|
59
|
-
<p>选择主题风格和颜色方�?/p>
|
|
60
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
59
|
+
<p>选择主题风格和颜色方�?/p>
|
|
60
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
61
61
|
</div>
|
|
62
62
|
|
|
63
63
|
<div class="setting-card" data-setting="notifications">
|
|
64
64
|
<div class="setting-icon">🔔</div>
|
|
65
65
|
<h3>通知设置</h3>
|
|
66
|
-
<p>管理通知偏好和提醒方�?/p>
|
|
67
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
66
|
+
<p>管理通知偏好和提醒方�?/p>
|
|
67
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
68
68
|
</div>
|
|
69
69
|
|
|
70
70
|
<div class="setting-card" data-setting="ai">
|
|
71
71
|
<div class="setting-icon">🤖</div>
|
|
72
72
|
<h3>AI 助手</h3>
|
|
73
|
-
<p>配置 AI 功能和智能建�?/p>
|
|
74
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
73
|
+
<p>配置 AI 功能和智能建�?/p>
|
|
74
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
75
75
|
</div>
|
|
76
76
|
|
|
77
77
|
${this.user.role === 'admin' ? `
|
|
78
78
|
<div class="setting-card" data-setting="permissions">
|
|
79
79
|
<div class="setting-icon">🔒</div>
|
|
80
80
|
<h3>权限管理</h3>
|
|
81
|
-
<p>设置用户权限和访问控�?/p>
|
|
82
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
81
|
+
<p>设置用户权限和访问控�?/p>
|
|
82
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
83
83
|
</div>
|
|
84
84
|
` : ''}
|
|
85
85
|
|
|
86
86
|
<div class="setting-card" data-setting="data">
|
|
87
87
|
<div class="setting-icon">📊</div>
|
|
88
88
|
<h3>数据管理</h3>
|
|
89
|
-
<p>导出数据和备份管�?/p>
|
|
90
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
89
|
+
<p>导出数据和备份管�?/p>
|
|
90
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
91
91
|
</div>
|
|
92
92
|
|
|
93
93
|
<div class="setting-card" data-setting="language">
|
|
94
94
|
<div class="setting-icon">🌐</div>
|
|
95
95
|
<h3>语言设置</h3>
|
|
96
96
|
<p>选择界面显示语言</p>
|
|
97
|
-
<button class="btn-card-action">进入设置 �?/button>
|
|
97
|
+
<button class="btn-card-action">进入设置 �?/button>
|
|
98
98
|
</div>
|
|
99
99
|
</div>
|
|
100
100
|
|
|
101
101
|
<!-- 详细设置面板 -->
|
|
102
102
|
<div class="setting-detail-panel hidden" id="settingDetailPanel">
|
|
103
|
-
<button class="btn-back" id="backToSettings">�?返回</button>
|
|
103
|
+
<button class="btn-back" id="backToSettings">�?返回</button>
|
|
104
104
|
<div id="settingDetailContent"></div>
|
|
105
105
|
</div>
|
|
106
106
|
`;
|
|
@@ -126,7 +126,7 @@ export class FeatureIntegrator {
|
|
|
126
126
|
const style = document.createElement('style');
|
|
127
127
|
style.id = 'settings-modern-styles';
|
|
128
128
|
style.textContent = `
|
|
129
|
-
/* 设置页面容器 - 添加高度限制和滚�?*/
|
|
129
|
+
/* 设置页面容器 - 添加高度限制和滚�?*/
|
|
130
130
|
#contentArea {
|
|
131
131
|
max-height: calc(100vh - 40px);
|
|
132
132
|
overflow-y: auto;
|
|
@@ -359,7 +359,7 @@ export class FeatureIntegrator {
|
|
|
359
359
|
line-height: 1.6;
|
|
360
360
|
}
|
|
361
361
|
|
|
362
|
-
/* 切换开�?*/
|
|
362
|
+
/* 切换开�?*/
|
|
363
363
|
.toggle-switch {
|
|
364
364
|
position: relative;
|
|
365
365
|
display: inline-block;
|
|
@@ -610,7 +610,7 @@ export class FeatureIntegrator {
|
|
|
610
610
|
box-shadow: 0 4px 12px rgba(239,68,68,0.4);
|
|
611
611
|
}
|
|
612
612
|
|
|
613
|
-
/* 语言选择�?*/
|
|
613
|
+
/* 语言选择�?*/
|
|
614
614
|
.language-selector-modern {
|
|
615
615
|
display: grid;
|
|
616
616
|
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
|
@@ -684,7 +684,7 @@ export class FeatureIntegrator {
|
|
|
684
684
|
animation: scaleIn 0.3s ease;
|
|
685
685
|
}
|
|
686
686
|
|
|
687
|
-
/* 信息提示�?*/
|
|
687
|
+
/* 信息提示�?*/
|
|
688
688
|
.language-info-box {
|
|
689
689
|
background: linear-gradient(135deg, rgba(99,102,241,0.1) 0%, rgba(99,102,241,0.05) 100%);
|
|
690
690
|
border: 2px solid rgba(99,102,241,0.3);
|
|
@@ -735,7 +735,7 @@ export class FeatureIntegrator {
|
|
|
735
735
|
}
|
|
736
736
|
}
|
|
737
737
|
|
|
738
|
-
/* 响应�?*/
|
|
738
|
+
/* 响应�?*/
|
|
739
739
|
@media (max-width: 768px) {
|
|
740
740
|
.settings-header-modern {
|
|
741
741
|
padding: 30px 20px;
|
|
@@ -796,7 +796,7 @@ export class FeatureIntegrator {
|
|
|
796
796
|
grid.style.display = 'none';
|
|
797
797
|
panel.classList.remove('hidden');
|
|
798
798
|
|
|
799
|
-
// 加载对应的设置内�? this.loadSettingsTab(setting, content);
|
|
799
|
+
// 加载对应的设置内�? this.loadSettingsTab(setting, content);
|
|
800
800
|
|
|
801
801
|
// 返回按钮
|
|
802
802
|
container.querySelector('#backToSettings').addEventListener('click', () => {
|
|
@@ -834,7 +834,7 @@ export class FeatureIntegrator {
|
|
|
834
834
|
}
|
|
835
835
|
|
|
836
836
|
/**
|
|
837
|
-
* 渲染数据管理设置(优化后�? */
|
|
837
|
+
* 渲染数据管理设置(优化后�? */
|
|
838
838
|
renderDataSettings(container) {
|
|
839
839
|
container.innerHTML = `
|
|
840
840
|
<div class="settings-detail-modern">
|
|
@@ -875,7 +875,7 @@ export class FeatureIntegrator {
|
|
|
875
875
|
<div class="setting-card-icon">📤</div>
|
|
876
876
|
<div class="setting-card-content">
|
|
877
877
|
<h4>导出数据</h4>
|
|
878
|
-
<p>导出您的聊天记录、文档和其他数据�?JSON �?CSV 格式</p>
|
|
878
|
+
<p>导出您的聊天记录、文档和其他数据�?JSON �?CSV 格式</p>
|
|
879
879
|
<div class="export-options">
|
|
880
880
|
<button class="btn-export" data-type="messages">
|
|
881
881
|
<span>💬</span> 导出消息
|
|
@@ -891,12 +891,12 @@ export class FeatureIntegrator {
|
|
|
891
891
|
</div>
|
|
892
892
|
|
|
893
893
|
<div class="setting-card-detail">
|
|
894
|
-
<div class="setting-card-icon">🗑�?/div>
|
|
894
|
+
<div class="setting-card-icon">🗑�?/div>
|
|
895
895
|
<div class="setting-card-content">
|
|
896
896
|
<h4>清除缓存</h4>
|
|
897
|
-
<p>清除本地缓存数据以释放空间,不会删除服务器数�?/p>
|
|
897
|
+
<p>清除本地缓存数据以释放空间,不会删除服务器数�?/p>
|
|
898
898
|
<button class="btn-danger-outline" id="clearCache">
|
|
899
|
-
<span>🗑�?/span> 清除缓存
|
|
899
|
+
<span>🗑�?/span> 清除缓存
|
|
900
900
|
</button>
|
|
901
901
|
</div>
|
|
902
902
|
</div>
|
|
@@ -905,7 +905,7 @@ export class FeatureIntegrator {
|
|
|
905
905
|
<div class="setting-card-icon">🔄</div>
|
|
906
906
|
<div class="setting-card-content">
|
|
907
907
|
<h4>自动备份</h4>
|
|
908
|
-
<p>定期自动备份您的重要数据,确保数据安�?/p>
|
|
908
|
+
<p>定期自动备份您的重要数据,确保数据安�?/p>
|
|
909
909
|
<label class="toggle-switch">
|
|
910
910
|
<input type="checkbox" id="autoBackup" checked>
|
|
911
911
|
<span class="toggle-slider"></span>
|
|
@@ -924,11 +924,11 @@ export class FeatureIntegrator {
|
|
|
924
924
|
btn.addEventListener('click', () => {
|
|
925
925
|
const type = btn.dataset.type;
|
|
926
926
|
const originalText = btn.innerHTML;
|
|
927
|
-
btn.innerHTML = '<span>�?/span> 导出�?..';
|
|
927
|
+
btn.innerHTML = '<span>�?/span> 导出�?..';
|
|
928
928
|
btn.disabled = true;
|
|
929
929
|
|
|
930
930
|
setTimeout(() => {
|
|
931
|
-
btn.innerHTML = '<span>�?/span> 导出成功�?;
|
|
931
|
+
btn.innerHTML = '<span>�?/span> 导出成功�?;
|
|
932
932
|
setTimeout(() => {
|
|
933
933
|
btn.innerHTML = originalText;
|
|
934
934
|
btn.disabled = false;
|
|
@@ -941,14 +941,14 @@ export class FeatureIntegrator {
|
|
|
941
941
|
|
|
942
942
|
// 清除缓存
|
|
943
943
|
container.querySelector('#clearCache')?.addEventListener('click', () => {
|
|
944
|
-
if (confirm('确定要清除缓存吗?这不会删除服务器上的数据�?)) {
|
|
944
|
+
if (confirm('确定要清除缓存吗?这不会删除服务器上的数据�?)) {
|
|
945
945
|
const btn = container.querySelector('#clearCache');
|
|
946
|
-
btn.innerHTML = '<span>�?/span> 清除�?..';
|
|
946
|
+
btn.innerHTML = '<span>�?/span> 清除�?..';
|
|
947
947
|
btn.disabled = true;
|
|
948
948
|
|
|
949
949
|
setTimeout(() => {
|
|
950
950
|
localStorage.clear();
|
|
951
|
-
alert('缓存已清除!页面将刷�?..');
|
|
951
|
+
alert('缓存已清除!页面将刷�?..');
|
|
952
952
|
window.location.reload();
|
|
953
953
|
}, 1000);
|
|
954
954
|
}
|
|
@@ -956,7 +956,7 @@ export class FeatureIntegrator {
|
|
|
956
956
|
}
|
|
957
957
|
|
|
958
958
|
/**
|
|
959
|
-
* 渲染语言设置(优化后�? */
|
|
959
|
+
* 渲染语言设置(优化后�? */
|
|
960
960
|
renderLanguageSettings(container) {
|
|
961
961
|
const currentLang = localStorage.getItem('language') || 'zh-CN';
|
|
962
962
|
|
|
@@ -972,11 +972,11 @@ export class FeatureIntegrator {
|
|
|
972
972
|
<div class="language-card ${currentLang === 'zh-CN' ? 'selected' : ''}" data-lang="zh-CN">
|
|
973
973
|
<div class="language-flag">🇨🇳</div>
|
|
974
974
|
<div class="language-info">
|
|
975
|
-
<h4>简体中�?/h4>
|
|
975
|
+
<h4>简体中�?/h4>
|
|
976
976
|
<p>Simplified Chinese</p>
|
|
977
977
|
</div>
|
|
978
978
|
<div class="language-check">
|
|
979
|
-
${currentLang === 'zh-CN' ? '<span class="check-icon">�?/span>' : ''}
|
|
979
|
+
${currentLang === 'zh-CN' ? '<span class="check-icon">�?/span>' : ''}
|
|
980
980
|
</div>
|
|
981
981
|
</div>
|
|
982
982
|
|
|
@@ -987,7 +987,7 @@ export class FeatureIntegrator {
|
|
|
987
987
|
<p>Traditional Chinese</p>
|
|
988
988
|
</div>
|
|
989
989
|
<div class="language-check">
|
|
990
|
-
${currentLang === 'zh-TW' ? '<span class="check-icon">�?/span>' : ''}
|
|
990
|
+
${currentLang === 'zh-TW' ? '<span class="check-icon">�?/span>' : ''}
|
|
991
991
|
</div>
|
|
992
992
|
</div>
|
|
993
993
|
|
|
@@ -998,29 +998,29 @@ export class FeatureIntegrator {
|
|
|
998
998
|
<p>United States</p>
|
|
999
999
|
</div>
|
|
1000
1000
|
<div class="language-check">
|
|
1001
|
-
${currentLang === 'en-US' ? '<span class="check-icon">�?/span>' : ''}
|
|
1001
|
+
${currentLang === 'en-US' ? '<span class="check-icon">�?/span>' : ''}
|
|
1002
1002
|
</div>
|
|
1003
1003
|
</div>
|
|
1004
1004
|
|
|
1005
1005
|
<div class="language-card ${currentLang === 'ja-JP' ? 'selected' : ''}" data-lang="ja-JP">
|
|
1006
1006
|
<div class="language-flag">🇯🇵</div>
|
|
1007
1007
|
<div class="language-info">
|
|
1008
|
-
<h4>日本�?/h4>
|
|
1008
|
+
<h4>日本�?/h4>
|
|
1009
1009
|
<p>Japanese</p>
|
|
1010
1010
|
</div>
|
|
1011
1011
|
<div class="language-check">
|
|
1012
|
-
${currentLang === 'ja-JP' ? '<span class="check-icon">�?/span>' : ''}
|
|
1012
|
+
${currentLang === 'ja-JP' ? '<span class="check-icon">�?/span>' : ''}
|
|
1013
1013
|
</div>
|
|
1014
1014
|
</div>
|
|
1015
1015
|
|
|
1016
1016
|
<div class="language-card ${currentLang === 'ko-KR' ? 'selected' : ''}" data-lang="ko-KR">
|
|
1017
1017
|
<div class="language-flag">🇰🇷</div>
|
|
1018
1018
|
<div class="language-info">
|
|
1019
|
-
<h4>한국�?/h4>
|
|
1019
|
+
<h4>한국�?/h4>
|
|
1020
1020
|
<p>Korean</p>
|
|
1021
1021
|
</div>
|
|
1022
1022
|
<div class="language-check">
|
|
1023
|
-
${currentLang === 'ko-KR' ? '<span class="check-icon">�?/span>' : ''}
|
|
1023
|
+
${currentLang === 'ko-KR' ? '<span class="check-icon">�?/span>' : ''}
|
|
1024
1024
|
</div>
|
|
1025
1025
|
</div>
|
|
1026
1026
|
|
|
@@ -1031,7 +1031,7 @@ export class FeatureIntegrator {
|
|
|
1031
1031
|
<p>French</p>
|
|
1032
1032
|
</div>
|
|
1033
1033
|
<div class="language-check">
|
|
1034
|
-
${currentLang === 'fr-FR' ? '<span class="check-icon">�?/span>' : ''}
|
|
1034
|
+
${currentLang === 'fr-FR' ? '<span class="check-icon">�?/span>' : ''}
|
|
1035
1035
|
</div>
|
|
1036
1036
|
</div>
|
|
1037
1037
|
</div>
|
|
@@ -1040,13 +1040,13 @@ export class FeatureIntegrator {
|
|
|
1040
1040
|
<div class="info-icon">ℹ️</div>
|
|
1041
1041
|
<div class="info-content">
|
|
1042
1042
|
<h4>语言切换说明</h4>
|
|
1043
|
-
<p>更改语言后,页面将自动刷新以应用新的语言设置。部分内容可能需要重新加载�?/p>
|
|
1043
|
+
<p>更改语言后,页面将自动刷新以应用新的语言设置。部分内容可能需要重新加载�?/p>
|
|
1044
1044
|
</div>
|
|
1045
1045
|
</div>
|
|
1046
1046
|
|
|
1047
1047
|
<div class="settings-actions">
|
|
1048
1048
|
<button class="btn-primary-large" id="saveLanguage">
|
|
1049
|
-
<span>💾</span> 保存并应�? </button>
|
|
1049
|
+
<span>💾</span> 保存并应�? </button>
|
|
1050
1050
|
</div>
|
|
1051
1051
|
</div>
|
|
1052
1052
|
`;
|
|
@@ -1057,13 +1057,13 @@ export class FeatureIntegrator {
|
|
|
1057
1057
|
// 语言卡片点击效果
|
|
1058
1058
|
container.querySelectorAll('.language-card').forEach(card => {
|
|
1059
1059
|
card.addEventListener('click', () => {
|
|
1060
|
-
// 移除所有选中状�? container.querySelectorAll('.language-card').forEach(c => {
|
|
1060
|
+
// 移除所有选中状�? container.querySelectorAll('.language-card').forEach(c => {
|
|
1061
1061
|
c.classList.remove('selected');
|
|
1062
1062
|
c.querySelector('.language-check').innerHTML = '';
|
|
1063
1063
|
});
|
|
1064
1064
|
|
|
1065
|
-
// 添加选中状�? card.classList.add('selected');
|
|
1066
|
-
card.querySelector('.language-check').innerHTML = '<span class="check-icon">�?/span>';
|
|
1065
|
+
// 添加选中状�? card.classList.add('selected');
|
|
1066
|
+
card.querySelector('.language-check').innerHTML = '<span class="check-icon">�?/span>';
|
|
1067
1067
|
});
|
|
1068
1068
|
});
|
|
1069
1069
|
|
|
@@ -1074,12 +1074,12 @@ export class FeatureIntegrator {
|
|
|
1074
1074
|
|
|
1075
1075
|
const btn = container.querySelector('#saveLanguage');
|
|
1076
1076
|
const originalText = btn.innerHTML;
|
|
1077
|
-
btn.innerHTML = '<span>�?/span> 应用�?..';
|
|
1077
|
+
btn.innerHTML = '<span>�?/span> 应用�?..';
|
|
1078
1078
|
btn.disabled = true;
|
|
1079
1079
|
|
|
1080
1080
|
setTimeout(() => {
|
|
1081
1081
|
localStorage.setItem('language', selectedLang);
|
|
1082
|
-
btn.innerHTML = '<span>�?/span> 应用成功�?;
|
|
1082
|
+
btn.innerHTML = '<span>�?/span> 应用成功�?;
|
|
1083
1083
|
|
|
1084
1084
|
setTimeout(() => {
|
|
1085
1085
|
window.location.reload();
|
|
@@ -1089,7 +1089,7 @@ export class FeatureIntegrator {
|
|
|
1089
1089
|
}
|
|
1090
1090
|
|
|
1091
1091
|
/**
|
|
1092
|
-
* 渲染通知设置(优化后�? */
|
|
1092
|
+
* 渲染通知设置(优化后�? */
|
|
1093
1093
|
renderNotificationSettings(container) {
|
|
1094
1094
|
const settings = {
|
|
1095
1095
|
desktop: localStorage.getItem('notif_desktop') !== 'false',
|
|
@@ -1103,12 +1103,12 @@ export class FeatureIntegrator {
|
|
|
1103
1103
|
<div class="settings-header-modern">
|
|
1104
1104
|
<div class="settings-icon-large">🔔</div>
|
|
1105
1105
|
<h2>通知设置</h2>
|
|
1106
|
-
<p>管理您的通知偏好和提醒方�?/p>
|
|
1106
|
+
<p>管理您的通知偏好和提醒方�?/p>
|
|
1107
1107
|
</div>
|
|
1108
1108
|
|
|
1109
1109
|
<div class="settings-cards-container">
|
|
1110
1110
|
<div class="setting-card-detail ${settings.desktop ? 'active' : ''}">
|
|
1111
|
-
<div class="setting-card-icon">🖥�?/div>
|
|
1111
|
+
<div class="setting-card-icon">🖥�?/div>
|
|
1112
1112
|
<div class="setting-card-content">
|
|
1113
1113
|
<div class="setting-card-header">
|
|
1114
1114
|
<h4>桌面通知</h4>
|
|
@@ -1117,7 +1117,7 @@ export class FeatureIntegrator {
|
|
|
1117
1117
|
<span class="toggle-slider"></span>
|
|
1118
1118
|
</label>
|
|
1119
1119
|
</div>
|
|
1120
|
-
<p>在桌面显示新消息通知,即使浏览器在后台运�?/p>
|
|
1120
|
+
<p>在桌面显示新消息通知,即使浏览器在后台运�?/p>
|
|
1121
1121
|
</div>
|
|
1122
1122
|
</div>
|
|
1123
1123
|
|
|
@@ -1145,7 +1145,7 @@ export class FeatureIntegrator {
|
|
|
1145
1145
|
<span class="toggle-slider"></span>
|
|
1146
1146
|
</label>
|
|
1147
1147
|
</div>
|
|
1148
|
-
<p>有人@提及您时发送特别通知,确保及时回�?/p>
|
|
1148
|
+
<p>有人@提及您时发送特别通知,确保及时回�?/p>
|
|
1149
1149
|
</div>
|
|
1150
1150
|
</div>
|
|
1151
1151
|
|
|
@@ -1159,7 +1159,7 @@ export class FeatureIntegrator {
|
|
|
1159
1159
|
<span class="toggle-slider"></span>
|
|
1160
1160
|
</label>
|
|
1161
1161
|
</div>
|
|
1162
|
-
<p>收到新消息时发送通知,保持与团队的实时沟�?/p>
|
|
1162
|
+
<p>收到新消息时发送通知,保持与团队的实时沟�?/p>
|
|
1163
1163
|
</div>
|
|
1164
1164
|
</div>
|
|
1165
1165
|
</div>
|
|
@@ -1178,7 +1178,7 @@ export class FeatureIntegrator {
|
|
|
1178
1178
|
// 添加详细设置样式
|
|
1179
1179
|
this.addDetailSettingsStyles();
|
|
1180
1180
|
|
|
1181
|
-
// 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
|
|
1181
|
+
// 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
|
|
1182
1182
|
input.addEventListener('change', (e) => {
|
|
1183
1183
|
const card = e.target.closest('.setting-card-detail');
|
|
1184
1184
|
if (e.target.checked) {
|
|
@@ -1199,7 +1199,7 @@ export class FeatureIntegrator {
|
|
|
1199
1199
|
// 显示成功提示
|
|
1200
1200
|
const btn = container.querySelector('#saveNotifSettings');
|
|
1201
1201
|
const originalText = btn.innerHTML;
|
|
1202
|
-
btn.innerHTML = '<span>�?/span> 保存成功�?;
|
|
1202
|
+
btn.innerHTML = '<span>�?/span> 保存成功�?;
|
|
1203
1203
|
btn.style.background = 'linear-gradient(135deg, #10b981 0%, #059669 100%)';
|
|
1204
1204
|
|
|
1205
1205
|
setTimeout(() => {
|
|
@@ -1214,7 +1214,7 @@ export class FeatureIntegrator {
|
|
|
1214
1214
|
Notification.requestPermission().then(permission => {
|
|
1215
1215
|
if (permission === 'granted') {
|
|
1216
1216
|
new Notification('CollabDocChat', {
|
|
1217
|
-
body: '这是一条测试通知�?,
|
|
1217
|
+
body: '这是一条测试通知�?,
|
|
1218
1218
|
icon: '/favicon.ico'
|
|
1219
1219
|
});
|
|
1220
1220
|
} else {
|
|
@@ -1228,7 +1228,7 @@ export class FeatureIntegrator {
|
|
|
1228
1228
|
}
|
|
1229
1229
|
|
|
1230
1230
|
/**
|
|
1231
|
-
* 渲染AI设置(优化后�? */
|
|
1231
|
+
* 渲染AI设置(优化后�? */
|
|
1232
1232
|
renderAISettings(container) {
|
|
1233
1233
|
const aiEnabled = localStorage.getItem('ai_enabled') !== 'false';
|
|
1234
1234
|
const smartReplies = localStorage.getItem('ai_smart_replies') !== 'false';
|
|
@@ -1239,12 +1239,12 @@ export class FeatureIntegrator {
|
|
|
1239
1239
|
<div class="settings-header-modern">
|
|
1240
1240
|
<div class="settings-icon-large">🤖</div>
|
|
1241
1241
|
<h2>AI 助手设置</h2>
|
|
1242
|
-
<p>配置 AI 功能,提升您的工作效�?/p>
|
|
1242
|
+
<p>配置 AI 功能,提升您的工作效�?/p>
|
|
1243
1243
|
</div>
|
|
1244
1244
|
|
|
1245
1245
|
<div class="settings-cards-container">
|
|
1246
1246
|
<div class="setting-card-detail ${aiEnabled ? 'active' : ''}">
|
|
1247
|
-
<div class="setting-card-icon">�?/div>
|
|
1247
|
+
<div class="setting-card-icon">�?/div>
|
|
1248
1248
|
<div class="setting-card-content">
|
|
1249
1249
|
<div class="setting-card-header">
|
|
1250
1250
|
<h4>启用 AI 助手</h4>
|
|
@@ -1267,12 +1267,12 @@ export class FeatureIntegrator {
|
|
|
1267
1267
|
<span class="toggle-slider"></span>
|
|
1268
1268
|
</label>
|
|
1269
1269
|
</div>
|
|
1270
|
-
<p>根据消息内容自动生成回复建议,快速响应对�?/p>
|
|
1270
|
+
<p>根据消息内容自动生成回复建议,快速响应对�?/p>
|
|
1271
1271
|
</div>
|
|
1272
1272
|
</div>
|
|
1273
1273
|
|
|
1274
1274
|
<div class="setting-card-detail ${autoComplete ? 'active' : ''}">
|
|
1275
|
-
<div class="setting-card-icon">�?/div>
|
|
1275
|
+
<div class="setting-card-icon">�?/div>
|
|
1276
1276
|
<div class="setting-card-content">
|
|
1277
1277
|
<div class="setting-card-header">
|
|
1278
1278
|
<h4>自动完成</h4>
|
|
@@ -1287,22 +1287,22 @@ export class FeatureIntegrator {
|
|
|
1287
1287
|
</div>
|
|
1288
1288
|
|
|
1289
1289
|
<div class="ai-features-showcase">
|
|
1290
|
-
<h3>�?AI 功能展示</h3>
|
|
1290
|
+
<h3>�?AI 功能展示</h3>
|
|
1291
1291
|
<div class="features-grid">
|
|
1292
1292
|
<div class="feature-item">
|
|
1293
1293
|
<div class="feature-icon">📝</div>
|
|
1294
1294
|
<h4>智能摘要</h4>
|
|
1295
|
-
<p>自动生成会议和文档摘�?/p>
|
|
1295
|
+
<p>自动生成会议和文档摘�?/p>
|
|
1296
1296
|
</div>
|
|
1297
1297
|
<div class="feature-item">
|
|
1298
1298
|
<div class="feature-icon">🔍</div>
|
|
1299
1299
|
<h4>智能搜索</h4>
|
|
1300
|
-
<p>理解语义的智能搜�?/p>
|
|
1300
|
+
<p>理解语义的智能搜�?/p>
|
|
1301
1301
|
</div>
|
|
1302
1302
|
<div class="feature-item">
|
|
1303
1303
|
<div class="feature-icon">🎯</div>
|
|
1304
1304
|
<h4>任务建议</h4>
|
|
1305
|
-
<p>智能推荐任务优先�?/p>
|
|
1305
|
+
<p>智能推荐任务优先�?/p>
|
|
1306
1306
|
</div>
|
|
1307
1307
|
<div class="feature-item">
|
|
1308
1308
|
<div class="feature-icon">📊</div>
|
|
@@ -1329,7 +1329,7 @@ export class FeatureIntegrator {
|
|
|
1329
1329
|
// 添加详细设置样式
|
|
1330
1330
|
this.addDetailSettingsStyles();
|
|
1331
1331
|
|
|
1332
|
-
// 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
|
|
1332
|
+
// 切换开关效�? container.querySelectorAll('.toggle-switch input').forEach(input => {
|
|
1333
1333
|
input.addEventListener('change', (e) => {
|
|
1334
1334
|
const card = e.target.closest('.setting-card-detail');
|
|
1335
1335
|
if (e.target.checked) {
|
|
@@ -1348,7 +1348,7 @@ export class FeatureIntegrator {
|
|
|
1348
1348
|
|
|
1349
1349
|
const btn = container.querySelector('#saveAISettings');
|
|
1350
1350
|
const originalText = btn.innerHTML;
|
|
1351
|
-
btn.innerHTML = '<span>�?/span> 保存成功�?;
|
|
1351
|
+
btn.innerHTML = '<span>�?/span> 保存成功�?;
|
|
1352
1352
|
btn.style.background = 'linear-gradient(135deg, #10b981 0%, #059669 100%)';
|
|
1353
1353
|
|
|
1354
1354
|
setTimeout(() => {
|
|
@@ -1361,11 +1361,11 @@ export class FeatureIntegrator {
|
|
|
1361
1361
|
container.querySelector('#testAI').addEventListener('click', () => {
|
|
1362
1362
|
const btn = container.querySelector('#testAI');
|
|
1363
1363
|
const originalText = btn.innerHTML;
|
|
1364
|
-
btn.innerHTML = '<span>�?/span> 测试�?..';
|
|
1364
|
+
btn.innerHTML = '<span>�?/span> 测试�?..';
|
|
1365
1365
|
btn.disabled = true;
|
|
1366
1366
|
|
|
1367
1367
|
setTimeout(() => {
|
|
1368
|
-
btn.innerHTML = '<span>�?/span> AI 正常运行�?;
|
|
1368
|
+
btn.innerHTML = '<span>�?/span> AI 正常运行�?;
|
|
1369
1369
|
setTimeout(() => {
|
|
1370
1370
|
btn.innerHTML = originalText;
|
|
1371
1371
|
btn.disabled = false;
|
|
@@ -1410,10 +1410,10 @@ export class FeatureIntegrator {
|
|
|
1410
1410
|
🤖 AI
|
|
1411
1411
|
</button>
|
|
1412
1412
|
<button class="btn-secondary" id="showCollabTools" title="协作工具">
|
|
1413
|
-
🛠�?工具
|
|
1413
|
+
🛠�?工具
|
|
1414
1414
|
</button>
|
|
1415
|
-
<button class="btn-secondary" id="markAllRead" title="全部标记为已�?>
|
|
1416
|
-
�?已读
|
|
1415
|
+
<button class="btn-secondary" id="markAllRead" title="全部标记为已�?>
|
|
1416
|
+
�?已读
|
|
1417
1417
|
</button>
|
|
1418
1418
|
</div>
|
|
1419
1419
|
`;
|
|
@@ -1478,7 +1478,7 @@ export class FeatureIntegrator {
|
|
|
1478
1478
|
modal.innerHTML = `
|
|
1479
1479
|
<div class="modal-content" style="max-width: 1000px;">
|
|
1480
1480
|
<div class="modal-header">
|
|
1481
|
-
<h3>🛠�?协作工具</h3>
|
|
1481
|
+
<h3>🛠�?协作工具</h3>
|
|
1482
1482
|
<button class="modal-close" id="closeCollabTools">×</button>
|
|
1483
1483
|
</div>
|
|
1484
1484
|
<div class="collab-tools-tabs-modern">
|
|
@@ -1707,3 +1707,4 @@ export class FeatureIntegrator {
|
|
|
1707
1707
|
}
|
|
1708
1708
|
}
|
|
1709
1709
|
|
|
1710
|
+
|