فهرست منبع

fix(maintenance): say that deleting a custom type applies to every printer

maziggy 1 هفته پیش
والد
کامیت
9712d27c64
98فایلهای تغییر یافته به همراه43 افزوده شده و 8 حذف شده
  1. 1 0
      CHANGELOG.md
  2. 23 2
      frontend/src/__tests__/pages/MaintenancePage.test.tsx
  3. 1 0
      frontend/src/i18n/locales/de.ts
  4. 1 0
      frontend/src/i18n/locales/en.ts
  5. 1 0
      frontend/src/i18n/locales/es.ts
  6. 1 0
      frontend/src/i18n/locales/fr.ts
  7. 1 0
      frontend/src/i18n/locales/it.ts
  8. 1 0
      frontend/src/i18n/locales/ja.ts
  9. 1 0
      frontend/src/i18n/locales/ko.ts
  10. 1 0
      frontend/src/i18n/locales/nl.ts
  11. 1 0
      frontend/src/i18n/locales/pt-BR.ts
  12. 1 0
      frontend/src/i18n/locales/ru.ts
  13. 1 0
      frontend/src/i18n/locales/sv.ts
  14. 1 0
      frontend/src/i18n/locales/tr.ts
  15. 1 0
      frontend/src/i18n/locales/uk.ts
  16. 1 0
      frontend/src/i18n/locales/zh-CN.ts
  17. 1 0
      frontend/src/i18n/locales/zh-TW.ts
  18. 1 1
      frontend/src/pages/MaintenancePage.tsx
  19. 0 0
      static/assets/AdditionalSection-DXRD7AnY.js
  20. 0 0
      static/assets/AmsUnitCard-DZxPS3xA.js
  21. 0 0
      static/assets/ArchivesPage-Cc-Afs6N.js
  22. 0 0
      static/assets/AssignToAmsModal-DxMRLw9M.js
  23. 0 0
      static/assets/CamWallPage-CT2wYxz_.js
  24. 0 0
      static/assets/CameraDiagnoseModal-DFSm4iqj.js
  25. 0 0
      static/assets/CameraPage-DcsCiwvU.js
  26. 0 0
      static/assets/CameraWall-N2Nmuy_x.js
  27. 0 0
      static/assets/ColumnConfigModal-BI9EKxKX.js
  28. 0 0
      static/assets/ConfigureAmsSlotModal-oO1BYxjJ.js
  29. 0 0
      static/assets/ConnectAuthorizePage--tchC0OA.js
  30. 0 0
      static/assets/ContextMenu-DhMK-T4f.js
  31. 0 0
      static/assets/ExternalLinkPage-CNM9LMax.js
  32. 0 1
      static/assets/FileManagerPage-B6moaOZC.js
  33. 0 0
      static/assets/FileUploadModal-D-AYfZnD.js
  34. 0 0
      static/assets/FinancePage-76NLYr_U.js
  35. 0 0
      static/assets/GCodeViewerPage-fws-inQ6.js
  36. 0 0
      static/assets/GroupEditPage-CsOe4non.js
  37. 0 0
      static/assets/ImagePreviewModal-CTlkt0sY.js
  38. 0 0
      static/assets/InventoryPage-BTq0yWoy.js
  39. 0 0
      static/assets/LibraryTrashPage-DjKLrLls.js
  40. 0 0
      static/assets/LoginPage-Czd50HzW.js
  41. 0 0
      static/assets/MaintenancePage-DnqHbNcD.js
  42. 0 0
      static/assets/ModelSourcesPage-DNijFRF-.js
  43. 0 0
      static/assets/NotificationsPage-Cq-P-397.js
  44. 0 1
      static/assets/PdfPreviewModal-B6sVcYE5.js
  45. 0 0
      static/assets/PhotoGalleryModal-BOqXKY8o.js
  46. 0 0
      static/assets/PrinterLocationsPage-D3LGywI1.js
  47. 0 0
      static/assets/PrintersPage-D20Q75tu.js
  48. 0 0
      static/assets/ProfilesPage-CwhFzZRH.js
  49. 0 0
      static/assets/ProjectDetailPage-B02Ky91G.js
  50. 0 0
      static/assets/ProjectsPage-i8Xbxcq3.js
  51. 0 0
      static/assets/QueuePage-BThzYmt5.js
  52. 0 0
      static/assets/RichTextEditor-DkmKwPOG.js
  53. 0 0
      static/assets/SettingsPage-CLOSy2Df.js
  54. 0 0
      static/assets/SetupPage-CLzdfZGN.js
  55. 0 0
      static/assets/SliceModal-CzgErUkx.js
  56. 0 0
      static/assets/SpoolBuddyAmsPage-BeqRXxPq.js
  57. 0 0
      static/assets/SpoolBuddyCalibrationPage-CI9EI9Si.js
  58. 0 0
      static/assets/SpoolBuddyDashboard-DFFhiXHA.js
  59. 0 0
      static/assets/SpoolBuddyInventoryPage-CCHfxrCJ.js
  60. 1 1
      static/assets/SpoolBuddySettingsPage-DUK8kwWy.js
  61. 0 0
      static/assets/SpoolBuddyWriteTagPage-BT0Cfenn.js
  62. 0 0
      static/assets/SpreadsheetPreviewModal-DTYn6MjH.js
  63. 0 0
      static/assets/StatsPage-Cdep-gvR.js
  64. 0 0
      static/assets/StreamOverlayPage-CNK1gOAU.js
  65. 0 0
      static/assets/SystemInfoPage-Ciw-6MRc.js
  66. 0 0
      static/assets/de-CRIz-V_S.js
  67. 0 0
      static/assets/de-bIen8vBa.js
  68. 0 0
      static/assets/es-D3Lxzz5P.js
  69. 0 0
      static/assets/es-DJlNQ9n2.js
  70. 0 0
      static/assets/fr-CHlHrq6D.js
  71. 0 0
      static/assets/fr-Om92FA6_.js
  72. 0 0
      static/assets/index-CJ0w0cCi.js
  73. 1 1
      static/assets/inventorySearch-abrgiuGv.js
  74. 0 0
      static/assets/it-4I6jx5bN.js
  75. 0 0
      static/assets/it-BvW9M3Vz.js
  76. 0 0
      static/assets/ja-BNEUPGWW.js
  77. 0 0
      static/assets/ja-D2EOAyJD.js
  78. 0 0
      static/assets/ko-B-_J2Kfz.js
  79. 0 0
      static/assets/ko-DfBFmlKY.js
  80. 0 0
      static/assets/locationSensorDefaults-BpOt1qFI.js
  81. 0 0
      static/assets/nl-bENooHN3.js
  82. 0 0
      static/assets/pdf-CWCRHxpU.js
  83. 0 0
      static/assets/pt-BR-92EhOKVO.js
  84. 0 0
      static/assets/pt-BR-CYc2SLsN.js
  85. 0 0
      static/assets/ru-BIcZal2N.js
  86. 0 0
      static/assets/ru-D-8vaLZZ.js
  87. 0 0
      static/assets/sv-Din8JniN.js
  88. 0 0
      static/assets/sv-s25PQYIG.js
  89. 0 0
      static/assets/tr-DsMABk7-.js
  90. 0 0
      static/assets/tr-zuS-RAgq.js
  91. 0 0
      static/assets/uk-DtWUCD87.js
  92. 0 0
      static/assets/uk-VLDlCeAG.js
  93. 0 0
      static/assets/utils-HWU1IUBT.js
  94. 0 0
      static/assets/zh-CN-7T9n_nz-.js
  95. 0 0
      static/assets/zh-CN-CYCzjlSw.js
  96. 0 0
      static/assets/zh-TW-CUA15mBh.js
  97. 0 0
      static/assets/zh-TW-D4Nxyg0K.js
  98. 1 1
      static/index.html

+ 1 - 0
CHANGELOG.md

@@ -135,6 +135,7 @@ All notable changes to Bambuddy will be documented in this file.
 - **Dutch (nl) is now a supported interface language (#2891, requested and contributed by @Igiegel)** — Adds `nl` as the fourteenth locale, listed as "Nederlands" in the language picker. The translation was contributed as a file on the issue and needed three corrections before it could be wired up, all of which the parity gate found. First, the nine `stats.timeframe.*` entries had their **keys** translated along with their values (`'today'` had become `'vandaag'`), which would have left the Statistics timeframe selector resolving nothing and rendering raw key names for every Dutch user — the values were kept and the keys restored. Second, the file was translated against an older `en.ts` and was 84 leaves short, missing the Filament Track Switch feed prompts, the AI-detection status strings, the no-3MF internal-history banner, the batch-order stranded-plate notices, the Avery starting-position field and the whole `locationHaSensors` section from #2824; those were translated and added. Rather than splice them in, `nl.ts` was regenerated from the `en.ts` skeleton with the contributor's strings carried over, so its structure, key order and section comments now match the reference locale exactly and a future diff against `en.ts` reads as content rather than as reordering. Third, 229 leaves were identical to English; each was checked individually and all were kept, because Dutch takes most technical UI vocabulary verbatim — printer, filament, status, nozzle, timelapse, dashboard — and Dutch slicer users use the English feature names (support, ironing, prime tower, gap fill) untranslated. Those 123 distinct values are now listed explicitly in a `NL_COGNATES` allow-list in `check-i18n-parity.mjs`, the same shape the other twelve locales use, so the exemption is an enumerated translator decision rather than a blanket skip. Parity green at 6264 leaves across all 14 locales.
 - **Dutch (nl) is now a supported interface language (#2891, requested and contributed by @Igiegel)** — Adds `nl` as the fourteenth locale, listed as "Nederlands" in the language picker. The translation was contributed as a file on the issue and needed three corrections before it could be wired up, all of which the parity gate found. First, the nine `stats.timeframe.*` entries had their **keys** translated along with their values (`'today'` had become `'vandaag'`), which would have left the Statistics timeframe selector resolving nothing and rendering raw key names for every Dutch user — the values were kept and the keys restored. Second, the file was translated against an older `en.ts` and was 84 leaves short, missing the Filament Track Switch feed prompts, the AI-detection status strings, the no-3MF internal-history banner, the batch-order stranded-plate notices, the Avery starting-position field and the whole `locationHaSensors` section from #2824; those were translated and added. Rather than splice them in, `nl.ts` was regenerated from the `en.ts` skeleton with the contributor's strings carried over, so its structure, key order and section comments now match the reference locale exactly and a future diff against `en.ts` reads as content rather than as reordering. Third, 229 leaves were identical to English; each was checked individually and all were kept, because Dutch takes most technical UI vocabulary verbatim — printer, filament, status, nozzle, timelapse, dashboard — and Dutch slicer users use the English feature names (support, ironing, prime tower, gap fill) untranslated. Those 123 distinct values are now listed explicitly in a `NL_COGNATES` allow-list in `check-i18n-parity.mjs`, the same shape the other twelve locales use, so the exemption is an enumerated translator decision rather than a blanket skip. Parity green at 6264 leaves across all 14 locales.
 
 
 ### Changed
 ### Changed
+- **Deleting a custom maintenance type says it applies to every printer** — Maintenance types are shared, so deleting a custom one removes it, with its maintenance history, from every printer, including those of other teams when printer access is limited. The confirmation now says so.
 - **The web interface downloads about 70% less on each new version (#3175, requested by @mason9468)** — The interface's script files were sent uncompressed and with no caching instructions, so a phone fetched the whole 11 MB again and the browser asked for it on every load.
 - **The web interface downloads about 70% less on each new version (#3175, requested by @mason9468)** — The interface's script files were sent uncompressed and with no caching instructions, so a phone fetched the whole 11 MB again and the browser asked for it on every load.
   - **Compressed:** scripts, styles and other text files under `/assets` now go out gzip-compressed when the browser accepts it. The main script drops from 11.0 MB to 3.0 MB.
   - **Compressed:** scripts, styles and other text files under `/assets` now go out gzip-compressed when the browser accepts it. The main script drops from 11.0 MB to 3.0 MB.
   - **Cached for good:** files whose name carries a content hash are now marked as never changing, so the browser loads them from its own cache until an update brings new ones. The page itself is still checked on every load, so updates are picked up as before.
   - **Cached for good:** files whose name carries a content hash are now marked as never changing, so the browser loads them from its own cache until an update brings new ones. The page itself is still checked on every load, so updates are picked up as before.

+ 23 - 2
frontend/src/__tests__/pages/MaintenancePage.test.tsx

@@ -2,8 +2,8 @@
  * Tests for the MaintenancePage component.
  * Tests for the MaintenancePage component.
  */
  */
 
 
-import { describe, it, expect, beforeEach } from 'vitest';
-import { screen, waitFor } from '@testing-library/react';
+import { describe, it, expect, beforeEach, vi } from 'vitest';
+import { fireEvent, screen, waitFor, within } from '@testing-library/react';
 import { render } from '../utils';
 import { render } from '../utils';
 import { MaintenancePage } from '../../pages/MaintenancePage';
 import { MaintenancePage } from '../../pages/MaintenancePage';
 import { http, HttpResponse } from 'msw';
 import { http, HttpResponse } from 'msw';
@@ -147,4 +147,25 @@ describe('MaintenancePage', () => {
       });
       });
     });
     });
   });
   });
+
+  it('says that deleting a custom type applies to every printer', async () => {
+    server.use(
+      http.get('/api/v1/maintenance/types', () =>
+        HttpResponse.json([
+          ...mockMaintenanceTypes,
+          { id: 9, name: 'Custom Check', description: null, default_interval_hours: 10, is_system: false },
+        ]),
+      ),
+    );
+    const confirm = vi.spyOn(window, 'confirm').mockReturnValue(false);
+
+    render(<MaintenancePage />);
+    fireEvent.click(await screen.findByText('Settings'));
+    const card = (await screen.findByText('Custom Check')).closest('.rounded-xl') as HTMLElement;
+    const buttons = within(card).getAllByRole('button');
+    fireEvent.click(buttons[buttons.length - 1]);
+
+    expect(confirm).toHaveBeenCalledWith(expect.stringContaining('not only yours'));
+    confirm.mockRestore();
+  });
 });
 });

+ 1 - 0
frontend/src/i18n/locales/de.ts

@@ -1958,6 +1958,7 @@ export default {
     printerRemoved: 'Drucker entfernt',
     printerRemoved: 'Drucker entfernt',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '"{{name}}" löschen?',
     deleteTypeConfirm: '"{{name}}" löschen?',
+    deleteTypeAllPrinters: 'Das entfernt ihn von allen Druckern, nicht nur von deinen, samt seinem Wartungsverlauf.',
     deleteSystemTypeTitle: 'Standard-Wartungsaufgabe löschen?',
     deleteSystemTypeTitle: 'Standard-Wartungsaufgabe löschen?',
     deleteSystemTypeMessage: 'Möchten Sie die Standard-Wartungsaufgabe "{{name}}" wirklich löschen?',
     deleteSystemTypeMessage: 'Möchten Sie die Standard-Wartungsaufgabe "{{name}}" wirklich löschen?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/en.ts

@@ -1978,6 +1978,7 @@ export default {
     printerRemoved: 'Printer removed',
     printerRemoved: 'Printer removed',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: 'Delete "{{name}}"?',
     deleteTypeConfirm: 'Delete "{{name}}"?',
+    deleteTypeAllPrinters: 'This removes it from every printer, not only yours, including its maintenance history.',
     deleteSystemTypeTitle: 'Delete default maintenance task?',
     deleteSystemTypeTitle: 'Delete default maintenance task?',
     deleteSystemTypeMessage: 'Are you sure you want to delete the default maintenance task "{{name}}"?',
     deleteSystemTypeMessage: 'Are you sure you want to delete the default maintenance task "{{name}}"?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/es.ts

@@ -1959,6 +1959,7 @@ export default {
     printerRemoved: 'Impresora eliminada',
     printerRemoved: 'Impresora eliminada',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '¿Eliminar "{{name}}"?',
     deleteTypeConfirm: '¿Eliminar "{{name}}"?',
+    deleteTypeAllPrinters: 'Esto lo elimina de todas las impresoras, no solo de las tuyas, incluido su historial de mantenimiento.',
     deleteSystemTypeTitle: '¿Eliminar la tarea de mantenimiento predeterminada?',
     deleteSystemTypeTitle: '¿Eliminar la tarea de mantenimiento predeterminada?',
     deleteSystemTypeMessage: '¿Está seguro de que desea eliminar la tarea de mantenimiento predeterminada "{{name}}"?',
     deleteSystemTypeMessage: '¿Está seguro de que desea eliminar la tarea de mantenimiento predeterminada "{{name}}"?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/fr.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: 'Imprimante retirée',
     printerRemoved: 'Imprimante retirée',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: 'Supprimer "{{name}}" ?',
     deleteTypeConfirm: 'Supprimer "{{name}}" ?',
+    deleteTypeAllPrinters: 'Cela le supprime de toutes les imprimantes, pas seulement des vôtres, y compris son historique de maintenance.',
     deleteSystemTypeTitle: 'Supprimer la tâche de maintenance par défaut ?',
     deleteSystemTypeTitle: 'Supprimer la tâche de maintenance par défaut ?',
     deleteSystemTypeMessage: 'Êtes-vous sûr de vouloir supprimer la tâche de maintenance par défaut "{{name}}" ?',
     deleteSystemTypeMessage: 'Êtes-vous sûr de vouloir supprimer la tâche de maintenance par défaut "{{name}}" ?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/it.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: 'Stampante rimossa',
     printerRemoved: 'Stampante rimossa',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: 'Eliminare "{{name}}"?',
     deleteTypeConfirm: 'Eliminare "{{name}}"?',
+    deleteTypeAllPrinters: 'Questo lo rimuove da tutte le stampanti, non solo dalle tue, compresa la sua cronologia di manutenzione.',
     deleteSystemTypeTitle: 'Eliminare attività di manutenzione predefinita?',
     deleteSystemTypeTitle: 'Eliminare attività di manutenzione predefinita?',
     deleteSystemTypeMessage: 'Sei sicuro di voler eliminare l\'attività di manutenzione predefinita "{{name}}"?',
     deleteSystemTypeMessage: 'Sei sicuro di voler eliminare l\'attività di manutenzione predefinita "{{name}}"?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/ja.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: 'プリンターを削除しました',
     printerRemoved: 'プリンターを削除しました',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '「{{name}}」を削除しますか?',
     deleteTypeConfirm: '「{{name}}」を削除しますか?',
+    deleteTypeAllPrinters: 'あなたのプリンターだけでなく、すべてのプリンターから削除され、メンテナンス履歴も削除されます。',
     deleteSystemTypeTitle: 'デフォルトのメンテナンスタスクを削除しますか?',
     deleteSystemTypeTitle: 'デフォルトのメンテナンスタスクを削除しますか?',
     deleteSystemTypeMessage: 'デフォルトのメンテナンスタスク「{{name}}」を削除してもよろしいですか?',
     deleteSystemTypeMessage: 'デフォルトのメンテナンスタスク「{{name}}」を削除してもよろしいですか?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/ko.ts

@@ -1875,6 +1875,7 @@ export default {
     printerAssigned: '프린터가 할당되었습니다',
     printerAssigned: '프린터가 할당되었습니다',
     printerRemoved: '프린터가 제거되었습니다',
     printerRemoved: '프린터가 제거되었습니다',
     deleteTypeConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
     deleteTypeConfirm: '"{{name}}"을(를) 삭제하시겠습니까?',
+    deleteTypeAllPrinters: '내 프린터뿐 아니라 모든 프린터에서 유지보수 기록과 함께 삭제됩니다.',
     deleteSystemTypeTitle: '기본 유지보수 작업을 삭제하시겠습니까?',
     deleteSystemTypeTitle: '기본 유지보수 작업을 삭제하시겠습니까?',
     deleteSystemTypeMessage: '기본 유지보수 작업 "{{name}}"을(를) 삭제하시겠습니까?',
     deleteSystemTypeMessage: '기본 유지보수 작업 "{{name}}"을(를) 삭제하시겠습니까?',
     noPermissionUpdate: '유지보수 항목을 업데이트할 권한이 없습니다',
     noPermissionUpdate: '유지보수 항목을 업데이트할 권한이 없습니다',

+ 1 - 0
frontend/src/i18n/locales/nl.ts

@@ -1976,6 +1976,7 @@ export default {
     printerRemoved: 'Printer verwijderd',
     printerRemoved: 'Printer verwijderd',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '"{{name}}" verwijderen?',
     deleteTypeConfirm: '"{{name}}" verwijderen?',
+    deleteTypeAllPrinters: 'Dit verwijdert het van alle printers, niet alleen van die van jou, inclusief de onderhoudsgeschiedenis.',
     deleteSystemTypeTitle: 'Standaard onderhoudstaak verwijderen?',
     deleteSystemTypeTitle: 'Standaard onderhoudstaak verwijderen?',
     deleteSystemTypeMessage: 'Weet je zeker dat je de standaard onderhoudstaak "{{name}}" wilt verwijderen?',
     deleteSystemTypeMessage: 'Weet je zeker dat je de standaard onderhoudstaak "{{name}}" wilt verwijderen?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/pt-BR.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: 'Impressora removida',
     printerRemoved: 'Impressora removida',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: 'Excluir "{{name}}"?',
     deleteTypeConfirm: 'Excluir "{{name}}"?',
+    deleteTypeAllPrinters: 'Isso o remove de todas as impressoras, não só das suas, incluindo o histórico de manutenção.',
     deleteSystemTypeTitle: 'Excluir tarefa de manutenção padrão?',
     deleteSystemTypeTitle: 'Excluir tarefa de manutenção padrão?',
     deleteSystemTypeMessage: 'Tem certeza de que deseja excluir a tarefa de manutenção padrão "{{name}}"?',
     deleteSystemTypeMessage: 'Tem certeza de que deseja excluir a tarefa de manutenção padrão "{{name}}"?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/ru.ts

@@ -1872,6 +1872,7 @@ export default {
     printerAssigned: "Принтер назначен",
     printerAssigned: "Принтер назначен",
     printerRemoved: "Принтер удалён из назначения",
     printerRemoved: "Принтер удалён из назначения",
     deleteTypeConfirm: "Удалить «{{name}}»?",
     deleteTypeConfirm: "Удалить «{{name}}»?",
+    deleteTypeAllPrinters: 'Он будет удалён со всех принтеров, а не только с ваших, вместе с историей обслуживания.',
     deleteSystemTypeTitle: "Удалить стандартную задачу обслуживания?",
     deleteSystemTypeTitle: "Удалить стандартную задачу обслуживания?",
     deleteSystemTypeMessage: "Удалить стандартную задачу обслуживания «{{name}}»?",
     deleteSystemTypeMessage: "Удалить стандартную задачу обслуживания «{{name}}»?",
     noPermissionUpdate: "У вас нет разрешения обновлять задачи обслуживания",
     noPermissionUpdate: "У вас нет разрешения обновлять задачи обслуживания",

+ 1 - 0
frontend/src/i18n/locales/sv.ts

@@ -1975,6 +1975,7 @@ export default {
     printerRemoved: 'Skrivare borttagen',
     printerRemoved: 'Skrivare borttagen',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: 'Ta bort "{{name}}"?',
     deleteTypeConfirm: 'Ta bort "{{name}}"?',
+    deleteTypeAllPrinters: 'Detta tar bort den från alla skrivare, inte bara dina, inklusive underhållshistoriken.',
     deleteSystemTypeTitle: 'Ta bort standardunderhållsuppgift?',
     deleteSystemTypeTitle: 'Ta bort standardunderhållsuppgift?',
     deleteSystemTypeMessage: 'Är du säker på att du vill ta bort standardunderhållsuppgift "{{name}}"?',
     deleteSystemTypeMessage: 'Är du säker på att du vill ta bort standardunderhållsuppgift "{{name}}"?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/tr.ts

@@ -1959,6 +1959,7 @@ export default {
     printerRemoved: 'Yazıcı kaldırıldı',
     printerRemoved: 'Yazıcı kaldırıldı',
     // Onay
     // Onay
     deleteTypeConfirm: '"{{name}}" silinsin mi?',
     deleteTypeConfirm: '"{{name}}" silinsin mi?',
+    deleteTypeAllPrinters: 'Bu, bakım geçmişi dahil olmak üzere onu yalnızca sizin yazıcılarınızdan değil, tüm yazıcılardan kaldırır.',
     deleteSystemTypeTitle: 'Varsayılan bakım görevi silinsin mi?',
     deleteSystemTypeTitle: 'Varsayılan bakım görevi silinsin mi?',
     deleteSystemTypeMessage: '"{{name}}" varsayılan bakım görevini silmek istediğinizden emin misiniz?',
     deleteSystemTypeMessage: '"{{name}}" varsayılan bakım görevini silmek istediğinizden emin misiniz?',
     // İzinler
     // İzinler

+ 1 - 0
frontend/src/i18n/locales/uk.ts

@@ -1974,6 +1974,7 @@ export default {
     printerRemoved: "Принтер видалено",
     printerRemoved: "Принтер видалено",
     // Confirmation
     // Confirmation
     deleteTypeConfirm: "Видалити \"{{name}}\"?",
     deleteTypeConfirm: "Видалити \"{{name}}\"?",
+    deleteTypeAllPrinters: 'Його буде видалено з усіх принтерів, а не лише з ваших, разом з історією обслуговування.',
     deleteSystemTypeTitle: "Видалити завдання обслуговування за умовчанням?",
     deleteSystemTypeTitle: "Видалити завдання обслуговування за умовчанням?",
     deleteSystemTypeMessage: "Ви впевнені, що бажаєте видалити стандартне завдання обслуговування \"{{name}}\"?",
     deleteSystemTypeMessage: "Ви впевнені, що бажаєте видалити стандартне завдання обслуговування \"{{name}}\"?",
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/zh-CN.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: '打印机已移除',
     printerRemoved: '打印机已移除',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '删除"{{name}}"?',
     deleteTypeConfirm: '删除"{{name}}"?',
+    deleteTypeAllPrinters: '这会将其从所有打印机(而不仅是你的打印机)中删除,包括其维护记录。',
     deleteSystemTypeTitle: '删除默认维护任务?',
     deleteSystemTypeTitle: '删除默认维护任务?',
     deleteSystemTypeMessage: '确定要删除默认维护任务"{{name}}"吗?',
     deleteSystemTypeMessage: '确定要删除默认维护任务"{{name}}"吗?',
     // Permissions
     // Permissions

+ 1 - 0
frontend/src/i18n/locales/zh-TW.ts

@@ -1957,6 +1957,7 @@ export default {
     printerRemoved: '印表機已移除',
     printerRemoved: '印表機已移除',
     // Confirmation
     // Confirmation
     deleteTypeConfirm: '刪除"{{name}}"?',
     deleteTypeConfirm: '刪除"{{name}}"?',
+    deleteTypeAllPrinters: '這會將其從所有印表機(而不只是你的印表機)中刪除,包括其維護紀錄。',
     deleteSystemTypeTitle: '刪除預設維護任務?',
     deleteSystemTypeTitle: '刪除預設維護任務?',
     deleteSystemTypeMessage: '確定要刪除預設維護任務"{{name}}"嗎?',
     deleteSystemTypeMessage: '確定要刪除預設維護任務"{{name}}"嗎?',
     // Permissions
     // Permissions

+ 1 - 1
frontend/src/pages/MaintenancePage.tsx

@@ -905,7 +905,7 @@ function SettingsSection({
                   </button>
                   </button>
                   <button
                   <button
                     onClick={() => {
                     onClick={() => {
-                      if (confirm(t('maintenance.deleteTypeConfirm', { name: type.name }))) {
+                      if (confirm(`${t('maintenance.deleteTypeConfirm', { name: type.name })}\n\n${t('maintenance.deleteTypeAllPrinters')}`)) {
                         onDeleteType(type.id);
                         onDeleteType(type.id);
                       }
                       }
                     }}
                     }}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/AdditionalSection-DXRD7AnY.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/AmsUnitCard-DZxPS3xA.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ArchivesPage-Cc-Afs6N.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/AssignToAmsModal-DxMRLw9M.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/CamWallPage-CT2wYxz_.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/CameraDiagnoseModal-DFSm4iqj.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/CameraPage-DcsCiwvU.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/CameraWall-N2Nmuy_x.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ColumnConfigModal-BI9EKxKX.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ConfigureAmsSlotModal-oO1BYxjJ.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ConnectAuthorizePage--tchC0OA.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ContextMenu-DhMK-T4f.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ExternalLinkPage-CNM9LMax.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
static/assets/FileManagerPage-B6moaOZC.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/FileUploadModal-D-AYfZnD.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/FinancePage-76NLYr_U.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/GCodeViewerPage-fws-inQ6.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/GroupEditPage-CsOe4non.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ImagePreviewModal-CTlkt0sY.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/InventoryPage-BTq0yWoy.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/LibraryTrashPage-DjKLrLls.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/LoginPage-Czd50HzW.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/MaintenancePage-DnqHbNcD.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ModelSourcesPage-DNijFRF-.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/NotificationsPage-Cq-P-397.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 1
static/assets/PdfPreviewModal-B6sVcYE5.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/PhotoGalleryModal-BOqXKY8o.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/PrinterLocationsPage-D3LGywI1.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/PrintersPage-D20Q75tu.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ProfilesPage-CwhFzZRH.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ProjectDetailPage-B02Ky91G.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ProjectsPage-i8Xbxcq3.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/QueuePage-BThzYmt5.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/RichTextEditor-DkmKwPOG.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SettingsPage-CLOSy2Df.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SetupPage-CLzdfZGN.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SliceModal-CzgErUkx.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpoolBuddyAmsPage-BeqRXxPq.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpoolBuddyCalibrationPage-CI9EI9Si.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpoolBuddyDashboard-DFFhiXHA.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpoolBuddyInventoryPage-CCHfxrCJ.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1 - 1
static/assets/SpoolBuddySettingsPage-DUK8kwWy.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpoolBuddyWriteTagPage-BT0Cfenn.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SpreadsheetPreviewModal-DTYn6MjH.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/StatsPage-Cdep-gvR.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/StreamOverlayPage-CNK1gOAU.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/SystemInfoPage-Ciw-6MRc.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/de-CRIz-V_S.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/de-bIen8vBa.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/es-D3Lxzz5P.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/es-DJlNQ9n2.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/fr-CHlHrq6D.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/fr-Om92FA6_.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/index-CJ0w0cCi.js


+ 1 - 1
static/assets/inventorySearch-B6iqizR8.js → static/assets/inventorySearch-abrgiuGv.js

@@ -1 +1 @@
-import{ft as e}from"./index-CizsGNuz.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-CJ0w0cCi.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-4I6jx5bN.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/it-BvW9M3Vz.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ja-BNEUPGWW.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ja-D2EOAyJD.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ko-B-_J2Kfz.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ko-DfBFmlKY.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/locationSensorDefaults-BpOt1qFI.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/nl-bENooHN3.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/pdf-CWCRHxpU.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/pt-BR-92EhOKVO.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/pt-BR-CYc2SLsN.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ru-BIcZal2N.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/ru-D-8vaLZZ.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/sv-Din8JniN.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/sv-s25PQYIG.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/tr-DsMABk7-.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/tr-zuS-RAgq.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/uk-DtWUCD87.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/uk-VLDlCeAG.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/utils-HWU1IUBT.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/zh-CN-7T9n_nz-.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/zh-CN-CYCzjlSw.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/zh-TW-CUA15mBh.js


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
static/assets/zh-TW-D4Nxyg0K.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-CizsGNuz.js"></script>
+    <script type="module" crossorigin src="/assets/index-CJ0w0cCi.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-C3LdD0iY.js">
     <link rel="modulepreload" crossorigin href="/assets/client-C3LdD0iY.js">
     <link rel="modulepreload" crossorigin href="/assets/QueryClientProvider-DzWmuIjj.js">
     <link rel="modulepreload" crossorigin href="/assets/QueryClientProvider-DzWmuIjj.js">

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است