hf-sheet 1.0.1

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.
Files changed (75) hide show
  1. package/README.md +156 -0
  2. package/dist/hf-sheet.css +2 -0
  3. package/dist/hf-sheet.js +243 -0
  4. package/dist/hf-sheet.umd.cjs +1 -0
  5. package/dist/index.d.ts +160 -0
  6. package/dist/luckysheet/assets/iconfont/Anton-Regular.ttf +0 -0
  7. package/dist/luckysheet/assets/iconfont/HanaleiFill-Regular.ttf +0 -0
  8. package/dist/luckysheet/assets/iconfont/Pacifico-Regular.ttf +0 -0
  9. package/dist/luckysheet/assets/iconfont/demo.css +539 -0
  10. package/dist/luckysheet/assets/iconfont/demo_index.html +2700 -0
  11. package/dist/luckysheet/assets/iconfont/iconfont.css +457 -0
  12. package/dist/luckysheet/assets/iconfont/iconfont.eot +0 -0
  13. package/dist/luckysheet/assets/iconfont/iconfont.js +1 -0
  14. package/dist/luckysheet/assets/iconfont/iconfont.json +779 -0
  15. package/dist/luckysheet/assets/iconfont/iconfont.svg +356 -0
  16. package/dist/luckysheet/assets/iconfont/iconfont.ttf +0 -0
  17. package/dist/luckysheet/assets/iconfont/iconfont.woff +0 -0
  18. package/dist/luckysheet/assets/iconfont/iconfont.woff2 +0 -0
  19. package/dist/luckysheet/css/EwaAntH.gif +0 -0
  20. package/dist/luckysheet/css/EwaAntV.gif +0 -0
  21. package/dist/luckysheet/css/arrow-down.png +0 -0
  22. package/dist/luckysheet/css/loading.gif +0 -0
  23. package/dist/luckysheet/css/luckysheet.css +7998 -0
  24. package/dist/luckysheet/css/menuSprite.svg +505 -0
  25. package/dist/luckysheet/css/paint_16px.ico +0 -0
  26. package/dist/luckysheet/css/paint_24px.ico +0 -0
  27. package/dist/luckysheet/css/paint_32px.ico +0 -0
  28. package/dist/luckysheet/css/sprite38.svg +528 -0
  29. package/dist/luckysheet/css/waffle_sprite.png +0 -0
  30. package/dist/luckysheet/demoData/chat.js +410 -0
  31. package/dist/luckysheet/demoData/demoFeature.js +42 -0
  32. package/dist/luckysheet/demoData/getTargetData.js +5496 -0
  33. package/dist/luckysheet/demoData/sheetCell.js +1578 -0
  34. package/dist/luckysheet/demoData/sheetChart.js +4918 -0
  35. package/dist/luckysheet/demoData/sheetComment.js +67 -0
  36. package/dist/luckysheet/demoData/sheetConditionFormat.js +6568 -0
  37. package/dist/luckysheet/demoData/sheetDataVerification.js +579 -0
  38. package/dist/luckysheet/demoData/sheetFormula.js +6600 -0
  39. package/dist/luckysheet/demoData/sheetPicture.js +159 -0
  40. package/dist/luckysheet/demoData/sheetPivotTable.js +189 -0
  41. package/dist/luckysheet/demoData/sheetPivotTableData.js +741 -0
  42. package/dist/luckysheet/demoData/sheetSparkline.js +7066 -0
  43. package/dist/luckysheet/demoData/sheetTable.js +1068 -0
  44. package/dist/luckysheet/expendPlugins/chart/chartmix.css +1 -0
  45. package/dist/luckysheet/expendPlugins/chart/chartmix.umd.min.js +12 -0
  46. package/dist/luckysheet/expendPlugins/chart/chartmix.umd.min.js.map +1 -0
  47. package/dist/luckysheet/expendPlugins/print/print.css +46 -0
  48. package/dist/luckysheet/expendPlugins/print/print.js +0 -0
  49. package/dist/luckysheet/fonts/FontAwesome.otf +0 -0
  50. package/dist/luckysheet/fonts/fontawesome-webfont.eot +0 -0
  51. package/dist/luckysheet/fonts/fontawesome-webfont.svg +2671 -0
  52. package/dist/luckysheet/fonts/fontawesome-webfont.ttf +0 -0
  53. package/dist/luckysheet/fonts/fontawesome-webfont.woff +0 -0
  54. package/dist/luckysheet/fonts/fontawesome-webfont.woff2 +0 -0
  55. package/dist/luckysheet/index.html +1965 -0
  56. package/dist/luckysheet/luckyexcel.cjs.js +4722 -0
  57. package/dist/luckysheet/luckyexcel.esm.js +4715 -0
  58. package/dist/luckysheet/luckyexcel.umd.js +7399 -0
  59. package/dist/luckysheet/luckysheet.umd.js +4511 -0
  60. package/dist/luckysheet/luckysheet.umd.js.map +7 -0
  61. package/dist/luckysheet/plugins/css/pluginsCss.css +1 -0
  62. package/dist/luckysheet/plugins/images/CFcolorGradation.png +0 -0
  63. package/dist/luckysheet/plugins/images/CFdataBar.png +0 -0
  64. package/dist/luckysheet/plugins/images/CFicons.png +0 -0
  65. package/dist/luckysheet/plugins/images/icon_dropCell.png +0 -0
  66. package/dist/luckysheet/plugins/images/js.png +0 -0
  67. package/dist/luckysheet/plugins/images/ui-icons_444444_256x240.png +0 -0
  68. package/dist/luckysheet/plugins/images/ui-icons_555555_256x240.png +0 -0
  69. package/dist/luckysheet/plugins/images/ui-icons_777620_256x240.png +0 -0
  70. package/dist/luckysheet/plugins/images/ui-icons_777777_256x240.png +0 -0
  71. package/dist/luckysheet/plugins/images/ui-icons_cc0000_256x240.png +0 -0
  72. package/dist/luckysheet/plugins/images/ui-icons_ffffff_256x240.png +0 -0
  73. package/dist/luckysheet/plugins/js/plugin.js +1 -0
  74. package/dist/luckysheet/plugins/plugins.css +10 -0
  75. package/package.json +53 -0
@@ -0,0 +1,410 @@
1
+ export function initChat() {
2
+ if (!isNeedChat()) {
3
+ return
4
+ }
5
+
6
+ // Your CSS as text
7
+ let styles = `
8
+ body {
9
+ background-color: #f5f5f5;
10
+ }
11
+
12
+ #chat-assistant-container {
13
+ position: fixed;
14
+ right: 40px;
15
+ bottom: 86px;
16
+ z-index:9990;
17
+ }
18
+
19
+ #chat-assistant-button {
20
+ width: 50px;
21
+ height: 50px;
22
+ border-radius: 50%;
23
+ border: none;
24
+ display: flex;
25
+ justify-content: center;
26
+ align-items: center;
27
+ cursor: pointer;
28
+ background: linear-gradient(135deg, rgb(215 98 150 / 55%),rgb(34 78 139 / 71%), rgb(114 222 172));
29
+ box-shadow: 0px 0px 8px 1px rgb(0 0 0 / 22%);
30
+ color: #fff;
31
+ text-shadow: 1px 1px 3px rgb(0 0 0 / 56%);
32
+ }
33
+
34
+
35
+ #chat-container {
36
+ position: fixed;
37
+ padding: 10px;
38
+ top: 45%;
39
+ left: 50%;
40
+ z-index:9990;
41
+ transform: translate(-50%, -50%);
42
+ display: none;
43
+ border-radius: 5px;
44
+ width: 40%;
45
+ background: linear-gradient(135deg, rgb(215 98 150 / 92%),rgb(34 78 139 / 93%), rgb(114 222 172 / 94%));
46
+ box-shadow: 0px 2px 5px rgba(0, 0, 0, 0.2);
47
+ }
48
+
49
+
50
+
51
+ #chat-header {
52
+ display: flex;
53
+ align-items: center;
54
+ justify-content: space-between;
55
+ padding: 0 10px 10px 0;
56
+ border-radius: 5px 5px 0 0;
57
+ cursor: move;
58
+ }
59
+
60
+ #loading-indicator {
61
+ width: 14px;
62
+ height: 14px;
63
+ margin: 0 10px 0 10px;
64
+ border: 2px solid #ccc;
65
+ border-top-color: #4caf50;
66
+ border-radius: 50%;
67
+ animation: spin 2s linear infinite;
68
+ visibility: hidden;
69
+ }
70
+
71
+ @keyframes spin {
72
+ 0% {
73
+ transform: rotate(0deg);
74
+ }
75
+
76
+ 100% {
77
+ transform: rotate(360deg);
78
+ }
79
+ }
80
+
81
+ #chat-header .show-loading {
82
+ visibility: visible;
83
+ }
84
+
85
+ #chat-header .hide-loading {
86
+ visibility: hidden;
87
+ }
88
+
89
+
90
+ #circle-button {
91
+ padding: 0;
92
+ border: none;
93
+ background-color: transparent;
94
+ font-size: 16px;
95
+ user-select: none;
96
+ display: flex;
97
+ align-items: center;
98
+ color: #fff;
99
+ text-shadow: 1px 1px 3px black;
100
+ }
101
+
102
+ #close-button {
103
+ cursor: pointer;
104
+ padding: 0;
105
+ border: none;
106
+ background-color: transparent;
107
+ font-size: 24px;
108
+ color: #fff;
109
+ text-shadow: 1px 1px 3px black;
110
+ }
111
+ #send-button {
112
+ cursor: pointer;
113
+ padding: 0;
114
+ border: none;
115
+ background-color: transparent;
116
+ font-size: 16px;
117
+ }
118
+
119
+ #close-button:hover,
120
+ #send-button:hover {
121
+ color: #888;
122
+ }
123
+
124
+ #chat-input-container,
125
+ #chat-input {
126
+ border: none;
127
+ }
128
+
129
+ #chat-input-container {
130
+ display: flex;
131
+ align-items: center;
132
+ border-radius: 5px;
133
+ background-color: #fff;
134
+ padding: 10px;
135
+ }
136
+
137
+ #chat-input {
138
+ flex: 1;
139
+ padding: 0;
140
+ margin-right: 5px;
141
+ border-radius: 5px;
142
+ overflow-y: auto;
143
+ height: 24px;
144
+ font-size: 1rem;
145
+ outline: none;
146
+ resize: none;
147
+ background: transparent;
148
+ }
149
+
150
+ #send-button {
151
+ background-color: transparent;
152
+ border: none;
153
+ border-radius: 5px;
154
+ cursor: pointer;
155
+ padding: 5px;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ height: 32px;
160
+ width: 32px;
161
+ }
162
+
163
+ #send-button>span {
164
+ height: 16px;
165
+ width: 16px;
166
+ }
167
+
168
+ #send-button:enabled {
169
+ background-color: rgb(120,198,174);
170
+ }
171
+
172
+ #send-button:enabled svg path {
173
+ fill: #fff;
174
+ }
175
+ `
176
+
177
+ let styleSheet = document.createElement("style")
178
+ styleSheet.innerText = styles
179
+ document.head.appendChild(styleSheet)
180
+
181
+
182
+ const html = `<div id="chat-assistant-container">
183
+ <button id="chat-assistant-button">🤖AI</button>
184
+ </div>
185
+
186
+ <div id="chat-container">
187
+ <div id="chat-header">
188
+ <span id="circle-button">Univer AI 助手<div id="loading-indicator"></div></span>
189
+
190
+ <button id="close-button">×</button>
191
+ </div>
192
+ <div id="chat-input-container">
193
+ <textarea id="chat-input" placeholder="请输入问题"></textarea>
194
+ <!-- <textarea id="chat-input" placeholder="请输入问题"></textarea> -->
195
+ <button id="send-button" disabled>
196
+ <span><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="none" class="h-4 w-4 m-1 md:m-0"
197
+ stroke-width="2">
198
+ <path
199
+ d="M.5 1.163A1 1 0 0 1 1.97.28l12.868 6.837a1 1 0 0 1 0 1.766L1.969 15.72A1 1 0 0 1 .5 14.836V10.33a1 1 0 0 1 .816-.983L8.5 8 1.316 6.653A1 1 0 0 1 .5 5.67V1.163Z"
200
+ fill="currentColor"></path>
201
+ </svg></span>
202
+ </button>
203
+ </div>
204
+
205
+ </div>`;
206
+ document.body.insertAdjacentHTML('beforeend', html)
207
+
208
+
209
+ const assistantButton = document.getElementById('chat-assistant-button');
210
+ const chatContainer = document.getElementById('chat-container');
211
+ const closeButton = document.getElementById('close-button');
212
+ const chatInput = document.getElementById('chat-input');
213
+ const sendButton = document.getElementById('send-button');
214
+ const loadingIndicator = document.getElementById('loading-indicator');
215
+
216
+ assistantButton.addEventListener('click', function () {
217
+ chatContainer.style.display = 'block';
218
+ });
219
+
220
+ closeButton.addEventListener('click', function () {
221
+ chatContainer.style.display = 'none';
222
+ });
223
+
224
+ sendButton.addEventListener('click', function () {
225
+ const message = chatInput.value;
226
+ if (message.trim() !== '') {
227
+ // 处理发送消息的逻辑
228
+
229
+ chatInput.value = '';
230
+ resetButton(chatInput)
231
+
232
+ // 显示 Loading
233
+ loadingIndicator.classList.add('show-loading');
234
+ setTimeout(() => {
235
+ setFormuala(message);
236
+ // 隐藏 Loading
237
+ loadingIndicator.classList.remove('show-loading');
238
+ }, 1000);
239
+ }
240
+
241
+
242
+ });
243
+
244
+ chatInput.addEventListener('input', function () {
245
+ inputHandler(this)
246
+ });
247
+
248
+ function inputHandler(input) {
249
+ if (input.scrollHeight > 24) {
250
+ input.style.height = 'auto'
251
+ }
252
+ input.style.height = input.scrollHeight + 'px'; // 根据内容高度设置 textarea 高度
253
+ if (input.scrollHeight > 200) {
254
+ input.style.overflowY = 'scroll'
255
+ } else {
256
+ input.style.overflowY = 'hidden'
257
+ }
258
+
259
+ resetButton(input)
260
+
261
+ }
262
+
263
+ function resetButton(input) {
264
+ if (input.value.trim() !== '') {
265
+ sendButton.disabled = false;
266
+ sendButton.classList.add('enabled');
267
+ } else {
268
+ input.style.height = '24px'; // 重置高度为一行
269
+ sendButton.disabled = true;
270
+ sendButton.classList.remove('enabled');
271
+ }
272
+ }
273
+
274
+ // 快捷键
275
+ let isComposing = false;
276
+
277
+ chatInput.addEventListener('compositionstart', function () {
278
+ isComposing = true;
279
+ });
280
+
281
+ chatInput.addEventListener('compositionend', function () {
282
+ isComposing = false;
283
+ });
284
+
285
+ chatInput.addEventListener('keydown', function (event) {
286
+ const isWindows = navigator.platform.includes('Win');
287
+ const isMac = navigator.platform.includes('Mac');
288
+
289
+ const key = event.key;
290
+
291
+ if (isWindows && event.key === 'Enter' && !isComposing && !event.altKey) {
292
+ // Windows 上的 Enter 键触发发送
293
+ event.preventDefault();
294
+ sendButton.click();
295
+ } else if (isWindows && event.key === 'Enter' && !isComposing && event.altKey) {
296
+ // Windows 上的 Alt+Enter 键触发换行
297
+ event.preventDefault();
298
+ this.value += '\n';
299
+ } else if (isMac && event.key === 'Enter' && !isComposing && !event.metaKey) {
300
+ // Mac 上的 Enter 键触发发送
301
+ event.preventDefault();
302
+ sendButton.click();
303
+ } else if (isMac && event.key === 'Enter' && !isComposing && event.metaKey) {
304
+ // Mac 上的 Command+Enter 键触发换行
305
+ event.preventDefault();
306
+ this.value += '\n';
307
+ } else if (!isComposing && (key === "Backspace" || key === "Delete")) {
308
+
309
+ }
310
+
311
+ inputHandler(this)
312
+ });
313
+
314
+
315
+ // 添加拖拽功能
316
+ let isDragging = false;
317
+ let offset = { x: 0, y: 0 };
318
+
319
+ const chatHeader = document.getElementById('chat-header');
320
+
321
+ chatHeader.addEventListener('mousedown', function (event) {
322
+ isDragging = true;
323
+ offset.x = event.clientX - chatContainer.offsetLeft;
324
+ offset.y = event.clientY - chatContainer.offsetTop;
325
+ });
326
+
327
+ document.addEventListener('mousemove', function (event) {
328
+ if (isDragging) {
329
+ chatContainer.style.left = `${event.clientX - offset.x}px`;
330
+ chatContainer.style.top = `${event.clientY - offset.y}px`;
331
+ }
332
+ });
333
+
334
+ document.addEventListener('mouseup', function () {
335
+ isDragging = false;
336
+ });
337
+ }
338
+
339
+ const needChatHosts = [
340
+ 'crm.lashuju.com',
341
+ 'localhost:3000'
342
+ ]
343
+ function isNeedChat() {
344
+ const host = location.host;
345
+ if (needChatHosts.includes(host)) {
346
+ return true
347
+ }
348
+
349
+ return false
350
+ }
351
+
352
+
353
+ function setFormuala(sentence = '') {
354
+
355
+ let link = getLink(sentence)
356
+
357
+ if (link !== '') {
358
+ setGET_AIRTABLE(link)
359
+ } else {
360
+ setASK_AI(sentence)
361
+ }
362
+
363
+ }
364
+
365
+ function setASK_AI(sentence = '') {
366
+
367
+ let range = getRange(sentence);
368
+
369
+ range = range === '' ? '' : ',' + range
370
+ const data = [
371
+ [
372
+ {
373
+ "f": "=ASK_AI(\"" + sentence + "\"" + range + ")"
374
+ }
375
+ ]
376
+ ]
377
+ luckysheet.setRangeValue(data)
378
+ }
379
+
380
+ function setGET_AIRTABLE(link) {
381
+ const data = [
382
+ [
383
+ {
384
+ "f": "=GET_AIRTABLE_DATA(\"" + link + "\")"
385
+ }
386
+ ]
387
+ ]
388
+ luckysheet.setRangeValue(data)
389
+ }
390
+
391
+ function getLink(sentence = '') {
392
+ const regex = /(https?:\/\/(?:www\.)?airtable\.com\/\S+)/gi;
393
+ const matches = sentence.match(regex);
394
+
395
+ if (matches) {
396
+ return matches[0];
397
+ }
398
+
399
+ return ''
400
+
401
+ }
402
+
403
+ function getRange(text) {
404
+ const regex = /([A-Z]+[0-9]*):([A-Z]+[0-9]*)/g;
405
+ const matche = text.match(regex);
406
+ if (matche) {
407
+ return matche[0]
408
+ }
409
+ return ''
410
+ }
@@ -0,0 +1,42 @@
1
+
2
+ // Features specially written for demo
3
+
4
+ (function () {
5
+
6
+ // language
7
+ function language(params) {
8
+
9
+ var lang = navigator.language || navigator.userLanguage;//常规浏览器语言和IE浏览器
10
+ lang = lang.substr(0, 2);//截取lang前2位字符
11
+
12
+ return lang;
13
+
14
+ }
15
+ // Tencent Forum Link Button
16
+ function supportButton() {
17
+ const text = language() === 'zh' ? '反馈' : 'Forum';
18
+ const link = language() === 'zh' ? 'https://support.qq.com/product/288322' : 'https://groups.google.com/g/luckysheet';
19
+
20
+ document.querySelector("body").insertAdjacentHTML('beforeend', '<a id="container" href="' + link + '" target="_blank" style="z-index:2;width:50px;height:50px;line-height:50px;position:fixed;right:40px;bottom:86px;border-radius:50px;cursor:pointer;background:rgb(71,133,249);color:#fff;text-align:center;text-decoration:none;font-size: 12px;">' + text + '</a>');
21
+ }
22
+
23
+ supportButton()
24
+
25
+ /**
26
+ * Get url parameters
27
+ */
28
+ function getRequest() {
29
+ var vars = {};
30
+ var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi,
31
+ function (m, key, value) {
32
+ vars[key] = value;
33
+ });
34
+ return vars;
35
+ }
36
+
37
+ window.luckysheetDemoUtil = {
38
+ language: language,
39
+ getRequest: getRequest
40
+ }
41
+
42
+ })()