viur-ui 0.0.1 → 0.0.2

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 (83) hide show
  1. package/README.md +67 -41
  2. package/index.d.ts +18 -9
  3. package/index.js +6 -3
  4. package/package.json +3 -5
  5. package/src/components/Browser/Browser.vue +58 -58
  6. package/src/components/Browser/TreeNav.vue +32 -32
  7. package/src/components/Browser/ViurBrowser.d.vue.ts +21 -21
  8. package/src/components/Browser/ViurBrowser.vue +47 -44
  9. package/src/components/Browser/dragSession.ts +27 -27
  10. package/src/components/Browser/index.ts +3 -3
  11. package/src/components/Browser/types.ts +9 -9
  12. package/src/components/DataTable/ColumnFilterPanel.vue +7 -7
  13. package/src/components/DataTable/DataTable.vue +346 -346
  14. package/src/components/DataTable/ViurDataTable.d.vue.ts +26 -26
  15. package/src/components/DataTable/ViurDataTable.vue +51 -50
  16. package/src/components/DataTable/columns.ts +30 -30
  17. package/src/components/DataTable/index.ts +12 -12
  18. package/src/components/DataTable/rows.ts +71 -72
  19. package/src/components/DataTable/types.ts +55 -55
  20. package/src/components/DataTable/useColumnLayout.ts +28 -28
  21. package/src/components/DataTable/useGridNavigation.ts +15 -15
  22. package/src/components/DataTable/useVirtualRows.ts +10 -10
  23. package/src/components/DataTable/viurColumns.ts +69 -69
  24. package/src/forms/ViForm.d.vue.ts +32 -32
  25. package/src/forms/ViForm.vue +17 -16
  26. package/src/forms/ViFormCategory.vue +3 -1
  27. package/src/forms/bones/Bone.vue +125 -108
  28. package/src/forms/bones/BoneActions.vue +21 -21
  29. package/src/forms/bones/BoneLabel.vue +1 -1
  30. package/src/forms/bones/BoneMultipleWrapper.vue +3 -3
  31. package/src/forms/bones/BoneNestedWrapper.vue +3 -3
  32. package/src/forms/bones/BoneSingleEntry.vue +2 -2
  33. package/src/forms/bones/FilterBone.vue +3 -3
  34. package/src/forms/bones/actions/ActionDialog.vue +2 -2
  35. package/src/forms/bones/actions/Debug.vue +6 -6
  36. package/src/forms/bones/actions/Delete.vue +2 -2
  37. package/src/forms/bones/actions/DescribeImage.vue +4 -3
  38. package/src/forms/bones/actions/Download.vue +4 -4
  39. package/src/forms/bones/actions/Placeholder.vue +2 -2
  40. package/src/forms/bones/actions/index.js +72 -74
  41. package/src/forms/bones/bone.d.ts +19 -19
  42. package/src/forms/bones/uploadAdapter.js +3 -3
  43. package/src/forms/bones/utils.js +40 -41
  44. package/src/forms/bones/view/base_item.vue +1 -1
  45. package/src/forms/bones/view/boneLogic.js +1 -1
  46. package/src/forms/bones/widgets/booleanBone.vue +19 -19
  47. package/src/forms/bones/widgets/booleanBoneChoose.vue +2 -2
  48. package/src/forms/bones/widgets/booleanBoneSelect.vue +3 -3
  49. package/src/forms/bones/widgets/codeBone.vue +22 -22
  50. package/src/forms/bones/widgets/colorBone.vue +18 -18
  51. package/src/forms/bones/widgets/dateBone.vue +22 -22
  52. package/src/forms/bones/widgets/emailBone.vue +20 -20
  53. package/src/forms/bones/widgets/fileBone.vue +32 -31
  54. package/src/forms/bones/widgets/keyBone.vue +21 -21
  55. package/src/forms/bones/widgets/numericBone.vue +21 -21
  56. package/src/forms/bones/widgets/passwordBone.vue +34 -31
  57. package/src/forms/bones/widgets/phoneBone.vue +20 -20
  58. package/src/forms/bones/widgets/rawBone.vue +19 -19
  59. package/src/forms/bones/widgets/recordBone.vue +16 -16
  60. package/src/forms/bones/widgets/relationalBone.vue +26 -26
  61. package/src/forms/bones/widgets/selectBone.vue +23 -23
  62. package/src/forms/bones/widgets/selectBoneChoose.vue +2 -2
  63. package/src/forms/bones/widgets/spatialBone.vue +21 -21
  64. package/src/forms/bones/widgets/stringBone.vue +27 -27
  65. package/src/forms/bones/widgets/textBone.vue +28 -26
  66. package/src/forms/install.d.ts +1 -1
  67. package/src/forms/install.js +7 -0
  68. package/src/forms/layouts/LayloutList2Columns.vue +1 -1
  69. package/src/forms/layouts/LayoutCategory.vue +1 -1
  70. package/src/forms/layouts/LayoutList.vue +1 -1
  71. package/src/forms/utils.js +22 -22
  72. package/src/request/configStore.js +4 -4
  73. package/src/request/envelope.js +6 -6
  74. package/src/request/request.js +22 -22
  75. package/src/translations/de.js +31 -0
  76. package/src/translations/en.js +31 -0
  77. package/src/user/LoginScreen.d.vue.ts +24 -24
  78. package/src/user/LoginScreen.vue +6 -7
  79. package/src/user/store.d.ts +16 -16
  80. package/src/vite/safeHtml.js +73 -0
  81. package/src/vite/sanitizeVHtml.d.ts +4 -0
  82. package/src/vite/sanitizeVHtml.js +15 -0
  83. package/src/webawesomeCompat.css +0 -40
@@ -97,51 +97,52 @@
97
97
  <script setup>
98
98
  import { reactive, onMounted, inject, ref } from "vue"
99
99
  import { downloadUrlFor, uploadFile } from "../../../request/index.js"
100
+ import BoneActions from "../BoneActions.vue"
100
101
  /**
101
- * Datei-Upload-Widget für Bones vom Typ `relational.tree.leaf.file.file`.
102
+ * File upload widget for bones of type `relational.tree.leaf.file.file`.
102
103
  *
103
- * Stellt eine kombinierte Klick-/Drop-Fläche bereit: ein Klick öffnet den File-Picker,
104
- * ein Drop lädt die fallengelassene Datei hoch. Bei Bilddateien wird eine klickbare
105
- * Vorschau angezeigt, die einen Dialog öffnet. Action-Buttons (Download, Delete)
106
- * werden über `<bone-actions>` per Default-Slot eingebracht.
104
+ * Provides a combined click/drop area: a click opens the file picker,
105
+ * a drop uploads the dropped file. For image files, a clickable
106
+ * preview is shown that opens a dialog. Action buttons (download, delete)
107
+ * are inserted via `<bone-actions>` through the default slot.
107
108
  *
108
109
  * @displayName FileBone
109
110
  *
110
- * @cssClass bone-widget-file-area - Äußerer klickbarer Container (Drop-Zone)
111
- * @cssClass bone-widget-prompt - Empty-State (Icon + Text)
112
- * @cssClass bone-widget-loader - Während des Uploads sichtbar
113
- * @cssClass bone-widget-preview - Container für das Vorschaubild oder das Datei-Icon
114
- * @cssClass has-preview - Zusatzklasse wenn ein Bild-Vorschau vorliegt
115
- * @cssClass is-dragover - Wenn eine Datei über die Fläche gezogen wird
116
- * @cssClass has-value - Wenn ein Wert gesetzt ist
117
- * @cssClass is-loading - Während ein Upload läuft
118
- * @cssClass is-readonly - Wenn der Bone readonly ist
111
+ * @cssClass bone-widget-file-area - Outer clickable container (drop zone)
112
+ * @cssClass bone-widget-prompt - Empty state (icon + text)
113
+ * @cssClass bone-widget-loader - Visible during the upload
114
+ * @cssClass bone-widget-preview - Container for the preview image or the file icon
115
+ * @cssClass has-preview - Additional class when an image preview is present
116
+ * @cssClass is-dragover - When a file is dragged over the area
117
+ * @cssClass has-value - When a value is set
118
+ * @cssClass is-loading - While an upload is in progress
119
+ * @cssClass is-readonly - When the bone is readonly
119
120
  */
120
121
  defineOptions({
121
122
  inheritAttrs: false,
122
123
  })
123
124
  const props = defineProps({
124
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
125
+ /** Bone name – passed as the first argument in every `change` event. */
125
126
  name: String,
126
- /** Aktueller Bone-Wert; Objekt mit `dest`- und `rel`-Schlüsseln oder `null`. */
127
+ /** Current bone value; object with `dest` and `rel` keys, or `null`. */
127
128
  value: [Object, String, Number, Boolean, Array],
128
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
129
+ /** Index in the multiple array; `undefined` for a single value. */
129
130
  index: Number,
130
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
131
+ /** Language key for multilingual bones, e.g. `"de"`. */
131
132
  lang: String,
132
- /** Bone-Struktur; `public`-Flag steuert ob der Upload öffentlich ist. */
133
+ /** Bone structure; the `public` flag controls whether the upload is public. */
133
134
  bone: Object,
134
- /** Aktuell nicht genutzt. */
135
+ /** Currently not used. */
135
136
  autofocus: Boolean,
136
137
  })
137
138
 
138
139
  const emit = defineEmits([
139
140
  /**
140
- * Wird bei Datei-Upload, Datei-Drop, Löschen und beim Mount (Initialisierung) gefeuert.
141
- * @arg {string} name - Bone-Name
142
- * @arg {{ dest: object, rel: null }|string} value - Hochgeladenes Datei-Objekt oder `""` beim Löschen
143
- * @arg {string|undefined} lang - Sprach-Key
144
- * @arg {number|undefined} index - Index im Multiple-Array
141
+ * Fired on file upload, file drop, clearing, and on mount (initialization).
142
+ * @arg {string} name - Bone name
143
+ * @arg {{ dest: object, rel: null }|string} value - Uploaded file object, or `""` when cleared
144
+ * @arg {string|undefined} lang - Language key
145
+ * @arg {number|undefined} index - Index in the multiple array
145
146
  */
146
147
  "change",
147
148
  ])
@@ -159,9 +160,9 @@ onMounted(() => {
159
160
  })
160
161
 
161
162
  /**
162
- * Triggert den nativen File-Picker des hidden Inputs.
163
- * Nur im Empty-State aktiv — ist bereits ein Wert gesetzt, muss zuerst per
164
- * Delete-Action geleert oder per Drag-and-Drop ersetzt werden.
163
+ * Triggers the native file picker of the hidden input.
164
+ * Only active in the empty state — if a value is already set, it must first be
165
+ * cleared via the delete action or replaced via drag-and-drop.
165
166
  */
166
167
  function openPicker() {
167
168
  if (state.loading || boneState.readonly || props.value) return
@@ -237,11 +238,11 @@ async function handleDrop(event) {
237
238
  .bone-widget-prompt {
238
239
  justify-content: center;
239
240
  color: var(--wa-color-on-quiet);
240
- /* Klicks fallen auf die outer Drop-Zone durch */
241
+ /* Clicks fall through to the outer drop zone */
241
242
  pointer-events: none;
242
243
  }
243
244
 
244
- /* Dateiname-Zeile darf schrumpfen; lange Namen werden mit Ellipsis abgekürzt */
245
+ /* Filename row may shrink; long names are truncated with an ellipsis */
245
246
  .bone-widget-file-row {
246
247
  min-width: 0;
247
248
  }
@@ -261,7 +262,7 @@ async function handleDrop(event) {
261
262
  background-color: color-mix(in srgb, var(--wa-color-surface-default) 70%, transparent);
262
263
  }
263
264
 
264
- /* Klickbare Bildvorschau: Zoom-Cursor + leichte Skalierung beim Hover */
265
+ /* Clickable image preview: zoom cursor + slight scaling on hover */
265
266
  .bone-widget-preview.has-preview {
266
267
  cursor: zoom-in;
267
268
  transition: transform 0.15s ease;
@@ -12,48 +12,48 @@
12
12
  <script setup>
13
13
  import { reactive, onMounted, inject } from "vue"
14
14
  /**
15
- * Anzeige-Widget für den internen Datenbankschlüssel eines Eintrags (Typ `key`).
15
+ * Display widget for an entry's internal database key (type `key`).
16
16
  *
17
- * Rendert ein immer deaktiviertes `<wa-input>`, da der Schlüssel nicht manuell
18
- * editiert werden kann. Der Wert wird direkt aus dem Skel übernommen und dient
19
- * ausschließlich zur Information. Unterstützt kein multiple und kein multilang.
17
+ * Renders an always-disabled `<wa-input>`, since the key cannot be edited
18
+ * manually. The value is taken directly from the skel and serves
19
+ * informational purposes only. Supports neither multiple nor multilang.
20
20
  *
21
21
  * @displayName KeyBone
22
22
  *
23
- * @cssClass bone-widget - Basis-Klasse aller Bone-Widgets
24
- * @cssClass bone-widget-key - Kennzeichnet den Bone-Typ
25
- * @cssClass bone-widget-key-default - Standard-Variante
26
- * @cssClass bone-widget-key-{name} - Dynamisch gesetzt auf den Bone-Namen, z.B. `bone-widget-key-key`
23
+ * @cssClass bone-widget - Base class of all bone widgets
24
+ * @cssClass bone-widget-key - Identifies the bone type
25
+ * @cssClass bone-widget-key-default - Default variant
26
+ * @cssClass bone-widget-key-{name} - Dynamically set to the bone name, e.g. `bone-widget-key-key`
27
27
  */
28
28
  defineOptions({
29
29
  inheritAttrs: false,
30
30
  })
31
31
  const props = defineProps({
32
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
32
+ /** Bone name – passed as the first argument in every `change` event. */
33
33
  name: String,
34
- /** Aktueller Schlüsselwert (URL-safe Base64-String). */
34
+ /** Current key value (URL-safe Base64 string). */
35
35
  value: [Object, String, Number, Boolean, Array],
36
- /** Index im Multiple-Array; nicht genutzt, da multiple nicht unterstützt wird. */
36
+ /** Index in the multiple array; unused, since multiple is not supported. */
37
37
  index: Number,
38
- /** Sprach-Key; nicht genutzt, da multilang nicht unterstützt wird. */
38
+ /** Language key; unused, since multilang is not supported. */
39
39
  lang: String,
40
- /** Readonly-Flag (wird nicht ausgewertet – der Bone ist immer disabled). */
40
+ /** Readonly flag (not evaluated – the bone is always disabled). */
41
41
  readonly: Boolean,
42
- /** Zusätzliche Bone-Parameter. */
42
+ /** Additional bone parameters. */
43
43
  params: Object,
44
- /** Bone-Struktur (aktuell nicht aktiv genutzt). */
44
+ /** Bone structure (currently not actively used). */
45
45
  bone: Object,
46
- /** Setzt den Fokus (ohne Effekt, da das Element immer disabled ist). */
46
+ /** Sets the focus (no effect, since the element is always disabled). */
47
47
  autofocus: Boolean,
48
48
  })
49
49
 
50
50
  const emit = defineEmits([
51
51
  /**
52
- * Wird beim Mount (Initialisierung) und bei change gefeuert.
53
- * @arg {string} name - Bone-Name
54
- * @arg {string} value - Aktueller Schlüsselwert
55
- * @arg {string|undefined} lang - Sprach-Key
56
- * @arg {number|undefined} index - Index im Multiple-Array
52
+ * Fired on mount (initialization) and on change.
53
+ * @arg {string} name - Bone name
54
+ * @arg {string} value - Current key value
55
+ * @arg {string|undefined} lang - Language key
56
+ * @arg {number|undefined} index - Index in the multiple array
57
57
  */
58
58
  "change",
59
59
  ])
@@ -32,46 +32,46 @@
32
32
  import { reactive, onMounted, computed, inject, ref, watchEffect } from "vue"
33
33
  import { useTimeoutFn } from "@vueuse/core"
34
34
  /**
35
- * Numerisches Eingabefeld für Ganzzahlen und Dezimalwerte.
35
+ * Numeric input field for integers and decimal values.
36
36
  *
37
- * Rendert ein `<wa-input type="number">` und zeigt optional Hinweise zu
38
- * Mindest-/Höchstwert und Präzision an. Unterstützt Mehrsprachigkeit
39
- * (`languages`) und mehrfache Werte (`multiple`). Der Schritt (`step`) wird
40
- * aus `boneState.bonestructure.precision` berechnet.
37
+ * Renders a `<wa-input type="number">` and optionally shows hints about
38
+ * the minimum/maximum value and precision. Supports multiple languages
39
+ * (`languages`) and multiple values (`multiple`). The step (`step`) is
40
+ * calculated from `boneState.bonestructure.precision`.
41
41
  *
42
42
  * @displayName NumericBone
43
43
  *
44
- * @cssClass bone-widget - Basis-Klasse aller Bone-Widgets
45
- * @cssClass bone-widget-numeric - Kennzeichnet den Bone-Typ
46
- * @cssClass bone-widget-numeric-default - Standard-Variante
47
- * @cssClass bone-widget-numeric-{name} - Dynamisch gesetzt auf den Bone-Namen, z.B. `bone-widget-numeric-amount`
44
+ * @cssClass bone-widget - Base class of all bone widgets
45
+ * @cssClass bone-widget-numeric - Identifies the bone type
46
+ * @cssClass bone-widget-numeric-default - Default variant
47
+ * @cssClass bone-widget-numeric-{name} - Dynamically set to the bone name, e.g. `bone-widget-numeric-amount`
48
48
  */
49
49
  defineOptions({
50
50
  inheritAttrs: false,
51
51
  })
52
52
  const props = defineProps({
53
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
53
+ /** Bone name – passed as the first argument in every `change` event. */
54
54
  name: String,
55
- /** Aktueller Bone-Wert. */
55
+ /** Current bone value. */
56
56
  value: [Object, String, Number, Boolean, Array],
57
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
57
+ /** Index in the multiple array; `undefined` for a single value. */
58
58
  index: Number,
59
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
59
+ /** Language key for multilingual bones, e.g. `"de"`. */
60
60
  lang: String,
61
- /** Bone-Struktur (aktuell nicht aktiv genutzt). */
61
+ /** Bone structure (currently not actively used). */
62
62
  bone: Object,
63
- /** Setzt den Fokus nach 600 ms auf das Input-Element. */
63
+ /** Focuses the input element after 600 ms. */
64
64
  autofocus: Boolean,
65
65
  })
66
66
 
67
67
  const emit = defineEmits([
68
68
  /**
69
- * Wird bei jeder Wertänderung sowie beim Mount (Initialisierung) gefeuert.
70
- * @arg {string} name - Bone-Name
71
- * @arg {string} value - Aktueller Eingabewert (als String)
72
- * @arg {string|undefined} lang - Sprach-Key
73
- * @arg {number|undefined} index - Index im Multiple-Array
74
- * @arg {boolean} [valid] - Validierungsstatus; fehlt beim Init-Event
69
+ * Fired on every value change and on mount (initialization).
70
+ * @arg {string} name - Bone name
71
+ * @arg {string} value - Current input value (as a string)
72
+ * @arg {string|undefined} lang - Language key
73
+ * @arg {number|undefined} index - Index in the multiple array
74
+ * @arg {boolean} [valid] - Validation status; missing on the init event
75
75
  */
76
76
  "change",
77
77
  ])
@@ -61,64 +61,67 @@
61
61
  <script setup>
62
62
  import { reactive, onMounted, computed, inject, watch, ref, watchEffect } from "vue"
63
63
  import { useTimeoutFn } from "@vueuse/core"
64
+ import { useI18n } from "vue-i18n"
64
65
  /**
65
- * Passwort-Eingabefeld mit Wiederholung und Stärke-Validierung.
66
+ * Password input field with confirmation and strength validation.
66
67
  *
67
- * Rendert `<wa-input type="password">` — mit Wiederholungs-Feld, WENN der Bone
68
- * überhaupt Passwort-Tests mitbringt (`bonestructure.tests`). Ein Login-Formular
69
- * liefert serverseitig einen rohen Passwort-Bone ohne Tests
70
- * (`PasswordBone(raw=True, tests=(), test_threshold=0)`); dort wäre eine
71
- * Wiederholung falsch — man tippt ein bestehendes Passwort ein, man setzt keins.
72
- * Im Readonly-Modus entfällt die Wiederholung ebenfalls. Passwort-Tests
73
- * werden über `boneState.bonestructure.tests` (Array aus `[regex, message, required]`
74
- * Tupeln) konfiguriert. `boneState.bonestructure.test_threshold` legt fest,
75
- * wie viele optionale Tests fehlschlagen dürfen.
68
+ * Renders `<wa-input type="password">` — with a confirmation field IF the bone
69
+ * comes with password tests at all (`bonestructure.tests`). A login form
70
+ * receives a raw password bone without tests from the server
71
+ * (`PasswordBone(raw=True, tests=(), test_threshold=0)`); a confirmation would be
72
+ * wrong there — you enter an existing password, you don't set one.
73
+ * In readonly mode the confirmation is omitted as well. Password tests
74
+ * are configured via `boneState.bonestructure.tests` (array of `[regex, message, required]`
75
+ * tuples). `boneState.bonestructure.test_threshold` defines
76
+ * how many optional tests may fail.
76
77
  *
77
78
  * @displayName PasswordBone
78
79
  *
79
- * @cssClass bone-widget - Basis-Klasse aller Bone-Widgets
80
- * @cssClass bone-widget-password - Kennzeichnet den Bone-Typ
81
- * @cssClass bone-widget-password-default - Standard-Variante
82
- * @cssClass bone-widget-password-{name} - Dynamisch gesetzt auf den Bone-Namen
83
- * @cssClass has-check - Gesetzt wenn nicht readonly; entfernt border-bottom-right-radius für nahtlosen Übergang zum Wiederholungs-Feld
80
+ * @cssClass bone-widget - Base class of all bone widgets
81
+ * @cssClass bone-widget-password - Identifies the bone type
82
+ * @cssClass bone-widget-password-default - Default variant
83
+ * @cssClass bone-widget-password-{name} - Dynamically set to the bone name
84
+ * @cssClass has-check - Set when not readonly; removes border-bottom-right-radius for a seamless transition to the confirmation field
84
85
  */
85
86
  defineOptions({
86
87
  inheritAttrs: false,
87
88
  })
88
89
  const props = defineProps({
89
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
90
+ /** Bone name – passed as the first argument in every `change` event. */
90
91
  name: String,
91
- /** Aktueller Bone-Wert (wird in `state.value1` gespiegelt). */
92
+ /** Current bone value (mirrored in `state.value1`). */
92
93
  value: [Object, String, Number, Boolean, Array],
93
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
94
+ /** Index in the multiple array; `undefined` for a single value. */
94
95
  index: Number,
95
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
96
+ /** Language key for multilingual bones, e.g. `"de"`. */
96
97
  lang: String,
97
- /** Bone-Struktur (aktuell nicht aktiv genutzt). */
98
+ /** Bone structure (currently not actively used). */
98
99
  bone: Object,
99
- /** Setzt den Fokus nach 600 ms auf das erste Passwort-Feld. */
100
+ /** Focuses the first password field after 600 ms. */
100
101
  autofocus: Boolean,
101
102
  })
102
103
 
103
104
  const emit = defineEmits([
104
105
  /**
105
- * Wird bei jeder Wertänderung sowie beim Mount (Initialisierung) gefeuert.
106
- * @arg {string} name - Bone-Name
107
- * @arg {string} value - Aktueller Passwortwert (nur wenn beide Felder übereinstimmen und Tests bestanden)
108
- * @arg {string|undefined} lang - Sprach-Key
109
- * @arg {number|undefined} index - Index im Multiple-Array
110
- * @arg {boolean} valid - `true` wenn Passwort gültig (Tests bestanden + Felder gleich)
106
+ * Fired on every value change and on mount (initialization).
107
+ * @arg {string} name - Bone name
108
+ * @arg {string} value - Current password value (only if both fields match and the tests passed)
109
+ * @arg {string|undefined} lang - Language key
110
+ * @arg {number|undefined} index - Index in the multiple array
111
+ * @arg {boolean} valid - `true` if the password is valid (tests passed + fields equal)
111
112
  */
112
113
  "change",
113
114
  ])
114
115
 
116
+ const { t } = useI18n()
117
+
115
118
  const boneState = inject("boneState")
116
119
  const state = reactive({
117
120
  value1: "",
118
121
  value2: null,
119
122
  equal: false,
120
- // Wiederholung nur, wenn der Bone Tests mitbringt (= ein Passwort wird
121
- // GESETZT). Beim Login liefert der Server einen rohen Bone ohne Tests.
123
+ // Confirmation only if the bone comes with tests (= a password is being
124
+ // SET). On login, the server delivers a raw bone without tests.
122
125
  needsConfirm: computed(() => !boneState.readonly && (boneState?.bonestructure?.["tests"]?.length ?? 0) > 0),
123
126
  passwordInfo: [],
124
127
  requiredPasswordInfo: [],
@@ -172,10 +175,10 @@ function testPassword(password) {
172
175
  }
173
176
  }
174
177
  if (state.needsConfirm && !state.equal) {
175
- state.requiredPasswordInfo.push("Die eingegebenen Passwörter stimmen nicht überein.")
178
+ state.requiredPasswordInfo.push(t("bones.password.mismatch"))
176
179
  }
177
180
  if (!state.value1) {
178
- state.requiredPasswordInfo.push("Das eingegebene Passwort ist leer.")
181
+ state.requiredPasswordInfo.push(t("bones.password.empty"))
179
182
  }
180
183
  }
181
184
 
@@ -34,49 +34,49 @@
34
34
  <script setup>
35
35
  import { reactive, onMounted, inject, computed, watchEffect, ref } from "vue"
36
36
  import { useTimeoutFn } from "@vueuse/core"
37
- import Utils from "../utils"
37
+ import Utils from "../utils.js"
38
38
  import jsonData from "../country_information.json"
39
39
  import parsePhoneNumber from "libphonenumber-js/min"
40
40
  import { AsYouType, validatePhoneNumberLength } from "libphonenumber-js/min"
41
41
  /**
42
- * Telefonnummer-Eingabefeld mit Ländervorwahl-Auswahl.
42
+ * Phone number input field with country code selection.
43
43
  *
44
- * Rendert ein `<wa-select>` für die Ländervorwahl (Flaggen-Emoji) und ein
45
- * `<wa-input type="tel">` für die eigentliche Nummer. Die Nummer wird beim
46
- * Tippen über `libphonenumber-js` formatiert und normalisiert. Der
47
- * Standard-Ländercode kann über `boneState.bonestructure.default_country_code`
48
- * gesteuert werden (Standard: `+49`).
44
+ * Renders a `<wa-select>` for the country code (flag emoji) and a
45
+ * `<wa-input type="tel">` for the actual number. The number is formatted and
46
+ * normalized via `libphonenumber-js` while typing. The
47
+ * default country code can be controlled via `boneState.bonestructure.default_country_code`
48
+ * (default: `+49`).
49
49
  *
50
50
  * @displayName PhoneBone
51
51
  *
52
- * @cssClass bone-widget - Basis-Klasse aller Bone-Widgets (auf dem inneren `<wa-input>`)
53
- * @cssClass bone-widget-phone - Kennzeichnet den Bone-Typ (auf dem inneren `<wa-input>`, via Wrapper-Klasse)
52
+ * @cssClass bone-widget - Base class of all bone widgets (on the inner `<wa-input>`)
53
+ * @cssClass bone-widget-phone - Identifies the bone type (on the inner `<wa-input>`, via wrapper class)
54
54
  */
55
55
  defineOptions({
56
56
  inheritAttrs: false,
57
57
  })
58
58
  const props = defineProps({
59
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
59
+ /** Bone name – passed as the first argument in every `change` event. */
60
60
  name: String,
61
- /** Aktueller Bone-Wert als internationale Telefonnummer, z.B. `"+49 89 12345678"`. */
61
+ /** Current bone value as an international phone number, e.g. `"+49 89 12345678"`. */
62
62
  value: [Object, String, Number, Boolean, Array],
63
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
63
+ /** Index in the multiple array; `undefined` for a single value. */
64
64
  index: Number,
65
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
65
+ /** Language key for multilingual bones, e.g. `"de"`. */
66
66
  lang: String,
67
- /** Bone-Struktur (aktuell nicht aktiv genutzt). */
67
+ /** Bone structure (currently not actively used). */
68
68
  bone: Object,
69
- /** Setzt den Fokus nach 600 ms auf das Tel-Input-Element. */
69
+ /** Focuses the tel input element after 600 ms. */
70
70
  autofocus: Boolean,
71
71
  })
72
72
 
73
73
  const emit = defineEmits([
74
74
  /**
75
- * Wird bei jeder Wertänderung sowie beim Mount (Initialisierung) gefeuert.
76
- * @arg {string} name - Bone-Name
77
- * @arg {string} value - Formatierte internationale Telefonnummer
78
- * @arg {string|undefined} lang - Sprach-Key
79
- * @arg {number|undefined} index - Index im Multiple-Array
75
+ * Fired on every value change and on mount (initialization).
76
+ * @arg {string} name - Bone name
77
+ * @arg {string} value - Formatted international phone number
78
+ * @arg {string|undefined} lang - Language key
79
+ * @arg {number|undefined} index - Index in the multiple array
80
80
  */
81
81
  "change",
82
82
  ])
@@ -30,44 +30,44 @@
30
30
  <script setup>
31
31
  import { reactive, onMounted, inject, computed } from "vue"
32
32
  /**
33
- * Mehrzeiliges Freitext- oder JSON-Eingabefeld für Rohdaten.
33
+ * Multi-line free-text or JSON input field for raw data.
34
34
  *
35
- * Rendert ein `<wa-textarea>`. Wenn `boneState.bonestructure.type === 'raw.json'`
36
- * wird der Wert beim Anzeigen per `JSON.stringify` serialisiert. Unterstützt
37
- * Mehrsprachigkeit (`languages`) und Mehrfachwerte (`multiple`).
35
+ * Renders a `<wa-textarea>`. If `boneState.bonestructure.type === 'raw.json'`,
36
+ * the value is serialized via `JSON.stringify` for display. Supports
37
+ * multiple languages (`languages`) and multiple values (`multiple`).
38
38
  *
39
39
  * @displayName RawBone
40
40
  *
41
- * @cssClass bone-widget - Basis-Klasse aller Bone-Widgets
42
- * @cssClass bone-widget-raw - Kennzeichnet den Bone-Typ
43
- * @cssClass bone-widget-raw-default - Standard-Variante
44
- * @cssClass bone-widget-raw-{name} - Dynamisch gesetzt auf den Bone-Namen, z.B. `bone-widget-raw-content`
41
+ * @cssClass bone-widget - Base class of all bone widgets
42
+ * @cssClass bone-widget-raw - Identifies the bone type
43
+ * @cssClass bone-widget-raw-default - Default variant
44
+ * @cssClass bone-widget-raw-{name} - Dynamically set to the bone name, e.g. `bone-widget-raw-content`
45
45
  */
46
46
  defineOptions({
47
47
  inheritAttrs: false,
48
48
  })
49
49
  const props = defineProps({
50
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
50
+ /** Bone name – passed as the first argument in every `change` event. */
51
51
  name: String,
52
- /** Aktueller Bone-Wert. Bei `raw.json` wird ein Objekt per `JSON.stringify` dargestellt. */
52
+ /** Current bone value. With `raw.json`, an object is displayed via `JSON.stringify`. */
53
53
  value: [Object, String, Number, Boolean, Array],
54
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
54
+ /** Index in the multiple array; `undefined` for a single value. */
55
55
  index: Number,
56
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
56
+ /** Language key for multilingual bones, e.g. `"de"`. */
57
57
  lang: String,
58
- /** Bone-Struktur (aktuell nicht aktiv genutzt). */
58
+ /** Bone structure (currently not actively used). */
59
59
  bone: Object,
60
- /** Setzt den Fokus nach dem Mount auf das Textarea-Element. */
60
+ /** Focuses the textarea element after mount. */
61
61
  autofocus: Boolean,
62
62
  })
63
63
 
64
64
  const emit = defineEmits([
65
65
  /**
66
- * Wird bei jeder Wertänderung sowie beim Mount (Initialisierung) gefeuert.
67
- * @arg {string} name - Bone-Name
68
- * @arg {string} value - Aktueller Eingabewert
69
- * @arg {string|undefined} lang - Sprach-Key
70
- * @arg {number|undefined} index - Index im Multiple-Array
66
+ * Fired on every value change and on mount (initialization).
67
+ * @arg {string} name - Bone name
68
+ * @arg {string} value - Current input value
69
+ * @arg {string|undefined} lang - Language key
70
+ * @arg {number|undefined} index - Index in the multiple array
71
71
  */
72
72
  "change",
73
73
  ])
@@ -14,12 +14,12 @@
14
14
  import { reactive, onMounted, inject, computed, getCurrentInstance } from "vue"
15
15
  import Wrapper_nested from "../BoneNestedWrapper.vue"
16
16
  /**
17
- * Record-Widget für Bones vom Typ `record`.
17
+ * Record widget for bones of type `record`.
18
18
  *
19
- * Delegiert die gesamte Darstellung an `Wrapper_nested`, der die Sub-Bones
20
- * aus `bone.using` rendert. Der Record-Wert ist ein Objekt dessen Schlüssel
21
- * den Sub-Bone-Namen entsprechen. Bei `multiple: true` ist der Wert ein Array
22
- * dieser Objekte.
19
+ * Delegates all rendering to `Wrapper_nested`, which renders the sub-bones
20
+ * from `bone.using`. The record value is an object whose keys match the
21
+ * sub-bone names. With `multiple: true`, the value is an array
22
+ * of these objects.
23
23
  *
24
24
  * @displayName RecordBone
25
25
  */
@@ -29,26 +29,26 @@ defineOptions({
29
29
 
30
30
  const emit = defineEmits([
31
31
  /**
32
- * Wird weitergeleitet wenn `Wrapper_nested` einen Wert ändert oder beim Mount (Initialisierung).
33
- * @arg {string} name - Bone-Name
34
- * @arg {object} value - Aktueller Record-Wert (Objekt mit Sub-Bone-Werten)
35
- * @arg {string|undefined} lang - Sprach-Key
36
- * @arg {number|undefined} index - Index im Multiple-Array
32
+ * Forwarded when `Wrapper_nested` changes a value, or on mount (initialization).
33
+ * @arg {string} name - Bone name
34
+ * @arg {object} value - Current record value (object with sub-bone values)
35
+ * @arg {string|undefined} lang - Language key
36
+ * @arg {number|undefined} index - Index in the multiple array
37
37
  */
38
38
  "change",
39
39
  ])
40
40
  const props = defineProps({
41
- /** Bone-Name – wird in jedem `change`-Event als erstes Argument übergeben. */
41
+ /** Bone name – passed as the first argument in every `change` event. */
42
42
  name: String,
43
- /** Aktueller Record-Wert; Objekt mit Sub-Bone-Werten oder Array davon bei `multiple`. */
43
+ /** Current record value; object with sub-bone values, or an array of them with `multiple`. */
44
44
  value: null,
45
- /** Index im Multiple-Array; `undefined` bei Einzelwert. */
45
+ /** Index in the multiple array; `undefined` for a single value. */
46
46
  index: Number,
47
- /** Sprach-Key bei mehrsprachigen Bones, z.B. `"de"`. */
47
+ /** Language key for multilingual bones, e.g. `"de"`. */
48
48
  lang: String,
49
- /** Bone-Struktur; `using` enthält die Sub-Bone-Definitionen. */
49
+ /** Bone structure; `using` contains the sub-bone definitions. */
50
50
  bone: Object,
51
- /** Aktuell nicht genutzt. */
51
+ /** Currently not used. */
52
52
  autofocus: Boolean,
53
53
  })
54
54