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