diff --git a/VERSION b/VERSION index 10c2c0c3..46b81d81 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.10.0 +2.11.0 diff --git a/assets/controllers/elements/datatables/datatables_controller.js b/assets/controllers/elements/datatables/datatables_controller.js index 98b9cf29..d945004b 100644 --- a/assets/controllers/elements/datatables/datatables_controller.js +++ b/assets/controllers/elements/datatables/datatables_controller.js @@ -83,8 +83,6 @@ export default class extends Controller { if (data) { //Do not save the start value (current page), as we want to always start at the first page on a page reload delete data.start; - //Reset the data length to the default value by deleting the length property - delete data.length; } return data; diff --git a/config/packages/datatables.yaml b/config/packages/datatables.yaml index f1ea4715..fe238a1e 100644 --- a/config/packages/datatables.yaml +++ b/config/packages/datatables.yaml @@ -8,7 +8,7 @@ datatables: # Set options, as documented at https://datatables.net/reference/option/ options: - lengthMenu : [[10, 25, 50, 100], [10, 25, 50, 100]] # We add the "All" option, when part tables are generated + lengthMenu : [[10, 25, 50, 100, 250, 500], [10, 25, 50, 100, 250, 500]] # We add the "All" option, when part tables are generated #pageLength: '%partdb.table.default_page_size%' # Set to -1 to disable pagination (i.e. show all rows) by default pageLength: 50 #TODO dom: " <'row' <'col mb-2 input-group flex-nowrap' B l > <'col-auto mb-2' < p >>> diff --git a/src/Controller/AdminPages/BaseAdminController.php b/src/Controller/AdminPages/BaseAdminController.php index c737e291..b7c25229 100644 --- a/src/Controller/AdminPages/BaseAdminController.php +++ b/src/Controller/AdminPages/BaseAdminController.php @@ -34,6 +34,7 @@ use App\Entity\Base\PartsContainingRepositoryInterface; use App\Entity\LabelSystem\LabelProcessMode; use App\Entity\LabelSystem\LabelProfile; use App\Entity\Parameters\AbstractParameter; +use App\Entity\UserSystem\User; use App\Exceptions\AttachmentDownloadException; use App\Exceptions\TwigModeException; use App\Form\AdminPages\ImportType; @@ -196,7 +197,9 @@ abstract class BaseAdminController extends AbstractController $this->commentHelper->setMessage($form['log_comment']->getData()); //In principle, the form should be disabled, if the edit permission is not granted, but for good measure, we also check it here, before saving changes. - $this->denyAccessUnlessGranted('edit', $entity); + if (!$entity instanceof User) { //Users entities does not have a simple edit permission, so we skip the check for them + $this->denyAccessUnlessGranted('edit', $entity); + } $em->persist($entity); $em->flush(); $this->addFlash('success', 'entity.edit_flash'); diff --git a/src/DataTables/PartsDataTable.php b/src/DataTables/PartsDataTable.php index b34eef9d..bcf64056 100644 --- a/src/DataTables/PartsDataTable.php +++ b/src/DataTables/PartsDataTable.php @@ -60,7 +60,7 @@ use Symfony\Contracts\Translation\TranslatorInterface; final class PartsDataTable implements DataTableTypeInterface { - const LENGTH_MENU = [[10, 25, 50, 100, -1], [10, 25, 50, 100, "All"]]; + public const LENGTH_MENU = [[10, 25, 50, 100, 250, 500, -1], [10, 25, 50, 100, 250, 500, "All"]]; public function __construct( private readonly EntityURLGenerator $urlGenerator, diff --git a/src/Entity/Parts/Category.php b/src/Entity/Parts/Category.php index 7fca81bc..22f8a3e4 100644 --- a/src/Entity/Parts/Category.php +++ b/src/Entity/Parts/Category.php @@ -208,6 +208,15 @@ class Category extends AbstractPartsContainingDBElement $this->eda_info = new EDACategoryInfo(); } + public function __clone() + { + if ($this->id) { + //Clone EDA info to prevent changes to the original EDA info when changing the cloned category + $this->eda_info = clone $this->eda_info; + } + parent::__clone(); + } + public function getPartnameHint(): string { return $this->partname_hint; diff --git a/src/Entity/Parts/Footprint.php b/src/Entity/Parts/Footprint.php index 6b043562..3d8be686 100644 --- a/src/Entity/Parts/Footprint.php +++ b/src/Entity/Parts/Footprint.php @@ -152,6 +152,15 @@ class Footprint extends AbstractPartsContainingDBElement $this->eda_info = new EDAFootprintInfo(); } + public function __clone() + { + if ($this->id) { + //Clone EDA info to prevent changes to the original EDA info when changing the cloned category + $this->eda_info = clone $this->eda_info; + } + parent::__clone(); + } + /**************************************** * Getters ****************************************/ diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index 7e070ff2..e5020c06 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -1,6 +1,6 @@ - + attachment_type.caption @@ -2779,7 +2779,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr Name - + part.table.si_value SI-Wert @@ -7217,13 +7217,13 @@ Element 1 -> Element 1.2 Unterprojekte - + project.info.total_build_price Gesamterstellpreis - + project.info.per_unit_price pro Einheit @@ -7253,7 +7253,7 @@ Element 1 -> Element 1.2 Preis - + project.bom.ext_price Gesamtpreis @@ -10052,85 +10052,85 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Wenn aktiviert, verlinkt das Datenblatt-Feld in KiCad auf die tatsächliche PDF-Datei (sofern gefunden). Wenn deaktiviert, führt es stattdessen zur Part-DB-Seite. Der Link zur Part-DB-Seite ist immer als separates "Part-DB URL"-Feld verfügbar. - + settings.misc.kicad_eda.editor.title KiCad Autovervollständigungslisten - + settings.misc.kicad_eda.editor.link Autovervollständigungseinstellungen - + settings.misc.kicad_eda.editor.description Konfigurieren Sie, ob KiCad Autovervollständigung die automatisch generierten Standardlisten oder Ihre benutzerdefinierten Überschreibungsdateien verwendet. Die benutzerdefinierten Dateien sind hier bearbeitbar, während die Standarddateien nur lesbar zur Referenz angezeigt werden. - + settings.misc.kicad_eda.editor.footprints Footprint-Liste - + settings.misc.kicad_eda.editor.footprints.help Ein Eintrag pro Zeile. Wird als Autovervollständigungsvorschlag für KiCad-Footprintfelder verwendet. - + settings.misc.kicad_eda.editor.symbols Symbolliste - + settings.misc.kicad_eda.editor.symbols.help Ein Eintrag pro Zeile. Wird als Autovervollständigungsvorschlag für KiCad-Symbolfelder verwendet. - + settings.misc.kicad_eda.use_custom_list Benutzerdefinierte Autovervollständigungslisten verwenden - + settings.misc.kicad_eda.use_custom_list.help Wenn aktiviert, verwendet die KiCad Autovervollständigung public/kicad/footprints_custom.txt und public/kicad/symbols_custom.txt anstelle der automatisch generierten Standarddateien. - + settings.misc.kicad_eda.editor.custom_footprints Benutzerdefinierte Footprint-Liste - + settings.misc.kicad_eda.editor.custom_symbols Benutzerdefinierte Symbolliste - + settings.misc.kicad_eda.editor.default_footprints Standard Footprint-Liste - + settings.misc.kicad_eda.editor.default_symbols Standardsymboliste - + settings.misc.kicad_eda.editor.default_files_help Automatisch generierte Datei wird nur zur Referenz angezeigt. Änderungen müssen in der benutzerdefinierten Liste vorgenommen werden. @@ -11210,6 +11210,96 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Bauteil aktualisieren + + + info_providers.bulk_import.back_to_jobs + Zurück zu Jobs + + + + + info_providers.bulk_import.back_to_parts + Zurück zu Bauteilen + + + + + info_providers.bulk_import.job_completed + Auftrag abgeschlossen! + + + + + info_providers.bulk_import.job_completed.description + Alle Bauteile wurden verarbeitet. Sie können die Ergebnisse unten überprüfen oder zur Bauteileliste zurückkehren. + + + + + info_providers.bulk_import.recommended + Top + + + + + info_providers.bulk_import.exact_match + Exakte Namensübereinstimmung + + + + + info_providers.bulk_import.mpn_match + MPN-Übereinstimmungen + + + + + info_providers.bulk_import.active_jobs + Aktive Jobs + + + + + info_providers.bulk_import.finished_jobs + Verlauf + + + + + info_providers.bulk_import.spn_match + SPN-Übereinstimmungen + + + + + info_providers.bulk_import.match + Übereinstimmung + + + + + info_providers.bulk_import.quick_apply + Schnellanwendung + + + + + info_providers.bulk_import.quick_apply.tooltip + Dieses Anbietergebnis auf das Bauteil anwenden, ohne das Bearbeitungsformular zu öffnen + + + + + info_providers.bulk_import.quick_apply_all + Alle anwenden (Top Ergebnisse) + + + + + info_providers.bulk_import.quick_apply_all.tooltip + Das bestplatzierte Suchergebnis auf alle ausstehenden Teile ohne einzelne Überprüfung anwenden + + info_providers.bulk_import.prefetch_details @@ -13053,6 +13143,312 @@ Buerklin-API-Authentication-Server: Backup-Download erlaubt + + + update_manager.docker.setup_title + Aktivieren Sie Docker-Updates mit einem Klick über Watchtower + + + + + update_manager.docker.setup_description + Part-DB kann Ihre Docker-Container automatisch mit Watchtower aktualisieren, einem Open-Source-Container-Updater. Fügen Sie Watchtower als Begleitcontainer hinzu und konfigurieren Sie die Verbindung unten. + + + + + update_manager.docker.setup_step1 + 1. Fügen Sie Watchtower zu Ihrer docker-compose.yml hinzu: + + + + + update_manager.docker.setup_step2 + 2. Fügen Sie diese Umgebungsvariablen zu Ihrem Part-DB Container hinzu: + + + + + update_manager.docker.setup_network_hint + Stellen Sie sicher, dass Part-DB und Watchtower im selben Docker-Netzwerk sind. Wenn Sie label-basierte Filterung in Watchtower verwenden (WATCHTOWER_LABEL_ENABLE=true), fügen Sie dem Part-DB Container das Label "com.centurylinklabs.watchtower.enable=true" hinzu. + + + + + update_manager.docker.watchtower_unreachable_title + Watchtower nicht erreichbar + + + + + update_manager.docker.watchtower_unreachable_description + Watchtower ist konfiguriert, kann aber nicht erreicht werden. Bitte prüfen Sie, ob der Watchtower-Container läuft und ob URL und Token korrekt sind. + + + + + update_manager.docker.confirm_update + Sind Sie sicher, dass Sie Part-DB über Watchtower aktualisieren möchten? Der Container wird mit dem neuen Image neu gestartet. Im Gegensatz zu Git-Updates können Docker-Updates nicht automatisch zurückgesetzt werden. + + + + + update_manager.docker.update_via_watchtower + Update über Watchtower zu + + + + + update_manager.docker.no_rollback_warning + Docker-Updates können nicht automatisch zurückgesetzt werden. Vor dem Update wird eine Datenbanksicherung erstellt, damit Sie Ihre Daten bei Bedarf wiederherstellen können. + + + + + update_manager.docker.progress_title + Docker-Update läuft + + + + + update_manager.docker.waiting_for_watchtower + Warte darauf, dass Watchtower das neue Image zieht... + + + + + update_manager.docker.elapsed + Verstrichen + + + + + update_manager.docker.waiting_title + Update gestartet + + + + + update_manager.docker.waiting_description + Watchtower wurde benachrichtigt. Es wird das neueste Docker-Image ziehen und den Part-DB-Container neu starten. + + + + + update_manager.docker.watchtower_working + Watchtower verarbeitet das Update... + + + + + update_manager.docker.watchtower_working_hint + Je nach Internetgeschwindigkeit und Imagegröße kann dies einige Minuten dauern. + + + + + update_manager.docker.restarting_title + Container wird neu gestartet + + + + + update_manager.docker.restarting_description + Watchtower hat das neue Image gezogen und startet den Part-DB-Container neu. + + + + + update_manager.docker.restarting_hint + Die Seite erkennt automatisch, wenn der Server wieder online ist. Dies dauert normalerweise 10-30 Sekunden. + + + + + update_manager.docker.success_title + Update abgeschlossen! + + + + + update_manager.docker.success_message + Part-DB wurde erfolgreich über Watchtower aktualisiert. + + + + + update_manager.docker.previous_version + Vorherige Version + + + + + update_manager.docker.new_version + Neue Version + + + + + update_manager.docker.back_to_update_manager + Zurück zum Update-Manager + + + + + update_manager.docker.go_to_homepage + Zur Startseite + + + + + update_manager.docker.timeout_title + Update dauert länger als erwartet + + + + + update_manager.docker.timeout_message + Das Update dauert länger als erwartet. Prüfen Sie die Watchtower-Container-Logs für Details. Das Update kann noch laufen. + + + + + update_manager.docker.retry + Erneut versuchen + + + + + update_manager.docker.warning + Warnung + + + + + update_manager.docker.do_not_close + Schließen Sie diese Seite nicht. Sie erkennt automatisch, wenn das Update abgeschlossen ist. + + + + + update_manager.docker.updating_via_watchtower + Update über Watchtower wird durchgeführt + + + + + update_manager.docker.step_waiting + Image wird gezogen + + + + + update_manager.docker.steps + Update-Schritte + + + + + update_manager.docker.step_trigger + Update auslösen + + + + + update_manager.docker.step_trigger_desc + Watchtower wurde benachrichtigt, nach Updates zu suchen + + + + + update_manager.docker.step_pull + Neues Image ziehen + + + + + update_manager.docker.step_pull_desc + Lade das neueste Docker-Image aus dem Register + + + + + update_manager.docker.step_restart + Container neu starten + + + + + update_manager.docker.step_restart_desc + Alten Container stoppen und neuen starten + + + + + update_manager.docker.step_verify + Verifizieren + + + + + update_manager.docker.step_verify_desc + Bestätige, dass Part-DB mit der neuen Version läuft + + + + + update_manager.docker.watchtower_status + Watchtower + + + + + update_manager.docker.watchtower_connected + Verbunden + + + + + update_manager.docker.watchtower_unreachable_short + Nicht erreichbar + + + + + update_manager.docker.watchtower_not_configured + Nicht konfiguriert + + + + + update_manager.docker.step_stop + Container stoppen + + + + + update_manager.docker.step_stop_desc + Aktuellen Container vor der Neuerstellung ordentlich stoppen + + + + + update_manager.docker.step_health + Health Check + + + + + update_manager.docker.step_health_desc + Warte darauf, dass der neue Container den Health Check besteht + + + + + update_manager.docker.updating + Part-DB wird über Docker aktualisiert... + + part.create_from_info_provider.lot_filled_from_barcode @@ -13065,5 +13461,149 @@ Buerklin-API-Authentication-Server: Zuordnungsfehler: Bitte prüfen Sie, ob Sie das richtige Trennzeichen ausgewählt haben! + + + settings.ai + KI + + + + + settings.ai.openrouter + OpenRouter + + + + + settings.ai.lmstudio + LMStudio + + + + + settings.ips.ai_extractor.model + KI-Modell + + + + + settings.ips.ai_extractor.ai_platform + KI-Plattform + + + + + settings.ips.ai_extractor.model.help + Das KI-Modell, das für die Extraktion verwendet werden soll. Muss strukturierte Ausgaben unterstützen. + + + + + settings.ips.ai_extractor.max_content_length + Maximale Webseitentextlänge + + + + + settings.ips.ai_extractor.max_content_length.description + Die maximale Anzahl an Zeichen der Webseite, die an den KI-Dienst gesendet werden. + + + + + settings.ips.ai_extractor.output_language + Ausgabesprache + + + + + settings.ips.ai_extractor.output_language.description + Standardmäßig liefern die Anbieter Informationen in der gleichen Sprache wie die Webseite. Mit dieser Option können Sie die KI bitten, für Sie zu übersetzen. Funktioniert möglicherweise nur mit bestimmten Modellen. + + + + + settings.ips.ai_extractor.additional_instructions + Zusätzliche Anweisungen + + + + + settings.ips.ai_extractor.additional_instructions.description + Die zusätzlichen Anweisungen werden an den System-Prompt angehängt. + + + + + info_providers.search.advanced_options + Erweiterte Optionen + + + + + info_providers.no_cache_search + Suchergebnisse nicht zwischenspeichern / Neue Suche erzwingen + + + + + info_providers.no_cache_details + Ergebnisdetails nicht zwischenspeichern / Neue Detailabfrage erzwingen + + + + + info_providers.from_url.method.generic_web + Klassischer Web-Scraper + + + + + info_providers.from_url.method.ai_web + KI Web-Scraper + + + + + info_providers.from_url.method + Methode + + + + + info_providers.from_url.no_cache + Cache ignorieren / Neue Infoabfrage erzwingen + + + + + info_providers.from_url.skip_delegation + Nicht an spezialisierte Infoanbieter delegieren + + + + + settings.ips.ai_extractor + KI Web Extraktor + + + + + settings.ips.ai_extractor.description + Dieser Infoanbieter verwendet ein großes Sprachmodell (LLM), um detaillierte Teileinformationen von beliebigen Shop-URLs zu extrahieren. + + + + + settings.ai.openrouter.help + Zugriff auf viele KI-Modelle über openrouter.ai + + + + + settings.ai.lmstudio.hosturl + Host-URL + +