|
38 | 38 | let pageSize = 5 // 每页显示5条记录 |
39 | 39 | let totalDocuments = 0 |
40 | 40 | let totalPages = 0 |
41 | | - let hasMoreDocuments = true |
42 | | - |
| 41 | +
|
43 | 42 | // 虚拟滚动配置 |
44 | 43 | const ITEM_HEIGHT = 45 // 每个文档项的高度(像素) |
45 | 44 | const MAX_VISIBLE_ITEMS = 5 // 每页显示的最大项数 |
|
79 | 78 | |
80 | 79 | // 重置分页状态 |
81 | 80 | currentPage = 0 |
82 | | - hasMoreDocuments = true |
83 | 81 | changeDetectionResult = { |
84 | 82 | newDocuments: [], |
85 | 83 | updatedDocuments: [], |
|
108 | 106 | logger.info("使用mock数据进行测试") |
109 | 107 | |
110 | 108 | // 生成mock的新文档数据 |
111 | | - const mockNewDocuments: any = Array.from({ length: 25 }, (_, i) => ({ |
| 109 | + const mockNewDocuments: any = Array.from({ length: 5 }, (_, i) => ({ |
112 | 110 | docId: `new-doc-${i + 1}`, |
113 | 111 | docTitle: `Mock 新增文档 ${i + 1} - 测试数据`, |
114 | 112 | modifiedTime: Date.now() - Math.floor(Math.random() * 1000 * 60 * 60 * 24), // 随机在过去24小时内 |
|
119 | 117 | })) |
120 | 118 | |
121 | 119 | // 生成mock的更新文档数据 |
122 | | - const mockUpdatedDocuments: any = Array.from({ length: 15 }, (_, i) => ({ |
| 120 | + const mockUpdatedDocuments: any = Array.from({ length: 3 }, (_, i) => ({ |
123 | 121 | docId: `updated-doc-${i + 1}`, |
124 | 122 | docTitle: `Mock 更新文档 ${i + 1} - 内容已修改`, |
125 | 123 | modifiedTime: Date.now() - Math.floor(Math.random() * 1000 * 60 * 60 * 24), // 随机在过去24小时内 |
|
134 | 132 | newDocuments: mockNewDocuments, |
135 | 133 | updatedDocuments: mockUpdatedDocuments, |
136 | 134 | unchangedDocuments: [], |
137 | | - blacklistedCount: 3, |
| 135 | + blacklistedCount: 0, |
138 | 136 | } |
139 | 137 | |
140 | 138 | // 更新分页信息 |
|
323 | 321 | <span>{pluginInstance.i18n.incrementalShare.loading}</span> |
324 | 322 | </div> |
325 | 323 | {:else if changeDetectionResult} |
| 324 | + {JSON.stringify(changeDetectionResult)} |
326 | 325 | <div class="share-stats"> |
327 | 326 | <div class="stat-item"> |
328 | | - <span class="stat-number">{changeDetectionResult.newDocuments.length}</span> |
| 327 | + <span class="stat-number">{changeDetectionResult.newDocuments?.length || 0}</span> |
329 | 328 | <span class="stat-label">{pluginInstance.i18n.incrementalShare.newDocuments}</span> |
330 | 329 | </div> |
331 | 330 | <div class="stat-item"> |
332 | | - <span class="stat-number">{changeDetectionResult.updatedDocuments.length}</span> |
| 331 | + <span class="stat-number">{changeDetectionResult.updatedDocuments?.length || 0}</span> |
333 | 332 | <span class="stat-label">{pluginInstance.i18n.incrementalShare.updatedDocuments}</span> |
334 | 333 | </div> |
335 | 334 | <div class="stat-item"> |
336 | | - <span class="stat-number">{changeDetectionResult.unchangedDocuments.length}</span> |
| 335 | + <span class="stat-number">{changeDetectionResult.unchangedDocuments?.length || 0}</span> |
337 | 336 | <span class="stat-label">{pluginInstance.i18n.incrementalShare.unchangedDocuments}</span> |
338 | 337 | </div> |
339 | 338 | <div class="stat-item blacklisted"> |
|
348 | 347 | <div class="group-header"> |
349 | 348 | <span class="group-title"> |
350 | 349 | {pluginInstance.i18n.incrementalShare.documentsToShare} |
351 | | - <span class="group-count">({filteredDocs.length})</span> |
| 350 | + <span class="group-count">({filteredDocs?.length || 0})</span> |
352 | 351 | </span> |
353 | | - {#if filteredDocs.length > 0} |
| 352 | + {#if (filteredDocs?.length || 0) > 0} |
354 | 353 | <label class="select-all"> |
355 | 354 | <input type="checkbox" bind:checked={selectAll} on:change={handleSelectAll} /> |
356 | 355 | {pluginInstance.i18n.incrementalShare.selectAll} |
357 | 356 | </label> |
358 | 357 | {/if} |
359 | 358 | </div> |
360 | 359 | <div class="group-content"> |
361 | | - {#if filteredDocs.length === 0} |
| 360 | + {#if (filteredDocs?.length || 0) === 0} |
362 | 361 | <div class="empty-message"> |
363 | 362 | {pluginInstance.i18n.incrementalShare.noDocumentsToShare} |
364 | 363 | </div> |
365 | 364 | {:else} |
366 | 365 | <!-- 使用虚拟滚动 --> |
367 | | - <div class="virtual-list-container" |
368 | | - style="height: {Math.min(filteredDocs.length, MAX_VISIBLE_ITEMS) * ITEM_HEIGHT}px;"> |
369 | | - <VirtualList items={filteredDocs} let:item height="{Math.min(filteredDocs.length, MAX_VISIBLE_ITEMS) * ITEM_HEIGHT}px"> |
| 366 | + <div class="virtual-list-container" |
| 367 | + style="height: {Math.min(filteredDocs?.length || 0, MAX_VISIBLE_ITEMS) * ITEM_HEIGHT}px;"> |
| 368 | + <VirtualList items={filteredDocs || []} let:item height="{Math.min(filteredDocs?.length || 0, MAX_VISIBLE_ITEMS) * ITEM_HEIGHT}px"> |
370 | 369 | <div class="document-item"> |
371 | 370 | <label class="document-checkbox"> |
372 | 371 | <input |
373 | 372 | type="checkbox" |
374 | | - checked={selectedDocs.has(item.docId)} |
| 373 | + checked={selectedDocs?.has(item.docId) || false} |
375 | 374 | on:change={() => toggleDocSelection(item.docId)} |
376 | 375 | /> |
377 | | - <span class="document-title">{item.docTitle}</span> |
| 376 | + <span class="document-title">{item.docTitle || "未命名文档"}</span> |
378 | 377 | </label> |
379 | 378 | <div class="document-meta"> |
380 | | - <span class={`document-type document-type--${item.type}`}> |
381 | | - {item.type === 'new' ? pluginInstance.i18n.incrementalShare.new : pluginInstance.i18n.incrementalShare.updated} |
| 379 | + <span class={`document-type document-type--${item.type || 'new'}`}> |
| 380 | + {item.type === 'updated' ? pluginInstance.i18n.incrementalShare.updated : pluginInstance.i18n.incrementalShare.new} |
382 | 381 | </span> |
383 | | - {#if item.shareTime} |
| 382 | + {#if item.shareTime && item.shareTime > 0} |
384 | 383 | <span class="document-time"> |
385 | 384 | {pluginInstance.i18n.incrementalShare.lastShared}: {formatTime(item.shareTime)} |
386 | 385 | </span> |
| 386 | + {:else} |
| 387 | + <span class="document-time"> |
| 388 | + {pluginInstance.i18n.incrementalShare.lastShared}: {pluginInstance.i18n.incrementalShare.neverShared} |
| 389 | + </span> |
387 | 390 | {/if} |
388 | 391 | </div> |
389 | 392 | </div> |
|
394 | 397 | </div> |
395 | 398 |
|
396 | 399 | <!-- 分页控件 --> |
397 | | - {#if totalPages > 1} |
| 400 | + {#if (totalPages || 0) > 1} |
398 | 401 | <div class="pagination-controls"> |
399 | 402 | <button |
400 | 403 | class="pagination-btn" |
|
406 | 409 | </button> |
407 | 410 |
|
408 | 411 | <div class="pagination-info"> |
409 | | - {pluginInstance.i18n.incrementalShare.page} {currentPage + 1} / {totalPages} |
| 412 | + {pluginInstance.i18n.incrementalShare.page} {(currentPage || 0) + 1} / {totalPages || 1} |
410 | 413 | </div> |
411 | 414 |
|
412 | 415 | <button |
413 | 416 | class="pagination-btn" |
414 | 417 | on:click={loadNextPage} |
415 | | - disabled={currentPage === totalPages - 1 || isLoading} |
| 418 | + disabled={currentPage === (totalPages || 1) - 1 || isLoading} |
416 | 419 | > |
417 | 420 | {pluginInstance.i18n.incrementalShare.nextPage} |
418 | 421 | {@html icons.iconChevronRight} |
|
0 commit comments