@mmlogic/components 0.1.24 → 0.1.25

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 (45) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/mosterdcomponents.cjs.js +1 -1
  3. package/dist/cjs/mrd-boolean-field_19.cjs.entry.js +3150 -0
  4. package/dist/collection/collection-manifest.json +1 -0
  5. package/dist/collection/components/mrd-layout-section/mrd-layout-section.js +715 -0
  6. package/dist/collection/components/mrd-layout-section/mrd-layout-section.scss +339 -0
  7. package/dist/collection/components/mrd-longtext-field/mrd-longtext-field.js +1 -1
  8. package/dist/collection/components/mrd-number-field/mrd-number-field.js +1 -1
  9. package/dist/collection/components/mrd-table/mrd-table.js +41 -4
  10. package/dist/collection/components/mrd-table/mrd-table.scss +23 -0
  11. package/dist/collection/components/mrd-text-field/mrd-text-field.js +1 -1
  12. package/dist/collection/components/mrd-textarea-field/mrd-textarea-field.js +1 -1
  13. package/dist/collection/components/mrd-time-field/mrd-time-field.js +1 -1
  14. package/dist/collection/dev/app.js +109 -3
  15. package/dist/collection/dev/example-data.js +324 -0
  16. package/dist/collection/utils/cell-renderer.js +26 -0
  17. package/dist/components/mrd-layout-section.d.ts +11 -0
  18. package/dist/components/mrd-layout-section.js +1 -0
  19. package/dist/components/mrd-longtext-field2.js +1 -1
  20. package/dist/components/mrd-number-field2.js +1 -1
  21. package/dist/components/mrd-table.js +1 -1
  22. package/dist/components/mrd-table2.js +1 -0
  23. package/dist/components/mrd-text-field2.js +1 -1
  24. package/dist/components/mrd-textarea-field2.js +1 -1
  25. package/dist/components/mrd-time-field2.js +1 -1
  26. package/dist/esm/loader.js +1 -1
  27. package/dist/esm/mosterdcomponents.js +1 -1
  28. package/dist/esm/mrd-boolean-field_19.entry.js +3130 -0
  29. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
  30. package/dist/mosterdcomponents/p-a3255fc4.entry.js +1 -0
  31. package/dist/types/components/mrd-layout-section/mrd-layout-section.d.ts +92 -0
  32. package/dist/types/components/mrd-table/mrd-table.d.ts +5 -0
  33. package/dist/types/components.d.ts +128 -8
  34. package/dist/types/types/client-layout.d.ts +19 -0
  35. package/dist/types/utils/cell-renderer.d.ts +9 -1
  36. package/package.json +1 -1
  37. package/dist/cjs/format-DExY8_nu.js +0 -328
  38. package/dist/cjs/mrd-boolean-field_17.cjs.entry.js +0 -1554
  39. package/dist/cjs/mrd-table.cjs.entry.js +0 -888
  40. package/dist/esm/format-CcRjWvcb.js +0 -319
  41. package/dist/esm/mrd-boolean-field_17.entry.js +0 -1536
  42. package/dist/esm/mrd-table.entry.js +0 -886
  43. package/dist/mosterdcomponents/p-17fe94c6.entry.js +0 -1
  44. package/dist/mosterdcomponents/p-3d856b27.entry.js +0 -1
  45. package/dist/mosterdcomponents/p-CcRjWvcb.js +0 -1
@@ -5,12 +5,12 @@
5
5
  * It contains typing information for all components that exist in this project.
6
6
  */
7
7
  import { HTMLStencilElement, JSXBase } from "./stencil-public-runtime";
8
- import { ClientLayout, ClientLayoutItem, ClientLayoutItemFieldDataType, ClientLayoutItemRelationDisplayType, ClientLayoutItemRelationEditBehavior, ClientListValue, CurrencyValue, RelationSearchResult } from "./types";
8
+ import { ClientLayout, ClientLayoutItem, ClientLayoutItemFieldDataType, ClientLayoutItemRelationDisplayType, ClientLayoutItemRelationEditBehavior, ClientListValue, CurrencyValue, RelationSearchResult as RelationSearchResult1 } from "./types";
9
+ import { AggregationResult, ClientLayoutItem as ClientLayoutItem1, ClientLayoutItemNavigate, ClientViewMetadata, RelationSearchResult } from "./types/client-layout";
9
10
  import { AlternativeView, ColumnFilter, TableAction, TableColumn } from "./utils/cell-renderer";
10
- import { AggregationResult } from "./types/client-layout";
11
- export { ClientLayout, ClientLayoutItem, ClientLayoutItemFieldDataType, ClientLayoutItemRelationDisplayType, ClientLayoutItemRelationEditBehavior, ClientListValue, CurrencyValue, RelationSearchResult } from "./types";
11
+ export { ClientLayout, ClientLayoutItem, ClientLayoutItemFieldDataType, ClientLayoutItemRelationDisplayType, ClientLayoutItemRelationEditBehavior, ClientListValue, CurrencyValue, RelationSearchResult as RelationSearchResult1 } from "./types";
12
+ export { AggregationResult, ClientLayoutItem as ClientLayoutItem1, ClientLayoutItemNavigate, ClientViewMetadata, RelationSearchResult } from "./types/client-layout";
12
13
  export { AlternativeView, ColumnFilter, TableAction, TableColumn } from "./utils/cell-renderer";
13
- export { AggregationResult } from "./types/client-layout";
14
14
  export namespace Components {
15
15
  interface MrdBooleanField {
16
16
  /**
@@ -279,6 +279,48 @@ export namespace Components {
279
279
  */
280
280
  "value": unknown;
281
281
  }
282
+ interface MrdLayoutSection {
283
+ /**
284
+ * Record data object; keys are field names, _links holds relation and related-view links.
285
+ * @default {}
286
+ */
287
+ "data": Record<string, unknown>;
288
+ /**
289
+ * Items from one layout entry in ClientDashboardMetadata.layouts[].
290
+ * @default []
291
+ */
292
+ "items": ClientLayoutItem1[];
293
+ /**
294
+ * Top-level _links from ClientDashboardMetadata; used to resolve hrefs for VIEW items.
295
+ * @default {}
296
+ */
297
+ "links": Record<string, { href: string }>;
298
+ /**
299
+ * @default navigator.language
300
+ */
301
+ "locale": string;
302
+ /**
303
+ * Open the lightbox directly with a URL (e.g. after mrdDownload on a FILE field).
304
+ */
305
+ "openImagePreview": (url: string) => Promise<void>;
306
+ /**
307
+ * Provide a resolved URL for an IMAGE field. Shows as thumbnail; clicking opens the lightbox.
308
+ */
309
+ "setImagePreview": (fieldName: string, url: string) => Promise<void>;
310
+ /**
311
+ * Inject search results. Pass dataClass to target a specific SEARCH item; omit when there is only one.
312
+ */
313
+ "setSearchResults": (results: RelationSearchResult[], dataClass?: string) => Promise<void>;
314
+ /**
315
+ * Inject data into an embedded mrd-table for a RELATED_VIEW or VIEW item. Pass totalElements on page 0 to initialise the table; omit on subsequent pages. Pass pageLinks (_links from the page response) on page 0 to enable action hrefs in mrdViewAction.
316
+ */
317
+ "setViewPage": (name: string, page: number, rows: any[], totalElements?: number, pageLinks?: Record<string, { href: string; }>) => Promise<void>;
318
+ /**
319
+ * View metadata map (ClientDashboardMetadata.views) for RELATED_VIEW and VIEW items.
320
+ * @default {}
321
+ */
322
+ "views": Record<string, ClientViewMetadata>;
323
+ }
282
324
  interface MrdListField {
283
325
  /**
284
326
  * @default false
@@ -426,14 +468,14 @@ export namespace Components {
426
468
  * @default false
427
469
  */
428
470
  "required": boolean;
429
- "setAllRecords": (records: RelationSearchResult[]) => Promise<void>;
471
+ "setAllRecords": (records: RelationSearchResult1[]) => Promise<void>;
430
472
  "setLoading": (loading: boolean) => Promise<void>;
431
- "setSearchResults": (results: RelationSearchResult[]) => Promise<void>;
473
+ "setSearchResults": (results: RelationSearchResult1[]) => Promise<void>;
432
474
  /**
433
475
  * Plain href string/array for normal use; pass { id, label } objects to pre-fill a loaded record.
434
476
  * @default null
435
477
  */
436
- "value": string | string[] | RelationSearchResult | RelationSearchResult[] | null;
478
+ "value": string | string[] | RelationSearchResult1 | RelationSearchResult1[] | null;
437
479
  }
438
480
  interface MrdTable {
439
481
  /**
@@ -629,6 +671,10 @@ export interface MrdImageFieldCustomEvent<T> extends CustomEvent<T> {
629
671
  detail: T;
630
672
  target: HTMLMrdImageFieldElement;
631
673
  }
674
+ export interface MrdLayoutSectionCustomEvent<T> extends CustomEvent<T> {
675
+ detail: T;
676
+ target: HTMLMrdLayoutSectionElement;
677
+ }
632
678
  export interface MrdListFieldCustomEvent<T> extends CustomEvent<T> {
633
679
  detail: T;
634
680
  target: HTMLMrdListFieldElement;
@@ -850,6 +896,29 @@ declare global {
850
896
  prototype: HTMLMrdImageFieldElement;
851
897
  new (): HTMLMrdImageFieldElement;
852
898
  };
899
+ interface HTMLMrdLayoutSectionElementEventMap {
900
+ "mrdNavigate": { href?: string; label: string; navigate?: ClientLayoutItemNavigate };
901
+ "mrdSearch": { query: string; dataClass: string };
902
+ "mrdDownload": { href: string; fileName: string };
903
+ "mrdLoadView": { name: string; href?: string; viewConfig: ClientViewMetadata };
904
+ "mrdLoadViewPage": { name: string; page: number; sort: string };
905
+ "mrdLoadImage": { fieldName: string; href: string };
906
+ "mrdViewAction": { name: string; action: string; href?: string };
907
+ }
908
+ interface HTMLMrdLayoutSectionElement extends Components.MrdLayoutSection, HTMLStencilElement {
909
+ addEventListener<K extends keyof HTMLMrdLayoutSectionElementEventMap>(type: K, listener: (this: HTMLMrdLayoutSectionElement, ev: MrdLayoutSectionCustomEvent<HTMLMrdLayoutSectionElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
910
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
911
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
912
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
913
+ removeEventListener<K extends keyof HTMLMrdLayoutSectionElementEventMap>(type: K, listener: (this: HTMLMrdLayoutSectionElement, ev: MrdLayoutSectionCustomEvent<HTMLMrdLayoutSectionElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
914
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
915
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
916
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
917
+ }
918
+ var HTMLMrdLayoutSectionElement: {
919
+ prototype: HTMLMrdLayoutSectionElement;
920
+ new (): HTMLMrdLayoutSectionElement;
921
+ };
853
922
  interface HTMLMrdListFieldElementEventMap {
854
923
  "mrdChange": { name: string; value: string | string[] };
855
924
  "mrdBlur": { name: string; value: string | string[] };
@@ -1012,6 +1081,7 @@ declare global {
1012
1081
  "mrd-form": HTMLMrdFormElement;
1013
1082
  "mrd-hyperlink-field": HTMLMrdHyperlinkFieldElement;
1014
1083
  "mrd-image-field": HTMLMrdImageFieldElement;
1084
+ "mrd-layout-section": HTMLMrdLayoutSectionElement;
1015
1085
  "mrd-list-field": HTMLMrdListFieldElement;
1016
1086
  "mrd-longtext-field": HTMLMrdLongtextFieldElement;
1017
1087
  "mrd-number-field": HTMLMrdNumberFieldElement;
@@ -1323,6 +1393,51 @@ declare namespace LocalJSX {
1323
1393
  */
1324
1394
  "value"?: unknown;
1325
1395
  }
1396
+ interface MrdLayoutSection {
1397
+ /**
1398
+ * Record data object; keys are field names, _links holds relation and related-view links.
1399
+ * @default {}
1400
+ */
1401
+ "data"?: Record<string, unknown>;
1402
+ /**
1403
+ * Items from one layout entry in ClientDashboardMetadata.layouts[].
1404
+ * @default []
1405
+ */
1406
+ "items"?: ClientLayoutItem1[];
1407
+ /**
1408
+ * Top-level _links from ClientDashboardMetadata; used to resolve hrefs for VIEW items.
1409
+ * @default {}
1410
+ */
1411
+ "links"?: Record<string, { href: string }>;
1412
+ /**
1413
+ * @default navigator.language
1414
+ */
1415
+ "locale"?: string;
1416
+ "onMrdDownload"?: (event: MrdLayoutSectionCustomEvent<{ href: string; fileName: string }>) => void;
1417
+ /**
1418
+ * Fired once on load for each IMAGE field that has an href; host resolves the URL and calls setImagePreview().
1419
+ */
1420
+ "onMrdLoadImage"?: (event: MrdLayoutSectionCustomEvent<{ fieldName: string; href: string }>) => void;
1421
+ /**
1422
+ * Fired once on load for each RELATED_VIEW and VIEW item; host fetches page 0 and calls setViewPage().
1423
+ */
1424
+ "onMrdLoadView"?: (event: MrdLayoutSectionCustomEvent<{ name: string; href?: string; viewConfig: ClientViewMetadata }>) => void;
1425
+ /**
1426
+ * Re-emitted from an embedded mrd-table's mrdLoadPage; host fetches the next page and calls setViewPage().
1427
+ */
1428
+ "onMrdLoadViewPage"?: (event: MrdLayoutSectionCustomEvent<{ name: string; page: number; sort: string }>) => void;
1429
+ "onMrdNavigate"?: (event: MrdLayoutSectionCustomEvent<{ href?: string; label: string; navigate?: ClientLayoutItemNavigate }>) => void;
1430
+ "onMrdSearch"?: (event: MrdLayoutSectionCustomEvent<{ query: string; dataClass: string }>) => void;
1431
+ /**
1432
+ * Re-emitted from an embedded mrd-table's mrdAction; includes the view name and resolved href.
1433
+ */
1434
+ "onMrdViewAction"?: (event: MrdLayoutSectionCustomEvent<{ name: string; action: string; href?: string }>) => void;
1435
+ /**
1436
+ * View metadata map (ClientDashboardMetadata.views) for RELATED_VIEW and VIEW items.
1437
+ * @default {}
1438
+ */
1439
+ "views"?: Record<string, ClientViewMetadata>;
1440
+ }
1326
1441
  interface MrdListField {
1327
1442
  /**
1328
1443
  * @default false
@@ -1484,7 +1599,7 @@ declare namespace LocalJSX {
1484
1599
  * Plain href string/array for normal use; pass { id, label } objects to pre-fill a loaded record.
1485
1600
  * @default null
1486
1601
  */
1487
- "value"?: string | string[] | RelationSearchResult | RelationSearchResult[] | null;
1602
+ "value"?: string | string[] | RelationSearchResult1 | RelationSearchResult1[] | null;
1488
1603
  }
1489
1604
  interface MrdTable {
1490
1605
  /**
@@ -1738,6 +1853,9 @@ declare namespace LocalJSX {
1738
1853
  "accept": string;
1739
1854
  "maxSize": number;
1740
1855
  }
1856
+ interface MrdLayoutSectionAttributes {
1857
+ "locale": string;
1858
+ }
1741
1859
  interface MrdListFieldAttributes {
1742
1860
  "name": string;
1743
1861
  "label": string;
@@ -1828,6 +1946,7 @@ declare namespace LocalJSX {
1828
1946
  "mrd-form": Omit<MrdForm, keyof MrdFormAttributes> & { [K in keyof MrdForm & keyof MrdFormAttributes]?: MrdForm[K] } & { [K in keyof MrdForm & keyof MrdFormAttributes as `attr:${K}`]?: MrdFormAttributes[K] } & { [K in keyof MrdForm & keyof MrdFormAttributes as `prop:${K}`]?: MrdForm[K] };
1829
1947
  "mrd-hyperlink-field": Omit<MrdHyperlinkField, keyof MrdHyperlinkFieldAttributes> & { [K in keyof MrdHyperlinkField & keyof MrdHyperlinkFieldAttributes]?: MrdHyperlinkField[K] } & { [K in keyof MrdHyperlinkField & keyof MrdHyperlinkFieldAttributes as `attr:${K}`]?: MrdHyperlinkFieldAttributes[K] } & { [K in keyof MrdHyperlinkField & keyof MrdHyperlinkFieldAttributes as `prop:${K}`]?: MrdHyperlinkField[K] };
1830
1948
  "mrd-image-field": Omit<MrdImageField, keyof MrdImageFieldAttributes> & { [K in keyof MrdImageField & keyof MrdImageFieldAttributes]?: MrdImageField[K] } & { [K in keyof MrdImageField & keyof MrdImageFieldAttributes as `attr:${K}`]?: MrdImageFieldAttributes[K] } & { [K in keyof MrdImageField & keyof MrdImageFieldAttributes as `prop:${K}`]?: MrdImageField[K] };
1949
+ "mrd-layout-section": Omit<MrdLayoutSection, keyof MrdLayoutSectionAttributes> & { [K in keyof MrdLayoutSection & keyof MrdLayoutSectionAttributes]?: MrdLayoutSection[K] } & { [K in keyof MrdLayoutSection & keyof MrdLayoutSectionAttributes as `attr:${K}`]?: MrdLayoutSectionAttributes[K] } & { [K in keyof MrdLayoutSection & keyof MrdLayoutSectionAttributes as `prop:${K}`]?: MrdLayoutSection[K] };
1831
1950
  "mrd-list-field": Omit<MrdListField, keyof MrdListFieldAttributes> & { [K in keyof MrdListField & keyof MrdListFieldAttributes]?: MrdListField[K] } & { [K in keyof MrdListField & keyof MrdListFieldAttributes as `attr:${K}`]?: MrdListFieldAttributes[K] } & { [K in keyof MrdListField & keyof MrdListFieldAttributes as `prop:${K}`]?: MrdListField[K] };
1832
1951
  "mrd-longtext-field": Omit<MrdLongtextField, keyof MrdLongtextFieldAttributes> & { [K in keyof MrdLongtextField & keyof MrdLongtextFieldAttributes]?: MrdLongtextField[K] } & { [K in keyof MrdLongtextField & keyof MrdLongtextFieldAttributes as `attr:${K}`]?: MrdLongtextFieldAttributes[K] } & { [K in keyof MrdLongtextField & keyof MrdLongtextFieldAttributes as `prop:${K}`]?: MrdLongtextField[K] };
1833
1952
  "mrd-number-field": Omit<MrdNumberField, keyof MrdNumberFieldAttributes> & { [K in keyof MrdNumberField & keyof MrdNumberFieldAttributes]?: MrdNumberField[K] } & { [K in keyof MrdNumberField & keyof MrdNumberFieldAttributes as `attr:${K}`]?: MrdNumberFieldAttributes[K] } & { [K in keyof MrdNumberField & keyof MrdNumberFieldAttributes as `prop:${K}`]?: MrdNumberField[K] };
@@ -1852,6 +1971,7 @@ declare module "@stencil/core" {
1852
1971
  "mrd-form": LocalJSX.IntrinsicElements["mrd-form"] & JSXBase.HTMLAttributes<HTMLMrdFormElement>;
1853
1972
  "mrd-hyperlink-field": LocalJSX.IntrinsicElements["mrd-hyperlink-field"] & JSXBase.HTMLAttributes<HTMLMrdHyperlinkFieldElement>;
1854
1973
  "mrd-image-field": LocalJSX.IntrinsicElements["mrd-image-field"] & JSXBase.HTMLAttributes<HTMLMrdImageFieldElement>;
1974
+ "mrd-layout-section": LocalJSX.IntrinsicElements["mrd-layout-section"] & JSXBase.HTMLAttributes<HTMLMrdLayoutSectionElement>;
1855
1975
  "mrd-list-field": LocalJSX.IntrinsicElements["mrd-list-field"] & JSXBase.HTMLAttributes<HTMLMrdListFieldElement>;
1856
1976
  "mrd-longtext-field": LocalJSX.IntrinsicElements["mrd-longtext-field"] & JSXBase.HTMLAttributes<HTMLMrdLongtextFieldElement>;
1857
1977
  "mrd-number-field": LocalJSX.IntrinsicElements["mrd-number-field"] & JSXBase.HTMLAttributes<HTMLMrdNumberFieldElement>;
@@ -47,6 +47,17 @@ export declare enum ClientLayoutItemRelationEditBehavior {
47
47
  DROPDOWN = "DROPDOWN",
48
48
  CHECKBOX = "CHECKBOX"
49
49
  }
50
+ /** A single sub-link within a multi-value relation link. */
51
+ export interface DataObjectSubLink {
52
+ href: string;
53
+ name: string;
54
+ }
55
+ /** Link object as returned by the API on a data object's `_links` map. */
56
+ export interface DataObjectLink {
57
+ href: string;
58
+ name?: string;
59
+ values?: DataObjectSubLink[];
60
+ }
50
61
  /** A selectable list item as returned by the API. */
51
62
  export interface ClientListValue {
52
63
  /** Raw key stored in the database (API uses `key`, older code used `value`). */
@@ -146,6 +157,14 @@ export interface ClientLayoutItem {
146
157
  relatedObject?: ClientLayoutItemRelatedObject;
147
158
  search?: ClientLayoutItemSearch;
148
159
  name?: string;
160
+ showTitle?: boolean;
161
+ alternativeViews?: Array<{
162
+ name: string;
163
+ label?: string;
164
+ class?: string;
165
+ }>;
166
+ /** Toolbar buttons for embedded views. null/omitted = ["NEW","EXPORT"]; [] = none. */
167
+ actions?: string[] | null;
149
168
  }
150
169
  export interface ClientLayout {
151
170
  type?: ClientLayoutType;
@@ -39,5 +39,13 @@ export interface ColumnFilter {
39
39
  }
40
40
  export declare class CellRenderer {
41
41
  static render(column: TableColumn, row: Record<string, any>, locale: string): string;
42
- private static renderValue;
42
+ static renderValue(dataType: string, value: any, listItems: Array<{
43
+ key: string;
44
+ label: string;
45
+ }>, locale: string): string;
46
+ /**
47
+ * Returns syntax-highlighted JSON as an HTML string with inline styles.
48
+ * compact=true → single line (no indentation); compact=false → pretty-printed.
49
+ */
50
+ static formatJson(value: any, compact?: boolean): string;
43
51
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmlogic/components",
3
- "version": "0.1.24",
3
+ "version": "0.1.25",
4
4
  "description": "Stencil.js web component library for dynamic forms and virtual-scroll data tables",
5
5
  "license": "MIT",
6
6
  "author": "Mosterd",
@@ -1,328 +0,0 @@
1
- 'use strict';
2
-
3
- const translations = {
4
- nl: {
5
- required: 'Dit veld is verplicht',
6
- select_placeholder: 'Selecteer een optie',
7
- search_placeholder: 'Zoeken...',
8
- upload_file: 'Bestand uploaden',
9
- choose_file: 'Bestand kiezen',
10
- clear: 'Wissen',
11
- today: 'Vandaag',
12
- invalid_email: 'Voer een geldig e-mailadres in',
13
- invalid_url: 'Voer een geldige URL in',
14
- invalid_number: 'Voer een geldig getal in',
15
- drop_file_here: 'Sleep bestand hierheen of',
16
- browse: 'bladeren',
17
- file_too_large: 'Bestand is te groot',
18
- search_results: 'Zoekresultaten',
19
- no_results: 'Geen resultaten gevonden',
20
- loading: 'Laden...',
21
- submit: 'Opslaan',
22
- cancel: 'Annuleren',
23
- remove: 'Verwijderen',
24
- add: 'Toevoegen',
25
- yes: 'Ja',
26
- no: 'Nee',
27
- // mrd-table footer
28
- table_of: 'van',
29
- download: 'Downloaden',
30
- // mrd-table toolbar
31
- table_filter: 'Filteren',
32
- table_filter_hide: 'Filter verbergen',
33
- table_filter_active: 'actief',
34
- table_filter_clear_all: 'Alle filters wissen',
35
- table_new_record: 'Nieuw record',
36
- table_export_excel: 'Exporteer naar Excel',
37
- // mrd-table filter popup
38
- filter_sorting: 'Sortering',
39
- filter_ascending: 'Oplopend',
40
- filter_descending: 'Aflopend',
41
- filter_section: 'Filter',
42
- filter_apply: 'Toepassen',
43
- filter_clear: 'Wissen',
44
- filter_contains: 'Bevat',
45
- filter_starts_with: 'Begint met',
46
- filter_equals: 'Gelijk aan',
47
- filter_has_value: 'Heeft waarde',
48
- filter_is_empty: 'Is leeg',
49
- filter_is_not_empty: 'Is niet leeg',
50
- filter_exact: 'Exact',
51
- filter_range: 'Bereik',
52
- filter_from: 'Van',
53
- filter_to: 'Tot',
54
- filter_all: 'Alle',
55
- filter_select_all: 'Alles',
56
- filter_select_none: 'Geen',
57
- filter_search_value: 'Zoekwaarde...',
58
- filter_no_support: 'Geen filtering beschikbaar voor dit veldtype.',
59
- // mrd-table textblock
60
- textblock_show_more: 'Meer tonen',
61
- close: 'Sluiten',
62
- },
63
- en: {
64
- required: 'This field is required',
65
- select_placeholder: 'Select an option',
66
- search_placeholder: 'Search...',
67
- upload_file: 'Upload file',
68
- choose_file: 'Choose file',
69
- clear: 'Clear',
70
- today: 'Today',
71
- invalid_email: 'Please enter a valid email address',
72
- invalid_url: 'Please enter a valid URL',
73
- invalid_number: 'Please enter a valid number',
74
- drop_file_here: 'Drop file here or',
75
- browse: 'browse',
76
- file_too_large: 'File is too large',
77
- search_results: 'Search results',
78
- no_results: 'No results found',
79
- loading: 'Loading...',
80
- submit: 'Save',
81
- cancel: 'Cancel',
82
- remove: 'Remove',
83
- add: 'Add',
84
- yes: 'Yes',
85
- no: 'No',
86
- // mrd-table footer
87
- table_of: 'of',
88
- download: 'Download',
89
- // mrd-table toolbar
90
- table_filter: 'Filter',
91
- table_filter_hide: 'Hide filter',
92
- table_filter_active: 'active',
93
- table_filter_clear_all: 'Clear all filters',
94
- table_new_record: 'New record',
95
- table_export_excel: 'Export to Excel',
96
- // mrd-table filter popup
97
- filter_sorting: 'Sorting',
98
- filter_ascending: 'Ascending',
99
- filter_descending: 'Descending',
100
- filter_section: 'Filter',
101
- filter_apply: 'Apply',
102
- filter_clear: 'Clear',
103
- filter_contains: 'Contains',
104
- filter_starts_with: 'Starts with',
105
- filter_equals: 'Equals',
106
- filter_has_value: 'Has value',
107
- filter_is_empty: 'Is empty',
108
- filter_is_not_empty: 'Is not empty',
109
- filter_exact: 'Exact',
110
- filter_range: 'Range',
111
- filter_from: 'From',
112
- filter_to: 'To',
113
- filter_all: 'All',
114
- filter_select_all: 'All',
115
- filter_select_none: 'None',
116
- filter_search_value: 'Search value...',
117
- filter_no_support: 'Filtering is not available for this field type.',
118
- // mrd-table textblock
119
- textblock_show_more: 'Show more',
120
- close: 'Close',
121
- },
122
- ar: {
123
- required: 'هذا الحقل مطلوب',
124
- select_placeholder: 'اختر خياراً',
125
- search_placeholder: 'بحث...',
126
- upload_file: 'رفع ملف',
127
- choose_file: 'اختر ملفاً',
128
- clear: 'مسح',
129
- today: 'اليوم',
130
- invalid_email: 'يرجى إدخال عنوان بريد إلكتروني صحيح',
131
- invalid_url: 'يرجى إدخال رابط صحيح',
132
- invalid_number: 'يرجى إدخال رقم صحيح',
133
- drop_file_here: 'اسحب الملف هنا أو',
134
- browse: 'تصفح',
135
- file_too_large: 'الملف كبير جداً',
136
- search_results: 'نتائج البحث',
137
- no_results: 'لم يتم العثور على نتائج',
138
- loading: 'جار التحميل...',
139
- submit: 'حفظ',
140
- cancel: 'إلغاء',
141
- remove: 'إزالة',
142
- add: 'إضافة',
143
- yes: 'نعم',
144
- no: 'لا',
145
- // mrd-table footer
146
- table_of: 'من أصل',
147
- download: 'تنزيل',
148
- // mrd-table toolbar
149
- table_filter: 'تصفية',
150
- table_filter_hide: 'إخفاء التصفية',
151
- table_filter_active: 'نشط',
152
- table_filter_clear_all: 'مسح جميع الفلاتر',
153
- table_new_record: 'سجل جديد',
154
- table_export_excel: 'تصدير إلى Excel',
155
- // mrd-table filter popup
156
- filter_sorting: 'الترتيب',
157
- filter_ascending: 'تصاعدي',
158
- filter_descending: 'تنازلي',
159
- filter_section: 'تصفية',
160
- filter_apply: 'تطبيق',
161
- filter_clear: 'مسح',
162
- filter_contains: 'يحتوي على',
163
- filter_starts_with: 'يبدأ بـ',
164
- filter_equals: 'يساوي',
165
- filter_has_value: 'له قيمة',
166
- filter_is_empty: 'فارغ',
167
- filter_is_not_empty: 'ليس فارغاً',
168
- filter_exact: 'دقيق',
169
- filter_range: 'نطاق',
170
- filter_from: 'من',
171
- filter_to: 'إلى',
172
- filter_all: 'الكل',
173
- filter_select_all: 'الكل',
174
- filter_select_none: 'لا شيء',
175
- filter_search_value: 'قيمة البحث...',
176
- filter_no_support: 'التصفية غير متاحة لهذا النوع من الحقول.',
177
- // mrd-table textblock
178
- textblock_show_more: 'عرض المزيد',
179
- close: 'إغلاق',
180
- },
181
- fr: {
182
- required: 'Ce champ est obligatoire',
183
- select_placeholder: 'Sélectionner une option',
184
- search_placeholder: 'Rechercher...',
185
- upload_file: 'Télécharger un fichier',
186
- choose_file: 'Choisir un fichier',
187
- clear: 'Effacer',
188
- today: "Aujourd'hui",
189
- invalid_email: 'Veuillez saisir une adresse e-mail valide',
190
- invalid_url: 'Veuillez saisir une URL valide',
191
- invalid_number: 'Veuillez saisir un nombre valide',
192
- drop_file_here: 'Déposez le fichier ici ou',
193
- browse: 'parcourir',
194
- file_too_large: 'Le fichier est trop volumineux',
195
- search_results: 'Résultats de recherche',
196
- no_results: 'Aucun résultat trouvé',
197
- loading: 'Chargement...',
198
- submit: 'Enregistrer',
199
- cancel: 'Annuler',
200
- remove: 'Supprimer',
201
- add: 'Ajouter',
202
- yes: 'Oui',
203
- no: 'Non',
204
- // mrd-table footer
205
- table_of: 'sur',
206
- download: 'Télécharger',
207
- // mrd-table toolbar
208
- table_filter: 'Filtrer',
209
- table_filter_hide: 'Masquer le filtre',
210
- table_filter_active: 'actif',
211
- table_filter_clear_all: 'Effacer tous les filtres',
212
- table_new_record: 'Nouvel enregistrement',
213
- table_export_excel: 'Exporter vers Excel',
214
- // mrd-table filter popup
215
- filter_sorting: 'Tri',
216
- filter_ascending: 'Croissant',
217
- filter_descending: 'Décroissant',
218
- filter_section: 'Filtre',
219
- filter_apply: 'Appliquer',
220
- filter_clear: 'Effacer',
221
- filter_contains: 'Contient',
222
- filter_starts_with: 'Commence par',
223
- filter_equals: 'Égal à',
224
- filter_has_value: 'A une valeur',
225
- filter_is_empty: 'Est vide',
226
- filter_is_not_empty: "N'est pas vide",
227
- filter_exact: 'Exact',
228
- filter_range: 'Plage',
229
- filter_from: 'De',
230
- filter_to: 'À',
231
- filter_all: 'Tous',
232
- filter_select_all: 'Tous',
233
- filter_select_none: 'Aucun',
234
- filter_search_value: 'Valeur de recherche...',
235
- filter_no_support: "Le filtrage n'est pas disponible pour ce type de champ.",
236
- // mrd-table textblock
237
- textblock_show_more: 'Voir plus',
238
- close: 'Fermer',
239
- },
240
- };
241
- function t(key, locale) {
242
- var _a, _b, _c;
243
- const lang = locale.split('-')[0].toLowerCase();
244
- const dict = (_a = translations[lang]) !== null && _a !== void 0 ? _a : translations['en'];
245
- return (_c = (_b = dict[key]) !== null && _b !== void 0 ? _b : translations['en'][key]) !== null && _c !== void 0 ? _c : key;
246
- }
247
-
248
- function formatNumber(value, locale, options) {
249
- if (value === null || value === undefined || isNaN(value))
250
- return '';
251
- return new Intl.NumberFormat(locale, options).format(value);
252
- }
253
- function formatCurrency(amount, currency, locale) {
254
- if (amount === null || amount === undefined || isNaN(amount))
255
- return '';
256
- return new Intl.NumberFormat(locale, {
257
- style: 'currency',
258
- currency,
259
- minimumFractionDigits: 2,
260
- maximumFractionDigits: 2,
261
- }).format(amount);
262
- }
263
- function formatPercentage(value, locale, decimalPrecision = 2) {
264
- if (value === null || value === undefined || isNaN(value))
265
- return '';
266
- return new Intl.NumberFormat(locale, {
267
- style: 'percent',
268
- minimumFractionDigits: decimalPrecision,
269
- maximumFractionDigits: decimalPrecision,
270
- }).format(value);
271
- }
272
- function formatDate(value, locale) {
273
- if (!value)
274
- return '';
275
- const date = typeof value === 'string' ? new Date(value) : value;
276
- if (isNaN(date.getTime()))
277
- return '';
278
- return new Intl.DateTimeFormat(locale, { year: 'numeric', month: '2-digit', day: '2-digit' }).format(date);
279
- }
280
- function formatDateTime(value, locale) {
281
- if (!value)
282
- return '';
283
- const date = typeof value === 'string' ? new Date(value) : value;
284
- if (isNaN(date.getTime()))
285
- return '';
286
- return new Intl.DateTimeFormat(locale, {
287
- year: 'numeric',
288
- month: '2-digit',
289
- day: '2-digit',
290
- hour: '2-digit',
291
- minute: '2-digit',
292
- }).format(date);
293
- }
294
- function formatTime(value, locale) {
295
- if (!value)
296
- return '';
297
- // value is HH:MM or HH:MM:SS
298
- const [hours, minutes] = value.split(':').map(Number);
299
- const date = new Date();
300
- date.setHours(hours, minutes, 0, 0);
301
- return new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).format(date);
302
- }
303
- function parseLocalizedNumber(str, locale) {
304
- var _a, _b, _c, _d;
305
- if (!str || !str.trim())
306
- return null;
307
- // Detect decimal and thousands separators from the locale
308
- const parts = new Intl.NumberFormat(locale).formatToParts(1234567.89);
309
- const groupSep = (_b = (_a = parts.find((p) => p.type === 'group')) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ',';
310
- const decimalSep = (_d = (_c = parts.find((p) => p.type === 'decimal')) === null || _c === void 0 ? void 0 : _c.value) !== null && _d !== void 0 ? _d : '.';
311
- // Remove group separators, replace decimal separator with '.'
312
- const normalized = str
313
- .replace(new RegExp(`\\${groupSep}`, 'g'), '')
314
- .replace(new RegExp(`\\${decimalSep}`), '.')
315
- .replace('%', '')
316
- .trim();
317
- const parsed = parseFloat(normalized);
318
- return isNaN(parsed) ? null : parsed;
319
- }
320
-
321
- exports.formatCurrency = formatCurrency;
322
- exports.formatDate = formatDate;
323
- exports.formatDateTime = formatDateTime;
324
- exports.formatNumber = formatNumber;
325
- exports.formatPercentage = formatPercentage;
326
- exports.formatTime = formatTime;
327
- exports.parseLocalizedNumber = parseLocalizedNumber;
328
- exports.t = t;