@mmlogic/components 0.5.3 → 0.5.5
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.
- package/dist/cjs/{cell-renderer-7KX9Qbml.js → cell-renderer-Mx3pwONr.js} +261 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/mosterdcomponents.cjs.js +1 -1
- package/dist/cjs/mrd-boolean-field_25.cjs.entry.js +391 -77
- package/dist/cjs/mrd-merge-view.cjs.entry.js +3 -3
- package/dist/collection/components/documents/mrd-document-container/mrd-document-container.css +3 -0
- package/dist/collection/components/documents/mrd-document-container/mrd-document-container.js +23 -3
- package/dist/collection/components/documents/mrd-document-list/mrd-document-list.js +76 -2
- package/dist/collection/components/fields/mrd-currency-field/mrd-currency-field.js +56 -5
- package/dist/collection/components/fields/mrd-date-field/mrd-date-field.css +55 -4
- package/dist/collection/components/fields/mrd-date-field/mrd-date-field.js +118 -8
- package/dist/collection/components/fields/mrd-datetime-field/mrd-datetime-field.css +55 -4
- package/dist/collection/components/fields/mrd-datetime-field/mrd-datetime-field.js +117 -15
- package/dist/collection/components/fields/mrd-email-field/mrd-email-field.js +1 -1
- package/dist/collection/components/fields/mrd-file-field/mrd-file-field.js +1 -1
- package/dist/collection/components/fields/mrd-image-field/mrd-image-field.js +1 -1
- package/dist/collection/components/fields/mrd-longtext-field/mrd-longtext-field.js +1 -1
- package/dist/collection/components/fields/mrd-number-field/mrd-number-field.js +33 -8
- package/dist/collection/components/fields/mrd-relation-field/mrd-relation-field.js +13 -3
- package/dist/collection/components/fields/mrd-secret-field/mrd-secret-field.js +2 -2
- package/dist/collection/components/fields/mrd-text-field/mrd-text-field.js +1 -1
- package/dist/collection/components/fields/mrd-textarea-field/mrd-textarea-field.js +1 -1
- package/dist/collection/components/fields/mrd-time-field/mrd-time-field.js +1 -1
- package/dist/collection/components/form/mrd-field/mrd-field.js +11 -11
- package/dist/collection/components/form/mrd-form/mrd-form.js +8 -4
- package/dist/collection/components/invoice/mrd-invoice-view/mrd-invoice-view.js +1 -1
- package/dist/collection/components/layout/mrd-layout-section/field-value.js +4 -2
- package/dist/collection/components/layout/mrd-layout-section/layout-helpers.js +6 -0
- package/dist/collection/components/layout/mrd-layout-section/mrd-layout-section.css +4 -0
- package/dist/collection/components/layout/mrd-layout-section/mrd-layout-section.js +8 -8
- package/dist/collection/components/merge/mrd-merge-view/mrd-merge-view.js +2 -2
- package/dist/collection/dev/app.js +58 -13
- package/dist/collection/dev/example-data.js +6 -1
- package/dist/collection/utils/format.js +160 -0
- package/dist/collection/utils/i18n.js +96 -0
- package/dist/components/cell-renderer.js +1 -1
- package/dist/components/format.js +1 -1
- package/dist/components/i18n.js +1 -1
- package/dist/components/mrd-currency-field2.js +1 -1
- package/dist/components/mrd-date-field2.js +1 -1
- package/dist/components/mrd-datetime-field2.js +1 -1
- package/dist/components/mrd-document-container2.js +1 -1
- package/dist/components/mrd-document-list2.js +1 -1
- package/dist/components/mrd-document-view2.js +1 -1
- package/dist/components/mrd-email-field2.js +1 -1
- package/dist/components/mrd-email-view2.js +1 -1
- package/dist/components/mrd-field2.js +1 -1
- package/dist/components/mrd-file-field2.js +1 -1
- package/dist/components/mrd-form.js +1 -1
- package/dist/components/mrd-image-field2.js +1 -1
- package/dist/components/mrd-invoice-view2.js +1 -1
- package/dist/components/mrd-layout-section.js +1 -1
- package/dist/components/mrd-longtext-field2.js +1 -1
- package/dist/components/mrd-merge-view.js +1 -1
- package/dist/components/mrd-number-field2.js +1 -1
- package/dist/components/mrd-relation-field2.js +1 -1
- package/dist/components/mrd-secret-field2.js +1 -1
- package/dist/components/mrd-table2.js +1 -1
- package/dist/components/mrd-text-field2.js +1 -1
- package/dist/components/mrd-textarea-field2.js +1 -1
- package/dist/components/mrd-time-field2.js +1 -1
- package/dist/esm/{cell-renderer-DIsNX9D7.js → cell-renderer-UQOYlDv7.js} +257 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/mosterdcomponents.js +1 -1
- package/dist/esm/mrd-boolean-field_25.entry.js +391 -77
- package/dist/esm/mrd-merge-view.entry.js +3 -3
- package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
- package/dist/mosterdcomponents/p-8cc374e0.entry.js +3 -0
- package/dist/mosterdcomponents/p-CF--ScWr.js +1 -0
- package/dist/mosterdcomponents/{p-4e061416.entry.js → p-d31b71d9.entry.js} +1 -1
- package/dist/types/components/documents/mrd-document-container/mrd-document-container.d.ts +7 -0
- package/dist/types/components/documents/mrd-document-list/mrd-document-list.d.ts +17 -0
- package/dist/types/components/fields/mrd-currency-field/mrd-currency-field.d.ts +13 -0
- package/dist/types/components/fields/mrd-date-field/mrd-date-field.d.ts +22 -1
- package/dist/types/components/fields/mrd-datetime-field/mrd-datetime-field.d.ts +21 -2
- package/dist/types/components/fields/mrd-number-field/mrd-number-field.d.ts +6 -0
- package/dist/types/components/fields/mrd-relation-field/mrd-relation-field.d.ts +7 -0
- package/dist/types/components/form/mrd-form/mrd-form.d.ts +3 -2
- package/dist/types/components/layout/mrd-layout-section/layout-helpers.d.ts +3 -0
- package/dist/types/components.d.ts +35 -0
- package/dist/types/types/client-layout.d.ts +7 -0
- package/dist/types/utils/format.d.ts +34 -0
- package/package.json +1 -1
- package/dist/mosterdcomponents/p-910ebfee.entry.js +0 -3
- package/dist/mosterdcomponents/p-Ce2QDq0t.js +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as registerInstance, c as createEvent, h, H as Host, g as getElement, w as writeTask } from './index-CDiBvvJU.js';
|
|
2
|
-
import { t, p as parseLocalizedNumber, f as
|
|
2
|
+
import { t, p as parseLocalizedNumber, f as formatNumber, a as formatIsoDate, l as localeDatePattern, b as parseLocalizedDate, c as formatLocalDateTime, d as parseLocalizedDateTime, e as formatDate, g as formatDateTime, h as formatCurrency, C as CellRenderer, i as formatPercentage } from './cell-renderer-UQOYlDv7.js';
|
|
3
3
|
import { b as ClientLayoutItemFieldDataType, e as ClientLayoutNavigateBehaviour, a as ClientLayoutItemType, c as ClientLayoutItemRelationDisplayType, d as ClientLayoutItemRelationEditBehavior, r as resolveArchetype, A as ARCHETYPE_DOCUMENT, h as ARCHETYPE_INVOICE_LINE, f as ARCHETYPE_INVOICE, g as ARCHETYPE_EMAIL } from './client-layout-Bc42CfJB.js';
|
|
4
4
|
|
|
5
5
|
const mrdBooleanFieldCss = () => `.sc-mrd-boolean-field-h{display:block}.mrd-boolean-field.sc-mrd-boolean-field{display:flex;align-items:center;width:100%}.mrd-boolean-field__toggle-label.sc-mrd-boolean-field{display:flex;align-items:center;gap:var(--mrd-space-3);cursor:pointer;user-select:none}.mrd-boolean-field__checkbox.sc-mrd-boolean-field{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.mrd-boolean-field__checkbox.sc-mrd-boolean-field:checked+.mrd-boolean-field__toggle.sc-mrd-boolean-field{background-color:var(--mrd-color-primary)}.mrd-boolean-field__checkbox.sc-mrd-boolean-field:checked+.mrd-boolean-field__toggle.sc-mrd-boolean-field::after{transform:translateX(20px)}.mrd-boolean-field__checkbox.sc-mrd-boolean-field:focus+.mrd-boolean-field__toggle.sc-mrd-boolean-field{box-shadow:var(--mrd-shadow-focus)}.mrd-boolean-field__checkbox.sc-mrd-boolean-field:disabled+.mrd-boolean-field__toggle.sc-mrd-boolean-field{opacity:0.5;cursor:not-allowed}.mrd-boolean-field__toggle.sc-mrd-boolean-field{position:relative;display:inline-block;width:44px;height:24px;background-color:var(--mrd-color-neutral-300);border-radius:var(--mrd-border-radius-full);transition:background-color var(--mrd-transition);flex-shrink:0}.mrd-boolean-field__toggle.sc-mrd-boolean-field::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background-color:var(--mrd-color-white);border-radius:50%;transition:transform var(--mrd-transition);box-shadow:var(--mrd-shadow-sm)}.mrd-boolean-field__text.sc-mrd-boolean-field{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-color-neutral-800)}.mrd-boolean-field__text--required.sc-mrd-boolean-field::after{content:" *";color:var(--mrd-color-danger)}`;
|
|
@@ -119,13 +119,26 @@ const MrdCurrencyField = class {
|
|
|
119
119
|
this.amountDisplay = '';
|
|
120
120
|
this.currency = 'EUR';
|
|
121
121
|
this.error = '';
|
|
122
|
+
/** While focused the user owns the text; prop updates must not overwrite it. */
|
|
123
|
+
this.focused = false;
|
|
122
124
|
this.handleAmountInput = (e) => {
|
|
123
125
|
this.amountDisplay = e.target.value;
|
|
124
126
|
};
|
|
127
|
+
this.handleAmountFocus = () => {
|
|
128
|
+
this.focused = true;
|
|
129
|
+
// Drop the grouping separators while editing, but keep the locale's decimal
|
|
130
|
+
// separator: String(1234.56) would be re-read as 123456 where '.' groups.
|
|
131
|
+
const parsed = parseLocalizedNumber(this.amountDisplay, this.locale);
|
|
132
|
+
if (parsed !== null) {
|
|
133
|
+
this.amountDisplay = formatNumber(parsed, this.locale, { useGrouping: false, maximumFractionDigits: 20 });
|
|
134
|
+
}
|
|
135
|
+
};
|
|
125
136
|
this.handleAmountBlur = (e) => {
|
|
137
|
+
this.focused = false;
|
|
126
138
|
const raw = e.target.value;
|
|
127
139
|
const parsed = parseLocalizedNumber(raw, this.locale);
|
|
128
140
|
this.error = requiredError(raw, this.required, this.locale);
|
|
141
|
+
this.amountDisplay = parsed !== null ? this.formatAmount(parsed) : '';
|
|
129
142
|
const val = { amount: parsed, currency: this.currency };
|
|
130
143
|
this.mrdChange.emit({ name: this.name, value: val });
|
|
131
144
|
this.mrdBlur.emit({ name: this.name, value: val });
|
|
@@ -137,19 +150,56 @@ const MrdCurrencyField = class {
|
|
|
137
150
|
};
|
|
138
151
|
}
|
|
139
152
|
componentWillLoad() {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
153
|
+
this.syncFromValue();
|
|
154
|
+
}
|
|
155
|
+
componentDidRender() {
|
|
156
|
+
// A rendered `selected` attribute is ignored once the select has an established
|
|
157
|
+
// value, so the currency is applied imperatively — same reason as the DROPDOWN
|
|
158
|
+
// preselect in mrd-relation-field. Without this an edit-mode record that loads
|
|
159
|
+
// after mount keeps showing EUR and would be saved back with the wrong currency.
|
|
160
|
+
if (this.selectEl && this.selectEl.value !== this.currency) {
|
|
161
|
+
this.selectEl.value = this.currency;
|
|
143
162
|
}
|
|
144
163
|
}
|
|
164
|
+
/** The record's own currency may sit outside the common list; never drop it. */
|
|
165
|
+
currencyOptions() {
|
|
166
|
+
return COMMON_CURRENCIES.includes(this.currency) ? COMMON_CURRENCIES : [this.currency, ...COMMON_CURRENCIES];
|
|
167
|
+
}
|
|
168
|
+
/** Edit mode loads the record after mount, so the incoming value must re-sync. */
|
|
169
|
+
valueChanged() {
|
|
170
|
+
if (!this.focused)
|
|
171
|
+
this.syncFromValue();
|
|
172
|
+
}
|
|
173
|
+
localeChanged() {
|
|
174
|
+
if (!this.focused)
|
|
175
|
+
this.syncFromValue();
|
|
176
|
+
}
|
|
177
|
+
syncFromValue() {
|
|
178
|
+
const value = this.value;
|
|
179
|
+
this.currency = (value === null || value === void 0 ? void 0 : value.currency) || 'EUR';
|
|
180
|
+
this.amountDisplay =
|
|
181
|
+
(value === null || value === void 0 ? void 0 : value.amount) !== null && (value === null || value === void 0 ? void 0 : value.amount) !== undefined ? this.formatAmount(value.amount) : '';
|
|
182
|
+
}
|
|
183
|
+
/** Display form: locale separators, always two decimals. The ISO code sits in the select. */
|
|
184
|
+
formatAmount(amount) {
|
|
185
|
+
return formatNumber(amount, this.locale, { minimumFractionDigits: 2, maximumFractionDigits: 2 });
|
|
186
|
+
}
|
|
145
187
|
render() {
|
|
146
188
|
const hasError = !!this.error;
|
|
147
|
-
return (h(Host, { key: '
|
|
189
|
+
return (h(Host, { key: '43ef1fe660c4eaef025203544916b077975b6aa3' }, h("div", { key: '00b8e79182c8e2a353d57ad5c341024caf00d4ea', class: "mrd-currency-field" }, h(FieldLabel, { key: '96835c311e0d490864c484b818f1dcc623f488b2', base: "mrd-currency-field", label: this.label, required: this.required }), h("div", { key: '80317cfe562af00cc4cbf9aabf4bac2126cf6fe5', class: "mrd-currency-field__row" }, h("input", { key: '1983ef1e4d19e0fc529cf5e8be7d287fea36620a', class: controlClass('mrd-currency-field', hasError, 'amount'), type: "text", inputMode: "decimal", name: `${this.name}_amount`, value: this.amountDisplay, placeholder: this.formatAmount(0), required: this.required, disabled: this.disabled, onInput: this.handleAmountInput, onFocus: this.handleAmountFocus, onBlur: this.handleAmountBlur }), h("select", { key: 'b5fe3f03590bebaa564d76bc5fcb47c327eacece', class: "mrd-currency-field__currency", ref: el => (this.selectEl = el), disabled: this.disabled, onChange: this.handleCurrencyChange }, this.currencyOptions().map(c => (h("option", { key: c, value: c, selected: c === this.currency }, c))))), h(FieldError, { key: '1a128b26293170d4137f787622d4e89a23e62c0b', base: "mrd-currency-field", error: this.error }))));
|
|
148
190
|
}
|
|
191
|
+
static get watchers() { return {
|
|
192
|
+
"value": [{
|
|
193
|
+
"valueChanged": 0
|
|
194
|
+
}],
|
|
195
|
+
"locale": [{
|
|
196
|
+
"localeChanged": 0
|
|
197
|
+
}]
|
|
198
|
+
}; }
|
|
149
199
|
};
|
|
150
200
|
MrdCurrencyField.style = mrdCurrencyFieldCss();
|
|
151
201
|
|
|
152
|
-
const mrdDateFieldCss = () => `.sc-mrd-date-field-h{display:block}.mrd-date-field.sc-mrd-date-field{display:flex;flex-direction:column;gap:var(--mrd-space-1);width:100%}.mrd-date-field__label.sc-mrd-date-field{display:block;font-family:var(--mrd-font-family);font-size:var(--mrd-label-font-size);font-weight:var(--mrd-label-font-weight);color:var(--mrd-label-color)}.mrd-date-field__label--required.sc-mrd-date-field::after{content:" *";color:var(--mrd-color-danger)}.mrd-date-field__input.sc-mrd-date-field{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);transition:border-color var(--mrd-transition), box-shadow var(--mrd-transition);outline:none;appearance:none;box-sizing:border-box}.mrd-date-field__input.sc-mrd-date-field::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-date-field__input.sc-mrd-date-field:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-date-field__input.sc-mrd-date-field:disabled{background-color:var(--mrd-input-bg-disabled);cursor:not-allowed;opacity:0.7}.mrd-date-field__input--error.sc-mrd-date-field{border-color:var(--mrd-border-color-error)}.mrd-date-field__input--error.sc-mrd-date-field:focus{box-shadow:var(--mrd-shadow-focus-error)}.mrd-date-
|
|
202
|
+
const mrdDateFieldCss = () => `.sc-mrd-date-field-h{display:block}.mrd-date-field.sc-mrd-date-field{display:flex;flex-direction:column;gap:var(--mrd-space-1);width:100%}.mrd-date-field__label.sc-mrd-date-field{display:block;font-family:var(--mrd-font-family);font-size:var(--mrd-label-font-size);font-weight:var(--mrd-label-font-weight);color:var(--mrd-label-color)}.mrd-date-field__label--required.sc-mrd-date-field::after{content:" *";color:var(--mrd-color-danger)}.mrd-date-field__control.sc-mrd-date-field{position:relative;display:block}.mrd-date-field__input.sc-mrd-date-field{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);transition:border-color var(--mrd-transition), box-shadow var(--mrd-transition);outline:none;appearance:none;box-sizing:border-box}.mrd-date-field__input.sc-mrd-date-field::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-date-field__input.sc-mrd-date-field:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-date-field__input.sc-mrd-date-field:disabled{background-color:var(--mrd-input-bg-disabled);cursor:not-allowed;opacity:0.7}.mrd-date-field__input--error.sc-mrd-date-field{border-color:var(--mrd-border-color-error)}.mrd-date-field__input--error.sc-mrd-date-field:focus{box-shadow:var(--mrd-shadow-focus-error)}.mrd-date-field__input.sc-mrd-date-field{padding-inline-end:calc(var(--mrd-input-padding-x) + 1.75rem)}.mrd-date-field__picker.sc-mrd-date-field{position:absolute;inset-inline-end:var(--mrd-space-1);top:50%;transform:translateY(-50%);width:1.75rem;height:1.75rem}.mrd-date-field__picker-button.sc-mrd-date-field{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;padding:0;border:0;border-radius:var(--mrd-border-radius-sm);background:transparent;color:var(--mrd-color-neutral-500);cursor:pointer;transition:color var(--mrd-transition), background-color var(--mrd-transition)}.mrd-date-field__picker-button.sc-mrd-date-field svg.sc-mrd-date-field{width:1.125rem;height:1.125rem}.mrd-date-field__picker-button.sc-mrd-date-field:hover:not(:disabled){color:var(--mrd-color-primary);background-color:var(--mrd-color-neutral-100)}.mrd-date-field__picker-button.sc-mrd-date-field:focus-visible{outline:2px solid var(--mrd-border-color-focus);outline-offset:1px}.mrd-date-field__picker-button.sc-mrd-date-field:disabled{cursor:not-allowed;opacity:0.5}.mrd-date-field__picker-native.sc-mrd-date-field{position:absolute;inset:0;width:100%;height:100%;padding:0;border:0;opacity:0;pointer-events:none}.mrd-date-field__error.sc-mrd-date-field{font-family:var(--mrd-font-family);font-size:var(--mrd-error-font-size);color:var(--mrd-error-color)}`;
|
|
153
203
|
|
|
154
204
|
const MrdDateField = class {
|
|
155
205
|
constructor(hostRef) {
|
|
@@ -158,28 +208,114 @@ const MrdDateField = class {
|
|
|
158
208
|
this.mrdBlur = createEvent(this, "mrdBlur");
|
|
159
209
|
this.name = '';
|
|
160
210
|
this.label = '';
|
|
211
|
+
/** ISO date, 'YYYY-MM-DD'. */
|
|
161
212
|
this.value = '';
|
|
213
|
+
/** Overrides the locale-derived pattern placeholder (e.g. 'dd-mm-jjjj'). */
|
|
214
|
+
this.placeholder = '';
|
|
162
215
|
this.required = false;
|
|
163
216
|
this.disabled = false;
|
|
164
217
|
this.locale = navigator.language;
|
|
218
|
+
/** What the user sees: the value formatted for `locale`, or their raw typing. */
|
|
219
|
+
this.displayValue = '';
|
|
165
220
|
this.error = '';
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
this.
|
|
221
|
+
/** While focused the user owns the text; prop updates must not overwrite it. */
|
|
222
|
+
this.focused = false;
|
|
223
|
+
this.handleFocus = () => {
|
|
224
|
+
this.focused = true;
|
|
225
|
+
};
|
|
226
|
+
this.handleInput = (e) => {
|
|
227
|
+
this.displayValue = e.target.value;
|
|
170
228
|
};
|
|
171
229
|
this.handleBlur = (e) => {
|
|
172
|
-
|
|
173
|
-
|
|
230
|
+
this.focused = false;
|
|
231
|
+
const value = this.commit(e.target.value);
|
|
232
|
+
this.mrdChange.emit({ name: this.name, value });
|
|
233
|
+
this.mrdBlur.emit({ name: this.name, value });
|
|
234
|
+
};
|
|
235
|
+
this.handleKeyDown = (e) => {
|
|
236
|
+
// Submitting with Enter never fires blur, so commit the typed text here too.
|
|
237
|
+
if (e.key !== 'Enter')
|
|
238
|
+
return;
|
|
239
|
+
const value = this.commit(e.target.value);
|
|
240
|
+
this.mrdChange.emit({ name: this.name, value });
|
|
241
|
+
};
|
|
242
|
+
this.openPicker = () => {
|
|
243
|
+
const native = this.nativeInput;
|
|
244
|
+
if (!native || this.disabled)
|
|
245
|
+
return;
|
|
246
|
+
// The blur commit that precedes this click re-renders asynchronously, so sync by hand first.
|
|
247
|
+
native.value = this.currentIso();
|
|
248
|
+
try {
|
|
249
|
+
native.showPicker();
|
|
250
|
+
}
|
|
251
|
+
catch (_a) {
|
|
252
|
+
// Browsers without showPicker(): focusing at least surfaces the platform control.
|
|
253
|
+
native.focus();
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
this.handlePickerChange = (e) => {
|
|
257
|
+
const iso = e.target.value; // native inputs always yield 'YYYY-MM-DD'
|
|
258
|
+
this.displayValue = formatIsoDate(iso, this.locale);
|
|
259
|
+
this.error = requiredError(iso, this.required, this.locale);
|
|
260
|
+
this.mrdChange.emit({ name: this.name, value: iso });
|
|
261
|
+
this.mrdBlur.emit({ name: this.name, value: iso });
|
|
174
262
|
};
|
|
175
263
|
}
|
|
264
|
+
componentWillLoad() {
|
|
265
|
+
this.displayValue = formatIsoDate(this.value, this.locale);
|
|
266
|
+
}
|
|
267
|
+
valueChanged(newValue) {
|
|
268
|
+
if (!this.focused)
|
|
269
|
+
this.displayValue = formatIsoDate(newValue, this.locale);
|
|
270
|
+
}
|
|
271
|
+
localeChanged() {
|
|
272
|
+
if (!this.focused)
|
|
273
|
+
this.displayValue = formatIsoDate(this.value, this.locale);
|
|
274
|
+
}
|
|
275
|
+
patternPlaceholder() {
|
|
276
|
+
if (this.placeholder)
|
|
277
|
+
return this.placeholder;
|
|
278
|
+
return localeDatePattern(this.locale, {
|
|
279
|
+
day: t('date_token_day', this.locale),
|
|
280
|
+
month: t('date_token_month', this.locale),
|
|
281
|
+
year: t('date_token_year', this.locale),
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
/** Parse the typed text, reformat it, and emit the ISO value. */
|
|
285
|
+
commit(raw) {
|
|
286
|
+
const trimmed = raw.trim();
|
|
287
|
+
const iso = trimmed ? parseLocalizedDate(trimmed, this.locale) : '';
|
|
288
|
+
if (trimmed && iso === null) {
|
|
289
|
+
// Keep the raw text so the user can correct it instead of retyping.
|
|
290
|
+
this.error = t('invalid_date', this.locale);
|
|
291
|
+
this.displayValue = trimmed;
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
this.error = requiredError(iso, this.required, this.locale);
|
|
295
|
+
this.displayValue = iso ? formatIsoDate(iso, this.locale) : '';
|
|
296
|
+
}
|
|
297
|
+
return iso !== null && iso !== void 0 ? iso : '';
|
|
298
|
+
}
|
|
299
|
+
/** The ISO value currently shown, so the picker opens on the right date. */
|
|
300
|
+
currentIso() {
|
|
301
|
+
var _a;
|
|
302
|
+
return (_a = (this.displayValue ? parseLocalizedDate(this.displayValue, this.locale) : '')) !== null && _a !== void 0 ? _a : '';
|
|
303
|
+
}
|
|
176
304
|
render() {
|
|
177
|
-
return (h(Host, { key: '
|
|
305
|
+
return (h(Host, { key: '06ba48bd538ee4c8de4e071285535451f783c259' }, h("div", { key: '73ea6ea23c85fe3325bb151afb755cc11a13cf58', class: "mrd-date-field" }, h(FieldLabel, { key: '527848cf72323aef176fc7d5bcd47dcf2f7e46f6', base: "mrd-date-field", label: this.label, required: this.required }), h("div", { key: '2ff7586f4e6298d1f9b9b131106044533de82c6d', class: "mrd-date-field__control" }, h("input", { key: '68fdf2f1f7961ca049ab6493494c8c0707e6a4af', class: controlClass('mrd-date-field', !!this.error), type: "text", name: this.name, value: this.displayValue, placeholder: this.patternPlaceholder(), autocomplete: "off", required: this.required, disabled: this.disabled, onFocus: this.handleFocus, onInput: this.handleInput, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown }), h("span", { key: '9557b7a3f6780b8a05030ab8e7c941c44df9f4a5', class: "mrd-date-field__picker" }, h("button", { key: '586973e0440ed0b74e1fa0affae9e462257024c3', type: "button", class: "mrd-date-field__picker-button", title: t('open_calendar', this.locale), "aria-label": t('open_calendar', this.locale), disabled: this.disabled, onClick: this.openPicker }, h("svg", { key: '144319d3a50d0d38c75c59dd3321d4b9097322a6', viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "aria-hidden": "true" }, h("rect", { key: 'aec01ca5c620bf3116705b7a28052eb3bc210cfd', x: "3", y: "4.5", width: "14", height: "12", rx: "2" }), h("path", { key: 'a0e13dd3a2005bfbee40f5a071b6760270d0d58d', d: "M3 8.5h14M7 2.5v3M13 2.5v3", "stroke-linecap": "round" }))), h("input", { key: 'be02df44f31a59a26ce166ab9a9eab9db2635d89', class: "mrd-date-field__picker-native", type: "date", ref: el => (this.nativeInput = el), value: this.currentIso(), disabled: this.disabled, tabIndex: -1, "aria-hidden": "true", onChange: this.handlePickerChange }))), h(FieldError, { key: '2f8b2072bee32170a35f98ec5c962018774c7e8c', base: "mrd-date-field", error: this.error }))));
|
|
178
306
|
}
|
|
307
|
+
static get watchers() { return {
|
|
308
|
+
"value": [{
|
|
309
|
+
"valueChanged": 0
|
|
310
|
+
}],
|
|
311
|
+
"locale": [{
|
|
312
|
+
"localeChanged": 0
|
|
313
|
+
}]
|
|
314
|
+
}; }
|
|
179
315
|
};
|
|
180
316
|
MrdDateField.style = mrdDateFieldCss();
|
|
181
317
|
|
|
182
|
-
const mrdDatetimeFieldCss = () => `.sc-mrd-datetime-field-h{display:block}.mrd-datetime-field.sc-mrd-datetime-field{display:flex;flex-direction:column;gap:var(--mrd-space-1);width:100%}.mrd-datetime-field__label.sc-mrd-datetime-field{display:block;font-family:var(--mrd-font-family);font-size:var(--mrd-label-font-size);font-weight:var(--mrd-label-font-weight);color:var(--mrd-label-color)}.mrd-datetime-field__label--required.sc-mrd-datetime-field::after{content:" *";color:var(--mrd-color-danger)}.mrd-datetime-field__input.sc-mrd-datetime-field{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);transition:border-color var(--mrd-transition), box-shadow var(--mrd-transition);outline:none;appearance:none;box-sizing:border-box}.mrd-datetime-field__input.sc-mrd-datetime-field::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-datetime-field__input.sc-mrd-datetime-field:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-datetime-field__input.sc-mrd-datetime-field:disabled{background-color:var(--mrd-input-bg-disabled);cursor:not-allowed;opacity:0.7}.mrd-datetime-field__input--error.sc-mrd-datetime-field{border-color:var(--mrd-border-color-error)}.mrd-datetime-field__input--error.sc-mrd-datetime-field:focus{box-shadow:var(--mrd-shadow-focus-error)}.mrd-datetime-
|
|
318
|
+
const mrdDatetimeFieldCss = () => `.sc-mrd-datetime-field-h{display:block}.mrd-datetime-field.sc-mrd-datetime-field{display:flex;flex-direction:column;gap:var(--mrd-space-1);width:100%}.mrd-datetime-field__label.sc-mrd-datetime-field{display:block;font-family:var(--mrd-font-family);font-size:var(--mrd-label-font-size);font-weight:var(--mrd-label-font-weight);color:var(--mrd-label-color)}.mrd-datetime-field__label--required.sc-mrd-datetime-field::after{content:" *";color:var(--mrd-color-danger)}.mrd-datetime-field__control.sc-mrd-datetime-field{position:relative;display:block}.mrd-datetime-field__input.sc-mrd-datetime-field{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);transition:border-color var(--mrd-transition), box-shadow var(--mrd-transition);outline:none;appearance:none;box-sizing:border-box}.mrd-datetime-field__input.sc-mrd-datetime-field::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-datetime-field__input.sc-mrd-datetime-field:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-datetime-field__input.sc-mrd-datetime-field:disabled{background-color:var(--mrd-input-bg-disabled);cursor:not-allowed;opacity:0.7}.mrd-datetime-field__input--error.sc-mrd-datetime-field{border-color:var(--mrd-border-color-error)}.mrd-datetime-field__input--error.sc-mrd-datetime-field:focus{box-shadow:var(--mrd-shadow-focus-error)}.mrd-datetime-field__input.sc-mrd-datetime-field{padding-inline-end:calc(var(--mrd-input-padding-x) + 1.75rem)}.mrd-datetime-field__picker.sc-mrd-datetime-field{position:absolute;inset-inline-end:var(--mrd-space-1);top:50%;transform:translateY(-50%);width:1.75rem;height:1.75rem}.mrd-datetime-field__picker-button.sc-mrd-datetime-field{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;padding:0;border:0;border-radius:var(--mrd-border-radius-sm);background:transparent;color:var(--mrd-color-neutral-500);cursor:pointer;transition:color var(--mrd-transition), background-color var(--mrd-transition)}.mrd-datetime-field__picker-button.sc-mrd-datetime-field svg.sc-mrd-datetime-field{width:1.125rem;height:1.125rem}.mrd-datetime-field__picker-button.sc-mrd-datetime-field:hover:not(:disabled){color:var(--mrd-color-primary);background-color:var(--mrd-color-neutral-100)}.mrd-datetime-field__picker-button.sc-mrd-datetime-field:focus-visible{outline:2px solid var(--mrd-border-color-focus);outline-offset:1px}.mrd-datetime-field__picker-button.sc-mrd-datetime-field:disabled{cursor:not-allowed;opacity:0.5}.mrd-datetime-field__picker-native.sc-mrd-datetime-field{position:absolute;inset:0;width:100%;height:100%;padding:0;border:0;opacity:0;pointer-events:none}.mrd-datetime-field__error.sc-mrd-datetime-field{font-family:var(--mrd-font-family);font-size:var(--mrd-error-font-size);color:var(--mrd-error-color)}`;
|
|
183
319
|
|
|
184
320
|
const MrdDatetimeField = class {
|
|
185
321
|
constructor(hostRef) {
|
|
@@ -188,30 +324,72 @@ const MrdDatetimeField = class {
|
|
|
188
324
|
this.mrdBlur = createEvent(this, "mrdBlur");
|
|
189
325
|
this.name = '';
|
|
190
326
|
this.label = '';
|
|
327
|
+
/** UTC ISO string, e.g. '2026-07-06T12:30:00Z'. */
|
|
191
328
|
this.value = '';
|
|
329
|
+
/** Overrides the locale-derived pattern placeholder (e.g. 'dd-mm-jjjj uu:mm'). */
|
|
330
|
+
this.placeholder = '';
|
|
192
331
|
this.required = false;
|
|
193
332
|
this.disabled = false;
|
|
194
333
|
this.locale = navigator.language;
|
|
334
|
+
/** What the user sees: the value formatted for `locale`, or their raw typing. */
|
|
335
|
+
this.displayValue = '';
|
|
195
336
|
this.error = '';
|
|
196
|
-
|
|
197
|
-
this.
|
|
198
|
-
|
|
199
|
-
this.
|
|
200
|
-
|
|
201
|
-
|
|
337
|
+
/** While focused the user owns the text; prop updates must not overwrite it. */
|
|
338
|
+
this.focused = false;
|
|
339
|
+
this.handleFocus = () => {
|
|
340
|
+
this.focused = true;
|
|
341
|
+
};
|
|
342
|
+
this.handleInput = (e) => {
|
|
343
|
+
this.displayValue = e.target.value;
|
|
202
344
|
};
|
|
203
345
|
this.handleBlur = (e) => {
|
|
204
|
-
|
|
205
|
-
|
|
346
|
+
this.focused = false;
|
|
347
|
+
const value = this.commit(e.target.value);
|
|
348
|
+
this.mrdChange.emit({ name: this.name, value });
|
|
349
|
+
this.mrdBlur.emit({ name: this.name, value });
|
|
350
|
+
};
|
|
351
|
+
this.handleKeyDown = (e) => {
|
|
352
|
+
// Submitting with Enter never fires blur, so commit the typed text here too.
|
|
353
|
+
if (e.key !== 'Enter')
|
|
354
|
+
return;
|
|
355
|
+
const value = this.commit(e.target.value);
|
|
356
|
+
this.mrdChange.emit({ name: this.name, value });
|
|
357
|
+
};
|
|
358
|
+
this.openPicker = () => {
|
|
359
|
+
const native = this.nativeInput;
|
|
360
|
+
if (!native || this.disabled)
|
|
361
|
+
return;
|
|
362
|
+
// The blur commit that precedes this click re-renders asynchronously, so sync by hand first.
|
|
363
|
+
native.value = this.currentLocal();
|
|
364
|
+
try {
|
|
365
|
+
native.showPicker();
|
|
366
|
+
}
|
|
367
|
+
catch (_a) {
|
|
368
|
+
// Browsers without showPicker(): focusing at least surfaces the platform control.
|
|
369
|
+
native.focus();
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
this.handlePickerChange = (e) => {
|
|
373
|
+
const local = e.target.value; // native inputs always yield 'YYYY-MM-DDTHH:mm'
|
|
374
|
+
this.displayValue = formatLocalDateTime(local, this.locale);
|
|
375
|
+
this.error = requiredError(local, this.required, this.locale);
|
|
376
|
+
const value = this.localToUtc(local);
|
|
377
|
+
this.mrdChange.emit({ name: this.name, value });
|
|
378
|
+
this.mrdBlur.emit({ name: this.name, value });
|
|
206
379
|
};
|
|
207
380
|
}
|
|
208
381
|
componentWillLoad() {
|
|
209
|
-
this.
|
|
382
|
+
this.displayValue = this.toDisplay(this.value);
|
|
210
383
|
}
|
|
211
384
|
valueChanged(newVal) {
|
|
212
|
-
|
|
385
|
+
if (!this.focused)
|
|
386
|
+
this.displayValue = this.toDisplay(newVal);
|
|
387
|
+
}
|
|
388
|
+
localeChanged() {
|
|
389
|
+
if (!this.focused)
|
|
390
|
+
this.displayValue = this.toDisplay(this.value);
|
|
213
391
|
}
|
|
214
|
-
// UTC ISO string → "YYYY-MM-DDTHH:mm" in local timezone
|
|
392
|
+
// UTC ISO string → "YYYY-MM-DDTHH:mm" in local timezone
|
|
215
393
|
utcToLocal(utcStr) {
|
|
216
394
|
if (!utcStr)
|
|
217
395
|
return '';
|
|
@@ -230,12 +408,50 @@ const MrdDatetimeField = class {
|
|
|
230
408
|
return '';
|
|
231
409
|
return d.toISOString().replace(/\.\d{3}Z$/, 'Z');
|
|
232
410
|
}
|
|
411
|
+
// UTC ISO string → locale-formatted text for the input
|
|
412
|
+
toDisplay(utcStr) {
|
|
413
|
+
return formatLocalDateTime(this.utcToLocal(utcStr), this.locale);
|
|
414
|
+
}
|
|
415
|
+
patternPlaceholder() {
|
|
416
|
+
if (this.placeholder)
|
|
417
|
+
return this.placeholder;
|
|
418
|
+
return localeDatePattern(this.locale, {
|
|
419
|
+
day: t('date_token_day', this.locale),
|
|
420
|
+
month: t('date_token_month', this.locale),
|
|
421
|
+
year: t('date_token_year', this.locale),
|
|
422
|
+
hour: t('time_token_hour', this.locale),
|
|
423
|
+
minute: t('time_token_minute', this.locale),
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
/** Parse the typed text, reformat it, and return the UTC value to emit. */
|
|
427
|
+
commit(raw) {
|
|
428
|
+
const trimmed = raw.trim();
|
|
429
|
+
const local = trimmed ? parseLocalizedDateTime(trimmed, this.locale) : '';
|
|
430
|
+
if (trimmed && local === null) {
|
|
431
|
+
// Keep the raw text so the user can correct it instead of retyping.
|
|
432
|
+
this.error = t('invalid_datetime', this.locale);
|
|
433
|
+
this.displayValue = trimmed;
|
|
434
|
+
return '';
|
|
435
|
+
}
|
|
436
|
+
const localValue = local !== null && local !== void 0 ? local : '';
|
|
437
|
+
this.error = requiredError(localValue, this.required, this.locale);
|
|
438
|
+
this.displayValue = localValue ? formatLocalDateTime(localValue, this.locale) : '';
|
|
439
|
+
return this.localToUtc(localValue);
|
|
440
|
+
}
|
|
441
|
+
/** The local 'YYYY-MM-DDTHH:mm' currently shown, so the picker opens on the right moment. */
|
|
442
|
+
currentLocal() {
|
|
443
|
+
var _a;
|
|
444
|
+
return (_a = (this.displayValue ? parseLocalizedDateTime(this.displayValue, this.locale) : '')) !== null && _a !== void 0 ? _a : '';
|
|
445
|
+
}
|
|
233
446
|
render() {
|
|
234
|
-
return (h(Host, { key: '
|
|
447
|
+
return (h(Host, { key: 'e075e65c76a627a8f19db488c07704e2b1a7270b' }, h("div", { key: 'a6b5a5df3168272f1f775933dfc372e1b2ccbd95', class: "mrd-datetime-field" }, h(FieldLabel, { key: '39e232c066b8c354eeda7df9bcba4e3f95c18ee5', base: "mrd-datetime-field", label: this.label, required: this.required }), h("div", { key: '4ffac4089cbb9e5506aa0854c8b1f15862bc8456', class: "mrd-datetime-field__control" }, h("input", { key: 'd33400133173c7f3e8b045339f44fbeba7f0b35a', class: controlClass('mrd-datetime-field', !!this.error), type: "text", name: this.name, value: this.displayValue, placeholder: this.patternPlaceholder(), autocomplete: "off", required: this.required, disabled: this.disabled, onFocus: this.handleFocus, onInput: this.handleInput, onBlur: this.handleBlur, onKeyDown: this.handleKeyDown }), h("span", { key: '54d8d3b1f508d6226d1341d87c1fec19d5914a10', class: "mrd-datetime-field__picker" }, h("button", { key: '27cd3977984eedd9e3471dd039fc73798f1c7abc', type: "button", class: "mrd-datetime-field__picker-button", title: t('open_calendar', this.locale), "aria-label": t('open_calendar', this.locale), disabled: this.disabled, onClick: this.openPicker }, h("svg", { key: '634ca817fa001263933795e35e1a215a06da7a77', viewBox: "0 0 20 20", fill: "none", stroke: "currentColor", "stroke-width": "1.5", "aria-hidden": "true" }, h("rect", { key: '66eadf6b2cfee53376f6ea0f50dbd2ec04fc5663', x: "3", y: "4.5", width: "14", height: "12", rx: "2" }), h("path", { key: '4bb61793e0501bd18bb16c4e203b20f509692970', d: "M3 8.5h14M7 2.5v3M13 2.5v3", "stroke-linecap": "round" }))), h("input", { key: '8877da44e4dc527e7c05244359a0caf9d2e81fdd', class: "mrd-datetime-field__picker-native", type: "datetime-local", ref: el => (this.nativeInput = el), value: this.currentLocal(), disabled: this.disabled, tabIndex: -1, "aria-hidden": "true", onChange: this.handlePickerChange }))), h(FieldError, { key: '4ee97180614972c4dd334d68873a9fb7f91e48f5', base: "mrd-datetime-field", error: this.error }))));
|
|
235
448
|
}
|
|
236
449
|
static get watchers() { return {
|
|
237
450
|
"value": [{
|
|
238
451
|
"valueChanged": 0
|
|
452
|
+
}],
|
|
453
|
+
"locale": [{
|
|
454
|
+
"localeChanged": 0
|
|
239
455
|
}]
|
|
240
456
|
}; }
|
|
241
457
|
};
|
|
@@ -275,7 +491,7 @@ function attachmentsKey(attachments) {
|
|
|
275
491
|
return attachments.map(a => a.href).join('|');
|
|
276
492
|
}
|
|
277
493
|
|
|
278
|
-
const mrdDocumentContainerCss = () => `.sc-mrd-document-container-h{display:block}.mrd-document-container__toolbar.sc-mrd-document-container{display:flex;align-items:center;justify-content:flex-end;gap:var(--mrd-space-2);padding:var(--mrd-space-2) 0;border-bottom:1px solid var(--mrd-color-neutral-100)}.mrd-document-container__body--tree.sc-mrd-document-container{border:1px solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);overflow:hidden}.mrd-document-container__action.sc-mrd-document-container{display:inline-flex;align-items:center;gap:var(--mrd-space-2);height:1.625rem;padding:0 var(--mrd-space-3);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-700);background:var(--mrd-color-white);border:1px solid var(--mrd-color-neutral-200);border-radius:var(--mrd-border-radius);cursor:pointer;transition:background var(--mrd-transition-fast), border-color var(--mrd-transition-fast)}.mrd-document-container__action.sc-mrd-document-container svg.sc-mrd-document-container{width:1rem;height:1rem;color:var(--mrd-color-folder)}.mrd-document-container__action.sc-mrd-document-container:hover:not(:disabled){background:var(--mrd-color-neutral-50);border-color:var(--mrd-color-neutral-300)}.mrd-document-container__action.sc-mrd-document-container:disabled{opacity:0.5;cursor:not-allowed}.mrd-document-container__seg.sc-mrd-document-container{display:inline-flex;gap:2px;padding:2px;background:var(--mrd-color-neutral-100);border-radius:var(--mrd-border-radius)}.mrd-document-container__seg-btn.sc-mrd-document-container{width:1.875rem;height:1.625rem;display:grid;place-items:center;border:none;background:none;border-radius:var(--mrd-border-radius-sm);color:var(--mrd-color-neutral-500);cursor:pointer;transition:color var(--mrd-transition-fast), background var(--mrd-transition-fast)}.mrd-document-container__seg-btn.sc-mrd-document-container:hover{color:var(--mrd-color-neutral-800)}.mrd-document-container__seg-btn[aria-pressed=true].sc-mrd-document-container{background:var(--mrd-color-white);color:var(--mrd-color-primary-dark);box-shadow:var(--mrd-shadow-sm)}.mrd-document-container__seg-btn.sc-mrd-document-container svg.sc-mrd-document-container{width:1rem;height:1rem}`;
|
|
494
|
+
const mrdDocumentContainerCss = () => `.sc-mrd-document-container-h{display:block}.mrd-document-container__toolbar.sc-mrd-document-container{display:flex;align-items:center;justify-content:flex-end;gap:var(--mrd-space-2);padding:var(--mrd-space-2) 0;border-bottom:1px solid var(--mrd-color-neutral-100)}.mrd-document-container__body--tree.sc-mrd-document-container{border:1px solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);overflow:hidden}.mrd-document-container__action.sc-mrd-document-container{display:inline-flex;align-items:center;gap:var(--mrd-space-2);height:1.625rem;padding:0 var(--mrd-space-3);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-700);background:var(--mrd-color-white);border:1px solid var(--mrd-color-neutral-200);border-radius:var(--mrd-border-radius);cursor:pointer;transition:background var(--mrd-transition-fast), border-color var(--mrd-transition-fast)}.mrd-document-container__action.sc-mrd-document-container svg.sc-mrd-document-container{width:1rem;height:1rem;color:var(--mrd-color-folder)}.mrd-document-container__action.sc-mrd-document-container:hover:not(:disabled){background:var(--mrd-color-neutral-50);border-color:var(--mrd-color-neutral-300)}.mrd-document-container__action.sc-mrd-document-container:disabled{opacity:0.5;cursor:not-allowed}.mrd-document-container__file-input.sc-mrd-document-container{display:none}.mrd-document-container__seg.sc-mrd-document-container{display:inline-flex;gap:2px;padding:2px;background:var(--mrd-color-neutral-100);border-radius:var(--mrd-border-radius)}.mrd-document-container__seg-btn.sc-mrd-document-container{width:1.875rem;height:1.625rem;display:grid;place-items:center;border:none;background:none;border-radius:var(--mrd-border-radius-sm);color:var(--mrd-color-neutral-500);cursor:pointer;transition:color var(--mrd-transition-fast), background var(--mrd-transition-fast)}.mrd-document-container__seg-btn.sc-mrd-document-container:hover{color:var(--mrd-color-neutral-800)}.mrd-document-container__seg-btn[aria-pressed=true].sc-mrd-document-container{background:var(--mrd-color-white);color:var(--mrd-color-primary-dark);box-shadow:var(--mrd-shadow-sm)}.mrd-document-container__seg-btn.sc-mrd-document-container svg.sc-mrd-document-container{width:1rem;height:1rem}`;
|
|
279
495
|
|
|
280
496
|
const MrdDocumentContainer = class {
|
|
281
497
|
constructor(hostRef) {
|
|
@@ -304,12 +520,28 @@ const MrdDocumentContainer = class {
|
|
|
304
520
|
this.mode = 'tree';
|
|
305
521
|
/** Whether the folder tree currently has a valid target for "New folder". */
|
|
306
522
|
this.canCreate = false;
|
|
523
|
+
/** Name of that target (folder path, or the container's label), for the upload tooltip. */
|
|
524
|
+
this.targetLabel = '';
|
|
307
525
|
/** Whether the currently mounted table has been init()'d. Reset on every mode switch. */
|
|
308
526
|
this.tableInited = false;
|
|
309
527
|
this.createFolder = () => {
|
|
310
528
|
var _a;
|
|
311
529
|
(_a = this.listEl) === null || _a === void 0 ? void 0 : _a.createFolder();
|
|
312
530
|
};
|
|
531
|
+
this.pickFile = () => {
|
|
532
|
+
var _a;
|
|
533
|
+
(_a = this.fileInputEl) === null || _a === void 0 ? void 0 : _a.click();
|
|
534
|
+
};
|
|
535
|
+
/** One file per upload, matching the drop handler. Reset the input afterwards
|
|
536
|
+
* so picking the same file twice in a row still fires a change event. */
|
|
537
|
+
this.onFilePicked = (e) => {
|
|
538
|
+
var _a, _b;
|
|
539
|
+
const input = e.target;
|
|
540
|
+
const file = (_a = input.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
541
|
+
if (file)
|
|
542
|
+
(_b = this.listEl) === null || _b === void 0 ? void 0 : _b.uploadFile(file);
|
|
543
|
+
input.value = '';
|
|
544
|
+
};
|
|
313
545
|
}
|
|
314
546
|
/** The embedded table does not self-load: like every mrd-table it waits for the
|
|
315
547
|
* host to call init() (which emits mrdLoadPage, and — once page 0 lands —
|
|
@@ -334,7 +566,7 @@ const MrdDocumentContainer = class {
|
|
|
334
566
|
}
|
|
335
567
|
// ── Toolbar ────────────────────────────────────────────────────────────────
|
|
336
568
|
renderToolbar() {
|
|
337
|
-
return (h("div", { class: "mrd-document-container__toolbar" }, this.mode === 'tree' && (h("button", { type: "button", class: "mrd-document-container__action", disabled: !this.canCreate, onClick: this.createFolder }, 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: "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" }), h("path", { d: "M12 11v4M10 13h4" })), t('new_folder', this.locale))), h("div", { class: "mrd-document-container__seg", role: "group", "aria-label": t('doc_view_switch', this.locale) }, h("button", { class: "mrd-document-container__seg-btn", "aria-pressed": String(this.mode === 'tree'), title: t('doc_view_tree', this.locale), "aria-label": t('doc_view_tree', this.locale), onClick: () => this.setMode('tree') }, 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: "M3 5h6M3 12h9M3 19h6" }), h("circle", { cx: "18", cy: "5", r: "1.6" }), h("circle", { cx: "18", cy: "19", r: "1.6" }), h("path", { d: "M16 12h4" }))), h("button", { class: "mrd-document-container__seg-btn", "aria-pressed": String(this.mode === 'list'), title: t('doc_view_list', this.locale), "aria-label": t('doc_view_list', this.locale), onClick: () => this.setMode('list') }, 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: "M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01" }))))));
|
|
569
|
+
return (h("div", { class: "mrd-document-container__toolbar" }, this.mode === 'tree' && (h("button", { type: "button", class: "mrd-document-container__action", disabled: !this.canCreate, onClick: this.createFolder }, 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: "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" }), h("path", { d: "M12 11v4M10 13h4" })), t('new_folder', this.locale))), this.mode === 'tree' && (h("button", { type: "button", class: "mrd-document-container__action", disabled: !this.canCreate, title: this.targetLabel ? `${t('doc_upload_to', this.locale)} ${this.targetLabel}` : undefined, onClick: this.pickFile }, 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: "M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" }), h("path", { d: "M12 3v13M7 8l5-5 5 5" })), t('doc_upload', this.locale))), h("input", { type: "file", class: "mrd-document-container__file-input", ref: el => (this.fileInputEl = el), onChange: this.onFilePicked }), h("div", { class: "mrd-document-container__seg", role: "group", "aria-label": t('doc_view_switch', this.locale) }, h("button", { class: "mrd-document-container__seg-btn", "aria-pressed": String(this.mode === 'tree'), title: t('doc_view_tree', this.locale), "aria-label": t('doc_view_tree', this.locale), onClick: () => this.setMode('tree') }, 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: "M3 5h6M3 12h9M3 19h6" }), h("circle", { cx: "18", cy: "5", r: "1.6" }), h("circle", { cx: "18", cy: "19", r: "1.6" }), h("path", { d: "M16 12h4" }))), h("button", { class: "mrd-document-container__seg-btn", "aria-pressed": String(this.mode === 'list'), title: t('doc_view_list', this.locale), "aria-label": t('doc_view_list', this.locale), onClick: () => this.setMode('list') }, 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: "M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01" }))))));
|
|
338
570
|
}
|
|
339
571
|
// ── Bodies ───────────────────────────────────────────────────────────────
|
|
340
572
|
renderTree() {
|
|
@@ -350,6 +582,9 @@ const MrdDocumentContainer = class {
|
|
|
350
582
|
}, onMrdCanCreate: (e) => {
|
|
351
583
|
e.stopPropagation();
|
|
352
584
|
this.canCreate = e.detail;
|
|
585
|
+
}, onMrdTargetLabel: (e) => {
|
|
586
|
+
e.stopPropagation();
|
|
587
|
+
this.targetLabel = e.detail;
|
|
353
588
|
}, onMrdUpdateObject: (e) => {
|
|
354
589
|
e.stopPropagation();
|
|
355
590
|
this.mrdUpdateObject.emit(e.detail);
|
|
@@ -386,7 +621,7 @@ const MrdDocumentContainer = class {
|
|
|
386
621
|
}
|
|
387
622
|
render() {
|
|
388
623
|
const treeMode = this.mode === 'tree';
|
|
389
|
-
return (h(Host, { key: '
|
|
624
|
+
return (h(Host, { key: 'ae948e2458d9087179e850b527802c489067d93f' }, this.renderToolbar(), h("div", { key: 'a04e1a78413aa794d0bda551aeb9c6245f1aafa2', class: {
|
|
390
625
|
'mrd-document-container__body': true,
|
|
391
626
|
'mrd-document-container__body--tree': treeMode,
|
|
392
627
|
}, style: treeMode ? { height: `${this.height}px`, overflowY: 'auto' } : {} }, treeMode ? this.renderTree() : this.renderList())));
|
|
@@ -639,6 +874,7 @@ const MrdDocumentList = class {
|
|
|
639
874
|
this.mrdLoadPage = createEvent(this, "mrdLoadPage");
|
|
640
875
|
this.mrdNavigate = createEvent(this, "mrdNavigate");
|
|
641
876
|
this.mrdCanCreate = createEvent(this, "mrdCanCreate");
|
|
877
|
+
this.mrdTargetLabel = createEvent(this, "mrdTargetLabel");
|
|
642
878
|
this.mrdUpdateObject = createEvent(this, "mrdUpdateObject");
|
|
643
879
|
this.mrdUpload = createEvent(this, "mrdUpload");
|
|
644
880
|
this.mrdCreateObject = createEvent(this, "mrdCreateObject");
|
|
@@ -682,6 +918,8 @@ const MrdDocumentList = class {
|
|
|
682
918
|
this.newFolderSeq = 0;
|
|
683
919
|
/** Last emitted canCreateFolder value, to only emit mrdCanCreate on change. */
|
|
684
920
|
this.lastCanCreate = false;
|
|
921
|
+
/** Last emitted upload-target label, to only emit mrdTargetLabel on change. */
|
|
922
|
+
this.lastTargetLabel = '';
|
|
685
923
|
// ── Drag & drop (move a document into another folder) ──────────────────────
|
|
686
924
|
/** The document row currently being dragged. */
|
|
687
925
|
this.dragDoc = null;
|
|
@@ -855,6 +1093,22 @@ const MrdDocumentList = class {
|
|
|
855
1093
|
this.lastCanCreate = can;
|
|
856
1094
|
this.mrdCanCreate.emit(can);
|
|
857
1095
|
}
|
|
1096
|
+
const label = this.targetLabel;
|
|
1097
|
+
if (label !== this.lastTargetLabel) {
|
|
1098
|
+
this.lastTargetLabel = label;
|
|
1099
|
+
this.mrdTargetLabel.emit(label);
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
/** Human-readable name of the node a new folder or upload lands in — the
|
|
1103
|
+
* folder path when one is selected, otherwise the container's own label.
|
|
1104
|
+
* Empty when there is no target at all. */
|
|
1105
|
+
get targetLabel() {
|
|
1106
|
+
var _a;
|
|
1107
|
+
const resolved = this.resolveTarget();
|
|
1108
|
+
if (!resolved)
|
|
1109
|
+
return '';
|
|
1110
|
+
const { target, container } = resolved;
|
|
1111
|
+
return (_a = folderStringOf(target, container)) !== null && _a !== void 0 ? _a : target.label;
|
|
858
1112
|
}
|
|
859
1113
|
// ── Slot field names ─────────────────────────────────────────────────────
|
|
860
1114
|
get containerField() {
|
|
@@ -1128,12 +1382,28 @@ const MrdDocumentList = class {
|
|
|
1128
1382
|
this.dropTargetId = null;
|
|
1129
1383
|
if (!file)
|
|
1130
1384
|
return;
|
|
1385
|
+
this.beginUpload(file, node, container);
|
|
1386
|
+
}
|
|
1387
|
+
/** Shared by the file drop and the host toolbar's upload button. */
|
|
1388
|
+
beginUpload(file, node, container) {
|
|
1131
1389
|
this.pendingUpload = { file, node, container };
|
|
1132
1390
|
node.open = true;
|
|
1133
1391
|
this.uploadingNodeId = node.id;
|
|
1134
1392
|
this.bump();
|
|
1135
1393
|
this.mrdUpload.emit({ file });
|
|
1136
1394
|
}
|
|
1395
|
+
/** Upload a file into the current target — the selected folder/container, or
|
|
1396
|
+
* the only container when there is just one. Called by the host toolbar
|
|
1397
|
+
* (mrd-document-container). No-op without a target, or while another upload
|
|
1398
|
+
* is still awaiting its setFileReference. */
|
|
1399
|
+
async uploadFile(file) {
|
|
1400
|
+
if (!file || this.pendingUpload)
|
|
1401
|
+
return;
|
|
1402
|
+
const resolved = this.resolveTarget();
|
|
1403
|
+
if (!resolved)
|
|
1404
|
+
return;
|
|
1405
|
+
this.beginUpload(file, resolved.target, resolved.container);
|
|
1406
|
+
}
|
|
1137
1407
|
/** Host callback with the uploaded file reference. Builds the create payload
|
|
1138
1408
|
* from the archetype slots and requests the new document. */
|
|
1139
1409
|
async setFileReference(uri) {
|
|
@@ -1268,7 +1538,7 @@ const MrdDocumentList = class {
|
|
|
1268
1538
|
body = renderLoadingRow(ctx, 0);
|
|
1269
1539
|
}
|
|
1270
1540
|
else if (this.containers.length === 0) {
|
|
1271
|
-
body = h("div", { key: '
|
|
1541
|
+
body = h("div", { key: '63604a99fc62d9108f61b8efc126c0cd3e8fc5ed', class: "mrd-document-list__empty" }, t('no_results', this.locale));
|
|
1272
1542
|
}
|
|
1273
1543
|
else if (this.singleContainer) {
|
|
1274
1544
|
// Dossier context: render the single container's folder tree at the root.
|
|
@@ -1286,7 +1556,7 @@ const MrdDocumentList = class {
|
|
|
1286
1556
|
else {
|
|
1287
1557
|
body = this.containers.map(c => renderContainerNode(ctx, c, 0));
|
|
1288
1558
|
}
|
|
1289
|
-
return (h(Host, { key: '
|
|
1559
|
+
return (h(Host, { key: '2a092e3a7483deb1fb30753b0c0428aaf75c303a' }, h("div", { key: '2b716c912a272b925a95133de5b1ff2abedd9dbc', class: 'mrd-document-list' + (this.rootDropActive ? ' mrd-document-list--drop-active' : ''), onDragOver: this.onRootDragOver, onDragLeave: this.onRootDragLeave, onDrop: this.onRootDrop }, body)));
|
|
1290
1560
|
}
|
|
1291
1561
|
get el() { return getElement(this); }
|
|
1292
1562
|
};
|
|
@@ -1405,7 +1675,7 @@ const MrdEmailField = class {
|
|
|
1405
1675
|
};
|
|
1406
1676
|
}
|
|
1407
1677
|
render() {
|
|
1408
|
-
return (h(Host, { key: '
|
|
1678
|
+
return (h(Host, { key: 'e185145e628e3a23dd338d93dd8e42bf11569728' }, h("div", { key: '7d77dd982543a8add5fa1f47aa7985cc15079080', class: "mrd-email-field" }, h(FieldLabel, { key: '14eb00a535a052ebe3cb2793cc7dfc05168c402b', base: "mrd-email-field", label: this.label, required: this.required }), h("input", { key: '11fb9856144f7da30a054b4433350d80d316de64', class: controlClass('mrd-email-field', !!this.error), type: "email", name: this.name, value: this.value, placeholder: this.placeholder || 'name@example.com', required: this.required, disabled: this.disabled, onInput: this.handleInput, onBlur: this.handleBlur }), h(FieldError, { key: 'be33c0a43cd99a7152c1d10b7067ea5e52834742', base: "mrd-email-field", error: this.error }))));
|
|
1409
1679
|
}
|
|
1410
1680
|
};
|
|
1411
1681
|
MrdEmailField.style = mrdEmailFieldCss();
|
|
@@ -4038,7 +4308,7 @@ const MrdField = class {
|
|
|
4038
4308
|
return (h("div", { class: "mrd-field__history-editor" }, this.historyEntries.length > 0 && (h("span", { class: "mrd-field__history-editor-label" }, t('history_badge_tooltip', locale))), this.historyEntries.map((entry, i) => (h("div", { key: String(i), class: "mrd-field__history-editor-row" }, h("input", { class: "mrd-field__history-editor-value", type: valueType, value: entry.value, onInput: (e) => updateEntry(i, 'value', e.target.value) }), h("span", { class: "mrd-field__history-editor-sep" }, t('history_until', locale)), h("input", { class: "mrd-field__history-editor-until", type: "date", value: entry.until, onInput: (e) => updateEntry(i, 'until', e.target.value) }), h("button", { type: "button", class: "mrd-field__history-editor-remove", onClick: () => removeEntry(i), "aria-label": t('remove', locale) }, h("svg", { viewBox: "0 0 20 20", fill: "currentColor", "aria-hidden": "true" }, h("path", { "fill-rule": "evenodd", d: "M8.75 1A2.75 2.75 0 006 3.75v.443c-.795.077-1.584.176-2.365.298a.75.75 0 10.23 1.482l.149-.022.841 10.518A2.75 2.75 0 007.596 19h4.807a2.75 2.75 0 002.742-2.53l.841-10.52.149.023a.75.75 0 00.23-1.482A41.03 41.03 0 0014 4.193V3.75A2.75 2.75 0 0011.25 1h-2.5zM10 4c.84 0 1.673.025 2.5.075V3.75c0-.69-.56-1.25-1.25-1.25h-2.5c-.69 0-1.25.56-1.25 1.25v.325C8.327 4.025 9.16 4 10 4zM8.58 7.72a.75.75 0 00-1.5.06l.3 7.5a.75.75 0 101.5-.06l-.3-7.5zm4.34.06a.75.75 0 10-1.5-.06l-.3 7.5a.75.75 0 101.5.06l.3-7.5z", "clip-rule": "evenodd" })))))), h("button", { type: "button", class: "mrd-field__history-editor-add", onClick: addEntry }, "+ ", t('add', locale))));
|
|
4039
4309
|
}
|
|
4040
4310
|
renderLeafField(displayValue) {
|
|
4041
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6;
|
|
4311
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3, _4, _5, _6, _7, _8;
|
|
4042
4312
|
const { item, locale } = this;
|
|
4043
4313
|
const commonProps = {
|
|
4044
4314
|
name: item.name,
|
|
@@ -4063,25 +4333,25 @@ const MrdField = class {
|
|
|
4063
4333
|
case ClientLayoutItemFieldDataType.BOOLEAN:
|
|
4064
4334
|
return (h("mrd-boolean-field", Object.assign({}, commonProps, { value: (_l = displayValue) !== null && _l !== void 0 ? _l : false })));
|
|
4065
4335
|
case ClientLayoutItemFieldDataType.DATE:
|
|
4066
|
-
return (h("mrd-date-field", Object.assign({}, commonProps, { value: (_m = displayValue) !== null && _m !== void 0 ? _m : '' })));
|
|
4336
|
+
return (h("mrd-date-field", Object.assign({}, commonProps, { value: (_m = displayValue) !== null && _m !== void 0 ? _m : '', placeholder: (_o = item.placeholder) !== null && _o !== void 0 ? _o : '' })));
|
|
4067
4337
|
case ClientLayoutItemFieldDataType.DATETIME:
|
|
4068
|
-
return (h("mrd-datetime-field", Object.assign({}, commonProps, { value: (
|
|
4338
|
+
return (h("mrd-datetime-field", Object.assign({}, commonProps, { value: (_p = displayValue) !== null && _p !== void 0 ? _p : '', placeholder: (_q = item.placeholder) !== null && _q !== void 0 ? _q : '' })));
|
|
4069
4339
|
case ClientLayoutItemFieldDataType.TIME:
|
|
4070
|
-
return (h("mrd-time-field", Object.assign({}, commonProps, { value: (
|
|
4340
|
+
return (h("mrd-time-field", Object.assign({}, commonProps, { value: (_r = displayValue) !== null && _r !== void 0 ? _r : '' })));
|
|
4071
4341
|
case ClientLayoutItemFieldDataType.EMAIL:
|
|
4072
|
-
return (h("mrd-email-field", Object.assign({}, commonProps, { value: (
|
|
4342
|
+
return (h("mrd-email-field", Object.assign({}, commonProps, { value: (_s = displayValue) !== null && _s !== void 0 ? _s : '', placeholder: (_t = item.placeholder) !== null && _t !== void 0 ? _t : '' })));
|
|
4073
4343
|
case ClientLayoutItemFieldDataType.HYPERLINK:
|
|
4074
|
-
return (h("mrd-hyperlink-field", Object.assign({}, commonProps, { value: (
|
|
4344
|
+
return (h("mrd-hyperlink-field", Object.assign({}, commonProps, { value: (_u = displayValue) !== null && _u !== void 0 ? _u : '', placeholder: (_v = item.placeholder) !== null && _v !== void 0 ? _v : '' })));
|
|
4075
4345
|
case ClientLayoutItemFieldDataType.LIST:
|
|
4076
|
-
return (h("mrd-list-field", Object.assign({}, commonProps, { value: (
|
|
4346
|
+
return (h("mrd-list-field", Object.assign({}, commonProps, { value: (_w = displayValue) !== null && _w !== void 0 ? _w : '', multiple: (_x = item.multiple) !== null && _x !== void 0 ? _x : false, listItems: (_y = item.listItems) !== null && _y !== void 0 ? _y : [] })));
|
|
4077
4347
|
case ClientLayoutItemFieldDataType.FILE:
|
|
4078
|
-
return (h("mrd-file-field", Object.assign({}, commonProps, { value: displayValue, accept: (
|
|
4348
|
+
return (h("mrd-file-field", Object.assign({}, commonProps, { value: displayValue, accept: (_z = item.accept) !== null && _z !== void 0 ? _z : '', maxSize: (_0 = item.maxSize) !== null && _0 !== void 0 ? _0 : 0, multiple: (_1 = item.multiple) !== null && _1 !== void 0 ? _1 : false, onMrdUpload: this.handleUpload })));
|
|
4079
4349
|
case ClientLayoutItemFieldDataType.IMAGE:
|
|
4080
|
-
return (h("mrd-image-field", Object.assign({}, commonProps, { value: displayValue, accept: (
|
|
4350
|
+
return (h("mrd-image-field", Object.assign({}, commonProps, { value: displayValue, accept: (_2 = item.accept) !== null && _2 !== void 0 ? _2 : 'image/*', maxSize: (_3 = item.maxSize) !== null && _3 !== void 0 ? _3 : 0, multiple: (_4 = item.multiple) !== null && _4 !== void 0 ? _4 : false, onMrdUpload: this.handleUpload })));
|
|
4081
4351
|
case ClientLayoutItemFieldDataType.LONGTEXT:
|
|
4082
|
-
return (h("mrd-longtext-field", Object.assign({}, commonProps, { value: (
|
|
4352
|
+
return (h("mrd-longtext-field", Object.assign({}, commonProps, { value: (_5 = displayValue) !== null && _5 !== void 0 ? _5 : '', placeholder: (_6 = item.placeholder) !== null && _6 !== void 0 ? _6 : '' })));
|
|
4083
4353
|
case ClientLayoutItemFieldDataType.SECRET:
|
|
4084
|
-
return (h("mrd-secret-field", Object.assign({}, commonProps, { value: (
|
|
4354
|
+
return (h("mrd-secret-field", Object.assign({}, commonProps, { value: (_7 = displayValue) !== null && _7 !== void 0 ? _7 : '', placeholder: (_8 = item.placeholder) !== null && _8 !== void 0 ? _8 : '' })));
|
|
4085
4355
|
default:
|
|
4086
4356
|
return null;
|
|
4087
4357
|
}
|
|
@@ -4277,7 +4547,7 @@ const MrdFileField = class {
|
|
|
4277
4547
|
error: hasError,
|
|
4278
4548
|
disabled: this.disabled || this.zoneBusy,
|
|
4279
4549
|
});
|
|
4280
|
-
return (h(Host, { key: '
|
|
4550
|
+
return (h(Host, { key: '36f9660fd297e7b2e7b2ac1816f4dcbc70d5cfcb' }, h("div", { key: 'a33534d3fedae04bad0eefc9d2d297ea148c5784', class: "mrd-file-field" }, h(FieldLabel, { key: '833f8ff178ec259c8066ddf542bdd1930bac486f', base: "mrd-file-field", label: this.label, required: this.required }), h("div", { key: 'd3bd00b25329b8cc716c5fcc526919d8f2c14bce', class: zoneClass, onClick: this.handleZoneClick, onDragOver: this.drag.onDragOver, onDragLeave: this.drag.onDragLeave, onDrop: this.drag.onDrop }, h("input", { key: '4b98ee338e8a5e4e6f94e5b5614ca88c90f802ee', ref: el => (this.fileInputRef = el), class: "mrd-file-field__input", type: "file", name: this.name, accept: this.accept, multiple: this.multiple, disabled: this.disabled || this.zoneBusy, required: this.required && !hasEntries, onChange: this.handleInputChange }), hasEntries && !this.multiple ? (h("div", { class: "mrd-file-field__selected" }, this.renderEntry(this.entries[0], 0))) : (h("div", { class: "mrd-file-field__prompt" }, h("svg", { class: "mrd-file-field__upload-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("polyline", { points: "16 16 12 12 8 16" }), h("line", { x1: "12", y1: "12", x2: "12", y2: "21" }), h("path", { d: "M20.39 18.39A5 5 0 0 0 18 9h-1.26A8 8 0 1 0 3 16.3" })), h("span", null, t('drop_file_here', this.locale), ' ', h("span", { class: "mrd-file-field__browse" }, t('browse', this.locale)))))), this.multiple && hasEntries && (h("ul", { key: '6e6e1d62738d0a824eb86e0dbb01b63a0227580d', class: "mrd-file-field__list" }, this.entries.map((entry, index) => (h("li", { class: "mrd-file-field__item", key: `${index}-${entryLabel(entry)}` }, this.renderEntry(entry, index)))))), h(FieldError, { key: 'df6427015d3f813a72e8998f9fa6152f6caef90e', base: "mrd-file-field", error: this.error }))));
|
|
4281
4551
|
}
|
|
4282
4552
|
static get watchers() { return {
|
|
4283
4553
|
"value": [{
|
|
@@ -4546,15 +4816,19 @@ const MrdForm = class {
|
|
|
4546
4816
|
}
|
|
4547
4817
|
}
|
|
4548
4818
|
}
|
|
4549
|
-
/** Extract a plain href string from a form value
|
|
4550
|
-
*
|
|
4819
|
+
/** Extract a plain href string from a form value: a string, a
|
|
4820
|
+
* RelationSearchResult-like object (`id`), or the raw API link shape
|
|
4821
|
+
* (`{ href, name }`) hosts spread into `values` for edit mode. */
|
|
4551
4822
|
getHref(value) {
|
|
4823
|
+
var _a, _b;
|
|
4552
4824
|
if (!value)
|
|
4553
4825
|
return '';
|
|
4554
4826
|
if (typeof value === 'string')
|
|
4555
4827
|
return value;
|
|
4556
|
-
if (typeof value === 'object'
|
|
4557
|
-
|
|
4828
|
+
if (typeof value === 'object') {
|
|
4829
|
+
const v = value;
|
|
4830
|
+
return (_b = (_a = v.id) !== null && _a !== void 0 ? _a : v.href) !== null && _b !== void 0 ? _b : '';
|
|
4831
|
+
}
|
|
4558
4832
|
return '';
|
|
4559
4833
|
}
|
|
4560
4834
|
collectFields(items) {
|
|
@@ -4901,7 +5175,7 @@ const MrdImageField = class {
|
|
|
4901
5175
|
error: hasError,
|
|
4902
5176
|
disabled: this.disabled || this.zoneBusy,
|
|
4903
5177
|
});
|
|
4904
|
-
return (h(Host, { key: '
|
|
5178
|
+
return (h(Host, { key: '5009b2db845c8f85f395c7230e2d5c464c56ea14' }, h("div", { key: 'fcae7821876ee3d71aac576cdea44c3c4f169890', class: "mrd-image-field" }, h(FieldLabel, { key: '834638e3f7b2073508d98b6dd5ecb437b0bb52ad', base: "mrd-image-field", label: this.label, required: this.required }), h("div", { key: '50e9bdaa1ebb3ec87f36e0d37dc6c2f8dc79848d', class: zoneClass, onClick: this.handleZoneClick, onDragOver: this.drag.onDragOver, onDragLeave: this.drag.onDragLeave, onDrop: this.drag.onDrop }, h("input", { key: '38e115fae5b3e2c3371857d284fbd54ea23812df', ref: el => (this.fileInputRef = el), class: "mrd-image-field__input", type: "file", name: this.name, accept: this.accept, multiple: this.multiple, disabled: this.disabled || this.zoneBusy, required: this.required && !hasEntries, onChange: this.handleInputChange }), hasEntries && !this.multiple ? (this.renderSingle(this.entries[0])) : (h("div", { class: "mrd-image-field__prompt" }, h("svg", { class: "mrd-image-field__upload-icon", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", "stroke-width": "2" }, h("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2", ry: "2" }), h("circle", { cx: "8.5", cy: "8.5", r: "1.5" }), h("polyline", { points: "21 15 16 10 5 21" })), h("span", null, t('drop_file_here', this.locale), ' ', h("span", { class: "mrd-image-field__browse" }, t('browse', this.locale)))))), this.multiple && hasEntries && (h("ul", { key: '67bad2f2142f78d7f25b8f35819b6adba48ea597', class: "mrd-image-field__grid" }, this.entries.map((entry, index) => this.renderGridItem(entry, index)))), h(FieldError, { key: 'ef07863946f0b4c94aa30b97d0ecb9616303e793', base: "mrd-image-field", error: this.error }))));
|
|
4905
5179
|
}
|
|
4906
5180
|
static get watchers() { return {
|
|
4907
5181
|
"value": [{
|
|
@@ -5006,7 +5280,7 @@ const MrdInvoiceView = class {
|
|
|
5006
5280
|
const invoiceDateRaw = this.slotValue('invoiceDate');
|
|
5007
5281
|
const dueDateRaw = this.slotValue('dueDate');
|
|
5008
5282
|
const hasLines = !!((_b = (_a = this.archetype) === null || _a === void 0 ? void 0 : _a.slots) === null || _b === void 0 ? void 0 : _b['lines']);
|
|
5009
|
-
return (h(Host, { key: '
|
|
5283
|
+
return (h(Host, { key: '8005640e6d13004ae2fdf5f48129214fbc8c55fc' }, h("div", { key: '992f925691e2455c8888df76f93176cec5866210', class: "mrd-invoice-view" }, h("div", { key: 'aa418658cfe830be4e0f8bf77af42a898c9170db', class: "mrd-invoice-view__header" }, h("div", { key: 'ce10fef2072c26a0eb8f7ead620cb460af6646f0', class: "mrd-invoice-view__title-row" }, invoiceNumber && h("h1", { key: '992486cd5dc0bfb9761bdc94bcd237e6bd6e3d24', class: "mrd-invoice-view__title" }, t('invoice_title', this.locale), " ", invoiceNumber), this.renderStatus()), h("div", { key: 'a8c5d2516b737d4dcd5d0f966aadcda4d47a63ad', class: "mrd-invoice-view__dates" }, invoiceDateRaw != null && invoiceDateRaw !== '' && (h("span", { key: 'dd728929fc408c280ad81e212bdfac5905cda02d' }, t('invoice_date', this.locale), ": ", formatDate(invoiceDateRaw, this.locale))), dueDateRaw != null && dueDateRaw !== '' && (h("span", { key: 'd4226d5cc37f0152950f44a3b63a88f0454919bd' }, t('invoice_due_date', this.locale), ": ", formatDate(dueDateRaw, this.locale)))), this.renderContainer()), h("div", { key: 'c40b00c852d005963be7b5006e13804e72ba032a', class: "mrd-invoice-view__parties" }, this.renderPartyLink('customer', t('invoice_customer', this.locale)), this.renderPartyLink('supplier', t('invoice_supplier', this.locale))), hasLines && (h("div", { key: '000e991c64daa582194631b2eac6b1acba418e97', class: "mrd-invoice-view__lines" }, h("slot", { key: '97ba2acb750137eeb5ed6b5e9e5d277f638d4f0a', name: "lines" }))), this.renderAmounts(), this.renderAttachments())));
|
|
5010
5284
|
}
|
|
5011
5285
|
static get watchers() { return {
|
|
5012
5286
|
"data": [{
|
|
@@ -5023,6 +5297,12 @@ function viewKeyFor(item) {
|
|
|
5023
5297
|
return (_b = (_a = item.relatedClass) !== null && _a !== void 0 ? _a : item.name) !== null && _b !== void 0 ? _b : '';
|
|
5024
5298
|
return (_d = (_c = item.dataClass) !== null && _c !== void 0 ? _c : item.name) !== null && _d !== void 0 ? _d : '';
|
|
5025
5299
|
}
|
|
5300
|
+
/** Whether a FIELD/RELATION item stays visible on an OBJECT_DASHBOARD when it
|
|
5301
|
+
* has no value. Reads the flat API flag, falling back to the nested wrappers. */
|
|
5302
|
+
function showsEmpty(item) {
|
|
5303
|
+
var _a, _b, _c, _d, _e;
|
|
5304
|
+
return (_e = (_c = (_a = item.showEmpty) !== null && _a !== void 0 ? _a : (_b = item.field) === null || _b === void 0 ? void 0 : _b.showEmpty) !== null && _c !== void 0 ? _c : (_d = item.relation) === null || _d === void 0 ? void 0 : _d.showEmpty) !== null && _e !== void 0 ? _e : false;
|
|
5305
|
+
}
|
|
5026
5306
|
/** Depth-first flatten of the SECTION/GROUP tree. */
|
|
5027
5307
|
function flattenItems(items) {
|
|
5028
5308
|
const result = [];
|
|
@@ -5148,15 +5428,16 @@ function renderField(ctx, item) {
|
|
|
5148
5428
|
if (item.header) {
|
|
5149
5429
|
return (h("h1", { class: "mrd-layout-section__field-header", key: item.name }, typeof renderedValue === 'string' ? renderedValue : rawValue != null ? String(rawValue) : item.label));
|
|
5150
5430
|
}
|
|
5151
|
-
|
|
5431
|
+
const isEmpty = renderedValue == null;
|
|
5432
|
+
if (isEmpty && !showsEmpty(item))
|
|
5152
5433
|
return null;
|
|
5153
5434
|
const isBlock = item.dataType === ClientLayoutItemFieldDataType.TEXTBLOCK
|
|
5154
5435
|
|| item.dataType === ClientLayoutItemFieldDataType.LONGTEXT
|
|
5155
5436
|
|| item.dataType === ClientLayoutItemFieldDataType.JSON;
|
|
5156
|
-
return (h("div", { class: `mrd-layout-section__field${isBlock ? ' mrd-layout-section__field--block' : ''}`, key: item.name }, h("span", { class: "mrd-layout-section__field-label" }, item.label), h("span", { class: "mrd-layout-section__field-value" }, renderedValue, renderHistoryBadge(ctx, item, raw))));
|
|
5437
|
+
return (h("div", { class: `mrd-layout-section__field${isBlock ? ' mrd-layout-section__field--block' : ''}${isEmpty ? ' mrd-layout-section__field--empty' : ''}`, key: item.name }, h("span", { class: "mrd-layout-section__field-label" }, item.label), h("span", { class: "mrd-layout-section__field-value" }, isEmpty ? t('value_empty', ctx.locale) : renderedValue, renderHistoryBadge(ctx, item, raw))));
|
|
5157
5438
|
}
|
|
5158
5439
|
|
|
5159
|
-
const mrdLayoutSectionCss = () => `.sc-mrd-layout-section-h{display:block;width:100%}.mrd-layout-section.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-color-neutral-800)}.mrd-layout-section__field.sc-mrd-layout-section{display:grid;grid-template-columns:200px 1fr;align-items:baseline;gap:0 var(--mrd-space-2);padding:var(--mrd-space-1) 0}.mrd-layout-section__field--block.sc-mrd-layout-section{grid-template-columns:1fr}.mrd-layout-section__field-label.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-normal);color:var(--mrd-color-neutral-500);padding-top:1px}.mrd-layout-section__field-value.sc-mrd-layout-section{font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-800);word-break:break-word;display:inline-flex;align-items:center;gap:var(--mrd-space-1)}.mrd-layout-section__history-wrap.sc-mrd-layout-section{position:relative;display:inline-flex;align-items:center}.mrd-layout-section__history-btn.sc-mrd-layout-section{display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:var(--mrd-border-radius-sm);color:var(--mrd-color-neutral-400);cursor:pointer;flex-shrink:0;transition:color var(--mrd-transition-fast), background-color var(--mrd-transition-fast)}.mrd-layout-section__history-btn.sc-mrd-layout-section:hover{color:var(--mrd-color-neutral-700);background-color:var(--mrd-color-neutral-100)}.mrd-layout-section__history-btn.sc-mrd-layout-section:focus{outline:none;box-shadow:var(--mrd-shadow-focus)}.mrd-layout-section__history-icon.sc-mrd-layout-section{width:0.875rem;height:0.875rem}.mrd-layout-section__history-popover.sc-mrd-layout-section{position:absolute;top:calc(100% + 0.25rem);left:0;min-width:24rem;max-width:24rem;background-color:var(--mrd-color-white);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius-md);box-shadow:var(--mrd-shadow-md);padding:var(--mrd-space-1) 0;z-index:var(--mrd-z-dropdown)}.mrd-layout-section__history-entry.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-normal);color:var(--mrd-color-neutral-700);padding:var(--mrd-space-2) var(--mrd-space-3);line-height:var(--mrd-line-height-normal)}.mrd-layout-section__history-entry.sc-mrd-layout-section:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-color-neutral-100)}.mrd-layout-section__field-header.sc-mrd-layout-section{font-size:var(--mrd-font-size-2xl);font-weight:var(--mrd-font-weight-bold);color:var(--mrd-color-neutral-900);margin:0 0 var(--mrd-space-4) 0;padding:0}.mrd-layout-section__header.sc-mrd-layout-section{font-size:var(--mrd-font-size-xl);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-800);margin:var(--mrd-space-4) 0 var(--mrd-space-2) 0;padding:0}.mrd-layout-section__text.sc-mrd-layout-section{font-size:var(--mrd-font-size-base);color:var(--mrd-color-neutral-700);line-height:var(--mrd-line-height-relaxed);margin:var(--mrd-space-2) 0}.mrd-layout-section__navigate.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-2);padding:var(--mrd-space-2) var(--mrd-space-3);background:none;border:1px solid var(--mrd-color-neutral-300);border-radius:var(--mrd-border-radius);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-primary);cursor:pointer;margin:var(--mrd-space-2) 0}.mrd-layout-section__navigate.sc-mrd-layout-section:hover{background-color:var(--mrd-color-primary-light);border-color:var(--mrd-color-primary)}.mrd-layout-section__link.sc-mrd-layout-section{color:var(--mrd-color-primary);text-decoration:none}.mrd-layout-section__link.sc-mrd-layout-section:hover{text-decoration:underline}.mrd-layout-section__relation-link.sc-mrd-layout-section{background:none;border:none;padding:0;font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-primary);cursor:pointer;text-align:left}.mrd-layout-section__relation-link.sc-mrd-layout-section:hover{text-decoration:underline}.mrd-layout-section__download-link.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-1);background:none;border:none;padding:0;font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-primary);cursor:pointer;text-align:left}.mrd-layout-section__download-link.sc-mrd-layout-section:hover{text-decoration:underline;color:var(--mrd-color-primary-dark)}.mrd-layout-section__file-icon.sc-mrd-layout-section{flex-shrink:0;width:1rem;height:1rem}.mrd-layout-section__file-list.sc-mrd-layout-section{display:flex;flex-direction:column;align-items:flex-start;gap:var(--mrd-space-1)}.mrd-layout-section__file-list-item.sc-mrd-layout-section{min-width:0;max-width:100%}.mrd-layout-section__boolean--true.sc-mrd-layout-section{color:var(--mrd-color-success);font-weight:var(--mrd-font-weight-semibold)}.mrd-layout-section__boolean--false.sc-mrd-layout-section{color:var(--mrd-color-neutral-400)}.mrd-layout-section__badge.sc-mrd-layout-section{display:inline-block;font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-medium);padding:2px var(--mrd-space-3);border-radius:10px}.mrd-layout-section__badge-dot-row.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-2)}.mrd-layout-section__badge-dot.sc-mrd-layout-section{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0}.mrd-layout-section__secret-masked.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-label-color);letter-spacing:0.15em;user-select:none;pointer-events:none}.mrd-layout-section__pre.sc-mrd-layout-section{font-family:var(--mrd-font-family-mono);font-size:var(--mrd-font-size-xs);background-color:var(--mrd-color-neutral-50);border:1px solid var(--mrd-color-neutral-200);border-radius:var(--mrd-border-radius);padding:var(--mrd-space-3);margin:0;max-height:calc(15 * var(--mrd-font-size-xs));overflow-x:auto;overflow-y:auto;white-space:pre-wrap;word-break:break-word}.mrd-layout-section__group.sc-mrd-layout-section{margin:var(--mrd-space-4) 0}.mrd-layout-section__group-title.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-500);margin:0 0 var(--mrd-space-2) 0;padding-bottom:0;letter-spacing:0.01em}.mrd-layout-section__related-view.sc-mrd-layout-section{margin:var(--mrd-space-4) 0}.mrd-layout-section__related-view-title.sc-mrd-layout-section{font-size:var(--mrd-font-size-lg);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-800);margin:0 0 var(--mrd-space-3) 0}.mrd-layout-section__search.sc-mrd-layout-section{position:relative;margin:var(--mrd-space-2) 0}.mrd-layout-section__search-wrap.sc-mrd-layout-section{position:relative}.mrd-layout-section__search-icon.sc-mrd-layout-section{position:absolute;left:var(--mrd-input-padding-x);top:50%;transform:translateY(-50%);width:1rem;height:1rem;color:var(--mrd-color-neutral-400);pointer-events:none}.mrd-layout-section__search-input.sc-mrd-layout-section{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x) var(--mrd-input-padding-y) calc(var(--mrd-input-padding-x) + 1rem + var(--mrd-space-2));font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);outline:none;appearance:none;box-sizing:border-box}.mrd-layout-section__search-input.sc-mrd-layout-section:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-layout-section__search-input.sc-mrd-layout-section::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-layout-section__search-results.sc-mrd-layout-section{position:absolute;top:100%;left:0;right:0;background-color:var(--mrd-color-white);border:1px solid var(--mrd-color-neutral-300);border-top:none;border-radius:0 0 var(--mrd-border-radius) var(--mrd-border-radius);box-shadow:var(--mrd-shadow-sm);z-index:100;max-height:300px;overflow-y:auto;list-style:none;margin:0;padding:var(--mrd-space-1) 0}.mrd-layout-section__search-result.sc-mrd-layout-section{margin:0;padding:0}.mrd-layout-section__search-result-btn.sc-mrd-layout-section{display:flex;flex-direction:column;width:100%;padding:var(--mrd-space-2) var(--mrd-space-3);background:none;border:none;text-align:left;cursor:pointer;font-family:var(--mrd-font-family)}.mrd-layout-section__search-result-btn.sc-mrd-layout-section:hover{background-color:var(--mrd-color-primary-light)}.mrd-layout-section__search-result-label.sc-mrd-layout-section{font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-800)}.mrd-layout-section__search-result-desc.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);color:var(--mrd-color-neutral-500);margin-top:var(--mrd-space-1)}.mrd-layout-section__image-thumb-btn.sc-mrd-layout-section{background:none;border:none;padding:0;cursor:pointer;display:inline-block;border-radius:var(--mrd-border-radius);overflow:hidden;line-height:0}.mrd-layout-section__image-thumb-btn.sc-mrd-layout-section:hover .mrd-layout-section__image-thumb.sc-mrd-layout-section{opacity:0.85}.mrd-layout-section__image-thumb.sc-mrd-layout-section{display:block;max-width:160px;max-height:100px;border-radius:var(--mrd-border-radius);object-fit:cover;transition:opacity 0.15s}.mrd-layout-section__modal-backdrop.sc-mrd-layout-section{position:fixed;inset:0;background:rgba(0, 0, 0, 0.6);z-index:300;display:flex;align-items:center;justify-content:center}.mrd-layout-section__modal.sc-mrd-layout-section{position:relative;background:var(--mrd-color-white);border-radius:var(--mrd-border-radius);padding:var(--mrd-space-3);max-width:min(90vw, 900px);max-height:90vh;display:flex;align-items:center;justify-content:center;box-shadow:var(--mrd-shadow-lg)}.mrd-layout-section__modal-close.sc-mrd-layout-section{position:absolute;top:var(--mrd-space-2);right:var(--mrd-space-2);background:rgba(0, 0, 0, 0.5);border:none;border-radius:50%;width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:var(--mrd-color-white);cursor:pointer;font-size:var(--mrd-font-size-sm);line-height:1;z-index:1}.mrd-layout-section__modal-close.sc-mrd-layout-section:hover{background:rgba(0, 0, 0, 0.8)}.mrd-layout-section__modal-image.sc-mrd-layout-section{display:block;max-width:100%;max-height:calc(90vh - 2rem);border-radius:var(--mrd-border-radius);object-fit:contain}`;
|
|
5440
|
+
const mrdLayoutSectionCss = () => `.sc-mrd-layout-section-h{display:block;width:100%}.mrd-layout-section.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-color-neutral-800)}.mrd-layout-section__field.sc-mrd-layout-section{display:grid;grid-template-columns:200px 1fr;align-items:baseline;gap:0 var(--mrd-space-2);padding:var(--mrd-space-1) 0}.mrd-layout-section__field--block.sc-mrd-layout-section{grid-template-columns:1fr}.mrd-layout-section__field-label.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-normal);color:var(--mrd-color-neutral-500);padding-top:1px}.mrd-layout-section__field-value.sc-mrd-layout-section{font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-800);word-break:break-word;display:inline-flex;align-items:center;gap:var(--mrd-space-1)}.mrd-layout-section__field--empty.sc-mrd-layout-section .mrd-layout-section__field-value.sc-mrd-layout-section{color:var(--mrd-color-neutral-400);font-weight:var(--mrd-font-weight-normal)}.mrd-layout-section__history-wrap.sc-mrd-layout-section{position:relative;display:inline-flex;align-items:center}.mrd-layout-section__history-btn.sc-mrd-layout-section{display:inline-flex;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;padding:0;background:transparent;border:none;border-radius:var(--mrd-border-radius-sm);color:var(--mrd-color-neutral-400);cursor:pointer;flex-shrink:0;transition:color var(--mrd-transition-fast), background-color var(--mrd-transition-fast)}.mrd-layout-section__history-btn.sc-mrd-layout-section:hover{color:var(--mrd-color-neutral-700);background-color:var(--mrd-color-neutral-100)}.mrd-layout-section__history-btn.sc-mrd-layout-section:focus{outline:none;box-shadow:var(--mrd-shadow-focus)}.mrd-layout-section__history-icon.sc-mrd-layout-section{width:0.875rem;height:0.875rem}.mrd-layout-section__history-popover.sc-mrd-layout-section{position:absolute;top:calc(100% + 0.25rem);left:0;min-width:24rem;max-width:24rem;background-color:var(--mrd-color-white);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius-md);box-shadow:var(--mrd-shadow-md);padding:var(--mrd-space-1) 0;z-index:var(--mrd-z-dropdown)}.mrd-layout-section__history-entry.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-normal);color:var(--mrd-color-neutral-700);padding:var(--mrd-space-2) var(--mrd-space-3);line-height:var(--mrd-line-height-normal)}.mrd-layout-section__history-entry.sc-mrd-layout-section:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-color-neutral-100)}.mrd-layout-section__field-header.sc-mrd-layout-section{font-size:var(--mrd-font-size-2xl);font-weight:var(--mrd-font-weight-bold);color:var(--mrd-color-neutral-900);margin:0 0 var(--mrd-space-4) 0;padding:0}.mrd-layout-section__header.sc-mrd-layout-section{font-size:var(--mrd-font-size-xl);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-800);margin:var(--mrd-space-4) 0 var(--mrd-space-2) 0;padding:0}.mrd-layout-section__text.sc-mrd-layout-section{font-size:var(--mrd-font-size-base);color:var(--mrd-color-neutral-700);line-height:var(--mrd-line-height-relaxed);margin:var(--mrd-space-2) 0}.mrd-layout-section__navigate.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-2);padding:var(--mrd-space-2) var(--mrd-space-3);background:none;border:1px solid var(--mrd-color-neutral-300);border-radius:var(--mrd-border-radius);font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-primary);cursor:pointer;margin:var(--mrd-space-2) 0}.mrd-layout-section__navigate.sc-mrd-layout-section:hover{background-color:var(--mrd-color-primary-light);border-color:var(--mrd-color-primary)}.mrd-layout-section__link.sc-mrd-layout-section{color:var(--mrd-color-primary);text-decoration:none}.mrd-layout-section__link.sc-mrd-layout-section:hover{text-decoration:underline}.mrd-layout-section__relation-link.sc-mrd-layout-section{background:none;border:none;padding:0;font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-primary);cursor:pointer;text-align:left}.mrd-layout-section__relation-link.sc-mrd-layout-section:hover{text-decoration:underline}.mrd-layout-section__download-link.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-1);background:none;border:none;padding:0;font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-primary);cursor:pointer;text-align:left}.mrd-layout-section__download-link.sc-mrd-layout-section:hover{text-decoration:underline;color:var(--mrd-color-primary-dark)}.mrd-layout-section__file-icon.sc-mrd-layout-section{flex-shrink:0;width:1rem;height:1rem}.mrd-layout-section__file-list.sc-mrd-layout-section{display:flex;flex-direction:column;align-items:flex-start;gap:var(--mrd-space-1)}.mrd-layout-section__file-list-item.sc-mrd-layout-section{min-width:0;max-width:100%}.mrd-layout-section__boolean--true.sc-mrd-layout-section{color:var(--mrd-color-success);font-weight:var(--mrd-font-weight-semibold)}.mrd-layout-section__boolean--false.sc-mrd-layout-section{color:var(--mrd-color-neutral-400)}.mrd-layout-section__badge.sc-mrd-layout-section{display:inline-block;font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-medium);padding:2px var(--mrd-space-3);border-radius:10px}.mrd-layout-section__badge-dot-row.sc-mrd-layout-section{display:inline-flex;align-items:center;gap:var(--mrd-space-2)}.mrd-layout-section__badge-dot.sc-mrd-layout-section{display:inline-block;width:10px;height:10px;border-radius:50%;flex-shrink:0}.mrd-layout-section__secret-masked.sc-mrd-layout-section{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-label-color);letter-spacing:0.15em;user-select:none;pointer-events:none}.mrd-layout-section__pre.sc-mrd-layout-section{font-family:var(--mrd-font-family-mono);font-size:var(--mrd-font-size-xs);background-color:var(--mrd-color-neutral-50);border:1px solid var(--mrd-color-neutral-200);border-radius:var(--mrd-border-radius);padding:var(--mrd-space-3);margin:0;max-height:calc(15 * var(--mrd-font-size-xs));overflow-x:auto;overflow-y:auto;white-space:pre-wrap;word-break:break-word}.mrd-layout-section__group.sc-mrd-layout-section{margin:var(--mrd-space-4) 0}.mrd-layout-section__group-title.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-500);margin:0 0 var(--mrd-space-2) 0;padding-bottom:0;letter-spacing:0.01em}.mrd-layout-section__related-view.sc-mrd-layout-section{margin:var(--mrd-space-4) 0}.mrd-layout-section__related-view-title.sc-mrd-layout-section{font-size:var(--mrd-font-size-lg);font-weight:var(--mrd-font-weight-semibold);color:var(--mrd-color-neutral-800);margin:0 0 var(--mrd-space-3) 0}.mrd-layout-section__search.sc-mrd-layout-section{position:relative;margin:var(--mrd-space-2) 0}.mrd-layout-section__search-wrap.sc-mrd-layout-section{position:relative}.mrd-layout-section__search-icon.sc-mrd-layout-section{position:absolute;left:var(--mrd-input-padding-x);top:50%;transform:translateY(-50%);width:1rem;height:1rem;color:var(--mrd-color-neutral-400);pointer-events:none}.mrd-layout-section__search-input.sc-mrd-layout-section{display:block;width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x) var(--mrd-input-padding-y) calc(var(--mrd-input-padding-x) + 1rem + var(--mrd-space-2));font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-base);color:var(--mrd-input-color);background-color:var(--mrd-input-bg);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);outline:none;appearance:none;box-sizing:border-box}.mrd-layout-section__search-input.sc-mrd-layout-section:focus{border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-layout-section__search-input.sc-mrd-layout-section::placeholder{color:var(--mrd-input-placeholder-color)}.mrd-layout-section__search-results.sc-mrd-layout-section{position:absolute;top:100%;left:0;right:0;background-color:var(--mrd-color-white);border:1px solid var(--mrd-color-neutral-300);border-top:none;border-radius:0 0 var(--mrd-border-radius) var(--mrd-border-radius);box-shadow:var(--mrd-shadow-sm);z-index:100;max-height:300px;overflow-y:auto;list-style:none;margin:0;padding:var(--mrd-space-1) 0}.mrd-layout-section__search-result.sc-mrd-layout-section{margin:0;padding:0}.mrd-layout-section__search-result-btn.sc-mrd-layout-section{display:flex;flex-direction:column;width:100%;padding:var(--mrd-space-2) var(--mrd-space-3);background:none;border:none;text-align:left;cursor:pointer;font-family:var(--mrd-font-family)}.mrd-layout-section__search-result-btn.sc-mrd-layout-section:hover{background-color:var(--mrd-color-primary-light)}.mrd-layout-section__search-result-label.sc-mrd-layout-section{font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-800)}.mrd-layout-section__search-result-desc.sc-mrd-layout-section{font-size:var(--mrd-font-size-xs);color:var(--mrd-color-neutral-500);margin-top:var(--mrd-space-1)}.mrd-layout-section__image-thumb-btn.sc-mrd-layout-section{background:none;border:none;padding:0;cursor:pointer;display:inline-block;border-radius:var(--mrd-border-radius);overflow:hidden;line-height:0}.mrd-layout-section__image-thumb-btn.sc-mrd-layout-section:hover .mrd-layout-section__image-thumb.sc-mrd-layout-section{opacity:0.85}.mrd-layout-section__image-thumb.sc-mrd-layout-section{display:block;max-width:160px;max-height:100px;border-radius:var(--mrd-border-radius);object-fit:cover;transition:opacity 0.15s}.mrd-layout-section__modal-backdrop.sc-mrd-layout-section{position:fixed;inset:0;background:rgba(0, 0, 0, 0.6);z-index:300;display:flex;align-items:center;justify-content:center}.mrd-layout-section__modal.sc-mrd-layout-section{position:relative;background:var(--mrd-color-white);border-radius:var(--mrd-border-radius);padding:var(--mrd-space-3);max-width:min(90vw, 900px);max-height:90vh;display:flex;align-items:center;justify-content:center;box-shadow:var(--mrd-shadow-lg)}.mrd-layout-section__modal-close.sc-mrd-layout-section{position:absolute;top:var(--mrd-space-2);right:var(--mrd-space-2);background:rgba(0, 0, 0, 0.5);border:none;border-radius:50%;width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:var(--mrd-color-white);cursor:pointer;font-size:var(--mrd-font-size-sm);line-height:1;z-index:1}.mrd-layout-section__modal-close.sc-mrd-layout-section:hover{background:rgba(0, 0, 0, 0.8)}.mrd-layout-section__modal-image.sc-mrd-layout-section{display:block;max-width:100%;max-height:calc(90vh - 2rem);border-radius:var(--mrd-border-radius);object-fit:contain}`;
|
|
5160
5441
|
|
|
5161
5442
|
const MrdLayoutSection = class {
|
|
5162
5443
|
constructor(hostRef) {
|
|
@@ -5342,19 +5623,18 @@ const MrdLayoutSection = class {
|
|
|
5342
5623
|
return null;
|
|
5343
5624
|
const links = ((_b = (_a = this.data) === null || _a === void 0 ? void 0 : _a._links) !== null && _b !== void 0 ? _b : {});
|
|
5344
5625
|
const link = links[item.name];
|
|
5345
|
-
if (!link)
|
|
5346
|
-
return null;
|
|
5347
5626
|
const makeBtn = (href, name) => (h("button", { key: href, class: "mrd-layout-section__relation-link", onClick: () => this.mrdNavigate.emit({ href, label: name }) }, name));
|
|
5348
5627
|
let valueContent;
|
|
5349
|
-
if ((_c = link.values) === null || _c === void 0 ? void 0 : _c.length) {
|
|
5628
|
+
if ((_c = link === null || link === void 0 ? void 0 : link.values) === null || _c === void 0 ? void 0 : _c.length) {
|
|
5350
5629
|
valueContent = link.values.map(v => makeBtn(v.href, v.name));
|
|
5351
5630
|
}
|
|
5352
|
-
else if (link.name) {
|
|
5631
|
+
else if (link === null || link === void 0 ? void 0 : link.name) {
|
|
5353
5632
|
valueContent = makeBtn(link.href, link.name);
|
|
5354
5633
|
}
|
|
5355
|
-
|
|
5634
|
+
const isEmpty = !valueContent;
|
|
5635
|
+
if (isEmpty && !showsEmpty(item))
|
|
5356
5636
|
return null;
|
|
5357
|
-
return (h("div", { class:
|
|
5637
|
+
return (h("div", { class: `mrd-layout-section__field${isEmpty ? ' mrd-layout-section__field--empty' : ''}`, key: item.name }, h("span", { class: "mrd-layout-section__field-label" }, item.label), h("span", { class: "mrd-layout-section__field-value" }, isEmpty ? t('value_empty', this.locale) : valueContent)));
|
|
5358
5638
|
}
|
|
5359
5639
|
renderSearch(item) {
|
|
5360
5640
|
var _a, _b, _c;
|
|
@@ -5528,7 +5808,7 @@ const MrdLayoutSection = class {
|
|
|
5528
5808
|
const docArchetype = resolveArchetype(this.archetypes, ARCHETYPE_DOCUMENT);
|
|
5529
5809
|
const invoiceArchetype = !docArchetype ? resolveArchetype(this.archetypes, ARCHETYPE_INVOICE) : undefined;
|
|
5530
5810
|
const emailArchetype = !docArchetype && !invoiceArchetype ? resolveArchetype(this.archetypes, ARCHETYPE_EMAIL) : undefined;
|
|
5531
|
-
return (h(Host, { key: '
|
|
5811
|
+
return (h(Host, { key: '8c4e0a0e71d777295010702584b4aa8f7817cafb' }, h("div", { key: 'fe021021eba48acad3d52ee4849ebe355e83c348', class: "mrd-layout-section" }, docArchetype && this.renderDocumentObject(docArchetype), invoiceArchetype && this.renderInvoiceObject(invoiceArchetype), emailArchetype && this.renderEmailObject(emailArchetype), !docArchetype && !invoiceArchetype && !emailArchetype && this.items.map(item => this.renderItem(item))), this.renderImageModal()));
|
|
5532
5812
|
}
|
|
5533
5813
|
get el() { return getElement(this); }
|
|
5534
5814
|
static get watchers() { return {
|
|
@@ -5647,7 +5927,7 @@ const MrdLongtextField = class {
|
|
|
5647
5927
|
};
|
|
5648
5928
|
}
|
|
5649
5929
|
render() {
|
|
5650
|
-
return (h(Host, { key: '
|
|
5930
|
+
return (h(Host, { key: 'a43ce67cb05e96853193e56c175d99e51d07cbab' }, h("div", { key: 'eb7d09bcae010736dd17b5f17bcb1cb32a6b1c4e', class: "mrd-longtext-field" }, h(FieldLabel, { key: 'd3a47993cc977c06b845eda4575b93d238eaf15a', base: "mrd-longtext-field", label: this.label, required: this.required }), this.disabled ? (h("pre", { class: "mrd-longtext-field__content" }, this.value)) : (h("textarea", { class: controlClass('mrd-longtext-field', !!this.error), name: this.name, placeholder: this.placeholder, required: this.required, rows: 10, onInput: this.handleInput, onBlur: this.handleBlur }, this.value)), h(FieldError, { key: '89f801af61fc0b874db44dbfca6eb33ffe285a84', base: "mrd-longtext-field", error: this.error }))));
|
|
5651
5931
|
}
|
|
5652
5932
|
};
|
|
5653
5933
|
MrdLongtextField.style = mrdLongtextFieldCss();
|
|
@@ -5670,10 +5950,13 @@ const MrdNumberField = class {
|
|
|
5670
5950
|
this.decimalPrecision = 2;
|
|
5671
5951
|
this.displayValue = '';
|
|
5672
5952
|
this.error = '';
|
|
5953
|
+
/** While focused the user owns the text; prop updates must not overwrite it. */
|
|
5954
|
+
this.focused = false;
|
|
5673
5955
|
this.handleInput = (e) => {
|
|
5674
5956
|
this.displayValue = e.target.value;
|
|
5675
5957
|
};
|
|
5676
5958
|
this.handleBlur = (e) => {
|
|
5959
|
+
this.focused = false;
|
|
5677
5960
|
const raw = e.target.value;
|
|
5678
5961
|
const parsed = parseLocalizedNumber(raw, this.locale);
|
|
5679
5962
|
if (this.required && (parsed === null || raw === '')) {
|
|
@@ -5692,17 +5975,30 @@ const MrdNumberField = class {
|
|
|
5692
5975
|
this.mrdBlur.emit({ name: this.name, value: parsed });
|
|
5693
5976
|
};
|
|
5694
5977
|
this.handleFocus = () => {
|
|
5695
|
-
|
|
5696
|
-
|
|
5697
|
-
|
|
5698
|
-
|
|
5978
|
+
this.focused = true;
|
|
5979
|
+
// Drop the grouping separators while editing, but keep the locale's decimal
|
|
5980
|
+
// separator: String(1234.56) would be re-read as 123456 where '.' groups.
|
|
5981
|
+
const parsed = parseLocalizedNumber(this.displayValue, this.locale);
|
|
5982
|
+
if (parsed !== null) {
|
|
5983
|
+
this.displayValue = formatNumber(parsed, this.locale, { useGrouping: false, maximumFractionDigits: 20 });
|
|
5699
5984
|
}
|
|
5700
5985
|
};
|
|
5701
5986
|
}
|
|
5702
5987
|
componentWillLoad() {
|
|
5703
|
-
|
|
5704
|
-
|
|
5705
|
-
|
|
5988
|
+
this.syncFromValue();
|
|
5989
|
+
}
|
|
5990
|
+
/** Edit mode loads the record after mount, so the incoming value must re-sync. */
|
|
5991
|
+
valueChanged() {
|
|
5992
|
+
if (!this.focused)
|
|
5993
|
+
this.syncFromValue();
|
|
5994
|
+
}
|
|
5995
|
+
localeChanged() {
|
|
5996
|
+
if (!this.focused)
|
|
5997
|
+
this.syncFromValue();
|
|
5998
|
+
}
|
|
5999
|
+
syncFromValue() {
|
|
6000
|
+
this.displayValue =
|
|
6001
|
+
this.value !== null && this.value !== undefined ? this.formatForDisplay(this.value) : '';
|
|
5706
6002
|
}
|
|
5707
6003
|
formatForDisplay(val) {
|
|
5708
6004
|
if (this.dataType === ClientLayoutItemFieldDataType.PERCENTAGE) {
|
|
@@ -5723,8 +6019,16 @@ const MrdNumberField = class {
|
|
|
5723
6019
|
const hasError = !!this.error;
|
|
5724
6020
|
const suffix = this.dataType === ClientLayoutItemFieldDataType.PERCENTAGE ? '%' :
|
|
5725
6021
|
this.dataType === ClientLayoutItemFieldDataType.DECIMAL ? '' : '';
|
|
5726
|
-
return (h(Host, { key: '
|
|
6022
|
+
return (h(Host, { key: 'bd5eb25cf7b97ef2ddb67a6bc6d6d96c9bff7510' }, h("div", { key: '68b15887a045f743a7f177e7a178146a9f4e0400', class: "mrd-number-field" }, h(FieldLabel, { key: '72e88a34a390e36ee11f5840d87dedd9d4d7fb12', base: "mrd-number-field", label: this.label, required: this.required }), h("div", { key: 'd97dae69eedf4c0ed1c872065754327dbffb5ba7', class: "mrd-number-field__input-wrapper" }, h("input", { key: '5767f6c34a08f503a1a157390c679382c857ff01', class: controlClass('mrd-number-field', hasError), type: "text", inputMode: "decimal", name: this.name, value: this.displayValue, placeholder: this.placeholder || (suffix ? `0${suffix}` : '0'), required: this.required, disabled: this.disabled, onInput: this.handleInput, onBlur: this.handleBlur, onFocus: this.handleFocus })), h(FieldError, { key: '1d4f8ffd3fcdf2ae2e8eb1eb68c051619d66c954', base: "mrd-number-field", error: this.error }))));
|
|
5727
6023
|
}
|
|
6024
|
+
static get watchers() { return {
|
|
6025
|
+
"value": [{
|
|
6026
|
+
"valueChanged": 0
|
|
6027
|
+
}],
|
|
6028
|
+
"locale": [{
|
|
6029
|
+
"localeChanged": 0
|
|
6030
|
+
}]
|
|
6031
|
+
}; }
|
|
5728
6032
|
};
|
|
5729
6033
|
MrdNumberField.style = mrdNumberFieldCss();
|
|
5730
6034
|
|
|
@@ -5854,16 +6158,22 @@ const MrdRelationField = class {
|
|
|
5854
6158
|
async setAllRecords(records) {
|
|
5855
6159
|
this.allRecords = records;
|
|
5856
6160
|
}
|
|
6161
|
+
/** Href of the current single value. Accepts both a RelationSearchResult
|
|
6162
|
+
* (`id`) and the raw API link shape (`{ href, name }`) a host puts in the
|
|
6163
|
+
* form values for edit mode — same tolerance as `toSearchResult()`. */
|
|
5857
6164
|
getValueHref() {
|
|
5858
|
-
var _a, _b, _c;
|
|
6165
|
+
var _a, _b, _c, _d;
|
|
5859
6166
|
const v = Array.isArray(this.value) ? ((_a = this.value[0]) !== null && _a !== void 0 ? _a : '') : ((_b = this.value) !== null && _b !== void 0 ? _b : '');
|
|
5860
6167
|
if (!v)
|
|
5861
6168
|
return '';
|
|
5862
6169
|
if (typeof v === 'object')
|
|
5863
|
-
return (_c = v.id) !== null && _c !== void 0 ? _c : '';
|
|
6170
|
+
return (_d = (_c = v.id) !== null && _c !== void 0 ? _c : v.href) !== null && _d !== void 0 ? _d : '';
|
|
5864
6171
|
return v;
|
|
5865
6172
|
}
|
|
5866
|
-
|
|
6173
|
+
/** Push the current value onto the rendered <select>. Options and value arrive
|
|
6174
|
+
* independently in edit mode (fetched records vs. the async `values` prop), so
|
|
6175
|
+
* this runs on both — whichever lands last completes the preselection. */
|
|
6176
|
+
syncDropdownSelection() {
|
|
5867
6177
|
if (this.editBehavior !== ClientLayoutItemRelationEditBehavior.DROPDOWN)
|
|
5868
6178
|
return;
|
|
5869
6179
|
const current = this.getValueHref();
|
|
@@ -5879,6 +6189,9 @@ const MrdRelationField = class {
|
|
|
5879
6189
|
select.value = current;
|
|
5880
6190
|
}, 0);
|
|
5881
6191
|
}
|
|
6192
|
+
allRecordsChanged() {
|
|
6193
|
+
this.syncDropdownSelection();
|
|
6194
|
+
}
|
|
5882
6195
|
async setSearchResults(results) {
|
|
5883
6196
|
this.searchResults = results;
|
|
5884
6197
|
this.isLoading = false;
|
|
@@ -5930,6 +6243,7 @@ const MrdRelationField = class {
|
|
|
5930
6243
|
// (host pre-fill). Plain href strings from user interaction are ignored.
|
|
5931
6244
|
valueChanged(newValue) {
|
|
5932
6245
|
this.applyValuePrefill(newValue);
|
|
6246
|
+
this.syncDropdownSelection();
|
|
5933
6247
|
}
|
|
5934
6248
|
componentDidLoad() {
|
|
5935
6249
|
// Only emit when there is no commonRelation dependency — the form orchestrates those.
|
|
@@ -6001,9 +6315,9 @@ const MrdSecretField = class {
|
|
|
6001
6315
|
};
|
|
6002
6316
|
}
|
|
6003
6317
|
render() {
|
|
6004
|
-
return (h(Host, { key: '
|
|
6318
|
+
return (h(Host, { key: 'd3d204242898c1f258b088e7b5428421cde8d7a7' }, h("div", { key: '11d284625cdd1e0def58cc31eab9bbe59346649d', class: "mrd-secret-field" }, h(FieldLabel, { key: '333e5b23d2379125a393f555b936be7bc521fdb4', base: "mrd-secret-field", label: this.label, required: this.required }), this.disabled
|
|
6005
6319
|
? (h("span", { class: "mrd-secret-field__masked", "aria-label": this.label }, this.value ? '••••••••' : ''))
|
|
6006
|
-
: (h("input", { class: controlClass('mrd-secret-field', !!this.error), type: "password", name: this.name, value: this.value, placeholder: this.placeholder, required: this.required, autocomplete: "new-password", onInput: this.handleInput, onBlur: this.handleBlur })), h(FieldError, { key: '
|
|
6320
|
+
: (h("input", { class: controlClass('mrd-secret-field', !!this.error), type: "password", name: this.name, value: this.value, placeholder: this.placeholder, required: this.required, autocomplete: "new-password", onInput: this.handleInput, onBlur: this.handleBlur })), h(FieldError, { key: 'cc202197fdab62da7b5083e078e69efd86e673ca', base: "mrd-secret-field", error: this.error }))));
|
|
6007
6321
|
}
|
|
6008
6322
|
};
|
|
6009
6323
|
MrdSecretField.style = mrdSecretFieldCss();
|
|
@@ -7331,7 +7645,7 @@ const MrdTextField = class {
|
|
|
7331
7645
|
};
|
|
7332
7646
|
}
|
|
7333
7647
|
render() {
|
|
7334
|
-
return (h(Host, { key: '
|
|
7648
|
+
return (h(Host, { key: '145aa80d06459fe85650702ced893e102762afa8' }, h("div", { key: '8f08af9acff56e704d216dc185a5d344b5b9f671', class: "mrd-text-field" }, h(FieldLabel, { key: '4e0204ffe7e8460eaf9a4be1535252cc11d0bab7', base: "mrd-text-field", label: this.label, required: this.required }), h("input", { key: '4d519077ad96c121ede51e188a2151efe72811db', class: controlClass('mrd-text-field', !!this.error), type: "text", name: this.name, value: this.value, placeholder: this.placeholder, required: this.required, disabled: this.disabled, onInput: this.handleInput, onBlur: this.handleBlur }), h(FieldError, { key: '3c5af47037f6d6851503d769429d6c0f786d389d', base: "mrd-text-field", error: this.error }))));
|
|
7335
7649
|
}
|
|
7336
7650
|
};
|
|
7337
7651
|
MrdTextField.style = mrdTextFieldCss();
|
|
@@ -7403,7 +7717,7 @@ const MrdTextareaField = class {
|
|
|
7403
7717
|
return purify.sanitize(html);
|
|
7404
7718
|
}
|
|
7405
7719
|
render() {
|
|
7406
|
-
return (h(Host, { key: '
|
|
7720
|
+
return (h(Host, { key: 'e7c53e9cf54bd4138b42ca3bc7bb5381aad3e4ac' }, h("div", { key: 'bf580a74d2233704852c7d3083ec91c9bbe868ad', class: "mrd-textarea-field" }, h(FieldLabel, { key: '7de50cb2865e83c7fe1ef9b6b099b639e165909c', base: "mrd-textarea-field", label: this.label, required: this.required }), h("div", { key: 'c78e914091cd70b52c1e9cd0046e7c97bcc7e799', class: controlClass('mrd-textarea-field', !!this.error, 'container') }, h("div", { key: '604a157e82ca8a4d98bbd1c928e9f8b41d031227', class: "mrd-textarea-field__editor" })), h(FieldError, { key: 'd0263a7285b928be6ed377e7e0fa3f53a555dadd', base: "mrd-textarea-field", error: this.error }))));
|
|
7407
7721
|
}
|
|
7408
7722
|
get el() { return getElement(this); }
|
|
7409
7723
|
};
|
|
@@ -7434,7 +7748,7 @@ const MrdTimeField = class {
|
|
|
7434
7748
|
};
|
|
7435
7749
|
}
|
|
7436
7750
|
render() {
|
|
7437
|
-
return (h(Host, { key: '
|
|
7751
|
+
return (h(Host, { key: 'ef3876dd5c1d72bdbdb65cba00ea0992ba2ab2b6' }, h("div", { key: '6b217f6c6ec0dbb8b3249dfab6443b8f6140891c', class: "mrd-time-field" }, h(FieldLabel, { key: '87adbcc4bf1ccad07d899a315cb14a00650af09c', base: "mrd-time-field", label: this.label, required: this.required }), h("input", { key: '870fcf7e0df2ee2804f95fdc79c890b3e27bba3f', class: controlClass('mrd-time-field', !!this.error), type: "time", name: this.name, value: this.value, required: this.required, disabled: this.disabled, onChange: this.handleChange, onBlur: this.handleBlur }), h(FieldError, { key: '03c21d23fbc039ffd79856134d181dffcb9e3621', base: "mrd-time-field", error: this.error }))));
|
|
7438
7752
|
}
|
|
7439
7753
|
};
|
|
7440
7754
|
MrdTimeField.style = mrdTimeFieldCss();
|