Просмотр исходного кода

fix(settings): the webhook endpoint list shows the endpoints that exist

maziggy 1 неделя назад
Родитель
Сommit
132dcbde06
94 измененных файлов с 136 добавлено и 84 удалено
  1. 1 0
      CHANGELOG.md
  2. 53 0
      backend/tests/unit/test_webhook_endpoint_list.py
  3. 4 4
      frontend/src/i18n/locales/de.ts
  4. 4 4
      frontend/src/i18n/locales/en.ts
  5. 4 4
      frontend/src/i18n/locales/es.ts
  6. 4 4
      frontend/src/i18n/locales/fr.ts
  7. 4 4
      frontend/src/i18n/locales/it.ts
  8. 4 4
      frontend/src/i18n/locales/ja.ts
  9. 5 5
      frontend/src/i18n/locales/ko.ts
  10. 4 4
      frontend/src/i18n/locales/nl.ts
  11. 4 4
      frontend/src/i18n/locales/pt-BR.ts
  12. 4 4
      frontend/src/i18n/locales/ru.ts
  13. 4 4
      frontend/src/i18n/locales/sv.ts
  14. 4 4
      frontend/src/i18n/locales/tr.ts
  15. 4 4
      frontend/src/i18n/locales/uk.ts
  16. 4 4
      frontend/src/i18n/locales/zh-CN.ts
  17. 4 4
      frontend/src/i18n/locales/zh-TW.ts
  18. 18 18
      frontend/src/pages/SettingsPage.tsx
  19. 0 0
      static/assets/AdditionalSection-BzVsRoKp.js
  20. 0 0
      static/assets/AmsUnitCard-DKZuOvjp.js
  21. 0 0
      static/assets/ArchivesPage-DroU8hxv.js
  22. 0 0
      static/assets/AssignToAmsModal-CpJbG9lU.js
  23. 0 0
      static/assets/CamWallPage-DtvuR41_.js
  24. 0 0
      static/assets/CameraDiagnoseModal-CZpj2hGw.js
  25. 0 0
      static/assets/CameraPage-BCe5mvxd.js
  26. 0 0
      static/assets/CameraWall-Cl0wElj3.js
  27. 0 0
      static/assets/ColumnConfigModal-FvLpl7kb.js
  28. 0 0
      static/assets/ConfigureAmsSlotModal-DhYzN3la.js
  29. 0 0
      static/assets/ConnectAuthorizePage-DM7WX4Fk.js
  30. 0 0
      static/assets/ContextMenu-BM_aaGkd.js
  31. 0 0
      static/assets/ExternalLinkPage-CK4xYzrj.js
  32. 0 1
      static/assets/FileManagerPage-qb_-bRxQ.js
  33. 0 0
      static/assets/FileUploadModal-DX9Tkc5e.js
  34. 0 0
      static/assets/FinancePage-C7L1sCfN.js
  35. 0 0
      static/assets/GCodeViewerPage-CTHEh7Wc.js
  36. 0 0
      static/assets/GroupEditPage-BzjCZXa4.js
  37. 0 0
      static/assets/ImagePreviewModal-U5UQWMbs.js
  38. 0 0
      static/assets/InventoryPage-DUA4AOO0.js
  39. 0 0
      static/assets/LibraryTrashPage-kWy1DWJE.js
  40. 0 0
      static/assets/LoginPage-CUNvvF06.js
  41. 0 0
      static/assets/MaintenancePage-DEVEECUl.js
  42. 0 0
      static/assets/ModelSourcesPage-ltGu84-x.js
  43. 0 0
      static/assets/NotificationsPage-WWEH2fAP.js
  44. 0 1
      static/assets/PdfPreviewModal-BVs-ZSx5.js
  45. 0 0
      static/assets/PhotoGalleryModal-CGD8WLdQ.js
  46. 0 0
      static/assets/PrinterLocationsPage-CdLtaKoC.js
  47. 0 0
      static/assets/PrintersPage-DZKYgf1A.js
  48. 0 0
      static/assets/ProfilesPage-WrqcQGhq.js
  49. 0 0
      static/assets/ProjectDetailPage-DckcyUtF.js
  50. 0 0
      static/assets/ProjectsPage-B4LKxsW5.js
  51. 0 0
      static/assets/QueuePage-C5waMiM-.js
  52. 0 0
      static/assets/RichTextEditor-nFwWNdVx.js
  53. 0 0
      static/assets/SettingsPage-BtX9J3wO.js
  54. 0 0
      static/assets/SetupPage-CJy6fhXu.js
  55. 0 0
      static/assets/SliceModal-DfVKzJhK.js
  56. 0 0
      static/assets/SpoolBuddyAmsPage-CGkdiFGG.js
  57. 0 0
      static/assets/SpoolBuddyCalibrationPage-MluBOMtR.js
  58. 0 0
      static/assets/SpoolBuddyDashboard-A6q5rOXM.js
  59. 0 0
      static/assets/SpoolBuddyInventoryPage-CnkBMhrP.js
  60. 1 1
      static/assets/SpoolBuddySettingsPage-DUtf5GHW.js
  61. 0 0
      static/assets/SpoolBuddyWriteTagPage-Cqq-vrR6.js
  62. 0 0
      static/assets/SpreadsheetPreviewModal-66d2cAP5.js
  63. 0 0
      static/assets/StatsPage-CCiI6IBk.js
  64. 0 0
      static/assets/StreamOverlayPage-DcRYQPlF.js
  65. 0 0
      static/assets/SystemInfoPage-CiD365bn.js
  66. 0 0
      static/assets/de-BfSmrO1D.js
  67. 0 0
      static/assets/es-CRlbEMPu.js
  68. 0 0
      static/assets/es-Dn92fmS9.js
  69. 0 0
      static/assets/fr-CvEzyKAc.js
  70. 0 0
      static/assets/fr-sItnTtep.js
  71. 0 0
      static/assets/index-Bxt0-gCC.js
  72. 1 1
      static/assets/inventorySearch-DY7qW1VE.js
  73. 0 0
      static/assets/it-DEhaofNm.js
  74. 0 0
      static/assets/ja-BxKx1wzl.js
  75. 0 0
      static/assets/ja-kqRtnJd1.js
  76. 0 0
      static/assets/ko-B0A-ZkcE.js
  77. 0 0
      static/assets/ko-CQEHoFgd.js
  78. 0 0
      static/assets/locationSensorDefaults-B-kfKB90.js
  79. 0 0
      static/assets/nl-C8XTrLkN.js
  80. 0 0
      static/assets/nl-CkXxNW_2.js
  81. 0 0
      static/assets/pdf-qF0BMKce.js
  82. 0 0
      static/assets/pt-BR-BWeofhYg.js
  83. 0 0
      static/assets/pt-BR-DnFDJh0V.js
  84. 0 0
      static/assets/ru-BFXObj6m.js
  85. 0 0
      static/assets/sv-CHlBzjBa.js
  86. 0 0
      static/assets/sv-Dw4u8Ujt.js
  87. 0 0
      static/assets/tr-Bgj-JQWk.js
  88. 0 0
      static/assets/uk-CszKWsI6.js
  89. 0 0
      static/assets/utils-CWsHJrpF.js
  90. 0 0
      static/assets/zh-CN-D_oie5vG.js
  91. 0 0
      static/assets/zh-CN-GWb1sFwd.js
  92. 0 0
      static/assets/zh-TW-BfrMVAcn.js
  93. 0 0
      static/assets/zh-TW-DeeUO0bT.js
  94. 1 1
      static/index.html

+ 1 - 0
CHANGELOG.md

@@ -161,6 +161,7 @@ All notable changes to Bambuddy will be documented in this file.
 - **The frontend build no longer warns about `path` and `crypto` being externalized for the STEP previewer (#2976)** — `occt-import-js`, the Emscripten build behind STEP previews, requires both modules, but only inside its `ENVIRONMENT_IS_NODE` branches; in the browser it loads its `.wasm` from the URL the preview worker passes and draws randomness from `crypto.getRandomValues`. Vite still externalized both and printed two warnings on every build. `vite.config.ts` now drops exactly those two warnings for that one package through `build.rolldownOptions.onLog`, so an externalization anywhere else, or of any other module, still shows.
 - **The frontend build no longer warns about `path` and `crypto` being externalized for the STEP previewer (#2976)** — `occt-import-js`, the Emscripten build behind STEP previews, requires both modules, but only inside its `ENVIRONMENT_IS_NODE` branches; in the browser it loads its `.wasm` from the URL the preview worker passes and draws randomness from `crypto.getRandomValues`. Vite still externalized both and printed two warnings on every build. `vite.config.ts` now drops exactly those two warnings for that one package through `build.rolldownOptions.onLog`, so an externalization anywhere else, or of any other module, still shows.
 
 
 ### Fixed
 ### Fixed
+- **The webhook endpoints listed in Settings didn't exist** — **Settings → API Keys → Webhook Endpoints** listed endpoints for the status of all printers, pausing and resuming that Bambuddy doesn't have, and two others under the wrong path. It now lists the real ones: add to the queue, start the next queued job, stop, cancel, printer status and queue status. Wiki updated.
 - **A valid API key could be refused as invalid during a brief database problem** — When checking an API key hit a database error (a busy database, or saving the key's last-used time while it was locked), the request was answered "Invalid API key", so integrations such as Home Assistant or scripts were told their key was wrong. It now answers "Authentication service temporarily unavailable" (503), which a client can retry, and the error is logged. A wrong or expired key is refused as before.
 - **A valid API key could be refused as invalid during a brief database problem** — When checking an API key hit a database error (a busy database, or saving the key's last-used time while it was locked), the request was answered "Invalid API key", so integrations such as Home Assistant or scripts were told their key was wrong. It now answers "Authentication service temporarily unavailable" (503), which a client can retry, and the error is logged. A wrong or expired key is refused as before.
 - **Errors were reported as "Authentication service temporarily unavailable" with login switched off** — Without authentication, any unexpected error in Bambuddy answered 503 "Authentication service temporarily unavailable", and the log blamed the authentication check, which sent troubleshooting the wrong way. Such errors are now reported as the internal error they are (500), and the error with its details now lands in `bambuddy.log` (and so in support packages), whether login is on or off. The protection that refuses requests when Bambuddy can't tell whether login is on stays as it was.
 - **Errors were reported as "Authentication service temporarily unavailable" with login switched off** — Without authentication, any unexpected error in Bambuddy answered 503 "Authentication service temporarily unavailable", and the log blamed the authentication check, which sent troubleshooting the wrong way. Such errors are now reported as the internal error they are (500), and the error with its details now lands in `bambuddy.log` (and so in support packages), whether login is on or off. The protection that refuses requests when Bambuddy can't tell whether login is on stays as it was.
   - **With login on, a brief database hiccup no longer signs you out:** while checking a sign-in, a database error answered "Invalid token", and the web interface took that as final, signed the user out and forgot the sign-in. It now answers "Authentication service temporarily unavailable", which the interface retries, and the error is logged.
   - **With login on, a brief database hiccup no longer signs you out:** while checking a sign-in, a database error answered "Invalid token", and the web interface took that as final, signed the user out and forgot the sign-in. It now answers "Authentication service temporarily unavailable", which the interface retries, and the error is logged.

+ 53 - 0
backend/tests/unit/test_webhook_endpoint_list.py

@@ -0,0 +1,53 @@
+"""The webhook endpoints listed in Settings are the ones that exist.
+
+The "Webhook Endpoints" card on the API keys settings page is the only place
+the UI tells an integrator what to call. It had drifted: it listed endpoints
+that never existed (status of all printers, pause, resume), gave two wrong
+paths, and left out start, cancel and the queue status. This compares the card
+with the webhook router, both ways.
+"""
+
+import re
+from pathlib import Path
+
+from backend.app.api.routes.webhook import router
+from backend.app.core.config import settings
+
+SETTINGS_PAGE = Path(__file__).resolve().parents[3] / "frontend" / "src" / "pages" / "SettingsPage.tsx"
+
+# <span ...>POST</span>{' '}
+# <span className="text-white">/api/v1/webhook/printer/:id/stop</span>
+_LISTED = re.compile(
+    r">(GET|POST|PUT|PATCH|DELETE)</span>\{' '\}\s*<span className=\"text-white\">(/api/v1/webhook/[^<\s]+)</span>"
+)
+
+
+def _listed() -> set[tuple[str, str]]:
+    return {(method, path) for method, path in _LISTED.findall(SETTINGS_PAGE.read_text(encoding="utf-8"))}
+
+
+def _routed() -> set[tuple[str, str]]:
+    found = set()
+    for route in router.routes:
+        path = settings.api_prefix + re.sub(r"\{[^}]+\}", ":id", route.path)
+        for method in route.methods - {"HEAD", "OPTIONS"}:
+            found.add((method, path))
+    return found
+
+
+def test_every_webhook_path_on_the_page_is_read_by_this_test():
+    """Otherwise an entry written in other markup would escape the comparison."""
+    text = SETTINGS_PAGE.read_text(encoding="utf-8")
+    occurrences = len(re.findall(r"/api/v1/webhook/", text))
+    parsed = len(_LISTED.findall(text))
+    assert occurrences == parsed, (
+        f"{occurrences} webhook paths in SettingsPage.tsx but only {parsed} in the expected markup; "
+        "write new entries like the existing ones (or extend _LISTED)"
+    )
+
+
+def test_the_settings_card_lists_exactly_the_webhook_routes():
+    listed, routed = _listed(), _routed()
+    assert listed, "no webhook endpoints found on the settings card; has its markup changed?"
+    assert listed - routed == set(), f"listed in Settings but no such route: {sorted(listed - routed)}"
+    assert routed - listed == set(), f"webhook route missing from the Settings card: {sorted(routed - listed)}"

+ 4 - 4
frontend/src/i18n/locales/de.ts

@@ -2412,12 +2412,12 @@ export default {
     webhookEndpoints: 'Webhook-Endpunkte',
     webhookEndpoints: 'Webhook-Endpunkte',
     webhookApiKeyHint: 'Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.',
     webhookApiKeyHint: 'Verwenden Sie Ihren API-Schlüssel im X-API-Key-Header.',
     webhook: {
     webhook: {
-      getAllStatus: 'Alle Druckerstatus abrufen',
-      getSpecificStatus: 'Spezifischen Druckerstatus abrufen',
       addToQueue: 'Zur Druckwarteschlange hinzufügen',
       addToQueue: 'Zur Druckwarteschlange hinzufügen',
-      pausePrint: 'Druck pausieren',
-      resumePrint: 'Druck fortsetzen',
+      startNext: 'Nächsten Auftrag in der Warteschlange starten',
       stopPrint: 'Druck stoppen',
       stopPrint: 'Druck stoppen',
+      cancelPrint: 'Druck abbrechen',
+      getSpecificStatus: 'Spezifischen Druckerstatus abrufen',
+      queueStatus: 'Warteschlangenstatus abrufen',
     },
     },
     apiBrowser: 'API-Browser',
     apiBrowser: 'API-Browser',
     apiBrowserDescription: 'Erkunden und testen Sie alle verfügbaren API-Endpunkte.',
     apiBrowserDescription: 'Erkunden und testen Sie alle verfügbaren API-Endpunkte.',

+ 4 - 4
frontend/src/i18n/locales/en.ts

@@ -2434,12 +2434,12 @@ export default {
     webhookEndpoints: 'Webhook Endpoints',
     webhookEndpoints: 'Webhook Endpoints',
     webhookApiKeyHint: 'Use your API key in the X-API-Key header.',
     webhookApiKeyHint: 'Use your API key in the X-API-Key header.',
     webhook: {
     webhook: {
-      getAllStatus: 'Get all printer status',
-      getSpecificStatus: 'Get specific printer status',
       addToQueue: 'Add to print queue',
       addToQueue: 'Add to print queue',
-      pausePrint: 'Pause print',
-      resumePrint: 'Resume print',
+      startNext: 'Start the next queued job',
       stopPrint: 'Stop print',
       stopPrint: 'Stop print',
+      cancelPrint: 'Cancel print',
+      getSpecificStatus: 'Get specific printer status',
+      queueStatus: 'Get queue status',
     },
     },
     apiBrowser: 'API Browser',
     apiBrowser: 'API Browser',
     apiBrowserDescription: 'Explore and test all available API endpoints.',
     apiBrowserDescription: 'Explore and test all available API endpoints.',

+ 4 - 4
frontend/src/i18n/locales/es.ts

@@ -2415,12 +2415,12 @@ export default {
     webhookEndpoints: 'Puntos de conexión de webhook',
     webhookEndpoints: 'Puntos de conexión de webhook',
     webhookApiKeyHint: 'Use su clave API en la cabecera X-API-Key.',
     webhookApiKeyHint: 'Use su clave API en la cabecera X-API-Key.',
     webhook: {
     webhook: {
-      getAllStatus: 'Obtener el estado de todas las impresoras',
-      getSpecificStatus: 'Obtener el estado de una impresora concreta',
       addToQueue: 'Añadir a la cola de impresión',
       addToQueue: 'Añadir a la cola de impresión',
-      pausePrint: 'Pausar impresión',
-      resumePrint: 'Reanudar impresión',
+      startNext: 'Iniciar el siguiente trabajo en cola',
       stopPrint: 'Detener impresión',
       stopPrint: 'Detener impresión',
+      cancelPrint: 'Cancelar impresión',
+      getSpecificStatus: 'Obtener el estado de una impresora concreta',
+      queueStatus: 'Obtener el estado de la cola',
     },
     },
     apiBrowser: 'Explorador de API',
     apiBrowser: 'Explorador de API',
     apiBrowserDescription: 'Explore y pruebe todos los puntos de conexión de API disponibles.',
     apiBrowserDescription: 'Explore y pruebe todos los puntos de conexión de API disponibles.',

+ 4 - 4
frontend/src/i18n/locales/fr.ts

@@ -2367,12 +2367,12 @@ export default {
     webhookEndpoints: 'Points de terminaison Webhook',
     webhookEndpoints: 'Points de terminaison Webhook',
     webhookApiKeyHint: 'Utilisez la clé dans l\'en-tête X-API-Key.',
     webhookApiKeyHint: 'Utilisez la clé dans l\'en-tête X-API-Key.',
     webhook: {
     webhook: {
-      getAllStatus: 'Tous les statuts',
-      getSpecificStatus: 'Statut spécifique',
       addToQueue: 'Ajouter à la file',
       addToQueue: 'Ajouter à la file',
-      pausePrint: 'Pause',
-      resumePrint: 'Reprise',
+      startNext: 'Lancer la tâche suivante',
       stopPrint: 'Arrêt',
       stopPrint: 'Arrêt',
+      cancelPrint: 'Annuler l\'impression',
+      getSpecificStatus: 'Statut spécifique',
+      queueStatus: 'Statut de la file',
     },
     },
     apiBrowser: 'Explorateur API',
     apiBrowser: 'Explorateur API',
     apiBrowserDescription: 'Testez les endpoints API.',
     apiBrowserDescription: 'Testez les endpoints API.',

+ 4 - 4
frontend/src/i18n/locales/it.ts

@@ -2367,12 +2367,12 @@ export default {
     webhookEndpoints: 'Endpoint webhook',
     webhookEndpoints: 'Endpoint webhook',
     webhookApiKeyHint: 'Usa la tua chiave API nell\'header X-API-Key.',
     webhookApiKeyHint: 'Usa la tua chiave API nell\'header X-API-Key.',
     webhook: {
     webhook: {
-      getAllStatus: 'Ottieni stato di tutte le stampanti',
-      getSpecificStatus: 'Ottieni stato di una stampante',
       addToQueue: 'Aggiungi alla coda di stampa',
       addToQueue: 'Aggiungi alla coda di stampa',
-      pausePrint: 'Metti in pausa stampa',
-      resumePrint: 'Riprendi stampa',
+      startNext: 'Avvia il prossimo lavoro in coda',
       stopPrint: 'Ferma stampa',
       stopPrint: 'Ferma stampa',
+      cancelPrint: 'Annulla stampa',
+      getSpecificStatus: 'Ottieni stato di una stampante',
+      queueStatus: 'Ottieni lo stato della coda',
     },
     },
     apiBrowser: 'Browser API',
     apiBrowser: 'Browser API',
     apiBrowserDescription: 'Esplora e testa tutti gli endpoint API disponibili.',
     apiBrowserDescription: 'Esplora e testa tutti gli endpoint API disponibili.',

+ 4 - 4
frontend/src/i18n/locales/ja.ts

@@ -2411,12 +2411,12 @@ export default {
     webhookEndpoints: 'Webhookエンドポイント',
     webhookEndpoints: 'Webhookエンドポイント',
     webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。',
     webhookApiKeyHint: 'X-API-KeyヘッダーでAPIキーを使用してください。',
     webhook: {
     webhook: {
-      getAllStatus: '全プリンターステータスを取得',
-      getSpecificStatus: '特定のプリンターステータスを取得',
       addToQueue: '印刷キューに追加',
       addToQueue: '印刷キューに追加',
-      pausePrint: '印刷を一時停止',
-      resumePrint: '印刷を再開',
+      startNext: 'キュー内の次のジョブを開始',
       stopPrint: '印刷を停止',
       stopPrint: '印刷を停止',
+      cancelPrint: '印刷をキャンセル',
+      getSpecificStatus: '特定のプリンターステータスを取得',
+      queueStatus: 'キューの状態を取得',
     },
     },
     apiBrowser: 'APIブラウザ',
     apiBrowser: 'APIブラウザ',
     apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。',
     apiBrowserDescription: 'すべての利用可能なAPIエンドポイントを探索してテストします。',

+ 5 - 5
frontend/src/i18n/locales/ko.ts

@@ -2289,12 +2289,12 @@ export default {
     webhookEndpoints: '웹훅 엔드포인트',
     webhookEndpoints: '웹훅 엔드포인트',
     webhookApiKeyHint: 'X-API-Key 헤더에 API 키를 사용하세요.',
     webhookApiKeyHint: 'X-API-Key 헤더에 API 키를 사용하세요.',
     webhook: {
     webhook: {
-      getAllStatus: '모든 프린터 상태 가져오기',
-      getSpecificStatus: '특정 프린터 상태 가져오기',
       addToQueue: '인쇄 대기열에 추가',
       addToQueue: '인쇄 대기열에 추가',
-      pausePrint: '인쇄 일시정지',
-      resumePrint: '인쇄 재개',
-      stopPrint: '인쇄 정지'
+      startNext: '대기열의 다음 작업 시작',
+      stopPrint: '인쇄 정지',
+      cancelPrint: '인쇄 취소',
+      getSpecificStatus: '특정 프린터 상태 가져오기',
+      queueStatus: '대기열 상태 가져오기',
     },
     },
     apiBrowser: 'API 브라우저',
     apiBrowser: 'API 브라우저',
     apiBrowserDescription: '사용 가능한 모든 API 엔드포인트를 탐색하고 테스트하세요.',
     apiBrowserDescription: '사용 가능한 모든 API 엔드포인트를 탐색하고 테스트하세요.',

+ 4 - 4
frontend/src/i18n/locales/nl.ts

@@ -2432,12 +2432,12 @@ export default {
     webhookEndpoints: 'Webhook-eindpunten',
     webhookEndpoints: 'Webhook-eindpunten',
     webhookApiKeyHint: 'Gebruik je API-sleutel in de X-API-Key-header.',
     webhookApiKeyHint: 'Gebruik je API-sleutel in de X-API-Key-header.',
     webhook: {
     webhook: {
-      getAllStatus: 'Status van alle printers ophalen',
-      getSpecificStatus: 'Status van specifieke printer ophalen',
       addToQueue: 'Toevoegen aan afdrukwachtrij',
       addToQueue: 'Toevoegen aan afdrukwachtrij',
-      pausePrint: 'Afdruk pauzeren',
-      resumePrint: 'Afdruk hervatten',
+      startNext: 'Volgende taak in de wachtrij starten',
       stopPrint: 'Afdruk stoppen',
       stopPrint: 'Afdruk stoppen',
+      cancelPrint: 'Afdruk annuleren',
+      getSpecificStatus: 'Status van specifieke printer ophalen',
+      queueStatus: 'Wachtrijstatus ophalen',
     },
     },
     apiBrowser: 'API-browser',
     apiBrowser: 'API-browser',
     apiBrowserDescription: 'Alle beschikbare API-eindpunten verkennen en testen.',
     apiBrowserDescription: 'Alle beschikbare API-eindpunten verkennen en testen.',

+ 4 - 4
frontend/src/i18n/locales/pt-BR.ts

@@ -2367,12 +2367,12 @@ export default {
     webhookEndpoints: 'Endpoints de Webhook',
     webhookEndpoints: 'Endpoints de Webhook',
     webhookApiKeyHint: 'Use sua chave API no cabeçalho X-API-Key.',
     webhookApiKeyHint: 'Use sua chave API no cabeçalho X-API-Key.',
     webhook: {
     webhook: {
-      getAllStatus: 'Obter status de todas as impressoras',
-      getSpecificStatus: 'Obter status de uma impressora específica',
       addToQueue: 'Adicionar à fila de impressão',
       addToQueue: 'Adicionar à fila de impressão',
-      pausePrint: 'Pausar impressão',
-      resumePrint: 'Retomar impressão',
+      startNext: 'Iniciar o próximo trabalho da fila',
       stopPrint: 'Parar impressão',
       stopPrint: 'Parar impressão',
+      cancelPrint: 'Cancelar impressão',
+      getSpecificStatus: 'Obter status de uma impressora específica',
+      queueStatus: 'Obter status da fila',
     },
     },
     apiBrowser: 'Navegador API',
     apiBrowser: 'Navegador API',
     apiBrowserDescription: 'Explore e teste todos os endpoints de API disponíveis.',
     apiBrowserDescription: 'Explore e teste todos os endpoints de API disponíveis.',

+ 4 - 4
frontend/src/i18n/locales/ru.ts

@@ -2292,12 +2292,12 @@ export default {
     webhookEndpoints: "Конечные точки вебхуков",
     webhookEndpoints: "Конечные точки вебхуков",
     webhookApiKeyHint: "Передавайте ключ API в заголовке X-API-Key.",
     webhookApiKeyHint: "Передавайте ключ API в заголовке X-API-Key.",
     webhook: {
     webhook: {
-      getAllStatus: "Получить состояние всех принтеров",
-      getSpecificStatus: "Получить состояние выбранного принтера",
       addToQueue: "Добавить в очередь печати",
       addToQueue: "Добавить в очередь печати",
-      pausePrint: "Приостановить печать",
-      resumePrint: "Продолжить печать",
+      startNext: "Запустить следующее задание в очереди",
       stopPrint: "Остановить печать",
       stopPrint: "Остановить печать",
+      cancelPrint: "Отменить печать",
+      getSpecificStatus: "Получить состояние выбранного принтера",
+      queueStatus: "Получить состояние очереди",
     },
     },
     apiBrowser: "Обозреватель API",
     apiBrowser: "Обозреватель API",
     apiBrowserDescription: "Просмотр и проверка всех доступных конечных точек API.",
     apiBrowserDescription: "Просмотр и проверка всех доступных конечных точек API.",

+ 4 - 4
frontend/src/i18n/locales/sv.ts

@@ -2431,12 +2431,12 @@ export default {
     webhookEndpoints: 'Webhook-ändpunkter',
     webhookEndpoints: 'Webhook-ändpunkter',
     webhookApiKeyHint: 'Använd din API-nyckel i adressinformationen för X-API-Key.',
     webhookApiKeyHint: 'Använd din API-nyckel i adressinformationen för X-API-Key.',
     webhook: {
     webhook: {
-      getAllStatus: 'Hämta alla skrivarstatusar',
-      getSpecificStatus: 'Hämta specifik skrivarstatus',
       addToQueue: 'Lägg till i utskriftskö',
       addToQueue: 'Lägg till i utskriftskö',
-      pausePrint: 'Pausa utskrift',
-      resumePrint: 'Fortsätt utskrift',
+      startNext: 'Starta nästa jobb i kön',
       stopPrint: 'Stoppa utskrift',
       stopPrint: 'Stoppa utskrift',
+      cancelPrint: 'Avbryt utskrift',
+      getSpecificStatus: 'Hämta specifik skrivarstatus',
+      queueStatus: 'Hämta köstatus',
     },
     },
     apiBrowser: 'API-läsare',
     apiBrowser: 'API-läsare',
     apiBrowserDescription: 'Utforska och testa alla tillgängliga API-ändpunkter.',
     apiBrowserDescription: 'Utforska och testa alla tillgängliga API-ändpunkter.',

+ 4 - 4
frontend/src/i18n/locales/tr.ts

@@ -2415,12 +2415,12 @@ export default {
     webhookEndpoints: 'Webhook Uç Noktaları',
     webhookEndpoints: 'Webhook Uç Noktaları',
     webhookApiKeyHint: 'API anahtarınızı X-API-Key başlığında kullanın.',
     webhookApiKeyHint: 'API anahtarınızı X-API-Key başlığında kullanın.',
     webhook: {
     webhook: {
-      getAllStatus: 'Tüm yazıcı durumlarını al',
-      getSpecificStatus: 'Belirli yazıcı durumunu al',
       addToQueue: 'Baskı kuyruğuna ekle',
       addToQueue: 'Baskı kuyruğuna ekle',
-      pausePrint: 'Baskıyı duraklat',
-      resumePrint: 'Baskıya devam et',
+      startNext: 'Kuyruktaki sonraki işi başlat',
       stopPrint: 'Baskıyı durdur',
       stopPrint: 'Baskıyı durdur',
+      cancelPrint: 'Baskıyı iptal et',
+      getSpecificStatus: 'Belirli yazıcı durumunu al',
+      queueStatus: 'Kuyruk durumunu al',
     },
     },
     apiBrowser: 'API Tarayıcısı',
     apiBrowser: 'API Tarayıcısı',
     apiBrowserDescription: 'Mevcut tüm API uç noktalarını keşfedin ve test edin.',
     apiBrowserDescription: 'Mevcut tüm API uç noktalarını keşfedin ve test edin.',

+ 4 - 4
frontend/src/i18n/locales/uk.ts

@@ -2430,12 +2430,12 @@ export default {
     webhookEndpoints: "Кінцеві точки вебхуків",
     webhookEndpoints: "Кінцеві точки вебхуків",
     webhookApiKeyHint: "Використовуйте свій ключ API у заголовку X-API-Key.",
     webhookApiKeyHint: "Використовуйте свій ключ API у заголовку X-API-Key.",
     webhook: {
     webhook: {
-      getAllStatus: "Отримати весь стан принтера",
-      getSpecificStatus: "Отримати певний стан принтера",
       addToQueue: "Додати до черги друку",
       addToQueue: "Додати до черги друку",
-      pausePrint: "Призупинити друк",
-      resumePrint: "Відновити друк",
+      startNext: "Запустити наступне завдання в черзі",
       stopPrint: "Зупинити друк",
       stopPrint: "Зупинити друк",
+      cancelPrint: "Скасувати друк",
+      getSpecificStatus: "Отримати певний стан принтера",
+      queueStatus: "Отримати стан черги",
     },
     },
     apiBrowser: "Оглядач API",
     apiBrowser: "Оглядач API",
     apiBrowserDescription: "Переглядайте й перевіряйте всі доступні кінцеві точки API.",
     apiBrowserDescription: "Переглядайте й перевіряйте всі доступні кінцеві точки API.",

+ 4 - 4
frontend/src/i18n/locales/zh-CN.ts

@@ -2412,12 +2412,12 @@ export default {
     webhookEndpoints: 'Webhook 端点',
     webhookEndpoints: 'Webhook 端点',
     webhookApiKeyHint: '在 X-API-Key 请求头中使用您的 API 密钥。',
     webhookApiKeyHint: '在 X-API-Key 请求头中使用您的 API 密钥。',
     webhook: {
     webhook: {
-      getAllStatus: '获取所有打印机状态',
-      getSpecificStatus: '获取特定打印机状态',
       addToQueue: '添加到打印队列',
       addToQueue: '添加到打印队列',
-      pausePrint: '暂停打印',
-      resumePrint: '继续打印',
+      startNext: '启动队列中的下一个任务',
       stopPrint: '停止打印',
       stopPrint: '停止打印',
+      cancelPrint: '取消打印',
+      getSpecificStatus: '获取特定打印机状态',
+      queueStatus: '获取队列状态',
     },
     },
     apiBrowser: 'API 浏览器',
     apiBrowser: 'API 浏览器',
     apiBrowserDescription: '浏览和测试所有可用的 API 端点。',
     apiBrowserDescription: '浏览和测试所有可用的 API 端点。',

+ 4 - 4
frontend/src/i18n/locales/zh-TW.ts

@@ -2412,12 +2412,12 @@ export default {
     webhookEndpoints: 'Webhook 端點',
     webhookEndpoints: 'Webhook 端點',
     webhookApiKeyHint: '在 X-API-Key 請求頭中使用您的 API 金鑰。',
     webhookApiKeyHint: '在 X-API-Key 請求頭中使用您的 API 金鑰。',
     webhook: {
     webhook: {
-      getAllStatus: '獲取所有印表機狀態',
-      getSpecificStatus: '獲取特定印表機狀態',
       addToQueue: '新增到列印佇列',
       addToQueue: '新增到列印佇列',
-      pausePrint: '暫停列印',
-      resumePrint: '繼續列印',
+      startNext: '啟動佇列中的下一個工作',
       stopPrint: '停止列印',
       stopPrint: '停止列印',
+      cancelPrint: '取消列印',
+      getSpecificStatus: '獲取特定印表機狀態',
+      queueStatus: '獲取佇列狀態',
     },
     },
     apiBrowser: 'API 瀏覽器',
     apiBrowser: 'API 瀏覽器',
     apiBrowserDescription: '瀏覽和測試所有可用的 API 端點。',
     apiBrowserDescription: '瀏覽和測試所有可用的 API 端點。',

+ 18 - 18
frontend/src/pages/SettingsPage.tsx

@@ -4983,36 +4983,36 @@ export function SettingsPage() {
                   {t('settings.webhookApiKeyHint')}
                   {t('settings.webhookApiKeyHint')}
                 </p>
                 </p>
                 <div className="space-y-2 font-mono text-xs">
                 <div className="space-y-2 font-mono text-xs">
-                  <div className="p-2 bg-bambu-dark rounded">
-                    <span className="text-blue-700 dark:text-blue-400">GET</span>{' '}
-                    <span className="text-white">/api/v1/webhook/status</span>
-                    <span className="text-bambu-gray"> - {t('settings.webhook.getAllStatus')}</span>
-                  </div>
-                  <div className="p-2 bg-bambu-dark rounded">
-                    <span className="text-blue-700 dark:text-blue-400">GET</span>{' '}
-                    <span className="text-white">/api/v1/webhook/status/:id</span>
-                    <span className="text-bambu-gray"> - {t('settings.webhook.getSpecificStatus')}</span>
-                  </div>
                   <div className="p-2 bg-bambu-dark rounded">
                   <div className="p-2 bg-bambu-dark rounded">
                     <span className="text-green-700 dark:text-green-400">POST</span>{' '}
                     <span className="text-green-700 dark:text-green-400">POST</span>{' '}
-                    <span className="text-white">/api/v1/webhook/queue</span>
+                    <span className="text-white">/api/v1/webhook/queue/add</span>
                     <span className="text-bambu-gray"> - {t('settings.webhook.addToQueue')}</span>
                     <span className="text-bambu-gray"> - {t('settings.webhook.addToQueue')}</span>
                   </div>
                   </div>
                   <div className="p-2 bg-bambu-dark rounded">
                   <div className="p-2 bg-bambu-dark rounded">
                     <span className="text-orange-700 dark:text-orange-400">POST</span>{' '}
                     <span className="text-orange-700 dark:text-orange-400">POST</span>{' '}
-                    <span className="text-white">/api/v1/webhook/printer/:id/pause</span>
-                    <span className="text-bambu-gray"> - {t('settings.webhook.pausePrint')}</span>
-                  </div>
-                  <div className="p-2 bg-bambu-dark rounded">
-                    <span className="text-orange-700 dark:text-orange-400">POST</span>{' '}
-                    <span className="text-white">/api/v1/webhook/printer/:id/resume</span>
-                    <span className="text-bambu-gray"> - {t('settings.webhook.resumePrint')}</span>
+                    <span className="text-white">/api/v1/webhook/printer/:id/start</span>
+                    <span className="text-bambu-gray"> - {t('settings.webhook.startNext')}</span>
                   </div>
                   </div>
                   <div className="p-2 bg-bambu-dark rounded">
                   <div className="p-2 bg-bambu-dark rounded">
                     <span className="text-red-700 dark:text-red-400">POST</span>{' '}
                     <span className="text-red-700 dark:text-red-400">POST</span>{' '}
                     <span className="text-white">/api/v1/webhook/printer/:id/stop</span>
                     <span className="text-white">/api/v1/webhook/printer/:id/stop</span>
                     <span className="text-bambu-gray"> - {t('settings.webhook.stopPrint')}</span>
                     <span className="text-bambu-gray"> - {t('settings.webhook.stopPrint')}</span>
                   </div>
                   </div>
+                  <div className="p-2 bg-bambu-dark rounded">
+                    <span className="text-red-700 dark:text-red-400">POST</span>{' '}
+                    <span className="text-white">/api/v1/webhook/printer/:id/cancel</span>
+                    <span className="text-bambu-gray"> - {t('settings.webhook.cancelPrint')}</span>
+                  </div>
+                  <div className="p-2 bg-bambu-dark rounded">
+                    <span className="text-blue-700 dark:text-blue-400">GET</span>{' '}
+                    <span className="text-white">/api/v1/webhook/printer/:id/status</span>
+                    <span className="text-bambu-gray"> - {t('settings.webhook.getSpecificStatus')}</span>
+                  </div>
+                  <div className="p-2 bg-bambu-dark rounded">
+                    <span className="text-blue-700 dark:text-blue-400">GET</span>{' '}
+                    <span className="text-white">/api/v1/webhook/queue</span>
+                    <span className="text-bambu-gray"> - {t('settings.webhook.queueStatus')}</span>
+                  </div>
                 </div>
                 </div>
               </CardContent>
               </CardContent>
             </Card>
             </Card>

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/AdditionalSection-BzVsRoKp.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/AmsUnitCard-DKZuOvjp.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ArchivesPage-DroU8hxv.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/AssignToAmsModal-CpJbG9lU.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/CamWallPage-DtvuR41_.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/CameraDiagnoseModal-CZpj2hGw.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/CameraPage-BCe5mvxd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/CameraWall-Cl0wElj3.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ColumnConfigModal-FvLpl7kb.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ConfigureAmsSlotModal-DhYzN3la.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ConnectAuthorizePage-DM7WX4Fk.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ContextMenu-BM_aaGkd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ExternalLinkPage-CK4xYzrj.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
static/assets/FileManagerPage-qb_-bRxQ.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/FileUploadModal-DX9Tkc5e.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/FinancePage-C7L1sCfN.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/GCodeViewerPage-CTHEh7Wc.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/GroupEditPage-BzjCZXa4.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ImagePreviewModal-U5UQWMbs.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/InventoryPage-DUA4AOO0.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/LibraryTrashPage-kWy1DWJE.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/LoginPage-CUNvvF06.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/MaintenancePage-DEVEECUl.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ModelSourcesPage-ltGu84-x.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/NotificationsPage-WWEH2fAP.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
static/assets/PdfPreviewModal-BVs-ZSx5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/PhotoGalleryModal-CGD8WLdQ.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/PrinterLocationsPage-CdLtaKoC.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/PrintersPage-DZKYgf1A.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ProfilesPage-WrqcQGhq.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ProjectDetailPage-DckcyUtF.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ProjectsPage-B4LKxsW5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/QueuePage-C5waMiM-.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/RichTextEditor-nFwWNdVx.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SettingsPage-BtX9J3wO.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SetupPage-CJy6fhXu.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SliceModal-DfVKzJhK.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpoolBuddyAmsPage-CGkdiFGG.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpoolBuddyCalibrationPage-MluBOMtR.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpoolBuddyDashboard-A6q5rOXM.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpoolBuddyInventoryPage-CnkBMhrP.js


Разница между файлами не показана из-за своего большого размера
+ 1 - 1
static/assets/SpoolBuddySettingsPage-DUtf5GHW.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpoolBuddyWriteTagPage-Cqq-vrR6.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SpreadsheetPreviewModal-66d2cAP5.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/StatsPage-CCiI6IBk.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/StreamOverlayPage-DcRYQPlF.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/SystemInfoPage-CiD365bn.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/de-BfSmrO1D.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/es-CRlbEMPu.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/es-Dn92fmS9.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/fr-CvEzyKAc.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/fr-sItnTtep.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/index-Bxt0-gCC.js


+ 1 - 1
static/assets/inventorySearch-CtBW7_f5.js → static/assets/inventorySearch-DY7qW1VE.js

@@ -1 +1 @@
-import{ft as e}from"./index-CovRLYqQ.js";function t(t,n){let r=n.trim().toLowerCase();if(!r)return!0;let i=r.match(/^#(\d+)$/);return i?t.id===Number(i[1]):String(t.id).includes(r)||t.material.toLowerCase().includes(r)||(t.brand?.toLowerCase().includes(r)??!1)||(t.color_name?.toLowerCase().includes(r)??!1)||(e(t.color_name,t.rgba,t.color_name_is_synthesized)?.toLowerCase().includes(r)??!1)||(t.subtype?.toLowerCase().includes(r)??!1)||(t.note?.toLowerCase().includes(r)??!1)||(t.slicer_filament_name?.toLowerCase().includes(r)??!1)||(t.storage_location?.toLowerCase().includes(r)??!1)||(t.material_number?.toLowerCase().includes(r)??!1)||(t.suppliers?.some(e=>e.supplier_name.toLowerCase().includes(r)||(e.supplier_article_number?.toLowerCase().includes(r)??!1))??!1)}function n(e,n){return n?e.filter(e=>t(e,n)):e}export{n as t};
+import{ft as e}from"./index-Bxt0-gCC.js";function t(t,n){let r=n.trim().toLowerCase();if(!r)return!0;let i=r.match(/^#(\d+)$/);return i?t.id===Number(i[1]):String(t.id).includes(r)||t.material.toLowerCase().includes(r)||(t.brand?.toLowerCase().includes(r)??!1)||(t.color_name?.toLowerCase().includes(r)??!1)||(e(t.color_name,t.rgba,t.color_name_is_synthesized)?.toLowerCase().includes(r)??!1)||(t.subtype?.toLowerCase().includes(r)??!1)||(t.note?.toLowerCase().includes(r)??!1)||(t.slicer_filament_name?.toLowerCase().includes(r)??!1)||(t.storage_location?.toLowerCase().includes(r)??!1)||(t.material_number?.toLowerCase().includes(r)??!1)||(t.suppliers?.some(e=>e.supplier_name.toLowerCase().includes(r)||(e.supplier_article_number?.toLowerCase().includes(r)??!1))??!1)}function n(e,n){return n?e.filter(e=>t(e,n)):e}export{n as t};

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/it-DEhaofNm.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ja-BxKx1wzl.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ja-kqRtnJd1.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ko-B0A-ZkcE.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ko-CQEHoFgd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/locationSensorDefaults-B-kfKB90.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/nl-C8XTrLkN.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/nl-CkXxNW_2.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/pdf-qF0BMKce.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/pt-BR-BWeofhYg.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/pt-BR-DnFDJh0V.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/ru-BFXObj6m.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/sv-CHlBzjBa.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/sv-Dw4u8Ujt.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/tr-Bgj-JQWk.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/uk-CszKWsI6.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/utils-CWsHJrpF.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/zh-CN-D_oie5vG.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/zh-CN-GWb1sFwd.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/zh-TW-BfrMVAcn.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/zh-TW-DeeUO0bT.js


+ 1 - 1
static/index.html

@@ -26,7 +26,7 @@
 
 
     <!-- Splash screens for iOS -->
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-CovRLYqQ.js"></script>
+    <script type="module" crossorigin src="/assets/index-Bxt0-gCC.js"></script>
     <link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
     <link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
     <link rel="modulepreload" crossorigin href="/assets/client-DnySrlFv.js">
     <link rel="modulepreload" crossorigin href="/assets/client-DnySrlFv.js">
     <link rel="modulepreload" crossorigin href="/assets/QueryClientProvider-Ce8_sN3w.js">
     <link rel="modulepreload" crossorigin href="/assets/QueryClientProvider-Ce8_sN3w.js">

Некоторые файлы не были показаны из-за большого количества измененных файлов