@rebasepro/app 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +1 -1
  2. package/dist/RlsSimulatorPanel-DOfmVgM3.js +403 -0
  3. package/dist/RlsSimulatorPanel-DOfmVgM3.js.map +1 -0
  4. package/dist/collections/form-layout.d.ts +30 -27
  5. package/dist/components/LanguageToggle.d.ts +9 -0
  6. package/dist/components/LoginView/index.d.ts +7 -0
  7. package/dist/components/index.d.ts +1 -0
  8. package/dist/components/studio/RlsSimulatorBar.d.ts +39 -0
  9. package/dist/components/studio/RlsSimulatorPanel.d.ts +29 -0
  10. package/dist/contexts/RlsSimulationContext.d.ts +47 -0
  11. package/dist/contexts/index.d.ts +1 -0
  12. package/dist/core/effective_role_state.d.ts +9 -0
  13. package/dist/{de-BMgOgwue.js → de-3yzzpuZj.js} +175 -1
  14. package/dist/de-3yzzpuZj.js.map +1 -0
  15. package/dist/debug.js +96 -46
  16. package/dist/{es-DSOOSgPW.js → es-mnyTaRkK.js} +175 -1
  17. package/dist/es-mnyTaRkK.js.map +1 -0
  18. package/dist/{fr-CnXidmZf.js → fr-nJHADzlI.js} +175 -1
  19. package/dist/fr-nJHADzlI.js.map +1 -0
  20. package/dist/{hi-lTvNsFMr.js → hi-B9_iunnL.js} +175 -1
  21. package/dist/hi-B9_iunnL.js.map +1 -0
  22. package/dist/hooks/useBuildEffectiveRoleController.d.ts +9 -3
  23. package/dist/hooks/usePermissions.d.ts +4 -0
  24. package/dist/hooks/useUnsavedChangesDialog.d.ts +7 -1
  25. package/dist/i18n/RebaseI18nProvider.d.ts +11 -0
  26. package/dist/index.es.js +2814 -2555
  27. package/dist/index.es.js.map +1 -1
  28. package/dist/{it-BoT_vBlx.js → it-DoEtz-OK.js} +175 -1
  29. package/dist/it-DoEtz-OK.js.map +1 -0
  30. package/dist/{pt-D9mSchbY.js → pt-DT26AmBU.js} +175 -1
  31. package/dist/pt-DT26AmBU.js.map +1 -0
  32. package/package.json +7 -7
  33. package/dist/de-BMgOgwue.js.map +0 -1
  34. package/dist/es-DSOOSgPW.js.map +0 -1
  35. package/dist/fr-CnXidmZf.js.map +0 -1
  36. package/dist/hi-lTvNsFMr.js.map +0 -1
  37. package/dist/it-BoT_vBlx.js.map +0 -1
  38. package/dist/pt-D9mSchbY.js.map +0 -1
@@ -0,0 +1,29 @@
1
+ /**
2
+ * The "Simulate access" pill and banner themselves. Loaded on demand by the
3
+ * wrappers in `RlsSimulatorBar.tsx`: only an administrator ever sees them, so
4
+ * nobody else downloads them before the login screen paints.
5
+ */
6
+ import React from "react";
7
+ import { type RlsSimulatorBarProps } from "./RlsSimulatorBar.js";
8
+ /**
9
+ * "Simulate access": the app bar pill that runs every data view as a role, a
10
+ * user or a service key, so an administrator sees exactly the rows and fields
11
+ * that identity's row-level security lets it read.
12
+ *
13
+ * Shown only to an administrator, and only when the data views ride a client
14
+ * that can derive a simulated one. The server checks the first again on every
15
+ * request: anyone else sending the simulation headers gets a 403.
16
+ *
17
+ * @group Components
18
+ */
19
+ export declare function RlsSimulatorBarPanel({ className, compact, side, align, portalContainer }: RlsSimulatorBarProps): React.JSX.Element | null;
20
+ /**
21
+ * The banner every screen shows while access is simulated: who the data views
22
+ * run as, how many collections show that identity nothing, how many fields its
23
+ * roles cannot read — and the way out.
24
+ *
25
+ * @group Components
26
+ */
27
+ export declare function RlsSimulationBannerPanel({ className }: {
28
+ className?: string;
29
+ }): React.JSX.Element | null;
@@ -0,0 +1,47 @@
1
+ import React from "react";
2
+ import type { AccessSimulation } from "@rebasepro/types";
3
+ /**
4
+ * How the banner names what is simulated — a key's name, a user's email —
5
+ * which the headers alone do not carry.
6
+ *
7
+ * @group Models
8
+ */
9
+ export type RlsSimulationLabel = {
10
+ kind: "role";
11
+ role: string;
12
+ userId?: string;
13
+ } | {
14
+ kind: "user";
15
+ user: string;
16
+ } | {
17
+ kind: "apiKey";
18
+ name: string;
19
+ keyPrefix: string;
20
+ };
21
+ /**
22
+ * The RLS simulator's state: what the admin panel's data views run as.
23
+ *
24
+ * While `simulation` is set, every data view reads through a client derived
25
+ * with `client.simulate()`, so a grid shows exactly the rows and fields that
26
+ * role, user or key can read. `null` is the signed-in administrator.
27
+ *
28
+ * @group Models
29
+ */
30
+ export interface RlsSimulationController {
31
+ /**
32
+ * Whether simulation is possible here: the client can derive a simulated
33
+ * one, and the default data source is that client (not a direct driver).
34
+ */
35
+ available: boolean;
36
+ simulation: AccessSimulation | null;
37
+ label: RlsSimulationLabel | null;
38
+ setSimulation(simulation: AccessSimulation | null, label?: RlsSimulationLabel | null): void;
39
+ }
40
+ export declare const RlsSimulationContext: React.Context<RlsSimulationController>;
41
+ /**
42
+ * The RLS simulator's state, for the bar that sets it and the banner that
43
+ * shows it.
44
+ *
45
+ * @group Hooks and utilities
46
+ */
47
+ export declare function useRlsSimulation(): RlsSimulationController;
@@ -16,3 +16,4 @@ export * from "./CustomizationControllerContext.js";
16
16
  export * from "./ComponentOverrideContext.js";
17
17
  export * from "./CollectionScopeContext.js";
18
18
  export * from "./CollectionResolverContext.js";
19
+ export * from "./RlsSimulationContext.js";
@@ -0,0 +1,9 @@
1
+ import type { EffectiveRoleController } from "@rebasepro/types";
2
+ /**
3
+ * The effective role controller `<Rebase>` falls back to when the host passes
4
+ * none. Kept apart from the deprecated public hook
5
+ * (`useBuildEffectiveRoleController`) so building it does not report a
6
+ * deprecation the app never used, and out of the hooks barrel so it is not a
7
+ * public export.
8
+ */
9
+ export declare function useEffectiveRoleState(): EffectiveRoleController;
@@ -196,6 +196,30 @@ var de = {
196
196
  error_firestore_index: "Für diese Abfrage ist ein Firestore-Index erforderlich.",
197
197
  realtime_connection_lost_title: "Live-Aktualisierungen pausiert",
198
198
  realtime_connection_lost_body: "Die Verbindung zum Server ist unterbrochen, daher ist das Angezeigte möglicherweise nicht mehr aktuell. Es wird aktualisiert, sobald die Verbindung wieder besteht.",
199
+ rls_simulate_access: "Zugriff simulieren",
200
+ rls_simulate_access_description: "Jede Sammlung so sehen, wie eine Rolle, ein Benutzer oder ein Dienstschlüssel sie sähe: Zeilen und Felder, die ihre Sicherheit auf Zeilenebene verbirgt, fehlen.",
201
+ rls_simulate_tab_role: "Rolle",
202
+ rls_simulate_tab_user: "Benutzer",
203
+ rls_simulate_tab_api_key: "API-Schlüssel",
204
+ rls_simulate_user_id_optional: "Als Benutzer-ID (optional)",
205
+ rls_simulate_apply: "Simulieren",
206
+ rls_simulate_stop: "Simulation beenden",
207
+ rls_simulate_search_users: "Benutzer suchen",
208
+ rls_simulate_no_users: "Keine Benutzer gefunden.",
209
+ rls_simulate_no_api_keys: "Keine aktiven Dienstschlüssel.",
210
+ rls_simulate_options_error: "Was simuliert werden kann, ließ sich nicht laden: {{message}}",
211
+ rls_simulate_users_error: "Benutzer ließen sich nicht laden: {{message}}",
212
+ rls_simulation_viewing_as_role: "Ansicht als Rolle {{role}}",
213
+ rls_simulation_viewing_as_role_user: "Ansicht als {{user}} mit der Rolle {{role}}",
214
+ rls_simulation_viewing_as_user: "Ansicht als Benutzer {{user}}",
215
+ rls_simulation_viewing_as_api_key: "Ansicht als API-Schlüssel {{name}} ({{prefix}}…)",
216
+ rls_simulation_hidden_collections: "{{count}} Sammlungen verborgen",
217
+ rls_simulation_hidden_collections_one: "1 Sammlung verborgen",
218
+ rls_simulation_masked_columns: "{{count}} Spalten durch RLS maskiert",
219
+ rls_simulation_masked_columns_one: "1 Spalte durch RLS maskiert",
220
+ rls_simulation_counting: "Es wird gezählt, was diese Identität lesen kann…",
221
+ rls_simulation_count_failed: "Was diese Identität lesen kann, ließ sich nicht zählen: {{message}}",
222
+ rls_simulation_note: "Datenansichten zeigen nur die Zeilen und Felder, die diese Identität lesen kann. Bearbeiten ist während der Simulation ausgeschaltet: Beenden Sie die Simulation, um Änderungen vorzunehmen. Live-Aktualisierungen pausieren.",
199
223
  create_index: "Index erstellen",
200
224
  value_is_not_reference: "Wert ist keine Referenz.",
201
225
  click_to_edit: "Klicken zum Bearbeiten",
@@ -957,6 +981,7 @@ var de = {
957
981
  studio_policy_help_step4_title: "4. WITH CHECK-Ausdruck",
958
982
  studio_policy_help_step4_desc: "Eine SQL-Bedingung, die wahr sein muss, damit neue oder geänderte Zeilen gespeichert werden (INSERT, UPDATE).",
959
983
  studio_policy_help_step4_example: "Meist identisch mit dem USING-Ausdruck, wenn Benutzer nur ihre eigenen Daten anlegen oder bearbeiten dürfen.",
984
+ studio_policy_help_example: "Beispiel:",
960
985
  studio_policy_help_auth_vars_title: "Rebase-Auth-Variablen",
961
986
  studio_policy_help_auth_vars_desc: "Rebase stellt native Hilfsfunktionen bereit, die Sie in Ihren Ausdrücken verwenden können:",
962
987
  studio_policy_help_auth_uid: "Gibt die ID des aktuellen Benutzers als Text zurück. Beispiel:",
@@ -1019,12 +1044,69 @@ var de = {
1019
1044
  studio_collections_editor_pick: "Wähle eine Sammlung aus oder lege eine neue an, um mit dem Bearbeiten zu beginnen.",
1020
1045
  studio_collections_editor_read_only: "Sammlungen können auf diesem Server nicht bearbeitet werden.",
1021
1046
  studio_collections_editor_unsaved: "Diese Sammlung hat ungespeicherte Änderungen.",
1047
+ schema_change_title_review: "Schemaänderung prüfen",
1048
+ schema_change_title_applied: "Schemaänderung angewendet",
1049
+ schema_change_title_committed: "Schemaänderung committet",
1050
+ schema_change_verdict_safe_title: "Bereit zum Anwenden",
1051
+ schema_change_verdict_safe_body: "Jede Änderung hier lässt sich an der laufenden Datenbank vornehmen.",
1052
+ schema_change_verdict_diverges_title: "Damit wäre die Datenbank nicht mehr auf demselben Stand",
1053
+ schema_change_verdict_diverges_body: "Die Änderung kann geschrieben werden, aber die Datenbank wird ihr am Ende nicht entsprechen. Die Details unten sagen, welcher Teil, und was sie anwendbar machen würde.",
1054
+ schema_change_verdict_migration_title: "Dafür ist eine Migration nötig",
1055
+ schema_change_verdict_migration_body: "Ein Teil davon lässt sich an einer laufenden Datenbank gar nicht vornehmen — er löscht oder schreibt etwas um, und das gehört in eine Migration, die jemand gelesen hat.",
1056
+ schema_change_commit_only_title: "Bereit zum Committen",
1057
+ schema_change_commit_only_body: "Jetzt wird nichts an der Datenbank ausgeführt. Jede Änderung unten sagt, was sie bewirkt und wann sie wirksam wird.",
1058
+ schema_change_commit_only_body_no_changes: "Das ändert, was Ihr Projekt deklariert. An der Datenbank wird nichts ausgeführt — es gibt keine Schemaänderung vorzunehmen.",
1059
+ schema_change_chip_safe: "sicher",
1060
+ schema_change_chip_diverges: "weicht ab",
1061
+ schema_change_chip_migration: "Migration nötig",
1062
+ schema_change_follow_up_one: "Danach ist noch eine Sache zu tun",
1063
+ schema_change_follow_up: "Danach zu tun",
1064
+ schema_change_withheld_one: "Eine Einschränkung wird nicht durchgesetzt",
1065
+ schema_change_withheld_many: "{{count}} Einschränkungen werden nicht durchgesetzt",
1066
+ schema_change_db_not_changed: "Die Datenbank wurde nicht geändert",
1067
+ schema_change_db_maybe_changed: "Die Datenbank wurde möglicherweise teilweise geändert",
1068
+ schema_change_statements_partial: "{{ran}} von {{total}} Anweisungen liefen, dann schlug eine fehl",
1069
+ schema_change_commit_holds: "Der Commit ist in jedem Fall auf {{branch}}, also wird alles, was nicht lief, beim nächsten Start angewendet.",
1070
+ schema_change_committed: "Committet",
1071
+ schema_change_committed_on: "{{sha}} auf {{branch}}",
1072
+ schema_change_plan_failed: "Die Änderung konnte nicht geplant werden",
1073
+ schema_change_planning: "Es wird ermittelt, was diese Änderung bewirken würde…",
1074
+ schema_change_source_only_changes: "Nichts hiervon ändert die Struktur Ihrer Daten. Nur der Quellcode der Sammlung ändert sich, und er wird committet.",
1075
+ schema_change_source_only_title: "Nur Quellcode bearbeiten: die Sammlung committen, die Datenbank unverändert lassen",
1076
+ schema_change_preview_only: "Sie können diese Änderung in der Vorschau sehen, aber nicht anwenden",
1077
+ schema_change_statements: "Anweisungen, die ausgeführt werden",
1078
+ schema_change_files: "Dateien, die committet werden",
1079
+ schema_change_message: "Commit-Nachricht",
1080
+ schema_change_edit_source_only: "Nur Quellcode bearbeiten",
1081
+ schema_change_committing: "Wird committet…",
1082
+ schema_change_applying: "Wird angewendet…",
1083
+ schema_change_commit: "Committen",
1084
+ schema_change_commit_and_apply: "Committen und anwenden",
1085
+ studio_api_explorer_spec_refused_title: "Diese Sitzung kann die API-Spezifikation nicht lesen",
1086
+ studio_api_explorer_spec_failed_title: "Die API-Spezifikation konnte nicht geladen werden",
1087
+ studio_api_explorer_spec_refused_body: "Der Zugriff der Konsole auf die API dieses Projekts wurde verweigert. Meist ist die Sitzung abgelaufen — melden Sie sich erneut an — oder der Konsolenzugriff wurde für dieses Projekt in den Einstellungen deaktiviert.",
1088
+ studio_api_explorer_spec_failed_body: "Das Projekt hat geantwortet, aber nicht mit einer Spezifikation, die dieser Explorer lesen kann. Seine API ist nicht betroffen, nur diese Seite.",
1022
1089
  db_column_type: "Datenbank-Spaltentyp",
1023
1090
  primary_key_unique_id: "Primärschlüssel / Eindeutige ID",
1024
1091
  spread_children_as_columns: "Kinder als Spalten aufteilen",
1025
1092
  mode: "Modus",
1026
1093
  timezone: "Zeitzone",
1027
1094
  target_collection: "Zielsammlung",
1095
+ column_type_default: "Standard ({{type}})",
1096
+ column_type_uuid_forced: "uuid (durch den Primärschlüssel vorgegeben)",
1097
+ column_type_varchar: "varchar (variable Länge)",
1098
+ column_type_text: "text (unbegrenzt)",
1099
+ column_type_char: "char (feste Länge)",
1100
+ column_type_timestamp: "timestamp (mit Zeitzone)",
1101
+ column_type_caption_string: "Optional: abweichender Datenbank-Spaltentyp für dieses Textfeld.",
1102
+ column_type_caption_number: "Optional: abweichender Datenbank-Spaltentyp für dieses Zahlenfeld.",
1103
+ column_type_caption_date: "Optional: abweichender Datenbank-Spaltentyp für dieses Datumsfeld.",
1104
+ primary_key_manual: "Ja (manuelle Eingabe)",
1105
+ primary_key_generated_string: "Ja (automatisch erzeugte UUID/Zeichenkette)",
1106
+ primary_key_identity: "Ja (Auto-Inkrement/Identity)",
1107
+ primary_key_increment: "Ja (Inkrement)",
1108
+ primary_key_strategy: "Ja ({{strategy}})",
1109
+ primary_key_caption: "Als Primärschlüssel festlegen und die Strategie zur ID-Erzeugung einstellen.",
1028
1110
  storage_file_name: "Dateiname",
1029
1111
  storage_path: "Speicherpfad",
1030
1112
  storage_max_size: "Maximale Größe (in Bytes)",
@@ -1040,6 +1122,14 @@ var de = {
1040
1122
  storage_include_bucket_url: "Bucket-URL (s3://...) im gespeicherten Wert einschließen",
1041
1123
  storage_save_url: "URL anstelle des Speicherpfads speichern",
1042
1124
  datetime_automatic_value: "Automatischer Wert",
1125
+ datetime_mode_date_time: "Datum/Uhrzeit",
1126
+ datetime_mode_date: "Datum",
1127
+ datetime_auto_value_none: "Keiner",
1128
+ datetime_auto_value_on_create: "Beim Erstellen",
1129
+ datetime_auto_value_on_update: "Bei jeder Aktualisierung",
1130
+ datetime_auto_value_caption: "Dieses Feld beim Erstellen oder Aktualisieren des Datensatzes automatisch setzen",
1131
+ datetime_timezone_local: "Lokale Zeitzone",
1132
+ datetime_timezone_caption: "Zeitzone für die Anzeige und Eingabe von Datumswerten. Gespeichert wird immer in UTC.",
1043
1133
  markdown_paste_behavior: "Einfügeverhalten",
1044
1134
  entity_saved: "Gespeichert",
1045
1135
  more_actions: "Weitere Aktionen",
@@ -1315,6 +1405,61 @@ var de = {
1315
1405
  studio_rls_nothing_changed: "Nichts geändert, daher wurde nichts gespeichert.",
1316
1406
  studio_branches_unavailable_title: "Datenbank-Branching ist nicht verfügbar",
1317
1407
  studio_branches_unavailable_body: "Branching benötigt ein Postgres-Backend mit einer Admin-Verbindung. Setze ADMIN_CONNECTION_STRING in der Umgebung des Backends.",
1408
+ studio_branch_diff_tab_schema: "Schema und RLS-Richtlinien",
1409
+ studio_branch_diff_tab_data: "Datenänderungen",
1410
+ studio_branch_diff_tab_details: "Einzelheiten",
1411
+ studio_branch_diff_merge: "In {{target}} zusammenführen",
1412
+ studio_branch_diff_failed: "Dieser Branch konnte nicht verglichen werden",
1413
+ studio_branch_diff_denied_title: "Du kannst diesen Branch nicht prüfen",
1414
+ studio_branch_diff_denied_hint: "Einen Branch zu prüfen erfordert den Scope database:write: Sein Diff zeigt Zeilen beider Datenbanken, gelesen außerhalb der Row-Level-Security.",
1415
+ studio_branch_diff_unreadable: "Der Server antwortete mit etwas, das kein Branch-Diff ist.",
1416
+ studio_branch_diff_no_api: "Dieses Panel hat keine Backend-Adresse, von der es den Diff des Branches lesen könnte.",
1417
+ studio_branch_diff_fork_unknown: "Der Zeitpunkt, zu dem dieser Branch erstellt wurde, ließ sich nicht lesen. Jede abweichende Zeile zählt daher als Änderung des Branches, und ein Zusammenführen würde auch rückgängig machen, was {{target}} seitdem geändert hat.",
1418
+ studio_branch_diff_schema_empty: "Keine Schema- oder Richtlinienänderungen gegenüber {{target}}.",
1419
+ studio_branch_diff_schema_not_merged: "Schema- und Richtlinienänderungen werden zur Prüfung gezeigt. Ein Zusammenführen wendet sie nie an: Sie gehören zu deinen Collections und deren Migrationen.",
1420
+ studio_branch_diff_object_table: "Tabelle",
1421
+ studio_branch_diff_object_column: "Spalte",
1422
+ studio_branch_diff_object_policy: "Richtlinie",
1423
+ studio_branch_diff_object_rls: "Sicherheit auf Zeilenebene",
1424
+ studio_branch_diff_object_constraint: "Constraint",
1425
+ studio_branch_diff_object_index: "Index",
1426
+ studio_branch_diff_object_trigger: "Trigger",
1427
+ studio_branch_diff_object_enum: "Enum-Typ",
1428
+ studio_branch_diff_object_view: "View",
1429
+ studio_branch_diff_object_function: "Funktion",
1430
+ studio_branch_diff_change_added: "Hinzugefügt",
1431
+ studio_branch_diff_change_dropped: "Entfernt",
1432
+ studio_branch_diff_change_altered: "Geändert",
1433
+ studio_branch_diff_data_empty: "Der Branch hat gegenüber {{target}} keine Zeilen geändert.",
1434
+ studio_branch_diff_row_inserted: "Eingefügt",
1435
+ studio_branch_diff_row_updated: "Aktualisiert",
1436
+ studio_branch_diff_row_deleted: "Gelöscht",
1437
+ studio_branch_diff_row_conflict: "Konflikt",
1438
+ studio_branch_diff_conflicts: "{{count}} Konflikte",
1439
+ studio_branch_diff_target_changes: "{{count}} Zeilen wurden seit dem Erstellen des Branches nur in {{target}} geändert. Ein Zusammenführen behält sie.",
1440
+ studio_branch_diff_target_changes_referencing: "{{count}} Zeilen wurden seit dem Erstellen des Branches nur in {{target}} geändert. {{reached}} davon verweisen auf Zeilen, die der Branch gelöscht hat: Ein Merge behält sie, außer der Branch gewinnt diesen Konflikt.",
1441
+ studio_branch_diff_referenced_by: "Auf Zeilen, die der Branch hier gelöscht hat, verweisen noch Zeilen, die {{target}} seit dem Erstellen des Branches geschrieben hat: {{tables}}. Jede zählt als Konflikt.",
1442
+ studio_branch_diff_row_counts: "Zeilen: {{targetCount}} in {{target}}, {{branchCount}} im Branch.",
1443
+ studio_branch_diff_column_change: "Änderung",
1444
+ studio_branch_diff_column_key: "Primärschlüssel",
1445
+ studio_branch_diff_column_values: "Werte",
1446
+ studio_branch_diff_samples_shown: "{{shown}} von {{total}} geänderten Zeilen werden angezeigt.",
1447
+ studio_branch_diff_merge_title: "{{branch}} in {{target}} zusammenführen",
1448
+ studio_branch_diff_merge_writes: "Damit werden die Zeilen des Branches in {{target}} geschrieben: {{inserted}} eingefügt, {{updated}} aktualisiert und {{deleted}} gelöscht.",
1449
+ studio_branch_diff_merge_target_kept: "Nichts, was {{target}} seit dem Erstellen des Branches geändert hat, wird angefasst.",
1450
+ studio_branch_diff_merge_target_kept_count: "Die {{count}} Zeilen, die {{target}} seit dem Erstellen des Branches geändert hat, bleiben unverändert.",
1451
+ studio_branch_diff_merge_schema_skipped: "Die {{count}} Schema- und Richtlinienänderungen werden nicht zusammengeführt. Wende sie mit deinen Migrationen an (rebase db push).",
1452
+ studio_branch_diff_merge_conflicts: "{{count}} Zeilen wurden auf beiden Seiten geändert. Welche Version gewinnt?",
1453
+ studio_branch_diff_merge_referenced_conflicts: "Einige davon sind Zeilen, die der Branch gelöscht hat und auf die noch {{count}} Zeilen verweisen, die {{target}} seitdem geschrieben hat: {{tables}}. Die Version von {{target}} zu behalten, behält diese Zeilen und die Zeilen, die auf sie verweisen.",
1454
+ studio_branch_diff_merge_referenced_reached: "Gewinnt der Branch, werden Zeilen gelöscht, auf die noch {{count}} Zeilen verweisen, die {{target}} seitdem geschrieben hat, und die Fremdschlüssel erreichen diese Zeilen: {{tables}}. Die übrigen Zeilen, die {{target}} seitdem geändert hat, bleiben unverändert.",
1455
+ studio_branch_diff_conflict_abort: "Keine: nichts zusammenführen",
1456
+ studio_branch_diff_conflict_branch: "Die des Branches ({{branch}})",
1457
+ studio_branch_diff_conflict_target: "Die von {{target}}: so lassen, wie sie ist",
1458
+ studio_branch_diff_merge_blocked: "{{count}} Tabellen mit geänderten Zeilen können nicht zusammengeführt werden:",
1459
+ studio_branch_diff_merge_skip_blocked: "Die übrigen Tabellen zusammenführen und diese so lassen",
1460
+ studio_branch_diff_merge_atomic: "Alles wird in einer Transaktion geschrieben oder gar nichts. Hat sich eine der beiden Datenbanken seit dem Lesen dieses Diffs geändert, wird nichts geschrieben und der Diff neu geladen.",
1461
+ studio_branch_diff_merge_confirm: "Zusammenführen",
1462
+ studio_branch_diff_merged: "{{count}} Zeilen in {{target}} zusammengeführt",
1318
1463
  studio_backups_not_configured_title: "Sicherungen sind nicht konfiguriert",
1319
1464
  studio_backups_not_configured_body: "Setze BACKUP_DESTINATION auf einen lokalen Pfad oder eine s3:// bzw. gs://-URL und erstelle dann eine Sicherung mit `rebase db backup` oder einem geplanten Cron-Job.",
1320
1465
  studio_cron_empty_title: "Keine Cron-Jobs registriert",
@@ -1406,6 +1551,34 @@ var de = {
1406
1551
  studio_storage_folder_exists: "Der Ordner „{{name}}“ existiert bereits",
1407
1552
  studio_storage_folder_created: "Ordner „{{name}}“ erstellt",
1408
1553
  studio_storage_create_folder_failed: "Ordner konnte nicht erstellt werden",
1554
+ studio_branches_empty: "Noch keine Branches. Erstelle einen, um mit einer isolierten Kopie der Datenbank zu arbeiten.",
1555
+ studio_branches_create_action: "Branch erstellen",
1556
+ studio_branches_empty_detail: "Erstelle einen Branch, um loszulegen",
1557
+ studio_branches_select_prompt: "Wähle einen Branch aus, um die Details zu sehen",
1558
+ studio_branches_list_from: "von {{parent}} · {{when}}",
1559
+ studio_branches_created_from: "Erstellt aus",
1560
+ studio_branches_branch_name: "Branch-Name",
1561
+ studio_branches_source_database: "Quelldatenbank",
1562
+ studio_branches_created: "Erstellt",
1563
+ studio_branches_size: "Größe",
1564
+ studio_branches_usage_title: "So verwendest du diesen Branch",
1565
+ studio_branches_usage_switch: "Richte diesen Checkout darauf aus. Jeder spätere Befehl verwendet ihn:",
1566
+ studio_branches_usage_off: "Zurück zur Hauptdatenbank geht es mit:",
1567
+ studio_branches_usage_isolated: "Änderungen in diesem Branch wirken sich nicht auf die Hauptdatenbank aus.",
1568
+ studio_branches_connection_details: "Verbindungsdetails",
1569
+ studio_branches_row_database: "Datenbank:",
1570
+ studio_branches_row_connect: "Verbinden mit:",
1571
+ studio_branches_row_branched_from: "Abgezweigt von:",
1572
+ studio_branches_row_created_at: "Erstellt am:",
1573
+ studio_branches_create_title: "Neuen Branch erstellen",
1574
+ studio_branches_create_body: "Erstelle eine isolierte Kopie der Datenbank. Der Branch ist ein vollständiger Klon der Quelldatenbank zum jetzigen Zeitpunkt.",
1575
+ studio_branches_name_placeholder: "z. B. feature-auth, staging, preview-pr-42",
1576
+ studio_branches_source_main: "Standard (Hauptdatenbank)",
1577
+ studio_branches_creating: "Wird erstellt…",
1578
+ studio_branches_delete_title: "Branch löschen",
1579
+ studio_branches_delete_body: "Möchtest du den Branch „{{name}}“ wirklich endgültig löschen? Diese Aktion kann nicht rückgängig gemacht werden, und alle Daten in diesem Branch gehen verloren.",
1580
+ studio_branches_created_snackbar: "Branch „{{name}}“ erfolgreich erstellt",
1581
+ studio_branches_deleted_snackbar: "Branch „{{name}}“ gelöscht",
1409
1582
  insights_period_last_days: "Letzte {{count}} Tage",
1410
1583
  insights_period_last_days_one: "Letzter Tag",
1411
1584
  insights_previous_period_value: "Vorherige {{count}} Tage: {{value}}",
@@ -1425,10 +1598,11 @@ var de = {
1425
1598
  copy_column_name: "Spaltennamen kopieren",
1426
1599
  generate_sql_templates: "SQL-Vorlagen erzeugen",
1427
1600
  select_row: "{{id}} auswählen",
1601
+ relation_open_record: "{{label}} öffnen",
1428
1602
  select: "Auswählen",
1429
1603
  open_view: "Ansicht öffnen"
1430
1604
  };
1431
1605
  //#endregion
1432
1606
  export { de };
1433
1607
 
1434
- //# sourceMappingURL=de-BMgOgwue.js.map
1608
+ //# sourceMappingURL=de-3yzzpuZj.js.map