|
48 | 48 | 更多 |
49 | 49 | </a-button> |
50 | 50 | <template #content> |
| 51 | + <a-doption value="enable-all"> |
| 52 | + <template #icon> |
| 53 | + <icon-check /> |
| 54 | + </template> |
| 55 | + 一键启用 |
| 56 | + </a-doption> |
| 57 | + <a-doption value="disable-all"> |
| 58 | + <template #icon> |
| 59 | + <icon-close /> |
| 60 | + </template> |
| 61 | + 一键停用 |
| 62 | + </a-doption> |
| 63 | + <a-divider style="margin: 4px 0;" /> |
51 | 64 | <a-doption value="load-config"> |
52 | 65 | <template #icon> |
53 | 66 | <icon-link /> |
|
150 | 163 | <div class="parser-actions"> |
151 | 164 | <a-switch |
152 | 165 | v-model="parser.enabled" |
153 | | - @change="toggleParser(parser.id)" |
| 166 | + @update:model-value="(value) => handleSwitchChange(parser.id, value)" |
154 | 167 | size="small" |
155 | 168 | /> |
156 | 169 | <a-button |
|
195 | 208 | <div class="parser-details"> |
196 | 209 | <div class="parser-url">{{ parser.url }}</div> |
197 | 210 | <div class="parser-meta"> |
198 | | - <a-tag :color="parser.type === '0' ? 'blue' : 'green'" size="small"> |
199 | | - {{ parser.type === '0' ? '嗅探' : 'Json' }} |
| 211 | + <a-tag :color="String(parser.type) === '0' ? 'blue' : 'green'" size="small"> |
| 212 | + {{ String(parser.type) === '0' ? '嗅探' : 'Json' }} |
200 | 213 | </a-tag> |
201 | 214 | <span v-if="parser.ext && parser.ext.flag" class="parser-flags"> |
202 | 215 | 支持: {{ parser.ext.flag.join(', ') }} |
@@ -454,25 +467,85 @@ const filteredParsers = computed(() => { |
454 | 467 | result = result.filter(parser => !parser.enabled) |
455 | 468 | } |
456 | 469 | |
457 | | - // 类型过滤 |
| 470 | + // 类型过滤 - 处理数字和字符串类型的兼容性 |
458 | 471 | if (filterType.value) { |
459 | | - result = result.filter(parser => parser.type === filterType.value) |
| 472 | + result = result.filter(parser => { |
| 473 | + // 将两个值都转换为字符串进行比较,确保兼容性 |
| 474 | + return String(parser.type) === String(filterType.value) |
| 475 | + }) |
460 | 476 | } |
461 | 477 | |
462 | 478 | return result |
463 | 479 | }) |
464 | 480 |
|
465 | 481 | // 监听过滤结果变化,更新拖拽数据 |
466 | 482 | watch(filteredParsers, (newFiltered) => { |
467 | | - dragParsers.value = [...newFiltered] |
| 483 | + // 只在筛选条件变化时才完全重新创建数组 |
| 484 | + // 避免在开关切换时重新创建,保持响应式绑定 |
| 485 | + if (dragParsers.value.length !== newFiltered.length || |
| 486 | + !dragParsers.value.every(item => newFiltered.some(filtered => filtered.id === item.id))) { |
| 487 | + dragParsers.value = [...newFiltered] |
| 488 | + } else { |
| 489 | + // 如果数组长度和ID都相同,只更新现有项的属性 |
| 490 | + dragParsers.value.forEach((dragItem, index) => { |
| 491 | + const filteredItem = newFiltered.find(item => item.id === dragItem.id) |
| 492 | + if (filteredItem) { |
| 493 | + Object.assign(dragItem, filteredItem) |
| 494 | + } |
| 495 | + }) |
| 496 | + } |
468 | 497 | }, { immediate: true }) |
469 | 498 |
|
| 499 | +// 监听筛选条件变化,确保筛选功能正常工作 |
| 500 | +watch([searchKeyword, filterStatus, filterType], () => { |
| 501 | + // 当筛选条件变化时,完全重新创建拖拽列表 |
| 502 | + dragParsers.value = [...filteredParsers.value] |
| 503 | +}, { immediate: false }) |
| 504 | +
|
470 | 505 | // 方法 |
471 | 506 | const toggleParser = (id) => { |
472 | 507 | parserStore.toggleParser(id) |
473 | 508 | Message.success('解析器状态已更新') |
474 | 509 | } |
475 | 510 |
|
| 511 | +const handleSwitchChange = (id, value) => { |
| 512 | + // 直接更新store中的状态,不需要切换,因为v-model已经更新了本地状态 |
| 513 | + const parser = parserStore.parsers.find(p => p.id === id) |
| 514 | + if (parser) { |
| 515 | + parser.enabled = value |
| 516 | + parserStore.saveToLocalStorage() |
| 517 | + Message.success('解析器状态已更新') |
| 518 | + } |
| 519 | +} |
| 520 | +
|
| 521 | +const enableAllParsers = () => { |
| 522 | + const count = parserStore.parsers.length |
| 523 | + if (count === 0) { |
| 524 | + Message.warning('没有可启用的解析器') |
| 525 | + return |
| 526 | + } |
| 527 | + |
| 528 | + parserStore.parsers.forEach(parser => { |
| 529 | + parser.enabled = true |
| 530 | + }) |
| 531 | + parserStore.saveToLocalStorage() |
| 532 | + Message.success(`已启用所有 ${count} 个解析器`) |
| 533 | +} |
| 534 | +
|
| 535 | +const disableAllParsers = () => { |
| 536 | + const count = parserStore.parsers.length |
| 537 | + if (count === 0) { |
| 538 | + Message.warning('没有可停用的解析器') |
| 539 | + return |
| 540 | + } |
| 541 | + |
| 542 | + parserStore.parsers.forEach(parser => { |
| 543 | + parser.enabled = false |
| 544 | + }) |
| 545 | + parserStore.saveToLocalStorage() |
| 546 | + Message.success(`已停用所有 ${count} 个解析器`) |
| 547 | +} |
| 548 | +
|
476 | 549 | const editParser = (parser) => { |
477 | 550 | editingParser.value = parser |
478 | 551 | parserForm.value = { |
@@ -672,6 +745,12 @@ const resetFromConfig = async () => { |
672 | 745 |
|
673 | 746 | const handleMoreAction = (value) => { |
674 | 747 | switch (value) { |
| 748 | + case 'enable-all': |
| 749 | + enableAllParsers() |
| 750 | + break |
| 751 | + case 'disable-all': |
| 752 | + disableAllParsers() |
| 753 | + break |
675 | 754 | case 'load-config': |
676 | 755 | showConfigDialog.value = true |
677 | 756 | break |
|
0 commit comments