@mmlogic/components 0.3.10 → 0.4.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 (149) hide show
  1. package/dist/cjs/{index-BPj2cBXs.js → index-CAzwGt9u.js} +38 -0
  2. package/dist/cjs/loader.cjs.js +2 -2
  3. package/dist/cjs/mosterdcomponents.cjs.js +2 -2
  4. package/dist/cjs/mrd-boolean-field_23.cjs.entry.js +1280 -1073
  5. package/dist/collection/collection-manifest.json +23 -23
  6. package/dist/collection/components/{mrd-document-container/mrd-document-container.scss → documents/mrd-document-container/mrd-document-container.css} +3 -3
  7. package/dist/collection/components/{mrd-document-container → documents/mrd-document-container}/mrd-document-container.js +54 -8
  8. package/dist/collection/components/documents/mrd-document-list/folder-tree.js +109 -0
  9. package/dist/collection/components/{mrd-document-list/mrd-document-list.scss → documents/mrd-document-list/mrd-document-list.css} +17 -4
  10. package/dist/collection/components/{mrd-document-list → documents/mrd-document-list}/mrd-document-list.js +166 -237
  11. package/dist/collection/components/documents/mrd-document-list/tree-view.js +75 -0
  12. package/dist/collection/components/{mrd-document-view/mrd-document-view.scss → documents/mrd-document-view/mrd-document-view.css} +1 -1
  13. package/dist/collection/components/{mrd-document-view → documents/mrd-document-view}/mrd-document-view.js +4 -4
  14. package/dist/collection/components/fields/field-helpers.js +17 -0
  15. package/dist/collection/components/fields/file-upload-common.js +38 -0
  16. package/dist/collection/components/{mrd-boolean-field/mrd-boolean-field.scss → fields/mrd-boolean-field/mrd-boolean-field.css} +3 -3
  17. package/dist/collection/components/{mrd-boolean-field → fields/mrd-boolean-field}/mrd-boolean-field.js +1 -1
  18. package/dist/collection/components/{mrd-currency-field/mrd-currency-field.scss → fields/mrd-currency-field/mrd-currency-field.css} +11 -9
  19. package/dist/collection/components/{mrd-currency-field → fields/mrd-currency-field}/mrd-currency-field.js +7 -13
  20. package/dist/collection/components/{mrd-date-field/mrd-date-field.scss → fields/mrd-date-field/mrd-date-field.css} +8 -10
  21. package/dist/collection/components/{mrd-date-field → fields/mrd-date-field}/mrd-date-field.js +3 -10
  22. package/dist/collection/components/{mrd-datetime-field/mrd-datetime-field.scss → fields/mrd-datetime-field/mrd-datetime-field.css} +8 -10
  23. package/dist/collection/components/{mrd-datetime-field → fields/mrd-datetime-field}/mrd-datetime-field.js +3 -10
  24. package/dist/collection/components/{mrd-email-field/mrd-email-field.scss → fields/mrd-email-field/mrd-email-field.css} +2 -11
  25. package/dist/collection/components/{mrd-email-field → fields/mrd-email-field}/mrd-email-field.js +6 -13
  26. package/dist/collection/components/{mrd-file-field/mrd-file-field.scss → fields/mrd-file-field/mrd-file-field.css} +19 -24
  27. package/dist/collection/components/{mrd-file-field → fields/mrd-file-field}/mrd-file-field.js +13 -24
  28. package/dist/collection/components/{mrd-hyperlink-field/mrd-hyperlink-field.scss → fields/mrd-hyperlink-field/mrd-hyperlink-field.css} +7 -16
  29. package/dist/collection/components/{mrd-hyperlink-field → fields/mrd-hyperlink-field}/mrd-hyperlink-field.js +9 -15
  30. package/dist/collection/components/{mrd-image-field/mrd-image-field.scss → fields/mrd-image-field/mrd-image-field.css} +15 -24
  31. package/dist/collection/components/{mrd-image-field → fields/mrd-image-field}/mrd-image-field.js +13 -28
  32. package/dist/collection/components/{mrd-list-field/mrd-list-field.scss → fields/mrd-list-field/mrd-list-field.css} +18 -21
  33. package/dist/collection/components/{mrd-list-field → fields/mrd-list-field}/mrd-list-field.js +10 -25
  34. package/dist/collection/components/{mrd-longtext-field/mrd-longtext-field.scss → fields/mrd-longtext-field/mrd-longtext-field.css} +21 -18
  35. package/dist/collection/components/{mrd-longtext-field → fields/mrd-longtext-field}/mrd-longtext-field.js +3 -10
  36. package/dist/collection/components/{mrd-number-field/mrd-number-field.scss → fields/mrd-number-field/mrd-number-field.css} +9 -10
  37. package/dist/collection/components/{mrd-number-field → fields/mrd-number-field}/mrd-number-field.js +7 -6
  38. package/dist/collection/components/{mrd-relation-field/mrd-relation-field.scss → fields/mrd-relation-field/mrd-relation-field.css} +61 -59
  39. package/dist/collection/components/{mrd-relation-field → fields/mrd-relation-field}/mrd-relation-field.js +16 -26
  40. package/dist/collection/components/{mrd-secret-field/mrd-secret-field.scss → fields/mrd-secret-field/mrd-secret-field.css} +7 -10
  41. package/dist/collection/components/{mrd-secret-field → fields/mrd-secret-field}/mrd-secret-field.js +4 -11
  42. package/dist/collection/components/{mrd-text-field/mrd-text-field.scss → fields/mrd-text-field/mrd-text-field.css} +2 -11
  43. package/dist/collection/components/{mrd-text-field → fields/mrd-text-field}/mrd-text-field.js +3 -10
  44. package/dist/collection/components/{mrd-textarea-field/mrd-textarea-field.scss → fields/mrd-textarea-field/mrd-textarea-field.css} +7 -10
  45. package/dist/collection/components/{mrd-textarea-field → fields/mrd-textarea-field}/mrd-textarea-field.js +3 -9
  46. package/dist/collection/components/{mrd-time-field/mrd-time-field.scss → fields/mrd-time-field/mrd-time-field.css} +8 -10
  47. package/dist/collection/components/{mrd-time-field → fields/mrd-time-field}/mrd-time-field.js +3 -10
  48. package/dist/collection/components/{mrd-field/mrd-field.scss → form/mrd-field/mrd-field.css} +1 -1
  49. package/dist/collection/components/{mrd-field → form/mrd-field}/mrd-field.js +3 -3
  50. package/dist/collection/components/{mrd-form/mrd-form.scss → form/mrd-form/mrd-form.css} +1 -1
  51. package/dist/collection/components/{mrd-form → form/mrd-form}/mrd-form.js +5 -5
  52. package/dist/collection/components/layout/mrd-layout-section/field-value.js +111 -0
  53. package/dist/collection/components/layout/mrd-layout-section/layout-helpers.js +29 -0
  54. package/dist/collection/components/{mrd-layout-section/mrd-layout-section.scss → layout/mrd-layout-section/mrd-layout-section.css} +4 -4
  55. package/dist/collection/components/{mrd-layout-section → layout/mrd-layout-section}/mrd-layout-section.js +58 -133
  56. package/dist/collection/components/{mrd-table/mrd-table.scss → table/mrd-table/mrd-table.css} +11 -13
  57. package/dist/collection/components/{mrd-table → table/mrd-table}/mrd-table.js +111 -439
  58. package/dist/collection/components/table/mrd-table/table-filter-popup.js +85 -0
  59. package/dist/collection/components/table/mrd-table/table-parts.js +110 -0
  60. package/dist/collection/components/table/mrd-table/table-query.js +178 -0
  61. package/dist/collection/components/table/mrd-table/virtual-scroll.js +49 -0
  62. package/dist/collection/dev/app.js +19 -18
  63. package/dist/collection/dev/example-data.js +58 -43
  64. package/dist/collection/utils/i18n.js +10 -0
  65. package/dist/collection/utils/query-params.js +43 -0
  66. package/dist/components/field-helpers.js +1 -0
  67. package/dist/components/file-upload-common.js +1 -0
  68. package/dist/components/i18n.js +1 -1
  69. package/dist/components/mrd-boolean-field2.js +1 -1
  70. package/dist/components/mrd-currency-field2.js +1 -1
  71. package/dist/components/mrd-date-field2.js +1 -1
  72. package/dist/components/mrd-datetime-field2.js +1 -1
  73. package/dist/components/mrd-document-container2.js +1 -1
  74. package/dist/components/mrd-document-list2.js +1 -1
  75. package/dist/components/mrd-document-view2.js +1 -1
  76. package/dist/components/mrd-email-field2.js +1 -1
  77. package/dist/components/mrd-file-field2.js +1 -1
  78. package/dist/components/mrd-form.js +1 -1
  79. package/dist/components/mrd-hyperlink-field2.js +1 -1
  80. package/dist/components/mrd-image-field2.js +1 -1
  81. package/dist/components/mrd-layout-section.js +1 -1
  82. package/dist/components/mrd-list-field2.js +1 -1
  83. package/dist/components/mrd-longtext-field2.js +1 -1
  84. package/dist/components/mrd-number-field2.js +1 -1
  85. package/dist/components/mrd-relation-field2.js +1 -1
  86. package/dist/components/mrd-secret-field2.js +1 -1
  87. package/dist/components/mrd-table2.js +1 -1
  88. package/dist/components/mrd-text-field2.js +1 -1
  89. package/dist/components/mrd-textarea-field2.js +1 -1
  90. package/dist/components/mrd-time-field2.js +1 -1
  91. package/dist/components/query-params.js +1 -0
  92. package/dist/esm/{index-_tsCCkAi.js → index-DiSEJMA8.js} +38 -1
  93. package/dist/esm/loader.js +3 -3
  94. package/dist/esm/mosterdcomponents.js +3 -3
  95. package/dist/esm/mrd-boolean-field_23.entry.js +1280 -1073
  96. package/dist/mosterdcomponents/mosterdcomponents.css +1 -1
  97. package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
  98. package/dist/mosterdcomponents/p-9b3c0917.entry.js +1 -0
  99. package/dist/mosterdcomponents/p-DiSEJMA8.js +2 -0
  100. package/dist/types/components/{mrd-document-container → documents/mrd-document-container}/mrd-document-container.d.ts +7 -2
  101. package/dist/types/components/documents/mrd-document-list/folder-tree.d.ts +66 -0
  102. package/dist/types/components/{mrd-document-list → documents/mrd-document-list}/mrd-document-list.d.ts +28 -38
  103. package/dist/types/components/documents/mrd-document-list/tree-view.d.ts +32 -0
  104. package/dist/types/components/{mrd-document-view → documents/mrd-document-view}/mrd-document-view.d.ts +2 -2
  105. package/dist/types/components/fields/field-helpers.d.ts +18 -0
  106. package/dist/types/components/fields/file-upload-common.d.ts +18 -0
  107. package/dist/types/components/{mrd-boolean-field → fields/mrd-boolean-field}/mrd-boolean-field.d.ts +1 -1
  108. package/dist/types/components/{mrd-currency-field → fields/mrd-currency-field}/mrd-currency-field.d.ts +2 -2
  109. package/dist/types/components/{mrd-date-field → fields/mrd-date-field}/mrd-date-field.d.ts +1 -1
  110. package/dist/types/components/{mrd-datetime-field → fields/mrd-datetime-field}/mrd-datetime-field.d.ts +1 -1
  111. package/dist/types/components/{mrd-email-field → fields/mrd-email-field}/mrd-email-field.d.ts +1 -1
  112. package/dist/types/components/{mrd-file-field → fields/mrd-file-field}/mrd-file-field.d.ts +2 -4
  113. package/dist/types/components/{mrd-hyperlink-field → fields/mrd-hyperlink-field}/mrd-hyperlink-field.d.ts +2 -2
  114. package/dist/types/components/{mrd-image-field → fields/mrd-image-field}/mrd-image-field.d.ts +2 -4
  115. package/dist/types/components/{mrd-list-field → fields/mrd-list-field}/mrd-list-field.d.ts +2 -2
  116. package/dist/types/components/{mrd-longtext-field → fields/mrd-longtext-field}/mrd-longtext-field.d.ts +1 -1
  117. package/dist/types/components/{mrd-number-field → fields/mrd-number-field}/mrd-number-field.d.ts +2 -2
  118. package/dist/types/components/{mrd-relation-field → fields/mrd-relation-field}/mrd-relation-field.d.ts +2 -2
  119. package/dist/types/components/{mrd-secret-field → fields/mrd-secret-field}/mrd-secret-field.d.ts +1 -1
  120. package/dist/types/components/{mrd-text-field → fields/mrd-text-field}/mrd-text-field.d.ts +1 -1
  121. package/dist/types/components/{mrd-textarea-field → fields/mrd-textarea-field}/mrd-textarea-field.d.ts +1 -1
  122. package/dist/types/components/{mrd-time-field → fields/mrd-time-field}/mrd-time-field.d.ts +1 -1
  123. package/dist/types/components/{mrd-field → form/mrd-field}/mrd-field.d.ts +2 -2
  124. package/dist/types/components/{mrd-form → form/mrd-form}/mrd-form.d.ts +2 -2
  125. package/dist/types/components/layout/mrd-layout-section/field-value.d.ts +22 -0
  126. package/dist/types/components/layout/mrd-layout-section/layout-helpers.d.ts +8 -0
  127. package/dist/types/components/{mrd-layout-section → layout/mrd-layout-section}/mrd-layout-section.d.ts +4 -8
  128. package/dist/types/components/{mrd-table → table/mrd-table}/mrd-table.d.ts +6 -13
  129. package/dist/types/components/table/mrd-table/table-filter-popup.d.ts +35 -0
  130. package/dist/types/components/table/mrd-table/table-parts.d.ts +61 -0
  131. package/dist/types/components/table/mrd-table/table-query.d.ts +50 -0
  132. package/dist/types/components/table/mrd-table/virtual-scroll.d.ts +26 -0
  133. package/dist/types/components.d.ts +36 -5
  134. package/dist/types/types/client-layout.d.ts +5 -0
  135. package/dist/types/utils/query-params.d.ts +14 -0
  136. package/package.json +7 -2
  137. package/dist/components/validation.js +0 -1
  138. package/dist/mosterdcomponents/cell-renderer-B-AJDBcj.js.map +0 -1
  139. package/dist/mosterdcomponents/client-layout-ChqRA3AF.js.map +0 -1
  140. package/dist/mosterdcomponents/format-BAfsQfy1.js.map +0 -1
  141. package/dist/mosterdcomponents/i18n-s1XrKcD2.js.map +0 -1
  142. package/dist/mosterdcomponents/index-DkY-NQj0.js.map +0 -1
  143. package/dist/mosterdcomponents/index-DwF_Sp__.js.map +0 -1
  144. package/dist/mosterdcomponents/index.esm.js.map +0 -1
  145. package/dist/mosterdcomponents/mosterdcomponents.esm.js.map +0 -1
  146. package/dist/mosterdcomponents/p-69452249.entry.js +0 -1
  147. package/dist/mosterdcomponents/p-_tsCCkAi.js +0 -2
  148. package/dist/mosterdcomponents/quill-C9pgw_k-.js.map +0 -1
  149. package/dist/mosterdcomponents/validation-Br9k2Ztw.js.map +0 -1
@@ -1,7 +1,9 @@
1
1
  import { Host, h } from "@stencil/core";
2
- import { ClientLayoutItemType } from "../../types/client-layout";
3
- import { t } from "../../utils/i18n";
4
- import { formatDate } from "../../utils/format";
2
+ import { ClientLayoutItemType } from "../../../types/client-layout";
3
+ import { t } from "../../../utils/i18n";
4
+ import { applyViewFilters, buildListPath } from "../../../utils/query-params";
5
+ import { makeContainerNode, makeFolderNode, computeTotals, segmentsOf, folderStringOf, stripExtension, applyFolderDistinct, applyDocMove, } from "./folder-tree";
6
+ import { renderLoadingRow, renderNodeChildren, renderContainerNode } from "./tree-view";
5
7
  /**
6
8
  * Archetype-driven document collection view. Renders documents as a lazy,
7
9
  * file-explorer-style folder tree, grouped by the `commons.document` archetype's
@@ -25,6 +27,11 @@ export class MrdDocumentList {
25
27
  this.item = null;
26
28
  /** Parent record id — required for RELATED_VIEW path building. */
27
29
  this.parentId = '';
30
+ /** Canonical parent href (`/{base}/{tenant}/{fromClass}/{parentId}`) supplied by
31
+ * the host. When the RELATED_VIEW's `inverseRelation` equals the archetype
32
+ * `container` slot, this seeds a single container so an empty dossier still
33
+ * accepts file drops and folder creation. */
34
+ this.containerHref = '';
28
35
  this.locale = navigator.language;
29
36
  this.containers = [];
30
37
  this.rootLoading = true;
@@ -36,6 +43,8 @@ export class MrdDocumentList {
36
43
  this.dropTargetId = null;
37
44
  /** Node id showing an "uploading…" indicator while a dropped file is processed. */
38
45
  this.uploadingNodeId = null;
46
+ /** Whether a drag is hovering the root drop-zone (single-container area highlight). */
47
+ this.rootDropActive = false;
39
48
  this.nodeIndex = new Map();
40
49
  // ── New-folder editing state ───────────────────────────────────────────────
41
50
  /** The pending node whose inline name input is open (null = not creating). */
@@ -69,7 +78,7 @@ export class MrdDocumentList {
69
78
  return;
70
79
  const { target, container } = resolved;
71
80
  const tempId = `${container.id}/__new__${this.newFolderSeq++}`;
72
- const node = this.makeFolderNode(tempId, '', container.id);
81
+ const node = makeFolderNode(tempId, '', container.id);
73
82
  node.pending = true;
74
83
  node.editing = true;
75
84
  target.children = [...target.children, node];
@@ -160,8 +169,18 @@ export class MrdDocumentList {
160
169
  e.preventDefault();
161
170
  if (e.dataTransfer)
162
171
  e.dataTransfer.dropEffect = file ? 'copy' : 'move';
172
+ if (!this.rootDropActive)
173
+ this.rootDropActive = true;
174
+ };
175
+ this.onRootDragLeave = (e) => {
176
+ const related = e.relatedTarget;
177
+ if (related && this.el.contains(related))
178
+ return; // moved onto a child, still inside
179
+ if (this.rootDropActive)
180
+ this.rootDropActive = false;
163
181
  };
164
182
  this.onRootDrop = (e) => {
183
+ this.rootDropActive = false;
165
184
  if (!this.singleContainer)
166
185
  return;
167
186
  const only = this.containers[0];
@@ -178,7 +197,33 @@ export class MrdDocumentList {
178
197
  };
179
198
  }
180
199
  componentDidLoad() {
181
- this.emitContainerDistinct();
200
+ if (this.isSeededSingleContainer()) {
201
+ this.seedSingleContainer();
202
+ }
203
+ else {
204
+ this.emitContainerDistinct();
205
+ }
206
+ }
207
+ /** True when the view is a single-container context: a RELATED_VIEW whose
208
+ * `inverseRelation` matches the archetype `container` slot, with a known
209
+ * parent href. The container is then implied by context (not by distinct),
210
+ * so it works even with zero documents. */
211
+ isSeededSingleContainer() {
212
+ var _a, _b;
213
+ return (((_a = this.item) === null || _a === void 0 ? void 0 : _a.type) === ClientLayoutItemType.RELATED_VIEW &&
214
+ !!((_b = this.item) === null || _b === void 0 ? void 0 : _b.inverseRelation) &&
215
+ this.item.inverseRelation === this.containerField &&
216
+ !!this.containerHref);
217
+ }
218
+ /** Seed the single implied container from context and load its folders. */
219
+ seedSingleContainer() {
220
+ const node = makeContainerNode(this.containerHref, this.containerField, 0);
221
+ this.nodeIndex.set(node.id, node);
222
+ this.containers = [node];
223
+ this.rootLoading = false;
224
+ this.singleContainer = true;
225
+ node.open = true;
226
+ this.emitFolderDistinct(node);
182
227
  }
183
228
  componentDidRender() {
184
229
  if (this.pendingNeedsFocus && this.pendingInputEl) {
@@ -214,50 +259,42 @@ export class MrdDocumentList {
214
259
  return (_b = (_a = this.archetype) === null || _a === void 0 ? void 0 : _a.slots) === null || _b === void 0 ? void 0 : _b.date;
215
260
  }
216
261
  // ── Path / query building (mirrors mrd-table conventions) ────────────────
217
- /** VIEW: `/{dataClass}`; RELATED_VIEW: `/{fromClass}/{parentId}/{dataClass}`. */
262
+ /** VIEW: `/{dataClass}`; RELATED_VIEW: `/{fromClass}/{parentId}/{dataClass}`.
263
+ * Used for reads (list/distinct): `dataClass`/`relatedClass` may be an abstract
264
+ * type (e.g. "contents"), filtered down to the concrete `filterClass` via the
265
+ * `type` query param — see baseParams(). */
218
266
  buildDataPath() {
267
+ var _a, _b;
268
+ const it = this.item;
269
+ return buildListPath({
270
+ isRelatedView: (it === null || it === void 0 ? void 0 : it.type) === ClientLayoutItemType.RELATED_VIEW,
271
+ fromClass: it === null || it === void 0 ? void 0 : it.fromClass,
272
+ parentId: this.parentId,
273
+ dataClass: (_b = (_a = it === null || it === void 0 ? void 0 : it.dataClass) !== null && _a !== void 0 ? _a : it === null || it === void 0 ? void 0 : it.relatedClass) !== null && _b !== void 0 ? _b : '',
274
+ });
275
+ }
276
+ /** Path for creating a new document (file-drop). Unlike buildDataPath(), this
277
+ * must target the concrete type: `dataClass`/`relatedClass` can be an abstract
278
+ * base type (e.g. "contents") that cannot be POSTed to directly, so prefer
279
+ * `filterClass` (e.g. "documents") when present. */
280
+ buildCreatePath() {
219
281
  var _a, _b, _c;
220
282
  const it = this.item;
221
- const dataClass = (_b = (_a = it === null || it === void 0 ? void 0 : it.dataClass) !== null && _a !== void 0 ? _a : it === null || it === void 0 ? void 0 : it.relatedClass) !== null && _b !== void 0 ? _b : '';
222
- if ((it === null || it === void 0 ? void 0 : it.type) === ClientLayoutItemType.RELATED_VIEW) {
223
- return `/${(_c = it.fromClass) !== null && _c !== void 0 ? _c : ''}/${this.parentId}/${dataClass}`;
224
- }
225
- return `/${dataClass}`;
283
+ return buildListPath({
284
+ isRelatedView: (it === null || it === void 0 ? void 0 : it.type) === ClientLayoutItemType.RELATED_VIEW,
285
+ fromClass: it === null || it === void 0 ? void 0 : it.fromClass,
286
+ parentId: this.parentId,
287
+ dataClass: (_c = (_b = (_a = it === null || it === void 0 ? void 0 : it.filterClass) !== null && _a !== void 0 ? _a : it === null || it === void 0 ? void 0 : it.dataClass) !== null && _b !== void 0 ? _b : it === null || it === void 0 ? void 0 : it.relatedClass) !== null && _c !== void 0 ? _c : '',
288
+ });
226
289
  }
227
290
  /** View-level static filters + filterClass, shared by every request. */
228
291
  baseParams() {
229
- var _a, _b, _c, _d, _e, _f, _g;
292
+ var _a, _b, _c;
230
293
  const p = new URLSearchParams();
231
294
  const filterClass = (_a = this.item) === null || _a === void 0 ? void 0 : _a.filterClass;
232
295
  if (filterClass)
233
296
  p.set('type', filterClass);
234
- for (const f of ((_d = (_c = (_b = this.item) === null || _b === void 0 ? void 0 : _b.view) === null || _c === void 0 ? void 0 : _c.filter) !== null && _d !== void 0 ? _d : [])) {
235
- if (!f.name)
236
- continue;
237
- if (f.operator === 'EMPTY') {
238
- p.set(f.name, '');
239
- continue;
240
- }
241
- if (f.operator === 'NOT_EMPTY') {
242
- p.set(f.name + '_notempty', 'true');
243
- continue;
244
- }
245
- if (f.operator === 'STARTS_WITH') {
246
- p.set(f.name + '_startswith', String((_e = f.value) !== null && _e !== void 0 ? _e : ''));
247
- continue;
248
- }
249
- if (f.operator === 'FROM') {
250
- p.set(f.name + '_from', String((_f = f.value) !== null && _f !== void 0 ? _f : ''));
251
- continue;
252
- }
253
- if (f.operator === 'TO') {
254
- p.set(f.name + '_to', String((_g = f.value) !== null && _g !== void 0 ? _g : ''));
255
- continue;
256
- }
257
- if (f.value != null) {
258
- p.set(f.name, String(f.value));
259
- }
260
- }
297
+ applyViewFilters(p, (_c = (_b = this.item) === null || _b === void 0 ? void 0 : _b.view) === null || _c === void 0 ? void 0 : _c.filter);
261
298
  return p;
262
299
  }
263
300
  emitContainerDistinct() {
@@ -324,7 +361,7 @@ export class MrdDocumentList {
324
361
  if (!v.value || typeof v.value !== 'object')
325
362
  continue;
326
363
  const href = v.value.href;
327
- const node = this.makeContainerNode(href, v.value.name, v.count);
364
+ const node = makeContainerNode(href, v.value.name, v.count);
328
365
  nodes.push(node);
329
366
  this.nodeIndex.set(node.id, node);
330
367
  }
@@ -342,38 +379,7 @@ export class MrdDocumentList {
342
379
  const container = this.nodeIndex.get(containerId);
343
380
  if (!container)
344
381
  return;
345
- container.children = [];
346
- container.hasDocs = false;
347
- container.docCount = 0;
348
- for (const v of values) {
349
- const raw = typeof v.value === 'string' ? v.value : v.value == null ? '' : String(v.value);
350
- const segs = this.splitFolder(raw);
351
- if (segs.length === 0) {
352
- // Root documents — the container's own direct documents.
353
- container.hasDocs = true;
354
- container.docCount = v.count;
355
- container.fullPath = raw;
356
- continue;
357
- }
358
- let node = container;
359
- const acc = [];
360
- for (const seg of segs) {
361
- acc.push(seg);
362
- let child = node.children.find(c => c.label === seg);
363
- if (!child) {
364
- child = this.makeFolderNode(container.id + '/' + acc.join('/'), seg, container.id);
365
- node.children.push(child);
366
- this.nodeIndex.set(child.id, child);
367
- }
368
- node = child;
369
- }
370
- node.hasDocs = true;
371
- node.docCount = v.count;
372
- node.fullPath = raw;
373
- }
374
- this.computeTotals(container);
375
- container.foldersLoaded = true;
376
- container.loading = false;
382
+ applyFolderDistinct(container, values, this.nodeIndex);
377
383
  // If the container has root documents, load them now (they show inline on expand).
378
384
  if (container.hasDocs && !container.docsLoaded) {
379
385
  this.emitDocuments(container, container);
@@ -381,36 +387,6 @@ export class MrdDocumentList {
381
387
  this.bump();
382
388
  }
383
389
  // ── Tree helpers ─────────────────────────────────────────────────────────
384
- /** Normalise a folder path: null/""/"/" → root ([]); else split on "/" dropping empties. */
385
- splitFolder(path) {
386
- if (path == null)
387
- return [];
388
- const s = String(path).trim();
389
- if (s === '' || s === '/')
390
- return [];
391
- return s.split('/').map(x => x.trim()).filter(Boolean);
392
- }
393
- makeContainerNode(href, label, count) {
394
- return {
395
- id: 'c:' + href, kind: 'container', label, href,
396
- hasDocs: false, docCount: 0, totalCount: count, children: [],
397
- open: false, loading: false, foldersLoaded: false, docsLoaded: false, docs: [],
398
- };
399
- }
400
- makeFolderNode(id, label, containerId) {
401
- return {
402
- id, kind: 'folder', label, containerId,
403
- hasDocs: false, docCount: 0, totalCount: 0, children: [],
404
- open: false, loading: false, foldersLoaded: false, docsLoaded: false, docs: [],
405
- };
406
- }
407
- computeTotals(node) {
408
- let total = node.docCount;
409
- for (const c of node.children)
410
- total += this.computeTotals(c);
411
- node.totalCount = total;
412
- return total;
413
- }
414
390
  /** Force a re-render after mutating nodes in place. */
415
391
  bump() {
416
392
  this.containers = [...this.containers];
@@ -460,14 +436,6 @@ export class MrdDocumentList {
460
436
  async createFolder() {
461
437
  this.startCreateFolder();
462
438
  }
463
- /** Folder path segments of a node relative to its container (derived from its id). */
464
- segmentsOf(node, container) {
465
- if (node.kind === 'container')
466
- return [];
467
- const prefix = container.id + '/';
468
- const rest = node.id.startsWith(prefix) ? node.id.slice(prefix.length) : '';
469
- return rest ? rest.split('/') : [];
470
- }
471
439
  commitFolder() {
472
440
  const node = this.pendingNode;
473
441
  const parent = this.pendingParent;
@@ -492,7 +460,7 @@ export class MrdDocumentList {
492
460
  }
493
461
  // Finalise: swap the temp id for the real path-derived id so a later distinct
494
462
  // value with the same folder string merges onto this node.
495
- const segs = [...this.segmentsOf(parent, container), name];
463
+ const segs = [...segmentsOf(parent, container), name];
496
464
  this.nodeIndex.delete(node.id);
497
465
  node.id = container.id + '/' + segs.join('/');
498
466
  node.fullPath = '/' + segs.join('/');
@@ -541,10 +509,6 @@ export class MrdDocumentList {
541
509
  this.bump();
542
510
  this.mrdUpload.emit({ file });
543
511
  }
544
- /** Strip a single trailing extension for the document title. */
545
- stripExtension(name) {
546
- return name.replace(/\.[^./\\]+$/, '');
547
- }
548
512
  /** Host callback with the uploaded file reference. Builds the create payload
549
513
  * from the archetype slots and requests the new document. */
550
514
  async setFileReference(uri) {
@@ -552,16 +516,20 @@ export class MrdDocumentList {
552
516
  if (!up)
553
517
  return;
554
518
  const { file, node, container } = up;
555
- const folder = this.folderStringOf(node, container);
519
+ const folder = folderStringOf(node, container);
556
520
  const values = {
557
521
  [this.fileField]: uri,
558
- [this.titleField]: this.stripExtension(file.name),
522
+ [this.titleField]: stripExtension(file.name),
559
523
  [this.folderField]: folder,
560
- [this.containerField]: container.href,
561
524
  };
562
- this.mrdCreateObject.emit({ path: this.buildDataPath(), values });
525
+ // The create path already embeds the container (/{fromClass}/{parentId}/...)
526
+ // when this is the seeded single-container context; omit the redundant field.
527
+ if (!this.isSeededSingleContainer()) {
528
+ values[this.containerField] = container.href;
529
+ }
530
+ this.mrdCreateObject.emit({ path: this.buildCreatePath(), values });
563
531
  // Optimistically show the new document (no href until a reload).
564
- const optimistic = { [this.titleField]: this.stripExtension(file.name), _optimistic: true };
532
+ const optimistic = { [this.titleField]: stripExtension(file.name), _optimistic: true };
565
533
  const wasUnloadedEmpty = !node.docsLoaded && node.docCount === 0;
566
534
  node.hasDocs = true;
567
535
  node.pending = false;
@@ -590,16 +558,6 @@ export class MrdDocumentList {
590
558
  this.lastOptimisticDoc = null;
591
559
  this.bump();
592
560
  }
593
- /** Folder string a node represents: the raw distinct value when it holds
594
- * documents, else derived from its path segments; null for a container root. */
595
- folderStringOf(node, container) {
596
- if (node.kind === 'container')
597
- return null;
598
- if (node.fullPath != null && node.fullPath !== '')
599
- return node.fullPath;
600
- const segs = this.segmentsOf(node, container);
601
- return segs.length ? '/' + segs.join('/') : null;
602
- }
603
561
  moveDocument(toNode, toContainer) {
604
562
  var _a, _b;
605
563
  const doc = this.dragDoc;
@@ -611,26 +569,14 @@ export class MrdDocumentList {
611
569
  : (fromNode.containerId ? this.nodeIndex.get(fromNode.containerId) : undefined);
612
570
  if (!fromContainer)
613
571
  return;
614
- const targetFolder = this.folderStringOf(toNode, toContainer);
615
- const sourceFolder = this.folderStringOf(fromNode, fromContainer);
572
+ const targetFolder = folderStringOf(toNode, toContainer);
573
+ const sourceFolder = folderStringOf(fromNode, fromContainer);
616
574
  const sameContainer = toContainer === fromContainer;
617
575
  // No-op: dropped back onto its own folder.
618
576
  if (toNode === fromNode || (sameContainer && targetFolder === sourceFolder))
619
577
  return;
620
- // ── Optimistic tree update (fire-and-forget; no refetch) ──
621
- fromNode.docs = fromNode.docs.filter(d => d !== doc);
622
- fromNode.docCount = Math.max(0, fromNode.docCount - 1);
623
- // A now-empty folder should stop showing an expand chevron (it disappears on
624
- // the next reload anyway, since it is derived from document folder strings).
625
- if (fromNode.docsLoaded)
626
- fromNode.hasDocs = fromNode.docs.length > 0;
627
- toNode.hasDocs = true;
628
- toNode.pending = false; // a pending folder is now materialised
629
- toNode.docCount += 1;
630
- if (toNode.kind === 'folder')
631
- toNode.fullPath = targetFolder !== null && targetFolder !== void 0 ? targetFolder : '';
632
- if (toNode.docsLoaded)
633
- toNode.docs = [...toNode.docs, doc];
578
+ // Optimistic tree update (fire-and-forget; no refetch).
579
+ applyDocMove(doc, fromNode, toNode, targetFolder);
634
580
  this.recomputeContainerTotals(fromContainer, -1);
635
581
  if (!sameContainer)
636
582
  this.recomputeContainerTotals(toContainer, +1);
@@ -648,7 +594,7 @@ export class MrdDocumentList {
648
594
  * loaded; otherwise just nudge the aggregate badge by the delta. */
649
595
  recomputeContainerTotals(container, delta) {
650
596
  if (container.foldersLoaded) {
651
- this.computeTotals(container);
597
+ computeTotals(container);
652
598
  }
653
599
  else {
654
600
  container.totalCount = Math.max(0, container.totalCount + delta);
@@ -661,97 +607,56 @@ export class MrdDocumentList {
661
607
  this.mrdNavigate.emit({ href, label });
662
608
  }
663
609
  // ── Render ───────────────────────────────────────────────────────────────
664
- renderChevron(open, leaf) {
665
- return (h("span", { class: `mrd-document-list__chev${leaf ? ' mrd-document-list__chev--leaf' : ''}${open ? ' mrd-document-list__chev--open' : ''}` }, h("svg", { viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M9 6l6 6-6 6" }))));
666
- }
667
- renderDossierIcon() {
668
- return (h("svg", { class: "mrd-document-list__icon mrd-document-list__icon--dossier", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" })));
669
- }
670
- renderFolderIcon() {
671
- return (h("svg", { class: "mrd-document-list__icon mrd-document-list__icon--folder", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" })));
672
- }
673
- renderDocIcon() {
674
- return (h("svg", { class: "mrd-document-list__icon mrd-document-list__icon--doc", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2", "stroke-linecap": "round", "stroke-linejoin": "round", "aria-hidden": "true" }, h("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z" }), h("path", { d: "M14 2v6h6" })));
675
- }
676
- indent(depth) {
677
- return h("span", { class: "mrd-document-list__indent", style: { width: `${depth * 18}px` } });
678
- }
679
- renderDocRow(doc, node, container, depth) {
680
- var _a, _b, _c, _d, _e;
681
- const label = (_b = (_a = doc === null || doc === void 0 ? void 0 : doc[this.titleField]) !== null && _a !== void 0 ? _a : doc === null || doc === void 0 ? void 0 : doc.name) !== null && _b !== void 0 ? _b : '';
682
- const dateRaw = this.dateField ? doc === null || doc === void 0 ? void 0 : doc[this.dateField] : undefined;
683
- const date = dateRaw ? formatDate(dateRaw, this.locale) : '';
684
- return (h("div", { class: "mrd-document-list__row mrd-document-list__row--doc", key: (_e = (_d = (_c = doc === null || doc === void 0 ? void 0 : doc._links) === null || _c === void 0 ? void 0 : _c.self) === null || _d === void 0 ? void 0 : _d.href) !== null && _e !== void 0 ? _e : label, draggable: true, onClick: () => this.openDoc(doc), onDragStart: (e) => this.onDocDragStart(e, doc, node), onDragEnd: this.onDocDragEnd, onDragOver: (e) => this.onNodeDragOver(e, node), onDragLeave: () => this.onNodeDragLeave(node), onDrop: (e) => this.onNodeDrop(e, node, container) }, this.indent(depth), this.renderChevron(false, true), this.renderDocIcon(), h("span", { class: "mrd-document-list__label" }, label), date && h("span", { class: "mrd-document-list__date" }, date)));
685
- }
686
- renderLoadingRow(depth) {
687
- return (h("div", { class: "mrd-document-list__loading", key: "loading" }, this.indent(depth), h("span", { class: "mrd-document-list__spinner" }), t('loading', this.locale)));
688
- }
689
- renderChildren(container, node, depth) {
690
- const out = [];
691
- // Direct documents of this node (root docs live on the container node).
692
- if (node.hasDocs) {
693
- if (node.docsLoaded) {
694
- for (const doc of node.docs)
695
- out.push(this.renderDocRow(doc, node, container, depth));
696
- }
697
- else if (node.loading) {
698
- out.push(this.renderLoadingRow(depth));
699
- }
700
- }
701
- // Child folders.
702
- for (const child of node.children) {
703
- out.push(this.renderFolderNode(container, child, depth));
704
- }
705
- // An uploading file dropped onto this node.
706
- if (node.id === this.uploadingNodeId)
707
- out.push(this.renderUploadingRow(depth));
708
- return out;
709
- }
710
- renderUploadingRow(depth) {
711
- return (h("div", { class: "mrd-document-list__loading", key: "uploading" }, this.indent(depth), h("span", { class: "mrd-document-list__spinner" }), t('upload_file', this.locale)));
712
- }
713
- renderFolderEditRow(node, depth) {
714
- return (h("div", { class: "mrd-document-list__node", key: node.id }, h("div", { class: "mrd-document-list__row mrd-document-list__row--edit" }, this.indent(depth), this.renderChevron(false, true), this.renderFolderIcon(), h("input", { class: "mrd-document-list__name-input", type: "text", placeholder: t('folder_name_placeholder', this.locale), ref: el => (this.pendingInputEl = el), onInput: this.onPendingInput, onKeyDown: this.onPendingKeyDown, onBlur: () => this.cancelFolder() })), node.error && (h("div", { class: "mrd-document-list__error", style: { paddingLeft: `${depth * 18 + 52}px` } }, node.error))));
715
- }
716
- renderFolderNode(container, node, depth) {
717
- if (node.editing)
718
- return this.renderFolderEditRow(node, depth);
719
- const leaf = node.children.length === 0 && !node.hasDocs;
720
- const selected = node.id === this.selectedId;
721
- const cls = 'mrd-document-list__row'
722
- + (selected ? ' mrd-document-list__row--selected' : '')
723
- + (node.pending ? ' mrd-document-list__row--pending' : '')
724
- + (node.id === this.dropTargetId ? ' mrd-document-list__row--drop' : '');
725
- return (h("div", { class: "mrd-document-list__node", key: node.id }, h("div", { class: cls, onClick: () => this.toggleFolder(container, node), onDragOver: (e) => this.onNodeDragOver(e, node), onDragLeave: () => this.onNodeDragLeave(node), onDrop: (e) => this.onNodeDrop(e, node, container) }, this.indent(depth), this.renderChevron(node.open, leaf), this.renderFolderIcon(), h("span", { class: "mrd-document-list__label" }, node.label), h("span", { class: "mrd-document-list__count" }, node.totalCount)), node.open && h("div", { class: "mrd-document-list__kids" }, this.renderChildren(container, node, depth + 1))));
726
- }
727
- renderContainerNode(node, depth) {
728
- const selected = node.id === this.selectedId;
729
- const cls = 'mrd-document-list__row mrd-document-list__row--dossier'
730
- + (selected ? ' mrd-document-list__row--selected' : '')
731
- + (node.id === this.dropTargetId ? ' mrd-document-list__row--drop' : '');
732
- return (h("div", { class: "mrd-document-list__node", key: node.id }, h("div", { class: cls, onClick: () => this.toggleContainer(node), onDragOver: (e) => this.onNodeDragOver(e, node), onDragLeave: () => this.onNodeDragLeave(node), onDrop: (e) => this.onNodeDrop(e, node, node) }, this.indent(depth), this.renderChevron(node.open, false), this.renderDossierIcon(), h("span", { class: "mrd-document-list__label" }, node.label), h("span", { class: "mrd-document-list__count" }, node.totalCount)), node.open && (h("div", { class: "mrd-document-list__kids" }, node.loading && !node.foldersLoaded
733
- ? this.renderLoadingRow(depth + 1)
734
- : this.renderChildren(node, node, depth + 1)))));
610
+ treeCtx() {
611
+ return {
612
+ locale: this.locale,
613
+ titleField: this.titleField,
614
+ dateField: this.dateField,
615
+ selectedId: this.selectedId,
616
+ dropTargetId: this.dropTargetId,
617
+ uploadingNodeId: this.uploadingNodeId,
618
+ on: {
619
+ toggleContainer: node => this.toggleContainer(node),
620
+ toggleFolder: (container, node) => this.toggleFolder(container, node),
621
+ openDoc: doc => this.openDoc(doc),
622
+ docDragStart: this.onDocDragStart,
623
+ docDragEnd: this.onDocDragEnd,
624
+ nodeDragOver: this.onNodeDragOver,
625
+ nodeDragLeave: this.onNodeDragLeave,
626
+ nodeDrop: this.onNodeDrop,
627
+ pendingInput: this.onPendingInput,
628
+ pendingKeyDown: this.onPendingKeyDown,
629
+ cancelFolder: () => this.cancelFolder(),
630
+ setPendingInputEl: el => (this.pendingInputEl = el),
631
+ },
632
+ };
735
633
  }
736
634
  render() {
635
+ const ctx = this.treeCtx();
737
636
  let body;
738
637
  if (this.rootLoading) {
739
- body = this.renderLoadingRow(0);
638
+ body = renderLoadingRow(ctx, 0);
740
639
  }
741
640
  else if (this.containers.length === 0) {
742
- body = h("div", { key: 'b8c3297cd7cff5bf79ce694d2ee1a64c570df5ce', class: "mrd-document-list__empty" }, t('no_results', this.locale));
641
+ body = h("div", { key: 'ce40dab51ab61447838e5059159ae4778209a6f3', class: "mrd-document-list__empty" }, t('no_results', this.locale));
743
642
  }
744
643
  else if (this.singleContainer) {
745
644
  // Dossier context: render the single container's folder tree at the root.
746
645
  const only = this.containers[0];
747
- body = only.loading && !only.foldersLoaded
748
- ? this.renderLoadingRow(0)
749
- : this.renderChildren(only, only, 0);
646
+ if (only.loading && !only.foldersLoaded) {
647
+ body = renderLoadingRow(ctx, 0);
648
+ }
649
+ else {
650
+ const kids = renderNodeChildren(ctx, only, only, 0);
651
+ body = kids.length
652
+ ? kids
653
+ : h("div", { class: "mrd-document-list__empty" }, t('doc_empty_drop', this.locale));
654
+ }
750
655
  }
751
656
  else {
752
- body = this.containers.map(c => this.renderContainerNode(c, 0));
657
+ body = this.containers.map(c => renderContainerNode(ctx, c, 0));
753
658
  }
754
- return (h(Host, { key: 'ff3b024a79ba2270aa28861923bc6406f98061aa' }, h("div", { key: '9db121e5336a4e3c82443257f6424db5ab4f0baf', class: "mrd-document-list", onDragOver: this.onRootDragOver, onDrop: this.onRootDrop }, body)));
659
+ return (h(Host, { key: '9e1f7805ae18bce506c530a481db902900ad95f3' }, h("div", { key: 'a51334634e94310a71650ad49f17f0a20e2aed4d', class: 'mrd-document-list' + (this.rootDropActive ? ' mrd-document-list--drop-active' : ''), onDragOver: this.onRootDragOver, onDragLeave: this.onRootDragLeave, onDrop: this.onRootDrop }, body)));
755
660
  }
756
661
  static get is() { return "mrd-document-list"; }
757
662
  static get encapsulation() { return "scoped"; }
@@ -776,7 +681,7 @@ export class MrdDocumentList {
776
681
  "references": {
777
682
  "ClientLayoutItem": {
778
683
  "location": "import",
779
- "path": "../../types/client-layout",
684
+ "path": "../../../types/client-layout",
780
685
  "id": "src/types/client-layout.ts::ClientLayoutItem",
781
686
  "referenceLocation": "ClientLayoutItem"
782
687
  }
@@ -801,7 +706,7 @@ export class MrdDocumentList {
801
706
  "references": {
802
707
  "ClientArchetype": {
803
708
  "location": "import",
804
- "path": "../../types/client-layout",
709
+ "path": "../../../types/client-layout",
805
710
  "id": "src/types/client-layout.ts::ClientArchetype",
806
711
  "referenceLocation": "ClientArchetype"
807
712
  }
@@ -836,6 +741,26 @@ export class MrdDocumentList {
836
741
  "attribute": "parent-id",
837
742
  "defaultValue": "''"
838
743
  },
744
+ "containerHref": {
745
+ "type": "string",
746
+ "mutable": false,
747
+ "complexType": {
748
+ "original": "string",
749
+ "resolved": "string",
750
+ "references": {}
751
+ },
752
+ "required": false,
753
+ "optional": false,
754
+ "docs": {
755
+ "tags": [],
756
+ "text": "Canonical parent href (`/{base}/{tenant}/{fromClass}/{parentId}`) supplied by\nthe host. When the RELATED_VIEW's `inverseRelation` equals the archetype\n`container` slot, this seeds a single container so an empty dossier still\naccepts file drops and folder creation."
757
+ },
758
+ "getter": false,
759
+ "setter": false,
760
+ "reflect": false,
761
+ "attribute": "container-href",
762
+ "defaultValue": "''"
763
+ },
839
764
  "locale": {
840
765
  "type": "string",
841
766
  "mutable": false,
@@ -865,7 +790,8 @@ export class MrdDocumentList {
865
790
  "singleContainer": {},
866
791
  "selectedId": {},
867
792
  "dropTargetId": {},
868
- "uploadingNodeId": {}
793
+ "uploadingNodeId": {},
794
+ "rootDropActive": {}
869
795
  };
870
796
  }
871
797
  static get events() {
@@ -1011,9 +937,10 @@ export class MrdDocumentList {
1011
937
  "id": "global::Promise"
1012
938
  },
1013
939
  "DistinctValue": {
1014
- "location": "local",
1015
- "path": "/Users/michiel/Mosterd/mosterd-components/src/components/mrd-document-list/mrd-document-list.tsx",
1016
- "id": "src/components/mrd-document-list/mrd-document-list.tsx::DistinctValue"
940
+ "location": "import",
941
+ "path": "./folder-tree",
942
+ "id": "src/components/documents/mrd-document-list/folder-tree.ts::DistinctValue",
943
+ "referenceLocation": "DistinctValue"
1017
944
  }
1018
945
  },
1019
946
  "return": "Promise<void>"
@@ -1041,9 +968,10 @@ export class MrdDocumentList {
1041
968
  "id": "global::Promise"
1042
969
  },
1043
970
  "DocRow": {
1044
- "location": "local",
1045
- "path": "/Users/michiel/Mosterd/mosterd-components/src/components/mrd-document-list/mrd-document-list.tsx",
1046
- "id": "src/components/mrd-document-list/mrd-document-list.tsx::DocRow"
971
+ "location": "import",
972
+ "path": "./folder-tree",
973
+ "id": "src/components/documents/mrd-document-list/folder-tree.ts::DocRow",
974
+ "referenceLocation": "DocRow"
1047
975
  }
1048
976
  },
1049
977
  "return": "Promise<void>"
@@ -1088,9 +1016,10 @@ export class MrdDocumentList {
1088
1016
  "id": "global::Record"
1089
1017
  },
1090
1018
  "DocRow": {
1091
- "location": "local",
1092
- "path": "/Users/michiel/Mosterd/mosterd-components/src/components/mrd-document-list/mrd-document-list.tsx",
1093
- "id": "src/components/mrd-document-list/mrd-document-list.tsx::DocRow"
1019
+ "location": "import",
1020
+ "path": "./folder-tree",
1021
+ "id": "src/components/documents/mrd-document-list/folder-tree.ts::DocRow",
1022
+ "referenceLocation": "DocRow"
1094
1023
  }
1095
1024
  },
1096
1025
  "return": "Promise<void>"