@mmlogic/components 0.5.1 → 0.5.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 (39) hide show
  1. package/dist/cjs/cell-renderer-CmaO0CZT.js +862 -0
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/cjs/mosterdcomponents.cjs.js +1 -1
  4. package/dist/cjs/mrd-boolean-field_23.cjs.entry.js +2490 -817
  5. package/dist/cjs/mrd-merge-view.cjs.entry.js +273 -0
  6. package/dist/collection/collection-manifest.json +1 -0
  7. package/dist/collection/components/fields/mrd-textarea-field/mrd-textarea-field.js +9 -5
  8. package/dist/collection/components/merge/mrd-merge-view/merge-diff.js +99 -0
  9. package/dist/collection/components/merge/mrd-merge-view/merge-parts.js +44 -0
  10. package/dist/collection/components/merge/mrd-merge-view/mrd-merge-view.css +244 -0
  11. package/dist/collection/components/merge/mrd-merge-view/mrd-merge-view.js +397 -0
  12. package/dist/collection/dev/api.js +24 -0
  13. package/dist/collection/dev/app.js +84 -4
  14. package/dist/collection/utils/cell-renderer.js +6 -1
  15. package/dist/collection/utils/i18n.js +104 -0
  16. package/dist/components/cell-renderer.js +1 -0
  17. package/dist/components/format.js +1 -1
  18. package/dist/components/i18n.js +1 -1
  19. package/dist/components/mrd-layout-section.js +1 -1
  20. package/dist/components/mrd-merge-view.d.ts +11 -0
  21. package/dist/components/mrd-merge-view.js +1 -0
  22. package/dist/components/mrd-table2.js +1 -1
  23. package/dist/components/mrd-textarea-field2.js +2 -1
  24. package/dist/esm/cell-renderer-D63AUZxa.js +854 -0
  25. package/dist/esm/loader.js +1 -1
  26. package/dist/esm/mosterdcomponents.js +1 -1
  27. package/dist/esm/mrd-boolean-field_23.entry.js +2420 -747
  28. package/dist/esm/mrd-merge-view.entry.js +271 -0
  29. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
  30. package/dist/mosterdcomponents/p-2e16a7d0.entry.js +1 -0
  31. package/dist/mosterdcomponents/p-CnqDM0Gb.js +1 -0
  32. package/dist/mosterdcomponents/p-b5f38707.entry.js +3 -0
  33. package/dist/types/components/fields/mrd-textarea-field/mrd-textarea-field.d.ts +1 -0
  34. package/dist/types/components/merge/mrd-merge-view/merge-diff.d.ts +43 -0
  35. package/dist/types/components/merge/mrd-merge-view/merge-parts.d.ts +37 -0
  36. package/dist/types/components/merge/mrd-merge-view/mrd-merge-view.d.ts +68 -0
  37. package/dist/types/components.d.ts +151 -0
  38. package/package.json +2 -1
  39. package/dist/mosterdcomponents/p-cdecc698.entry.js +0 -1
@@ -21,5 +21,6 @@ export declare class MrdTextareaField implements ComponentDidLoad {
21
21
  private editorEl;
22
22
  componentDidLoad(): void;
23
23
  private initQuill;
24
+ private getSanitizedHtml;
24
25
  render(): any;
25
26
  }
@@ -0,0 +1,43 @@
1
+ import { ClientLayoutItem } from '../../../types/client-layout';
2
+ /** A single field/relation whose value differs between the two records being merged. */
3
+ export interface MergeFieldDiff {
4
+ item: ClientLayoutItem;
5
+ aValue: unknown;
6
+ bValue: unknown;
7
+ }
8
+ /**
9
+ * Whether a layout item can appear in the merge diff at all. m-n relations
10
+ * (`multiple: true`) are unioned automatically server-side (DataService.merge)
11
+ * and must never be surfaced as a user choice — only FIELD and single-value
12
+ * (n-1) RELATION items are diffable.
13
+ */
14
+ export declare function isDiffable(item: ClientLayoutItem): boolean;
15
+ /**
16
+ * Raw value for a field/relation off a record in the API's row shape (flat
17
+ * fields + `_links`). History-enabled fields come back as `{ current,
18
+ * history: [...] }` — this returns that whole object as-is, since a winning
19
+ * B value must carry its entire history into the patch (FINDING-0114: "the
20
+ * entire history list follows whichever value wins ... never interleaved").
21
+ */
22
+ export declare function getRawValue(item: ClientLayoutItem, record: Record<string, any> | null | undefined): unknown;
23
+ /**
24
+ * Splits diffable fields into `conflicts` (both records have a — different —
25
+ * value, user must pick) and `autoFilled` (A has no value, B does; silently
26
+ * taken from B without a UI choice).
27
+ */
28
+ export declare function diffFields(fields: ClientLayoutItem[], recordA: Record<string, any> | null | undefined, recordB: Record<string, any> | null | undefined): {
29
+ conflicts: MergeFieldDiff[];
30
+ autoFilled: MergeFieldDiff[];
31
+ };
32
+ /**
33
+ * Builds the patch payload per the merge endpoint contract: every `autoFilled`
34
+ * entry is always included (A had nothing to lose); a `conflicts` entry is
35
+ * only included when the user explicitly resolved it to B — anything left
36
+ * unresolved keeps A's value by omission.
37
+ */
38
+ export declare function buildPatch(diff: {
39
+ conflicts: MergeFieldDiff[];
40
+ autoFilled: MergeFieldDiff[];
41
+ }, resolutions: Record<string, 'A' | 'B'>): Record<string, unknown>;
42
+ /** Display label for a candidate record in the search results list. */
43
+ export declare function candidateLabel(record: Record<string, any> | null | undefined): string;
@@ -0,0 +1,37 @@
1
+ import { FunctionalComponent } from '../../../stencil-public-runtime';
2
+ import { MergeFieldDiff } from './merge-diff';
3
+ export declare const MergeSearchStep: FunctionalComponent<{
4
+ locale: string;
5
+ searchQuery: string;
6
+ searchResults: Record<string, any>[];
7
+ isLoading: boolean;
8
+ onSearchInput: (query: string) => void;
9
+ onSelect: (record: Record<string, any>) => void;
10
+ }>;
11
+ export declare const MergeCompareStep: FunctionalComponent<{
12
+ locale: string;
13
+ currentLabel: string;
14
+ candidateLabel: string;
15
+ conflicts: MergeFieldDiff[];
16
+ autoFilled: MergeFieldDiff[];
17
+ recordA: Record<string, any>;
18
+ recordB: Record<string, any>;
19
+ resolutions: Record<string, 'A' | 'B'>;
20
+ openHistoryKey: string | null;
21
+ onResolve: (name: string, side: 'A' | 'B') => void;
22
+ onToggleHistory: (key: string | null) => void;
23
+ onChangeCandidate: () => void;
24
+ onContinue: () => void;
25
+ }>;
26
+ export declare const MergeConfirmStep: FunctionalComponent<{
27
+ locale: string;
28
+ candidateLabel: string;
29
+ conflicts: MergeFieldDiff[];
30
+ autoFilled: MergeFieldDiff[];
31
+ resolutions: Record<string, 'A' | 'B'>;
32
+ recordB: Record<string, any>;
33
+ openHistoryKey: string | null;
34
+ onToggleHistory: (key: string | null) => void;
35
+ onBack: () => void;
36
+ onConfirm: () => void;
37
+ }>;
@@ -0,0 +1,68 @@
1
+ import { EventEmitter } from '../../../stencil-public-runtime';
2
+ import { ClientLayoutItem } from '../../../types/client-layout';
3
+ type MergeStep = 'search' | 'compare' | 'confirm';
4
+ /**
5
+ * Merges two DataObjects of the same basic type (FINDING-0114 / TASK-0177).
6
+ * Never performs network I/O itself: it emits `mrdSearch` (host searches and
7
+ * calls `setSearchResults()`, mirroring mrd-relation-field) and `mrdMerge`
8
+ * (host calls the merge endpoint — `POST {winnerHref}/merge` with
9
+ * `{ loser: loserHref, patch }`, per DataController.merge()).
10
+ *
11
+ * Has no exit/cancel affordance of its own — hosts show this inside their
12
+ * own overlay-page chrome (its close button), the same way mrd-layout-section
13
+ * never renders a page-level close button either.
14
+ */
15
+ export declare class MrdMergeView {
16
+ el: HTMLElement;
17
+ locale: string;
18
+ /** Dot-notation class, passed through on mrdSearch (host may use it to pick the right search endpoint). */
19
+ basicType: string;
20
+ /** URL segment for the search endpoint; falls back to basicType when absent. */
21
+ mostSignificantClass: string;
22
+ /** Flat FIELD/RELATION items describing the basic type's schema (host flattens SECTION/GROUP, same as mrd-table's `columns`). */
23
+ fields: ClientLayoutItem[];
24
+ /** Href of A (winner) — the object the merge screen was opened from. */
25
+ currentHref: string;
26
+ /** A's full raw record: flat fields + `_links`, the same row shape CellRenderer.render expects. */
27
+ currentRecord: Record<string, any>;
28
+ /** Display name for A, shown in the compare step's column header. */
29
+ currentLabel: string;
30
+ step: MergeStep;
31
+ searchQuery: string;
32
+ searchResults: Record<string, any>[];
33
+ isLoading: boolean;
34
+ candidate: Record<string, any> | null;
35
+ resolutions: Record<string, 'A' | 'B'>;
36
+ /** Which history badge popover is open, keyed e.g. `legalName:A` / `legalName:confirm`. */
37
+ openHistoryKey: string | null;
38
+ mrdSearch: EventEmitter<{
39
+ query: string;
40
+ basicType: string;
41
+ mostSignificantClass?: string;
42
+ }>;
43
+ mrdMerge: EventEmitter<{
44
+ winnerHref: string;
45
+ loserHref: string;
46
+ patch: Record<string, unknown>;
47
+ }>;
48
+ private historyClickOutside;
49
+ connectedCallback(): void;
50
+ disconnectedCallback(): void;
51
+ /**
52
+ * Stores search results, filtering out A itself regardless of what the
53
+ * host's search returns — A must never appear as a mergeable candidate.
54
+ */
55
+ setSearchResults(records: Record<string, any>[]): Promise<void>;
56
+ setLoading(loading: boolean): Promise<void>;
57
+ private searchDebounce;
58
+ private handleSearchInput;
59
+ private handleSelect;
60
+ private handleChangeCandidate;
61
+ private handleResolve;
62
+ private handleToggleHistory;
63
+ private handleContinue;
64
+ private handleBack;
65
+ private handleConfirm;
66
+ render(): any;
67
+ }
68
+ export {};
@@ -550,6 +550,57 @@ export namespace Components {
550
550
  */
551
551
  "value": string;
552
552
  }
553
+ /**
554
+ * Merges two DataObjects of the same basic type (FINDING-0114 / TASK-0177).
555
+ * Never performs network I/O itself: it emits `mrdSearch` (host searches and
556
+ * calls `setSearchResults()`, mirroring mrd-relation-field) and `mrdMerge`
557
+ * (host calls the merge endpoint — `POST {winnerHref}/merge` with
558
+ * `{ loser: loserHref, patch }`, per DataController.merge()).
559
+ * Has no exit/cancel affordance of its own — hosts show this inside their
560
+ * own overlay-page chrome (its close button), the same way mrd-layout-section
561
+ * never renders a page-level close button either.
562
+ */
563
+ interface MrdMergeView {
564
+ /**
565
+ * Dot-notation class, passed through on mrdSearch (host may use it to pick the right search endpoint).
566
+ * @default ''
567
+ */
568
+ "basicType": string;
569
+ /**
570
+ * Href of A (winner) — the object the merge screen was opened from.
571
+ * @default ''
572
+ */
573
+ "currentHref": string;
574
+ /**
575
+ * Display name for A, shown in the compare step's column header.
576
+ * @default ''
577
+ */
578
+ "currentLabel": string;
579
+ /**
580
+ * A's full raw record: flat fields + `_links`, the same row shape CellRenderer.render expects.
581
+ * @default {}
582
+ */
583
+ "currentRecord": Record<string, any>;
584
+ /**
585
+ * Flat FIELD/RELATION items describing the basic type's schema (host flattens SECTION/GROUP, same as mrd-table's `columns`).
586
+ * @default []
587
+ */
588
+ "fields": ClientLayoutItem[];
589
+ /**
590
+ * @default navigator.language
591
+ */
592
+ "locale": string;
593
+ /**
594
+ * URL segment for the search endpoint; falls back to basicType when absent.
595
+ * @default ''
596
+ */
597
+ "mostSignificantClass": string;
598
+ "setLoading": (loading: boolean) => Promise<void>;
599
+ /**
600
+ * Stores search results, filtering out A itself regardless of what the host's search returns — A must never appear as a mergeable candidate.
601
+ */
602
+ "setSearchResults": (records: Record<string, any>[]) => Promise<void>;
603
+ }
553
604
  interface MrdNumberField {
554
605
  /**
555
606
  * @default ClientLayoutItemFieldDataType.INTEGER
@@ -880,6 +931,10 @@ export interface MrdLongtextFieldCustomEvent<T> extends CustomEvent<T> {
880
931
  detail: T;
881
932
  target: HTMLMrdLongtextFieldElement;
882
933
  }
934
+ export interface MrdMergeViewCustomEvent<T> extends CustomEvent<T> {
935
+ detail: T;
936
+ target: HTMLMrdMergeViewElement;
937
+ }
883
938
  export interface MrdNumberFieldCustomEvent<T> extends CustomEvent<T> {
884
939
  detail: T;
885
940
  target: HTMLMrdNumberFieldElement;
@@ -1268,6 +1323,34 @@ declare global {
1268
1323
  prototype: HTMLMrdLongtextFieldElement;
1269
1324
  new (): HTMLMrdLongtextFieldElement;
1270
1325
  };
1326
+ interface HTMLMrdMergeViewElementEventMap {
1327
+ "mrdSearch": { query: string; basicType: string; mostSignificantClass?: string };
1328
+ "mrdMerge": { winnerHref: string; loserHref: string; patch: Record<string, unknown> };
1329
+ }
1330
+ /**
1331
+ * Merges two DataObjects of the same basic type (FINDING-0114 / TASK-0177).
1332
+ * Never performs network I/O itself: it emits `mrdSearch` (host searches and
1333
+ * calls `setSearchResults()`, mirroring mrd-relation-field) and `mrdMerge`
1334
+ * (host calls the merge endpoint — `POST {winnerHref}/merge` with
1335
+ * `{ loser: loserHref, patch }`, per DataController.merge()).
1336
+ * Has no exit/cancel affordance of its own — hosts show this inside their
1337
+ * own overlay-page chrome (its close button), the same way mrd-layout-section
1338
+ * never renders a page-level close button either.
1339
+ */
1340
+ interface HTMLMrdMergeViewElement extends Components.MrdMergeView, HTMLStencilElement {
1341
+ addEventListener<K extends keyof HTMLMrdMergeViewElementEventMap>(type: K, listener: (this: HTMLMrdMergeViewElement, ev: MrdMergeViewCustomEvent<HTMLMrdMergeViewElementEventMap[K]>) => any, options?: boolean | AddEventListenerOptions): void;
1342
+ addEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1343
+ addEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
1344
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
1345
+ removeEventListener<K extends keyof HTMLMrdMergeViewElementEventMap>(type: K, listener: (this: HTMLMrdMergeViewElement, ev: MrdMergeViewCustomEvent<HTMLMrdMergeViewElementEventMap[K]>) => any, options?: boolean | EventListenerOptions): void;
1346
+ removeEventListener<K extends keyof DocumentEventMap>(type: K, listener: (this: Document, ev: DocumentEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1347
+ removeEventListener<K extends keyof HTMLElementEventMap>(type: K, listener: (this: HTMLElement, ev: HTMLElementEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
1348
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
1349
+ }
1350
+ var HTMLMrdMergeViewElement: {
1351
+ prototype: HTMLMrdMergeViewElement;
1352
+ new (): HTMLMrdMergeViewElement;
1353
+ };
1271
1354
  interface HTMLMrdNumberFieldElementEventMap {
1272
1355
  "mrdChange": { name: string; value: number | null };
1273
1356
  "mrdBlur": { name: string; value: number | null };
@@ -1417,6 +1500,7 @@ declare global {
1417
1500
  "mrd-layout-section": HTMLMrdLayoutSectionElement;
1418
1501
  "mrd-list-field": HTMLMrdListFieldElement;
1419
1502
  "mrd-longtext-field": HTMLMrdLongtextFieldElement;
1503
+ "mrd-merge-view": HTMLMrdMergeViewElement;
1420
1504
  "mrd-number-field": HTMLMrdNumberFieldElement;
1421
1505
  "mrd-relation-field": HTMLMrdRelationFieldElement;
1422
1506
  "mrd-secret-field": HTMLMrdSecretFieldElement;
@@ -2062,6 +2146,54 @@ declare namespace LocalJSX {
2062
2146
  */
2063
2147
  "value"?: string;
2064
2148
  }
2149
+ /**
2150
+ * Merges two DataObjects of the same basic type (FINDING-0114 / TASK-0177).
2151
+ * Never performs network I/O itself: it emits `mrdSearch` (host searches and
2152
+ * calls `setSearchResults()`, mirroring mrd-relation-field) and `mrdMerge`
2153
+ * (host calls the merge endpoint — `POST {winnerHref}/merge` with
2154
+ * `{ loser: loserHref, patch }`, per DataController.merge()).
2155
+ * Has no exit/cancel affordance of its own — hosts show this inside their
2156
+ * own overlay-page chrome (its close button), the same way mrd-layout-section
2157
+ * never renders a page-level close button either.
2158
+ */
2159
+ interface MrdMergeView {
2160
+ /**
2161
+ * Dot-notation class, passed through on mrdSearch (host may use it to pick the right search endpoint).
2162
+ * @default ''
2163
+ */
2164
+ "basicType"?: string;
2165
+ /**
2166
+ * Href of A (winner) — the object the merge screen was opened from.
2167
+ * @default ''
2168
+ */
2169
+ "currentHref"?: string;
2170
+ /**
2171
+ * Display name for A, shown in the compare step's column header.
2172
+ * @default ''
2173
+ */
2174
+ "currentLabel"?: string;
2175
+ /**
2176
+ * A's full raw record: flat fields + `_links`, the same row shape CellRenderer.render expects.
2177
+ * @default {}
2178
+ */
2179
+ "currentRecord"?: Record<string, any>;
2180
+ /**
2181
+ * Flat FIELD/RELATION items describing the basic type's schema (host flattens SECTION/GROUP, same as mrd-table's `columns`).
2182
+ * @default []
2183
+ */
2184
+ "fields"?: ClientLayoutItem[];
2185
+ /**
2186
+ * @default navigator.language
2187
+ */
2188
+ "locale"?: string;
2189
+ /**
2190
+ * URL segment for the search endpoint; falls back to basicType when absent.
2191
+ * @default ''
2192
+ */
2193
+ "mostSignificantClass"?: string;
2194
+ "onMrdMerge"?: (event: MrdMergeViewCustomEvent<{ winnerHref: string; loserHref: string; patch: Record<string, unknown> }>) => void;
2195
+ "onMrdSearch"?: (event: MrdMergeViewCustomEvent<{ query: string; basicType: string; mostSignificantClass?: string }>) => void;
2196
+ }
2065
2197
  interface MrdNumberField {
2066
2198
  /**
2067
2199
  * @default ClientLayoutItemFieldDataType.INTEGER
@@ -2463,6 +2595,13 @@ declare namespace LocalJSX {
2463
2595
  "disabled": boolean;
2464
2596
  "locale": string;
2465
2597
  }
2598
+ interface MrdMergeViewAttributes {
2599
+ "locale": string;
2600
+ "basicType": string;
2601
+ "mostSignificantClass": string;
2602
+ "currentHref": string;
2603
+ "currentLabel": string;
2604
+ }
2466
2605
  interface MrdNumberFieldAttributes {
2467
2606
  "name": string;
2468
2607
  "label": string;
@@ -2550,6 +2689,7 @@ declare namespace LocalJSX {
2550
2689
  "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] };
2551
2690
  "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] };
2552
2691
  "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] };
2692
+ "mrd-merge-view": Omit<MrdMergeView, keyof MrdMergeViewAttributes> & { [K in keyof MrdMergeView & keyof MrdMergeViewAttributes]?: MrdMergeView[K] } & { [K in keyof MrdMergeView & keyof MrdMergeViewAttributes as `attr:${K}`]?: MrdMergeViewAttributes[K] } & { [K in keyof MrdMergeView & keyof MrdMergeViewAttributes as `prop:${K}`]?: MrdMergeView[K] };
2553
2693
  "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] };
2554
2694
  "mrd-relation-field": Omit<MrdRelationField, keyof MrdRelationFieldAttributes> & { [K in keyof MrdRelationField & keyof MrdRelationFieldAttributes]?: MrdRelationField[K] } & { [K in keyof MrdRelationField & keyof MrdRelationFieldAttributes as `attr:${K}`]?: MrdRelationFieldAttributes[K] } & { [K in keyof MrdRelationField & keyof MrdRelationFieldAttributes as `prop:${K}`]?: MrdRelationField[K] };
2555
2695
  "mrd-secret-field": Omit<MrdSecretField, keyof MrdSecretFieldAttributes> & { [K in keyof MrdSecretField & keyof MrdSecretFieldAttributes]?: MrdSecretField[K] } & { [K in keyof MrdSecretField & keyof MrdSecretFieldAttributes as `attr:${K}`]?: MrdSecretFieldAttributes[K] } & { [K in keyof MrdSecretField & keyof MrdSecretFieldAttributes as `prop:${K}`]?: MrdSecretField[K] };
@@ -2620,6 +2760,17 @@ declare module "@stencil/core" {
2620
2760
  "mrd-layout-section": LocalJSX.IntrinsicElements["mrd-layout-section"] & JSXBase.HTMLAttributes<HTMLMrdLayoutSectionElement>;
2621
2761
  "mrd-list-field": LocalJSX.IntrinsicElements["mrd-list-field"] & JSXBase.HTMLAttributes<HTMLMrdListFieldElement>;
2622
2762
  "mrd-longtext-field": LocalJSX.IntrinsicElements["mrd-longtext-field"] & JSXBase.HTMLAttributes<HTMLMrdLongtextFieldElement>;
2763
+ /**
2764
+ * Merges two DataObjects of the same basic type (FINDING-0114 / TASK-0177).
2765
+ * Never performs network I/O itself: it emits `mrdSearch` (host searches and
2766
+ * calls `setSearchResults()`, mirroring mrd-relation-field) and `mrdMerge`
2767
+ * (host calls the merge endpoint — `POST {winnerHref}/merge` with
2768
+ * `{ loser: loserHref, patch }`, per DataController.merge()).
2769
+ * Has no exit/cancel affordance of its own — hosts show this inside their
2770
+ * own overlay-page chrome (its close button), the same way mrd-layout-section
2771
+ * never renders a page-level close button either.
2772
+ */
2773
+ "mrd-merge-view": LocalJSX.IntrinsicElements["mrd-merge-view"] & JSXBase.HTMLAttributes<HTMLMrdMergeViewElement>;
2623
2774
  "mrd-number-field": LocalJSX.IntrinsicElements["mrd-number-field"] & JSXBase.HTMLAttributes<HTMLMrdNumberFieldElement>;
2624
2775
  "mrd-relation-field": LocalJSX.IntrinsicElements["mrd-relation-field"] & JSXBase.HTMLAttributes<HTMLMrdRelationFieldElement>;
2625
2776
  "mrd-secret-field": LocalJSX.IntrinsicElements["mrd-secret-field"] & JSXBase.HTMLAttributes<HTMLMrdSecretFieldElement>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmlogic/components",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Stencil.js web component library for dynamic forms and virtual-scroll data tables",
5
5
  "license": "MIT",
6
6
  "author": "Mosterd",
@@ -43,6 +43,7 @@
43
43
  },
44
44
  "dependencies": {
45
45
  "@stencil/core": "^4.43.5",
46
+ "dompurify": "^3.4.12",
46
47
  "quill": "^2.0.3"
47
48
  },
48
49
  "devDependencies": {