@mmlogic/components 0.5.11 → 0.5.13
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-pwUGEDql.js → cell-renderer-BBebjBVz.js} +8 -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 +161 -24
- package/dist/cjs/mrd-merge-view.cjs.entry.js +1 -1
- package/dist/collection/components/documents/mrd-document-container/mrd-document-container.js +30 -4
- package/dist/collection/components/documents/mrd-document-list/mrd-document-list.js +55 -6
- package/dist/collection/components/layout/mrd-layout-section/mrd-layout-section.js +27 -3
- package/dist/collection/components/table/mrd-table/mrd-table.js +120 -6
- package/dist/collection/components/table/mrd-table/table-parts.js +9 -5
- package/dist/collection/dev/app.js +24 -0
- package/dist/collection/utils/i18n.js +8 -0
- package/dist/components/i18n.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-layout-section.js +1 -1
- package/dist/components/mrd-table2.js +1 -1
- package/dist/esm/{cell-renderer-B8rJpnq8.js → cell-renderer-CC8-MtvQ.js} +8 -0
- package/dist/esm/loader.js +1 -1
- package/dist/esm/mosterdcomponents.js +1 -1
- package/dist/esm/mrd-boolean-field_25.entry.js +161 -24
- package/dist/esm/mrd-merge-view.entry.js +1 -1
- package/dist/mosterdcomponents/mosterdcomponents.esm.js +1 -1
- package/dist/mosterdcomponents/p-07b148b2.entry.js +3 -0
- package/dist/mosterdcomponents/p-D5ZPfX3-.js +1 -0
- package/dist/mosterdcomponents/{p-e540de6a.entry.js → p-a7e8f6a3.entry.js} +1 -1
- package/dist/types/components/documents/mrd-document-container/mrd-document-container.d.ts +4 -0
- package/dist/types/components/documents/mrd-document-list/mrd-document-list.d.ts +6 -1
- package/dist/types/components/layout/mrd-layout-section/mrd-layout-section.d.ts +4 -0
- package/dist/types/components/table/mrd-table/mrd-table.d.ts +30 -0
- package/dist/types/components/table/mrd-table/table-parts.d.ts +3 -0
- package/dist/types/components.d.ts +45 -1
- package/package.json +1 -1
- package/dist/mosterdcomponents/cell-renderer-B8u5BCK-.js.map +0 -1
- package/dist/mosterdcomponents/client-layout-Bc42CfJB.js.map +0 -1
- package/dist/mosterdcomponents/document-attachments-BufPmMRv.js.map +0 -1
- package/dist/mosterdcomponents/field-helpers-CUJsHr1V.js.map +0 -1
- package/dist/mosterdcomponents/file-upload-common-DdTDuxEU.js.map +0 -1
- package/dist/mosterdcomponents/format-gcecItcD.js.map +0 -1
- package/dist/mosterdcomponents/i18n-Ba7_jO9I.js.map +0 -1
- package/dist/mosterdcomponents/index-1ayBojyN.js.map +0 -1
- package/dist/mosterdcomponents/index-DhffneUF.js.map +0 -1
- package/dist/mosterdcomponents/index.esm.js.map +0 -1
- package/dist/mosterdcomponents/mosterdcomponents.esm.js.map +0 -1
- package/dist/mosterdcomponents/p-eee4be8b.entry.js +0 -3
- package/dist/mosterdcomponents/p-rTM1tU_M.js +0 -1
- package/dist/mosterdcomponents/purify.es-_duHfPgC.js.map +0 -1
- package/dist/mosterdcomponents/query-params-BZbQoeYF.js.map +0 -1
- package/dist/mosterdcomponents/quill-C9pgw_k-.js.map +0 -1
- package/dist/mosterdcomponents/validation-CjjTt66G.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./p-Bc42CfJB.js";function i(e,i,r){return null==e||isNaN(e)?"":new Intl.NumberFormat(i,r).format(e)}function r(e,i,r){return null==e||isNaN(e)?"":new Intl.NumberFormat(r,{style:"currency",currency:i,minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function t(e,i,r=2){return null==e||isNaN(e)?"":new Intl.NumberFormat(i,{style:"percent",minimumFractionDigits:r,maximumFractionDigits:r}).format(e)}function l(e,i){if(!e)return"";const r="string"==typeof e?new Date(e):e;return isNaN(r.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit"}).format(r)}function a(e,i){if(!e)return"";const r="string"==typeof e?new Date(e):e;return isNaN(r.getTime())?"":new Intl.DateTimeFormat(i,{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(r)}function n(e,i){var r,t,l,a;if(!e||!e.trim())return null;const n=new Intl.NumberFormat(i).formatToParts(1234567.89),o=null!==(t=null===(r=n.find((e=>"group"===e.type)))||void 0===r?void 0:r.value)&&void 0!==t?t:",",_=null!==(a=null===(l=n.find((e=>"decimal"===e.type)))||void 0===l?void 0:l.value)&&void 0!==a?a:".",c=e.replace(new RegExp(`\\${o}`,"g"),"").replace(new RegExp(`\\${_}`),".").replace("%","").trim(),s=parseFloat(c);return isNaN(s)?null:s}const o={nl:{required:"Dit veld is verplicht",select_placeholder:"Selecteer een optie",search_placeholder:"Zoeken...",upload_file:"Bestand uploaden",choose_file:"Bestand kiezen",clear:"Wissen",today:"Vandaag",invalid_email:"Voer een geldig e-mailadres in",invalid_url:"Voer een geldige URL in",invalid_number:"Voer een geldig getal in",drop_file_here:"Sleep bestand hierheen of",browse:"bladeren",file_too_large:"Bestand is te groot",invalid_image:"Selecteer een afbeeldingsbestand",search_results:"Zoekresultaten",no_results:"Geen resultaten gevonden",load_failed_retry:"Laden mislukt — opnieuw proberen",column_resize:"Kolombreedte aanpassen (dubbelklik om passend te maken)",loading:"Laden...",submit:"Opslaan",cancel:"Annuleren",remove:"Verwijderen",add:"Toevoegen",yes:"Ja",no:"Nee",table_of:"van",download:"Downloaden",value_empty:"—",table_filter_clear_all:"Alle filters wissen",table_new_record:"Nieuw record",table_export_excel:"Exporteer naar Excel",readonly_access:"Je hebt alleen-leestoegang",doc_view_switch:"Weergave wisselen",doc_view_tree:"Boomweergave",doc_upload:"Uploaden",doc_upload_to:"Uploaden naar",doc_view_list:"Lijstweergave",filter_sorting:"Sortering",filter_ascending:"Oplopend",filter_descending:"Aflopend",filter_section:"Filter",filter_apply:"Toepassen",filter_clear:"Wissen",filter_contains:"Bevat",filter_starts_with:"Begint met",filter_equals:"Gelijk aan",filter_has_value:"Heeft waarde",filter_is_empty:"Is leeg",filter_is_not_empty:"Is niet leeg",filter_exact:"Exact",filter_range:"Bereik",filter_from:"Van",filter_to:"Tot",filter_all:"Alle",filter_select_all:"Alles",filter_select_none:"Geen",filter_search_value:"Zoekwaarde...",filter_no_support:"Geen filtering beschikbaar voor dit veldtype.",textblock_show_more:"Meer tonen",close:"Sluiten",history_until:"tot",history_badge_tooltip:"Vorige waarden",hyperlink_name:"Linktekst (optioneel)",new_folder:"Nieuwe folder",folder_name_placeholder:"Foldernaam",folder_no_slash:"Een foldernaam mag geen '/' bevatten",folder_duplicate:"Er bestaat al een folder met deze naam",doc_empty_drop:"Nog geen documenten — sleep bestanden hierheen",merge_search_hint:"Zoek het duplicaat waarmee je wilt samenvoegen",merge_select:"Selecteer",merge_compare_heading:"Los conflicten op",merge_column_a:"Huidig (blijft behouden)",merge_column_b:"Kandidaat (wordt verwijderd)",merge_auto_heading:"Deze velden worden automatisch overgenomen van de kandidaat:",merge_no_conflicts:"Geen conflicterende velden gevonden",merge_continue:"Doorgaan",merge_back:"Terug",merge_confirm_heading:"Bevestig samenvoegen",merge_confirm_warning:"Dit kan niet ongedaan worden gemaakt: de kandidaat wordt definitief verwijderd.",merge_confirm_button:"Samenvoegen bevestigen",invoice_title:"Factuur",invoice_date:"Factuurdatum",invoice_due_date:"Vervaldatum",invoice_subtotal:"Subtotaal",invoice_tax:"BTW",invoice_total:"Totaal",invoice_customer:"Klant",invoice_supplier:"Leverancier",email_from:"Van",email_to:"Aan",email_cc:"Cc",email_date:"Datum",email_show_headers:"Toon technische headers"},en:{required:"This field is required",select_placeholder:"Select an option",search_placeholder:"Search...",upload_file:"Upload file",choose_file:"Choose file",clear:"Clear",today:"Today",invalid_email:"Please enter a valid email address",invalid_url:"Please enter a valid URL",invalid_number:"Please enter a valid number",drop_file_here:"Drop file here or",browse:"browse",file_too_large:"File is too large",invalid_image:"Please select an image file",search_results:"Search results",no_results:"No results found",load_failed_retry:"Failed to load — retry",column_resize:"Resize column (double-click to fit)",loading:"Loading...",submit:"Save",cancel:"Cancel",remove:"Remove",add:"Add",yes:"Yes",no:"No",table_of:"of",download:"Download",value_empty:"—",table_filter_clear_all:"Clear all filters",table_new_record:"New record",table_export_excel:"Export to Excel",readonly_access:"You have read-only access",doc_view_switch:"Switch view",doc_view_tree:"Tree view",doc_upload:"Upload",doc_upload_to:"Upload to",doc_view_list:"List view",filter_sorting:"Sorting",filter_ascending:"Ascending",filter_descending:"Descending",filter_section:"Filter",filter_apply:"Apply",filter_clear:"Clear",filter_contains:"Contains",filter_starts_with:"Starts with",filter_equals:"Equals",filter_has_value:"Has value",filter_is_empty:"Is empty",filter_is_not_empty:"Is not empty",filter_exact:"Exact",filter_range:"Range",filter_from:"From",filter_to:"To",filter_all:"All",filter_select_all:"All",filter_select_none:"None",filter_search_value:"Search value...",filter_no_support:"Filtering is not available for this field type.",textblock_show_more:"Show more",close:"Close",history_until:"until",history_badge_tooltip:"Previous values",hyperlink_name:"Link text (optional)",new_folder:"New folder",folder_name_placeholder:"Folder name",folder_no_slash:"A folder name cannot contain '/'",folder_duplicate:"A folder with this name already exists",doc_empty_drop:"No documents yet — drop files here",merge_search_hint:"Search for the duplicate to merge with",merge_select:"Select",merge_compare_heading:"Resolve conflicts",merge_column_a:"Current (kept)",merge_column_b:"Candidate (will be deleted)",merge_auto_heading:"These fields will be taken from the candidate automatically:",merge_no_conflicts:"No conflicting fields found",merge_continue:"Continue",merge_back:"Back",merge_confirm_heading:"Confirm merge",merge_confirm_warning:"This cannot be undone: the candidate will be permanently deleted.",merge_confirm_button:"Confirm merge",invoice_title:"Invoice",invoice_date:"Invoice date",invoice_due_date:"Due date",invoice_subtotal:"Subtotal",invoice_tax:"Tax",invoice_total:"Total",invoice_customer:"Customer",invoice_supplier:"Supplier",email_from:"From",email_to:"To",email_cc:"Cc",email_date:"Date",email_show_headers:"Show technical headers"},ar:{required:"هذا الحقل مطلوب",select_placeholder:"اختر خياراً",search_placeholder:"بحث...",upload_file:"رفع ملف",choose_file:"اختر ملفاً",clear:"مسح",today:"اليوم",invalid_email:"يرجى إدخال عنوان بريد إلكتروني صحيح",invalid_url:"يرجى إدخال رابط صحيح",invalid_number:"يرجى إدخال رقم صحيح",drop_file_here:"اسحب الملف هنا أو",browse:"تصفح",file_too_large:"الملف كبير جداً",invalid_image:"يرجى اختيار ملف صورة",search_results:"نتائج البحث",no_results:"لم يتم العثور على نتائج",load_failed_retry:"فشل التحميل — إعادة المحاولة",column_resize:"تغيير عرض العمود (انقر نقرًا مزدوجًا للملاءمة)",loading:"جار التحميل...",submit:"حفظ",cancel:"إلغاء",remove:"إزالة",add:"إضافة",yes:"نعم",no:"لا",table_of:"من أصل",download:"تنزيل",value_empty:"—",table_filter_clear_all:"مسح جميع الفلاتر",table_new_record:"سجل جديد",table_export_excel:"تصدير إلى Excel",readonly_access:"لديك حق الوصول للقراءة فقط",doc_view_switch:"تبديل العرض",doc_view_tree:"عرض شجري",doc_upload:"رفع",doc_upload_to:"رفع إلى",doc_view_list:"عرض القائمة",filter_sorting:"الترتيب",filter_ascending:"تصاعدي",filter_descending:"تنازلي",filter_section:"تصفية",filter_apply:"تطبيق",filter_clear:"مسح",filter_contains:"يحتوي على",filter_starts_with:"يبدأ بـ",filter_equals:"يساوي",filter_has_value:"له قيمة",filter_is_empty:"فارغ",filter_is_not_empty:"ليس فارغاً",filter_exact:"دقيق",filter_range:"نطاق",filter_from:"من",filter_to:"إلى",filter_all:"الكل",filter_select_all:"الكل",filter_select_none:"لا شيء",filter_search_value:"قيمة البحث...",filter_no_support:"التصفية غير متاحة لهذا النوع من الحقول.",textblock_show_more:"عرض المزيد",close:"إغلاق",history_until:"حتى",history_badge_tooltip:"القيم السابقة",hyperlink_name:"نص الرابط (اختياري)",merge_search_hint:"ابحث عن السجل المكرر للدمج معه",merge_select:"اختر",merge_compare_heading:"حل التعارضات",merge_column_a:"الحالي (سيتم الاحتفاظ به)",merge_column_b:"المرشح (سيتم حذفه)",merge_auto_heading:"سيتم أخذ هذه الحقول من المرشح تلقائياً:",merge_no_conflicts:"لم يتم العثور على حقول متعارضة",merge_continue:"متابعة",merge_back:"رجوع",merge_confirm_heading:"تأكيد الدمج",merge_confirm_warning:"لا يمكن التراجع عن هذا الإجراء: سيتم حذف المرشح نهائياً.",merge_confirm_button:"تأكيد الدمج",invoice_title:"فاتورة",invoice_date:"تاريخ الفاتورة",invoice_due_date:"تاريخ الاستحقاق",invoice_subtotal:"المجموع الفرعي",invoice_tax:"الضريبة",invoice_total:"الإجمالي",invoice_customer:"العميل",invoice_supplier:"المورد",email_from:"من",email_to:"إلى",email_cc:"نسخة",email_date:"التاريخ",email_show_headers:"إظهار الترويسات التقنية"},fr:{required:"Ce champ est obligatoire",select_placeholder:"Sélectionner une option",search_placeholder:"Rechercher...",upload_file:"Télécharger un fichier",choose_file:"Choisir un fichier",clear:"Effacer",today:"Aujourd'hui",invalid_email:"Veuillez saisir une adresse e-mail valide",invalid_url:"Veuillez saisir une URL valide",invalid_number:"Veuillez saisir un nombre valide",drop_file_here:"Déposez le fichier ici ou",browse:"parcourir",file_too_large:"Le fichier est trop volumineux",invalid_image:"Veuillez sélectionner un fichier image",search_results:"Résultats de recherche",no_results:"Aucun résultat trouvé",load_failed_retry:"Échec du chargement — réessayer",column_resize:"Redimensionner la colonne (double-cliquer pour ajuster)",loading:"Chargement...",submit:"Enregistrer",cancel:"Annuler",remove:"Supprimer",add:"Ajouter",yes:"Oui",no:"Non",table_of:"sur",download:"Télécharger",value_empty:"—",table_filter_clear_all:"Effacer tous les filtres",table_new_record:"Nouvel enregistrement",table_export_excel:"Exporter vers Excel",readonly_access:"Vous disposez d'un accès en lecture seule",doc_view_switch:"Changer de vue",doc_view_tree:"Vue arborescente",doc_upload:"Téléverser",doc_upload_to:"Téléverser vers",doc_view_list:"Vue liste",filter_sorting:"Tri",filter_ascending:"Croissant",filter_descending:"Décroissant",filter_section:"Filtre",filter_apply:"Appliquer",filter_clear:"Effacer",filter_contains:"Contient",filter_starts_with:"Commence par",filter_equals:"Égal à",filter_has_value:"A une valeur",filter_is_empty:"Est vide",filter_is_not_empty:"N'est pas vide",filter_exact:"Exact",filter_range:"Plage",filter_from:"De",filter_to:"À",filter_all:"Tous",filter_select_all:"Tous",filter_select_none:"Aucun",filter_search_value:"Valeur de recherche...",filter_no_support:"Le filtrage n'est pas disponible pour ce type de champ.",textblock_show_more:"Voir plus",close:"Fermer",history_until:"jusqu'au",history_badge_tooltip:"Valeurs précédentes",hyperlink_name:"Texte du lien (optionnel)",merge_search_hint:"Rechercher le doublon à fusionner",merge_select:"Sélectionner",merge_compare_heading:"Résoudre les conflits",merge_column_a:"Actuel (conservé)",merge_column_b:"Candidat (sera supprimé)",merge_auto_heading:"Ces champs seront repris automatiquement du candidat :",merge_no_conflicts:"Aucun champ en conflit trouvé",merge_continue:"Continuer",merge_back:"Retour",merge_confirm_heading:"Confirmer la fusion",merge_confirm_warning:"Cette action est irréversible : le candidat sera définitivement supprimé.",merge_confirm_button:"Confirmer la fusion",invoice_title:"Facture",invoice_date:"Date de facture",invoice_due_date:"Date d'échéance",invoice_subtotal:"Sous-total",invoice_tax:"TVA",invoice_total:"Total",invoice_customer:"Client",invoice_supplier:"Fournisseur",email_from:"De",email_to:"À",email_cc:"Cc",email_date:"Date",email_show_headers:"Afficher les en-têtes techniques"},de:{required:"Dieses Feld ist erforderlich",select_placeholder:"Option auswählen",search_placeholder:"Suchen...",upload_file:"Datei hochladen",choose_file:"Datei auswählen",clear:"Löschen",today:"Heute",invalid_email:"Bitte geben Sie eine gültige E-Mail-Adresse ein",invalid_url:"Bitte geben Sie eine gültige URL ein",invalid_number:"Bitte geben Sie eine gültige Zahl ein",drop_file_here:"Datei hier ablegen oder",browse:"durchsuchen",file_too_large:"Datei ist zu groß",invalid_image:"Bitte eine Bilddatei auswählen",search_results:"Suchergebnisse",no_results:"Keine Ergebnisse gefunden",load_failed_retry:"Laden fehlgeschlagen — erneut versuchen",column_resize:"Spaltenbreite anpassen (Doppelklick zum Anpassen)",loading:"Laden...",submit:"Speichern",cancel:"Abbrechen",remove:"Entfernen",add:"Hinzufügen",yes:"Ja",no:"Nein",table_of:"von",download:"Herunterladen",value_empty:"—",table_filter_clear_all:"Alle Filter löschen",table_new_record:"Neuer Eintrag",table_export_excel:"Als Excel exportieren",readonly_access:"Sie haben nur Lesezugriff",doc_view_switch:"Ansicht wechseln",doc_view_tree:"Baumansicht",doc_upload:"Hochladen",doc_upload_to:"Hochladen nach",doc_view_list:"Listenansicht",filter_sorting:"Sortierung",filter_ascending:"Aufsteigend",filter_descending:"Absteigend",filter_section:"Filter",filter_apply:"Anwenden",filter_clear:"Löschen",filter_contains:"Enthält",filter_starts_with:"Beginnt mit",filter_equals:"Gleich",filter_has_value:"Hat Wert",filter_is_empty:"Ist leer",filter_is_not_empty:"Ist nicht leer",filter_exact:"Genau",filter_range:"Bereich",filter_from:"Von",filter_to:"Bis",filter_all:"Alle",filter_select_all:"Alle",filter_select_none:"Keine",filter_search_value:"Suchwert...",filter_no_support:"Filterung ist für diesen Feldtyp nicht verfügbar.",textblock_show_more:"Mehr anzeigen",close:"Schließen",history_until:"bis",history_badge_tooltip:"Vorherige Werte",hyperlink_name:"Linktext (optional)",merge_search_hint:"Suchen Sie das Duplikat, mit dem zusammengeführt werden soll",merge_select:"Auswählen",merge_compare_heading:"Konflikte lösen",merge_column_a:"Aktuell (bleibt erhalten)",merge_column_b:"Kandidat (wird gelöscht)",merge_auto_heading:"Diese Felder werden automatisch vom Kandidaten übernommen:",merge_no_conflicts:"Keine widersprüchlichen Felder gefunden",merge_continue:"Weiter",merge_back:"Zurück",merge_confirm_heading:"Zusammenführung bestätigen",merge_confirm_warning:"Dies kann nicht rückgängig gemacht werden: der Kandidat wird endgültig gelöscht.",merge_confirm_button:"Zusammenführung bestätigen",invoice_title:"Rechnung",invoice_date:"Rechnungsdatum",invoice_due_date:"Fälligkeitsdatum",invoice_subtotal:"Zwischensumme",invoice_tax:"MwSt.",invoice_total:"Gesamt",invoice_customer:"Kunde",invoice_supplier:"Lieferant",email_from:"Von",email_to:"An",email_cc:"Cc",email_date:"Datum",email_show_headers:"Technische Header anzeigen"},es:{required:"Este campo es obligatorio",select_placeholder:"Seleccionar una opción",search_placeholder:"Buscar...",upload_file:"Subir archivo",choose_file:"Elegir archivo",clear:"Borrar",today:"Hoy",invalid_email:"Por favor, introduzca una dirección de correo electrónico válida",invalid_url:"Por favor, introduzca una URL válida",invalid_number:"Por favor, introduzca un número válido",drop_file_here:"Suelte el archivo aquí o",browse:"explorar",file_too_large:"El archivo es demasiado grande",invalid_image:"Seleccione un archivo de imagen",search_results:"Resultados de búsqueda",no_results:"No se encontraron resultados",load_failed_retry:"Error al cargar — reintentar",column_resize:"Ajustar ancho de columna (doble clic para ajustar)",loading:"Cargando...",submit:"Guardar",cancel:"Cancelar",remove:"Eliminar",add:"Añadir",yes:"Sí",no:"No",table_of:"de",download:"Descargar",value_empty:"—",table_filter_clear_all:"Borrar todos los filtros",table_new_record:"Nuevo registro",table_export_excel:"Exportar a Excel",readonly_access:"Tienes acceso de solo lectura",doc_view_switch:"Cambiar vista",doc_view_tree:"Vista de árbol",doc_upload:"Subir",doc_upload_to:"Subir a",doc_view_list:"Vista de lista",filter_sorting:"Ordenación",filter_ascending:"Ascendente",filter_descending:"Descendente",filter_section:"Filtro",filter_apply:"Aplicar",filter_clear:"Borrar",filter_contains:"Contiene",filter_starts_with:"Empieza por",filter_equals:"Igual a",filter_has_value:"Tiene valor",filter_is_empty:"Está vacío",filter_is_not_empty:"No está vacío",filter_exact:"Exacto",filter_range:"Rango",filter_from:"Desde",filter_to:"Hasta",filter_all:"Todos",filter_select_all:"Todos",filter_select_none:"Ninguno",filter_search_value:"Valor de búsqueda...",filter_no_support:"El filtrado no está disponible para este tipo de campo.",textblock_show_more:"Mostrar más",close:"Cerrar",history_until:"hasta",history_badge_tooltip:"Valores anteriores",hyperlink_name:"Texto del enlace (opcional)",merge_search_hint:"Busque el duplicado con el que fusionar",merge_select:"Seleccionar",merge_compare_heading:"Resolver conflictos",merge_column_a:"Actual (se conserva)",merge_column_b:"Candidato (se eliminará)",merge_auto_heading:"Estos campos se tomarán automáticamente del candidato:",merge_no_conflicts:"No se encontraron campos en conflicto",merge_continue:"Continuar",merge_back:"Atrás",merge_confirm_heading:"Confirmar fusión",merge_confirm_warning:"Esto no se puede deshacer: el candidato se eliminará permanentemente.",merge_confirm_button:"Confirmar fusión",invoice_title:"Factura",invoice_date:"Fecha de factura",invoice_due_date:"Fecha de vencimiento",invoice_subtotal:"Subtotal",invoice_tax:"Impuesto",invoice_total:"Total",invoice_customer:"Cliente",invoice_supplier:"Proveedor",email_from:"De",email_to:"Para",email_cc:"Cc",email_date:"Fecha",email_show_headers:"Mostrar encabezados técnicos"},it:{required:"Questo campo è obbligatorio",select_placeholder:"Seleziona un'opzione",search_placeholder:"Cerca...",upload_file:"Carica file",choose_file:"Scegli file",clear:"Cancella",today:"Oggi",invalid_email:"Inserisci un indirizzo email valido",invalid_url:"Inserisci un URL valido",invalid_number:"Inserisci un numero valido",drop_file_here:"Trascina il file qui o",browse:"sfoglia",file_too_large:"Il file è troppo grande",invalid_image:"Seleziona un file immagine",search_results:"Risultati della ricerca",no_results:"Nessun risultato trovato",load_failed_retry:"Caricamento non riuscito — riprova",column_resize:"Ridimensiona colonna (doppio clic per adattare)",loading:"Caricamento...",submit:"Salva",cancel:"Annulla",remove:"Rimuovi",add:"Aggiungi",yes:"Sì",no:"No",table_of:"di",download:"Scarica",value_empty:"—",table_filter_clear_all:"Cancella tutti i filtri",table_new_record:"Nuovo record",table_export_excel:"Esporta in Excel",readonly_access:"Hai accesso in sola lettura",doc_view_switch:"Cambia vista",doc_view_tree:"Vista ad albero",doc_upload:"Carica",doc_upload_to:"Carica in",doc_view_list:"Vista elenco",filter_sorting:"Ordinamento",filter_ascending:"Crescente",filter_descending:"Decrescente",filter_section:"Filtro",filter_apply:"Applica",filter_clear:"Cancella",filter_contains:"Contiene",filter_starts_with:"Inizia con",filter_equals:"Uguale a",filter_has_value:"Ha valore",filter_is_empty:"È vuoto",filter_is_not_empty:"Non è vuoto",filter_exact:"Esatto",filter_range:"Intervallo",filter_from:"Da",filter_to:"A",filter_all:"Tutti",filter_select_all:"Tutti",filter_select_none:"Nessuno",filter_search_value:"Valore di ricerca...",filter_no_support:"Il filtro non è disponibile per questo tipo di campo.",textblock_show_more:"Mostra altro",close:"Chiudi",history_until:"fino a",history_badge_tooltip:"Valori precedenti",hyperlink_name:"Testo del collegamento (opzionale)",merge_search_hint:"Cerca il duplicato con cui unire",merge_select:"Seleziona",merge_compare_heading:"Risolvi i conflitti",merge_column_a:"Attuale (viene mantenuto)",merge_column_b:"Candidato (verrà eliminato)",merge_auto_heading:"Questi campi verranno ripresi automaticamente dal candidato:",merge_no_conflicts:"Nessun campo in conflitto trovato",merge_continue:"Continua",merge_back:"Indietro",merge_confirm_heading:"Conferma unione",merge_confirm_warning:"Questa azione non può essere annullata: il candidato verrà eliminato definitivamente.",merge_confirm_button:"Conferma unione",invoice_title:"Fattura",invoice_date:"Data fattura",invoice_due_date:"Data di scadenza",invoice_subtotal:"Subtotale",invoice_tax:"IVA",invoice_total:"Totale",invoice_customer:"Cliente",invoice_supplier:"Fornitore",email_from:"Da",email_to:"A",email_cc:"Cc",email_date:"Data",email_show_headers:"Mostra intestazioni tecniche"},uk:{required:"Це поле обов'язкове",select_placeholder:"Виберіть варіант",search_placeholder:"Пошук...",upload_file:"Завантажити файл",choose_file:"Вибрати файл",clear:"Очистити",today:"Сьогодні",invalid_email:"Будь ласка, введіть дійсну адресу електронної пошти",invalid_url:"Будь ласка, введіть дійсну URL-адресу",invalid_number:"Будь ласка, введіть дійсне число",drop_file_here:"Перетягніть файл сюди або",browse:"огляд",file_too_large:"Файл занадто великий",invalid_image:"Будь ласка, виберіть файл зображення",search_results:"Результати пошуку",no_results:"Результатів не знайдено",load_failed_retry:"Не вдалося завантажити — повторити",column_resize:"Змінити ширину стовпця (подвійний клік — за вмістом)",loading:"Завантаження...",submit:"Зберегти",cancel:"Скасувати",remove:"Видалити",add:"Додати",yes:"Так",no:"Ні",table_of:"з",download:"Завантажити",value_empty:"—",table_filter_clear_all:"Очистити всі фільтри",table_new_record:"Новий запис",table_export_excel:"Експортувати до Excel",readonly_access:"У вас доступ лише для перегляду",doc_view_switch:"Змінити вигляд",doc_view_tree:"Деревоподібний вигляд",doc_upload:"Завантажити",doc_upload_to:"Завантажити до",doc_view_list:"Список",filter_sorting:"Сортування",filter_ascending:"За зростанням",filter_descending:"За спаданням",filter_section:"Фільтр",filter_apply:"Застосувати",filter_clear:"Очистити",filter_contains:"Містить",filter_starts_with:"Починається з",filter_equals:"Дорівнює",filter_has_value:"Має значення",filter_is_empty:"Порожнє",filter_is_not_empty:"Не порожнє",filter_exact:"Точно",filter_range:"Діапазон",filter_from:"Від",filter_to:"До",filter_all:"Всі",filter_select_all:"Всі",filter_select_none:"Жодного",filter_search_value:"Значення для пошуку...",filter_no_support:"Фільтрування недоступне для цього типу поля.",textblock_show_more:"Показати більше",close:"Закрити",history_until:"до",history_badge_tooltip:"Попередні значення",hyperlink_name:"Текст посилання (необов'язково)",merge_search_hint:"Знайдіть дублікат для об'єднання",merge_select:"Вибрати",merge_compare_heading:"Вирішити конфлікти",merge_column_a:"Поточний (залишається)",merge_column_b:"Кандидат (буде видалено)",merge_auto_heading:"Ці поля будуть автоматично взяті з кандидата:",merge_no_conflicts:"Конфліктних полів не знайдено",merge_continue:"Продовжити",merge_back:"Назад",merge_confirm_heading:"Підтвердити об'єднання",merge_confirm_warning:"Цю дію не можна скасувати: кандидат буде остаточно видалено.",merge_confirm_button:"Підтвердити об'єднання",invoice_title:"Рахунок-фактура",invoice_date:"Дата рахунку",invoice_due_date:"Термін оплати",invoice_subtotal:"Проміжний підсумок",invoice_tax:"ПДВ",invoice_total:"Разом",invoice_customer:"Клієнт",invoice_supplier:"Постачальник",email_from:"Від",email_to:"Кому",email_cc:"Копія",email_date:"Дата",email_show_headers:"Показати технічні заголовки"}};function _(e,i){var r,t,l;const a=(null!=i?i:"en").split("-")[0].toLowerCase();return null!==(l=null!==(t=(null!==(r=o[a])&&void 0!==r?r:o.en)[e])&&void 0!==t?t:o.en[e])&&void 0!==l?l:e}class c{static render(i,r,t){var l,a,n,o;if(i.type===e.RELATION){const e=null!==(l=i.name)&&void 0!==l?l:"",t=null===(a=null==r?void 0:r._links)||void 0===a?void 0:a[e];return t?Array.isArray(t)?t.map((e=>{var i;return null!==(i=e.name)&&void 0!==i?i:""})).filter(Boolean).join(", "):null!==(n=t.name)&&void 0!==n?n:"":""}if(i.type!==e.FIELD)return"";const _=null!==(o=i.name)&&void 0!==o?o:"",s=i.dataType,d=i.listItems;let u=null==r?void 0:r[_];return i.historyEnabled&&null!=u&&"object"==typeof u&&!Array.isArray(u)&&"current"in u&&(u=u.current),null==u||""===u?"":(Array.isArray(u)?u:[u]).map((e=>c.renderValue(null!=s?s:"TEXT",e,null!=d?d:[],t))).filter((e=>""!==e)).join(", ")}static renderValue(e,n,o,_){var c,s;switch(e){case"INTEGER":return i(Number(n),_,{maximumFractionDigits:0});case"DECIMAL":return i(Number(n),_);case"PERCENTAGE":return t(Number(n),_);case"CURRENCY":{const{amount:e,currency:t}="object"==typeof n&&null!==n?n:{amount:n,currency:""};return t?r(Number(e),t,_):i(Number(e),_)}case"DATE":return l(n,_);case"DATETIME":return a(n,_);case"TIME":return function(e,i){if(!e)return"";const[r,t]=e.split(":").map(Number),l=new Date;return l.setHours(r,t,0,0),new Intl.DateTimeFormat(i,{hour:"2-digit",minute:"2-digit"}).format(l)}(n,_);case"BOOLEAN":return n?"✓":"";case"FILE":case"IMAGE":return"object"==typeof n&&null!==n&&null!==(c=n.fileName)&&void 0!==c?c:"";case"LIST":{const e=o.find((e=>e.key===String(n)));return null!==(s=null==e?void 0:e.label)&&void 0!==s?s:String(n)}case"TEXTBLOCK":{const e=String(n).replace(/<[^>]*>/g,""),i=document.createElement("textarea");return i.innerHTML=e,i.value.trim()}case"LONGTEXT":return String(n).replace(/[\r\n]+/g," ").trim();case"JSON":return("object"==typeof n?JSON.stringify(n):String(n)).replace(/[\r\n]+/g," ").trim();case"SECRET":return n?"••••••••":"";default:return String(n)}}static formatJson(e,i=!1){try{const r="string"==typeof e?JSON.parse(e):e;return(i?JSON.stringify(r):JSON.stringify(r,null,2)).replace(/("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?)/g,(e=>{let i="color:#2aa198";return/^"/.test(e)?i=/:$/.test(e)?"color:#881391":"color:#268bd2":/true|false/.test(e)?i="color:#b58900":/null/.test(e)&&(i="color:#dc322f"),`<span style="${i}">${e}</span>`}))}catch(i){return String(e)}}}export{c as C,l as a,a as b,r as c,t as d,i as f,n as p,_ as t}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as r,r as e,c as i,H as o,g as d}from"./p-CDiBvvJU.js";import{a as t}from"./p-Bc42CfJB.js";import{t as a,C as s,a as m}from"./p-rTM1tU_M.js";function n(r){return r.type===t.FIELD||r.type===t.RELATION&&!r.multiple}function l(r,e){var i,o,d,a,s;const m=null!==(i=r.name)&&void 0!==i?i:"";return r.type===t.RELATION?null!==(a=null===(d=null===(o=null==e?void 0:e._links)||void 0===o?void 0:o[m])||void 0===d?void 0:d.href)&&void 0!==a?a:null:null!==(s=null==e?void 0:e[m])&&void 0!==s?s:null}function c(r,e){return r.historyEnabled&&null!=e&&"object"==typeof e&&!Array.isArray(e)&&"current"in e?e.current:e}function v(r){return void 0===r||""===r?null:r}function g(r,e){const i=v(r),o=v(e);return i===o||null!==i&&null!==o&&JSON.stringify(i)===JSON.stringify(o)}function u(r){return null===v(r)}function h(r,e,i){const o=[],d=[];for(const t of r.filter(n)){const r=l(t,e),a=l(t,i),s=c(t,r),m=c(t,a);g(s,m)||(u(s)&&!u(m)?d.push({item:t,aValue:r,bValue:a}):o.push({item:t,aValue:r,bValue:a}))}return{conflicts:o,autoFilled:d}}function _(r){var e,i,o,d,t;return null!==(t=null!==(i=null!==(e=null==r?void 0:r.name)&&void 0!==e?e:null==r?void 0:r.label)&&void 0!==i?i:null===(d=null===(o=null==r?void 0:r._links)||void 0===o?void 0:o.self)||void 0===d?void 0:d.href)&&void 0!==t?t:""}function w(r,e){var i,o;return r.historyEnabled&&r.name&&null!==(o=null===(i=null==e?void 0:e[r.name])||void 0===i?void 0:i.history)&&void 0!==o?o:[]}const p=({locale:e,history:i,isOpen:o,onToggle:d})=>{if(0===i.length)return null;const t=[...i].sort(((r,e)=>e.until.localeCompare(r.until)));return r("span",{class:"mrd-merge-view__history-wrap"},r("button",{type:"button",class:"mrd-merge-view__history-btn",title:a("history_badge_tooltip",e),"aria-label":a("history_badge_tooltip",e),onClick:r=>{r.stopPropagation(),d()}},r("svg",{class:"mrd-merge-view__history-icon",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},r("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm.75-13a.75.75 0 00-1.5 0v5c0 .207.085.394.22.53l2.5 2.5a.75.75 0 101.06-1.06L10.75 9.69V5z","clip-rule":"evenodd"}))),o&&r("div",{class:"mrd-merge-view__history-popover",role:"listbox"},t.map(((i,o)=>r("div",{key:String(o),class:"mrd-merge-view__history-entry"},i.value," (",a("history_until",e)," ",m(i.until,e),")")))))},b=({locale:e,searchQuery:i,searchResults:o,isLoading:d,onSearchInput:t,onSelect:s})=>r("div",{class:"mrd-merge-view__search-step"},r("p",{class:"mrd-merge-view__hint"},a("merge_search_hint",e)),r("div",{class:"mrd-merge-view__search-wrapper"},r("input",{class:"mrd-merge-view__search",type:"text",value:i,placeholder:a("search_placeholder",e),onInput:r=>t(r.target.value)}),d&&r("span",{class:"mrd-merge-view__spinner","aria-label":a("loading",e)})),i.trim().length>=2&&!d&&r("div",{class:"mrd-merge-view__results"},0===o.length?r("div",{class:"mrd-merge-view__no-results"},a("no_results",e)):o.map((i=>{var o,d,t;return r("div",{key:null!==(t=null===(d=null===(o=null==i?void 0:i._links)||void 0===o?void 0:o.self)||void 0===d?void 0:d.href)&&void 0!==t?t:_(i),class:"mrd-merge-view__result-item"},r("span",{class:"mrd-merge-view__result-label"},_(i)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:()=>s(i)},a("merge_select",e)))})))),f=({locale:e,currentLabel:i,candidateLabel:o,conflicts:d,autoFilled:t,recordA:m,recordB:n,resolutions:l,openHistoryKey:c,onResolve:v,onToggleHistory:g,onChangeCandidate:u,onContinue:h})=>r("div",{class:"mrd-merge-view__compare-step"},r("h3",{class:"mrd-merge-view__heading"},a("merge_compare_heading",e)),0===d.length?r("p",{class:"mrd-merge-view__no-conflicts"},a("merge_no_conflicts",e)):r("table",{class:"mrd-merge-view__table"},r("thead",null,r("tr",null,r("th",{class:"mrd-merge-view__header"}),r("th",{class:"mrd-merge-view__header"},a("merge_column_a",e),r("span",{class:"mrd-merge-view__header-name"},i)),r("th",{class:"mrd-merge-view__header"},a("merge_column_b",e),r("span",{class:"mrd-merge-view__header-name"},o)))),r("tbody",null,d.map((({item:i})=>{var o,d,t;const a=null!==(o=i.name)&&void 0!==o?o:"",u=null!==(d=l[a])&&void 0!==d?d:"A",h=w(i,m),_=w(i,n),b=`${a}:A`,f=`${a}:B`;return r("tr",{key:a,class:"mrd-merge-view__row"},r("td",{class:"mrd-merge-view__cell mrd-merge-view__cell--label"},null!==(t=i.label)&&void 0!==t?t:a),r("td",{class:"mrd-merge-view__cell"},r("label",{class:"mrd-merge-view__option"},r("input",{type:"radio",name:`merge-${a}`,checked:"A"===u,onChange:()=>v(a,"A")}),r("span",null,s.render(i,m,e)||"—")),r(p,{locale:e,history:h,isOpen:c===b,onToggle:()=>g(c===b?null:b)})),r("td",{class:"mrd-merge-view__cell"},r("label",{class:"mrd-merge-view__option"},r("input",{type:"radio",name:`merge-${a}`,checked:"B"===u,onChange:()=>v(a,"B")}),r("span",null,s.render(i,n,e)||"—")),r(p,{locale:e,history:_,isOpen:c===f,onToggle:()=>g(c===f?null:f)})))})))),t.length>0&&r("div",{class:"mrd-merge-view__auto-note"},r("p",null,a("merge_auto_heading",e)),r("ul",null,t.map((({item:e})=>{var i;return r("li",{key:e.name},null!==(i=e.label)&&void 0!==i?i:e.name)})))),r("div",{class:"mrd-merge-view__actions"},r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:u},a("merge_back",e)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--primary",onClick:h},a("merge_continue",e)))),y=({locale:e,candidateLabel:i,conflicts:o,autoFilled:d,resolutions:t,recordB:m,openHistoryKey:n,onToggleHistory:l,onBack:c,onConfirm:v})=>{const g=[...d,...o.filter((({item:r})=>{var e;return"B"===t[null!==(e=r.name)&&void 0!==e?e:""]}))];return r("div",{class:"mrd-merge-view__confirm-step"},r("h3",{class:"mrd-merge-view__heading"},a("merge_confirm_heading",e)),0===g.length?r("p",{class:"mrd-merge-view__no-conflicts"},a("merge_no_conflicts",e)):r("ul",{class:"mrd-merge-view__summary-list"},g.map((({item:i})=>{var o;const d=`${i.name}:confirm`;return r("li",{key:i.name},null!==(o=i.label)&&void 0!==o?o:i.name,": ",s.render(i,m,e)||"—",r(p,{locale:e,history:w(i,m),isOpen:n===d,onToggle:()=>l(n===d?null:d)}))}))),r("p",{class:"mrd-merge-view__warning"},a("merge_confirm_warning",e)," (",i,")"),r("div",{class:"mrd-merge-view__actions"},r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:c},a("merge_back",e)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--danger",onClick:v},a("merge_confirm_button",e))))},k=class{constructor(r){e(this,r),this.mrdSearch=i(this,"mrdSearch"),this.mrdMerge=i(this,"mrdMerge"),this.locale=navigator.language,this.basicType="",this.mostSignificantClass="",this.fields=[],this.currentHref="",this.currentRecord={},this.currentLabel="",this.step="search",this.searchQuery="",this.searchResults=[],this.isLoading=!1,this.candidate=null,this.resolutions={},this.openHistoryKey=null,this.historyClickOutside=null,this.searchDebounce=null,this.handleSearchInput=r=>{this.searchQuery=r,this.searchDebounce&&clearTimeout(this.searchDebounce),r.trim().length>=2?(this.isLoading=!0,this.searchDebounce=setTimeout((()=>{this.mrdSearch.emit({query:r,basicType:this.basicType,mostSignificantClass:this.mostSignificantClass||void 0})}),300)):(this.searchResults=[],this.isLoading=!1)},this.handleSelect=r=>{this.candidate=r;const{conflicts:e}=h(this.fields,this.currentRecord,r),i={};e.forEach((({item:r})=>{var e;i[null!==(e=r.name)&&void 0!==e?e:""]="A"})),this.resolutions=i,this.openHistoryKey=null,this.step="compare"},this.handleChangeCandidate=()=>{this.candidate=null,this.resolutions={},this.openHistoryKey=null,this.step="search"},this.handleResolve=(r,e)=>{this.resolutions=Object.assign(Object.assign({},this.resolutions),{[r]:e})},this.handleToggleHistory=r=>{this.openHistoryKey=r},this.handleContinue=()=>{this.step="confirm"},this.handleBack=()=>{this.step="compare"},this.handleConfirm=()=>{var r,e,i,o;if(!this.candidate)return;const d=function(r,e){var i,o,d;const t={};for(const{item:e,bValue:o}of r.autoFilled)t[null!==(i=e.name)&&void 0!==i?i:""]=o;for(const{item:i,bValue:a}of r.conflicts)"B"===e[null!==(o=i.name)&&void 0!==o?o:""]&&(t[null!==(d=i.name)&&void 0!==d?d:""]=a);return t}(h(this.fields,this.currentRecord,this.candidate),this.resolutions),t=null!==(o=null===(i=null===(e=null===(r=this.candidate)||void 0===r?void 0:r._links)||void 0===e?void 0:e.self)||void 0===i?void 0:i.href)&&void 0!==o?o:"";this.mrdMerge.emit({winnerHref:this.currentHref,loserHref:t,patch:d})}}connectedCallback(){this.historyClickOutside=r=>{this.el.contains(r.target)||(this.openHistoryKey=null)},document.addEventListener("mousedown",this.historyClickOutside)}disconnectedCallback(){this.historyClickOutside&&(document.removeEventListener("mousedown",this.historyClickOutside),this.historyClickOutside=null)}async setSearchResults(r){this.searchResults=(null!=r?r:[]).filter((r=>{var e,i,o;return(null!==(o=null===(i=null===(e=null==r?void 0:r._links)||void 0===e?void 0:e.self)||void 0===i?void 0:i.href)&&void 0!==o?o:null)!==this.currentHref})),this.isLoading=!1}async setLoading(r){this.isLoading=r}render(){var e,i;let d;if("search"===this.step)d=r(b,{key:"3adb36fb46aa7260641a46a2cf27cc0ef320876f",locale:this.locale,searchQuery:this.searchQuery,searchResults:this.searchResults,isLoading:this.isLoading,onSearchInput:this.handleSearchInput,onSelect:this.handleSelect});else{const o=h(this.fields,this.currentRecord,this.candidate),t=_(this.candidate);d="compare"===this.step?r(f,{locale:this.locale,currentLabel:this.currentLabel,candidateLabel:t,conflicts:o.conflicts,autoFilled:o.autoFilled,recordA:this.currentRecord,recordB:null!==(e=this.candidate)&&void 0!==e?e:{},resolutions:this.resolutions,openHistoryKey:this.openHistoryKey,onResolve:this.handleResolve,onToggleHistory:this.handleToggleHistory,onChangeCandidate:this.handleChangeCandidate,onContinue:this.handleContinue}):r(y,{locale:this.locale,candidateLabel:t,conflicts:o.conflicts,autoFilled:o.autoFilled,resolutions:this.resolutions,recordB:null!==(i=this.candidate)&&void 0!==i?i:{},openHistoryKey:this.openHistoryKey,onToggleHistory:this.handleToggleHistory,onBack:this.handleBack,onConfirm:this.handleConfirm})}return r(o,{key:"e33a6d66a220b28cc9533da78dc274e2d7ec5c4a"},r("div",{key:"b5fb1390d86192f9f6f15e3ccb89e2d21d9c7c8b",class:"mrd-merge-view"},d))}get el(){return d(this)}};k.style=".sc-mrd-merge-view-h{display:block;width:100%}.mrd-merge-view.sc-mrd-merge-view{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-900)}.mrd-merge-view__hint.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);color:var(--mrd-color-neutral-600)}.mrd-merge-view__heading.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);font-size:var(--mrd-font-size-lg);font-weight:var(--mrd-font-weight-semibold)}.mrd-merge-view__search-wrapper.sc-mrd-merge-view{position:relative;display:flex;align-items:center}.mrd-merge-view__search.sc-mrd-merge-view{width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);background:var(--mrd-input-bg);color:var(--mrd-input-color);font-size:var(--mrd-font-size-sm)}.mrd-merge-view__search.sc-mrd-merge-view:focus{outline:none;border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-merge-view__spinner.sc-mrd-merge-view{position:absolute;right:var(--mrd-space-3);width:1rem;height:1rem;border:2px solid var(--mrd-color-neutral-300);border-top-color:var(--mrd-color-primary);border-radius:var(--mrd-border-radius-full);animation:mrd-merge-view-spin var(--mrd-transition-slow) linear infinite}.mrd-merge-view__results.sc-mrd-merge-view{margin-top:var(--mrd-space-2);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);overflow:hidden}.mrd-merge-view__no-results.sc-mrd-merge-view{padding:var(--mrd-space-3) var(--mrd-space-4);color:var(--mrd-color-neutral-500)}.mrd-merge-view__result-item.sc-mrd-merge-view{display:flex;align-items:center;justify-content:space-between;gap:var(--mrd-space-3);padding:var(--mrd-space-2) var(--mrd-space-4)}.mrd-merge-view__result-item.sc-mrd-merge-view:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-border-color)}.mrd-merge-view__result-label.sc-mrd-merge-view{font-weight:var(--mrd-font-weight-medium)}.mrd-merge-view__no-conflicts.sc-mrd-merge-view{color:var(--mrd-color-neutral-600)}.mrd-merge-view__table.sc-mrd-merge-view{width:100%;border-collapse:collapse;margin-bottom:var(--mrd-space-4)}.mrd-merge-view__header.sc-mrd-merge-view{text-align:left;padding:var(--mrd-space-2) var(--mrd-space-3);border-bottom:2px solid var(--mrd-border-color);font-size:var(--mrd-font-size-xs);text-transform:uppercase;letter-spacing:0.04em;color:var(--mrd-color-neutral-600)}.mrd-merge-view__header-name.sc-mrd-merge-view{display:block;text-transform:none;letter-spacing:normal;font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-900);margin-top:var(--mrd-space-1)}.mrd-merge-view__row.sc-mrd-merge-view:nth-child(even){background:var(--mrd-color-neutral-50)}.mrd-merge-view__cell.sc-mrd-merge-view{padding:var(--mrd-space-2) var(--mrd-space-3);border-bottom:var(--mrd-border-width) solid var(--mrd-border-color);vertical-align:top}.mrd-merge-view__cell--label.sc-mrd-merge-view{font-weight:var(--mrd-font-weight-medium);white-space:nowrap}.mrd-merge-view__option.sc-mrd-merge-view{display:flex;align-items:flex-start;gap:var(--mrd-space-2);cursor:pointer}.mrd-merge-view__option.sc-mrd-merge-view input[type=radio].sc-mrd-merge-view{margin-top:0.2em}.mrd-merge-view__history-wrap.sc-mrd-merge-view{position:relative;display:inline-flex;align-items:center;margin-left:var(--mrd-space-1)}.mrd-merge-view__history-btn.sc-mrd-merge-view{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-merge-view__history-btn.sc-mrd-merge-view:hover{color:var(--mrd-color-neutral-700);background-color:var(--mrd-color-neutral-100)}.mrd-merge-view__history-btn.sc-mrd-merge-view:focus{outline:none;box-shadow:var(--mrd-shadow-focus)}.mrd-merge-view__history-icon.sc-mrd-merge-view{width:0.875rem;height:0.875rem}.mrd-merge-view__history-popover.sc-mrd-merge-view{position:absolute;top:calc(100% + 0.25rem);left:0;min-width:18rem;max-width:18rem;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-merge-view__history-entry.sc-mrd-merge-view{font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-700);padding:var(--mrd-space-2) var(--mrd-space-3);line-height:var(--mrd-line-height-normal)}.mrd-merge-view__history-entry.sc-mrd-merge-view:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-color-neutral-100)}.mrd-merge-view__auto-note.sc-mrd-merge-view{margin-bottom:var(--mrd-space-4);padding:var(--mrd-space-3) var(--mrd-space-4);background:var(--mrd-color-neutral-50);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);color:var(--mrd-color-neutral-700)}.mrd-merge-view__auto-note.sc-mrd-merge-view p.sc-mrd-merge-view{margin:0 0 var(--mrd-space-1);font-weight:var(--mrd-font-weight-medium)}.mrd-merge-view__auto-note.sc-mrd-merge-view ul.sc-mrd-merge-view{margin:0;padding-left:var(--mrd-space-5)}.mrd-merge-view__summary-list.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);padding-left:var(--mrd-space-5)}.mrd-merge-view__warning.sc-mrd-merge-view{padding:var(--mrd-space-3) var(--mrd-space-4);background:var(--mrd-color-danger-light);border:var(--mrd-border-width) solid var(--mrd-color-danger);border-radius:var(--mrd-border-radius);color:var(--mrd-color-danger-dark);margin-bottom:var(--mrd-space-4)}.mrd-merge-view__actions.sc-mrd-merge-view{display:flex;gap:var(--mrd-space-3)}.mrd-merge-view__btn.sc-mrd-merge-view{height:var(--mrd-input-height-sm);padding:0 var(--mrd-space-4);border-radius:var(--mrd-border-radius);border:var(--mrd-border-width) solid transparent;font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);cursor:pointer;transition:background-color var(--mrd-transition-fast), border-color var(--mrd-transition-fast)}.mrd-merge-view__btn--primary.sc-mrd-merge-view{background:var(--mrd-color-primary);color:var(--mrd-color-white)}.mrd-merge-view__btn--primary.sc-mrd-merge-view:hover{background:var(--mrd-color-primary-hover)}.mrd-merge-view__btn--secondary.sc-mrd-merge-view{background:var(--mrd-color-white);border-color:var(--mrd-border-color);color:var(--mrd-color-neutral-700)}.mrd-merge-view__btn--secondary.sc-mrd-merge-view:hover{background:var(--mrd-color-neutral-50)}.mrd-merge-view__btn--danger.sc-mrd-merge-view{background:var(--mrd-color-danger);color:var(--mrd-color-white)}.mrd-merge-view__btn--danger.sc-mrd-merge-view:hover{background:var(--mrd-color-danger-dark)}@keyframes mrd-merge-view-spin{to{transform:rotate(360deg)}}";export{k as mrd_merge_view}
|
|
1
|
+
import{h as r,r as e,c as i,H as o,g as d}from"./p-CDiBvvJU.js";import{a as t}from"./p-Bc42CfJB.js";import{t as a,C as s,a as m}from"./p-D5ZPfX3-.js";function n(r){return r.type===t.FIELD||r.type===t.RELATION&&!r.multiple}function l(r,e){var i,o,d,a,s;const m=null!==(i=r.name)&&void 0!==i?i:"";return r.type===t.RELATION?null!==(a=null===(d=null===(o=null==e?void 0:e._links)||void 0===o?void 0:o[m])||void 0===d?void 0:d.href)&&void 0!==a?a:null:null!==(s=null==e?void 0:e[m])&&void 0!==s?s:null}function c(r,e){return r.historyEnabled&&null!=e&&"object"==typeof e&&!Array.isArray(e)&&"current"in e?e.current:e}function v(r){return void 0===r||""===r?null:r}function g(r,e){const i=v(r),o=v(e);return i===o||null!==i&&null!==o&&JSON.stringify(i)===JSON.stringify(o)}function u(r){return null===v(r)}function h(r,e,i){const o=[],d=[];for(const t of r.filter(n)){const r=l(t,e),a=l(t,i),s=c(t,r),m=c(t,a);g(s,m)||(u(s)&&!u(m)?d.push({item:t,aValue:r,bValue:a}):o.push({item:t,aValue:r,bValue:a}))}return{conflicts:o,autoFilled:d}}function _(r){var e,i,o,d,t;return null!==(t=null!==(i=null!==(e=null==r?void 0:r.name)&&void 0!==e?e:null==r?void 0:r.label)&&void 0!==i?i:null===(d=null===(o=null==r?void 0:r._links)||void 0===o?void 0:o.self)||void 0===d?void 0:d.href)&&void 0!==t?t:""}function w(r,e){var i,o;return r.historyEnabled&&r.name&&null!==(o=null===(i=null==e?void 0:e[r.name])||void 0===i?void 0:i.history)&&void 0!==o?o:[]}const p=({locale:e,history:i,isOpen:o,onToggle:d})=>{if(0===i.length)return null;const t=[...i].sort(((r,e)=>e.until.localeCompare(r.until)));return r("span",{class:"mrd-merge-view__history-wrap"},r("button",{type:"button",class:"mrd-merge-view__history-btn",title:a("history_badge_tooltip",e),"aria-label":a("history_badge_tooltip",e),onClick:r=>{r.stopPropagation(),d()}},r("svg",{class:"mrd-merge-view__history-icon",viewBox:"0 0 20 20",fill:"currentColor","aria-hidden":"true"},r("path",{"fill-rule":"evenodd",d:"M10 18a8 8 0 100-16 8 8 0 000 16zm.75-13a.75.75 0 00-1.5 0v5c0 .207.085.394.22.53l2.5 2.5a.75.75 0 101.06-1.06L10.75 9.69V5z","clip-rule":"evenodd"}))),o&&r("div",{class:"mrd-merge-view__history-popover",role:"listbox"},t.map(((i,o)=>r("div",{key:String(o),class:"mrd-merge-view__history-entry"},i.value," (",a("history_until",e)," ",m(i.until,e),")")))))},b=({locale:e,searchQuery:i,searchResults:o,isLoading:d,onSearchInput:t,onSelect:s})=>r("div",{class:"mrd-merge-view__search-step"},r("p",{class:"mrd-merge-view__hint"},a("merge_search_hint",e)),r("div",{class:"mrd-merge-view__search-wrapper"},r("input",{class:"mrd-merge-view__search",type:"text",value:i,placeholder:a("search_placeholder",e),onInput:r=>t(r.target.value)}),d&&r("span",{class:"mrd-merge-view__spinner","aria-label":a("loading",e)})),i.trim().length>=2&&!d&&r("div",{class:"mrd-merge-view__results"},0===o.length?r("div",{class:"mrd-merge-view__no-results"},a("no_results",e)):o.map((i=>{var o,d,t;return r("div",{key:null!==(t=null===(d=null===(o=null==i?void 0:i._links)||void 0===o?void 0:o.self)||void 0===d?void 0:d.href)&&void 0!==t?t:_(i),class:"mrd-merge-view__result-item"},r("span",{class:"mrd-merge-view__result-label"},_(i)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:()=>s(i)},a("merge_select",e)))})))),f=({locale:e,currentLabel:i,candidateLabel:o,conflicts:d,autoFilled:t,recordA:m,recordB:n,resolutions:l,openHistoryKey:c,onResolve:v,onToggleHistory:g,onChangeCandidate:u,onContinue:h})=>r("div",{class:"mrd-merge-view__compare-step"},r("h3",{class:"mrd-merge-view__heading"},a("merge_compare_heading",e)),0===d.length?r("p",{class:"mrd-merge-view__no-conflicts"},a("merge_no_conflicts",e)):r("table",{class:"mrd-merge-view__table"},r("thead",null,r("tr",null,r("th",{class:"mrd-merge-view__header"}),r("th",{class:"mrd-merge-view__header"},a("merge_column_a",e),r("span",{class:"mrd-merge-view__header-name"},i)),r("th",{class:"mrd-merge-view__header"},a("merge_column_b",e),r("span",{class:"mrd-merge-view__header-name"},o)))),r("tbody",null,d.map((({item:i})=>{var o,d,t;const a=null!==(o=i.name)&&void 0!==o?o:"",u=null!==(d=l[a])&&void 0!==d?d:"A",h=w(i,m),_=w(i,n),b=`${a}:A`,f=`${a}:B`;return r("tr",{key:a,class:"mrd-merge-view__row"},r("td",{class:"mrd-merge-view__cell mrd-merge-view__cell--label"},null!==(t=i.label)&&void 0!==t?t:a),r("td",{class:"mrd-merge-view__cell"},r("label",{class:"mrd-merge-view__option"},r("input",{type:"radio",name:`merge-${a}`,checked:"A"===u,onChange:()=>v(a,"A")}),r("span",null,s.render(i,m,e)||"—")),r(p,{locale:e,history:h,isOpen:c===b,onToggle:()=>g(c===b?null:b)})),r("td",{class:"mrd-merge-view__cell"},r("label",{class:"mrd-merge-view__option"},r("input",{type:"radio",name:`merge-${a}`,checked:"B"===u,onChange:()=>v(a,"B")}),r("span",null,s.render(i,n,e)||"—")),r(p,{locale:e,history:_,isOpen:c===f,onToggle:()=>g(c===f?null:f)})))})))),t.length>0&&r("div",{class:"mrd-merge-view__auto-note"},r("p",null,a("merge_auto_heading",e)),r("ul",null,t.map((({item:e})=>{var i;return r("li",{key:e.name},null!==(i=e.label)&&void 0!==i?i:e.name)})))),r("div",{class:"mrd-merge-view__actions"},r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:u},a("merge_back",e)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--primary",onClick:h},a("merge_continue",e)))),y=({locale:e,candidateLabel:i,conflicts:o,autoFilled:d,resolutions:t,recordB:m,openHistoryKey:n,onToggleHistory:l,onBack:c,onConfirm:v})=>{const g=[...d,...o.filter((({item:r})=>{var e;return"B"===t[null!==(e=r.name)&&void 0!==e?e:""]}))];return r("div",{class:"mrd-merge-view__confirm-step"},r("h3",{class:"mrd-merge-view__heading"},a("merge_confirm_heading",e)),0===g.length?r("p",{class:"mrd-merge-view__no-conflicts"},a("merge_no_conflicts",e)):r("ul",{class:"mrd-merge-view__summary-list"},g.map((({item:i})=>{var o;const d=`${i.name}:confirm`;return r("li",{key:i.name},null!==(o=i.label)&&void 0!==o?o:i.name,": ",s.render(i,m,e)||"—",r(p,{locale:e,history:w(i,m),isOpen:n===d,onToggle:()=>l(n===d?null:d)}))}))),r("p",{class:"mrd-merge-view__warning"},a("merge_confirm_warning",e)," (",i,")"),r("div",{class:"mrd-merge-view__actions"},r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--secondary",onClick:c},a("merge_back",e)),r("button",{type:"button",class:"mrd-merge-view__btn mrd-merge-view__btn--danger",onClick:v},a("merge_confirm_button",e))))},k=class{constructor(r){e(this,r),this.mrdSearch=i(this,"mrdSearch"),this.mrdMerge=i(this,"mrdMerge"),this.locale=navigator.language,this.basicType="",this.mostSignificantClass="",this.fields=[],this.currentHref="",this.currentRecord={},this.currentLabel="",this.step="search",this.searchQuery="",this.searchResults=[],this.isLoading=!1,this.candidate=null,this.resolutions={},this.openHistoryKey=null,this.historyClickOutside=null,this.searchDebounce=null,this.handleSearchInput=r=>{this.searchQuery=r,this.searchDebounce&&clearTimeout(this.searchDebounce),r.trim().length>=2?(this.isLoading=!0,this.searchDebounce=setTimeout((()=>{this.mrdSearch.emit({query:r,basicType:this.basicType,mostSignificantClass:this.mostSignificantClass||void 0})}),300)):(this.searchResults=[],this.isLoading=!1)},this.handleSelect=r=>{this.candidate=r;const{conflicts:e}=h(this.fields,this.currentRecord,r),i={};e.forEach((({item:r})=>{var e;i[null!==(e=r.name)&&void 0!==e?e:""]="A"})),this.resolutions=i,this.openHistoryKey=null,this.step="compare"},this.handleChangeCandidate=()=>{this.candidate=null,this.resolutions={},this.openHistoryKey=null,this.step="search"},this.handleResolve=(r,e)=>{this.resolutions=Object.assign(Object.assign({},this.resolutions),{[r]:e})},this.handleToggleHistory=r=>{this.openHistoryKey=r},this.handleContinue=()=>{this.step="confirm"},this.handleBack=()=>{this.step="compare"},this.handleConfirm=()=>{var r,e,i,o;if(!this.candidate)return;const d=function(r,e){var i,o,d;const t={};for(const{item:e,bValue:o}of r.autoFilled)t[null!==(i=e.name)&&void 0!==i?i:""]=o;for(const{item:i,bValue:a}of r.conflicts)"B"===e[null!==(o=i.name)&&void 0!==o?o:""]&&(t[null!==(d=i.name)&&void 0!==d?d:""]=a);return t}(h(this.fields,this.currentRecord,this.candidate),this.resolutions),t=null!==(o=null===(i=null===(e=null===(r=this.candidate)||void 0===r?void 0:r._links)||void 0===e?void 0:e.self)||void 0===i?void 0:i.href)&&void 0!==o?o:"";this.mrdMerge.emit({winnerHref:this.currentHref,loserHref:t,patch:d})}}connectedCallback(){this.historyClickOutside=r=>{this.el.contains(r.target)||(this.openHistoryKey=null)},document.addEventListener("mousedown",this.historyClickOutside)}disconnectedCallback(){this.historyClickOutside&&(document.removeEventListener("mousedown",this.historyClickOutside),this.historyClickOutside=null)}async setSearchResults(r){this.searchResults=(null!=r?r:[]).filter((r=>{var e,i,o;return(null!==(o=null===(i=null===(e=null==r?void 0:r._links)||void 0===e?void 0:e.self)||void 0===i?void 0:i.href)&&void 0!==o?o:null)!==this.currentHref})),this.isLoading=!1}async setLoading(r){this.isLoading=r}render(){var e,i;let d;if("search"===this.step)d=r(b,{key:"3adb36fb46aa7260641a46a2cf27cc0ef320876f",locale:this.locale,searchQuery:this.searchQuery,searchResults:this.searchResults,isLoading:this.isLoading,onSearchInput:this.handleSearchInput,onSelect:this.handleSelect});else{const o=h(this.fields,this.currentRecord,this.candidate),t=_(this.candidate);d="compare"===this.step?r(f,{locale:this.locale,currentLabel:this.currentLabel,candidateLabel:t,conflicts:o.conflicts,autoFilled:o.autoFilled,recordA:this.currentRecord,recordB:null!==(e=this.candidate)&&void 0!==e?e:{},resolutions:this.resolutions,openHistoryKey:this.openHistoryKey,onResolve:this.handleResolve,onToggleHistory:this.handleToggleHistory,onChangeCandidate:this.handleChangeCandidate,onContinue:this.handleContinue}):r(y,{locale:this.locale,candidateLabel:t,conflicts:o.conflicts,autoFilled:o.autoFilled,resolutions:this.resolutions,recordB:null!==(i=this.candidate)&&void 0!==i?i:{},openHistoryKey:this.openHistoryKey,onToggleHistory:this.handleToggleHistory,onBack:this.handleBack,onConfirm:this.handleConfirm})}return r(o,{key:"e33a6d66a220b28cc9533da78dc274e2d7ec5c4a"},r("div",{key:"b5fb1390d86192f9f6f15e3ccb89e2d21d9c7c8b",class:"mrd-merge-view"},d))}get el(){return d(this)}};k.style=".sc-mrd-merge-view-h{display:block;width:100%}.mrd-merge-view.sc-mrd-merge-view{font-family:var(--mrd-font-family);font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-900)}.mrd-merge-view__hint.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);color:var(--mrd-color-neutral-600)}.mrd-merge-view__heading.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);font-size:var(--mrd-font-size-lg);font-weight:var(--mrd-font-weight-semibold)}.mrd-merge-view__search-wrapper.sc-mrd-merge-view{position:relative;display:flex;align-items:center}.mrd-merge-view__search.sc-mrd-merge-view{width:100%;height:var(--mrd-input-height);padding:var(--mrd-input-padding-y) var(--mrd-input-padding-x);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);background:var(--mrd-input-bg);color:var(--mrd-input-color);font-size:var(--mrd-font-size-sm)}.mrd-merge-view__search.sc-mrd-merge-view:focus{outline:none;border-color:var(--mrd-border-color-focus);box-shadow:var(--mrd-shadow-focus)}.mrd-merge-view__spinner.sc-mrd-merge-view{position:absolute;right:var(--mrd-space-3);width:1rem;height:1rem;border:2px solid var(--mrd-color-neutral-300);border-top-color:var(--mrd-color-primary);border-radius:var(--mrd-border-radius-full);animation:mrd-merge-view-spin var(--mrd-transition-slow) linear infinite}.mrd-merge-view__results.sc-mrd-merge-view{margin-top:var(--mrd-space-2);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);overflow:hidden}.mrd-merge-view__no-results.sc-mrd-merge-view{padding:var(--mrd-space-3) var(--mrd-space-4);color:var(--mrd-color-neutral-500)}.mrd-merge-view__result-item.sc-mrd-merge-view{display:flex;align-items:center;justify-content:space-between;gap:var(--mrd-space-3);padding:var(--mrd-space-2) var(--mrd-space-4)}.mrd-merge-view__result-item.sc-mrd-merge-view:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-border-color)}.mrd-merge-view__result-label.sc-mrd-merge-view{font-weight:var(--mrd-font-weight-medium)}.mrd-merge-view__no-conflicts.sc-mrd-merge-view{color:var(--mrd-color-neutral-600)}.mrd-merge-view__table.sc-mrd-merge-view{width:100%;border-collapse:collapse;margin-bottom:var(--mrd-space-4)}.mrd-merge-view__header.sc-mrd-merge-view{text-align:left;padding:var(--mrd-space-2) var(--mrd-space-3);border-bottom:2px solid var(--mrd-border-color);font-size:var(--mrd-font-size-xs);text-transform:uppercase;letter-spacing:0.04em;color:var(--mrd-color-neutral-600)}.mrd-merge-view__header-name.sc-mrd-merge-view{display:block;text-transform:none;letter-spacing:normal;font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);color:var(--mrd-color-neutral-900);margin-top:var(--mrd-space-1)}.mrd-merge-view__row.sc-mrd-merge-view:nth-child(even){background:var(--mrd-color-neutral-50)}.mrd-merge-view__cell.sc-mrd-merge-view{padding:var(--mrd-space-2) var(--mrd-space-3);border-bottom:var(--mrd-border-width) solid var(--mrd-border-color);vertical-align:top}.mrd-merge-view__cell--label.sc-mrd-merge-view{font-weight:var(--mrd-font-weight-medium);white-space:nowrap}.mrd-merge-view__option.sc-mrd-merge-view{display:flex;align-items:flex-start;gap:var(--mrd-space-2);cursor:pointer}.mrd-merge-view__option.sc-mrd-merge-view input[type=radio].sc-mrd-merge-view{margin-top:0.2em}.mrd-merge-view__history-wrap.sc-mrd-merge-view{position:relative;display:inline-flex;align-items:center;margin-left:var(--mrd-space-1)}.mrd-merge-view__history-btn.sc-mrd-merge-view{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-merge-view__history-btn.sc-mrd-merge-view:hover{color:var(--mrd-color-neutral-700);background-color:var(--mrd-color-neutral-100)}.mrd-merge-view__history-btn.sc-mrd-merge-view:focus{outline:none;box-shadow:var(--mrd-shadow-focus)}.mrd-merge-view__history-icon.sc-mrd-merge-view{width:0.875rem;height:0.875rem}.mrd-merge-view__history-popover.sc-mrd-merge-view{position:absolute;top:calc(100% + 0.25rem);left:0;min-width:18rem;max-width:18rem;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-merge-view__history-entry.sc-mrd-merge-view{font-size:var(--mrd-font-size-sm);color:var(--mrd-color-neutral-700);padding:var(--mrd-space-2) var(--mrd-space-3);line-height:var(--mrd-line-height-normal)}.mrd-merge-view__history-entry.sc-mrd-merge-view:not(:last-child){border-bottom:var(--mrd-border-width) solid var(--mrd-color-neutral-100)}.mrd-merge-view__auto-note.sc-mrd-merge-view{margin-bottom:var(--mrd-space-4);padding:var(--mrd-space-3) var(--mrd-space-4);background:var(--mrd-color-neutral-50);border:var(--mrd-border-width) solid var(--mrd-border-color);border-radius:var(--mrd-border-radius);color:var(--mrd-color-neutral-700)}.mrd-merge-view__auto-note.sc-mrd-merge-view p.sc-mrd-merge-view{margin:0 0 var(--mrd-space-1);font-weight:var(--mrd-font-weight-medium)}.mrd-merge-view__auto-note.sc-mrd-merge-view ul.sc-mrd-merge-view{margin:0;padding-left:var(--mrd-space-5)}.mrd-merge-view__summary-list.sc-mrd-merge-view{margin:0 0 var(--mrd-space-4);padding-left:var(--mrd-space-5)}.mrd-merge-view__warning.sc-mrd-merge-view{padding:var(--mrd-space-3) var(--mrd-space-4);background:var(--mrd-color-danger-light);border:var(--mrd-border-width) solid var(--mrd-color-danger);border-radius:var(--mrd-border-radius);color:var(--mrd-color-danger-dark);margin-bottom:var(--mrd-space-4)}.mrd-merge-view__actions.sc-mrd-merge-view{display:flex;gap:var(--mrd-space-3)}.mrd-merge-view__btn.sc-mrd-merge-view{height:var(--mrd-input-height-sm);padding:0 var(--mrd-space-4);border-radius:var(--mrd-border-radius);border:var(--mrd-border-width) solid transparent;font-size:var(--mrd-font-size-sm);font-weight:var(--mrd-font-weight-medium);cursor:pointer;transition:background-color var(--mrd-transition-fast), border-color var(--mrd-transition-fast)}.mrd-merge-view__btn--primary.sc-mrd-merge-view{background:var(--mrd-color-primary);color:var(--mrd-color-white)}.mrd-merge-view__btn--primary.sc-mrd-merge-view:hover{background:var(--mrd-color-primary-hover)}.mrd-merge-view__btn--secondary.sc-mrd-merge-view{background:var(--mrd-color-white);border-color:var(--mrd-border-color);color:var(--mrd-color-neutral-700)}.mrd-merge-view__btn--secondary.sc-mrd-merge-view:hover{background:var(--mrd-color-neutral-50)}.mrd-merge-view__btn--danger.sc-mrd-merge-view{background:var(--mrd-color-danger);color:var(--mrd-color-white)}.mrd-merge-view__btn--danger.sc-mrd-merge-view:hover{background:var(--mrd-color-danger-dark)}@keyframes mrd-merge-view-spin{to{transform:rotate(360deg)}}";export{k as mrd_merge_view}
|
|
@@ -29,6 +29,10 @@ export declare class MrdDocumentContainer {
|
|
|
29
29
|
* on top, Finder-style. The table manages its own height. */
|
|
30
30
|
height: number;
|
|
31
31
|
locale: string;
|
|
32
|
+
/** When true, this dashboard is read-only: New folder and Upload are disabled
|
|
33
|
+
* (with a tooltip explaining why) and the embedded table/list get it passed
|
|
34
|
+
* through so their own create/upload/drag-drop paths are disabled too. */
|
|
35
|
+
readOnly: boolean;
|
|
32
36
|
/** Re-emitted from the embedded list/table. `nodeId` present for a folder load. */
|
|
33
37
|
mrdLoadPage: EventEmitter<{
|
|
34
38
|
page: number;
|
|
@@ -33,6 +33,11 @@ export declare class MrdDocumentList {
|
|
|
33
33
|
* accepts file drops and folder creation. */
|
|
34
34
|
containerHref: string;
|
|
35
35
|
locale: string;
|
|
36
|
+
/** When true, folder creation, file upload (button and drag-drop) and moving a
|
|
37
|
+
* document between folders are all disabled — a viewer-role user can browse
|
|
38
|
+
* but not mutate anything. Drives mrdCanCreate(false) so the host toolbar's
|
|
39
|
+
* New folder / Upload buttons stay disabled too. */
|
|
40
|
+
readOnly: boolean;
|
|
36
41
|
/** Request distinct values for a field/relation. Host fetches `{path}?{qs}` and calls `setDistinct(nodeId, values)`. */
|
|
37
42
|
mrdLoadDistinct: EventEmitter<{
|
|
38
43
|
nodeId: string;
|
|
@@ -181,7 +186,7 @@ export declare class MrdDocumentList {
|
|
|
181
186
|
private resolveTarget;
|
|
182
187
|
private get canCreateFolder();
|
|
183
188
|
/** Start creating a folder under the current target. Called by the host toolbar
|
|
184
|
-
* (mrd-document-container). No-op when there is no valid target. */
|
|
189
|
+
* (mrd-document-container). No-op when there is no valid target, or read-only. */
|
|
185
190
|
createFolder(): Promise<void>;
|
|
186
191
|
private startCreateFolder;
|
|
187
192
|
private onPendingInput;
|
|
@@ -18,6 +18,10 @@ export declare class MrdLayoutSection {
|
|
|
18
18
|
/** Top-level archetypes on the object dashboard. When it contains commons.document,
|
|
19
19
|
* the record is rendered as a single-document view instead of generic fields. */
|
|
20
20
|
archetypes: ClientArchetype[];
|
|
21
|
+
/** When true, this dashboard is read-only (viewer role): the embedded mrd-table's
|
|
22
|
+
* create ("+") action and the documents view's New folder / Upload are disabled
|
|
23
|
+
* with a tooltip explaining why, so it's clear at a glance the user can't mutate data. */
|
|
24
|
+
readOnly: boolean;
|
|
21
25
|
private searchQueryMap;
|
|
22
26
|
private searchResultsMap;
|
|
23
27
|
private imagePreviewUrl;
|
|
@@ -19,6 +19,10 @@ export declare class MrdTable {
|
|
|
19
19
|
private resizeObserver;
|
|
20
20
|
/** Guards against scheduling more than one column-width measurement per freeze. */
|
|
21
21
|
private colWidthMeasureScheduled;
|
|
22
|
+
/** True once the header/totals widths have been checked against the current totals row. */
|
|
23
|
+
private fixedContentMeasured;
|
|
24
|
+
/** Guards against scheduling more than one grow pass. */
|
|
25
|
+
private growScheduled;
|
|
22
26
|
/** Drag origin of the running column resize (null = no drag in progress). */
|
|
23
27
|
private resizeOrigin;
|
|
24
28
|
/** True once the user has dragged (or auto-fitted) a column — see colWidthsUserSet usages. */
|
|
@@ -44,6 +48,10 @@ export declare class MrdTable {
|
|
|
44
48
|
/** Time (ms) to wait for setPage() before retrying a page request; after
|
|
45
49
|
* MAX_RETRY_ATTEMPTS retries the page is marked failed (see failedPages). */
|
|
46
50
|
requestTimeoutMs: number;
|
|
51
|
+
/** When true, the toolbar's create ("+") action is disabled (with a tooltip
|
|
52
|
+
* explaining why) so a viewer-role user can see at a glance that this dashboard
|
|
53
|
+
* is read-only. Sorting, filtering and export stay available — those don't mutate data. */
|
|
54
|
+
readOnly: boolean;
|
|
47
55
|
/** Clamp renderEnd when totalElements shrinks (e.g. after a filter is applied).
|
|
48
56
|
* 0 means "unknown" (hosts that rely on minKnownTotal never set it, and some reset it
|
|
49
57
|
* while a filter is being applied) — clamping to it would collapse the window to a
|
|
@@ -179,6 +187,14 @@ export declare class MrdTable {
|
|
|
179
187
|
* Read from scrollWidth rather than the laid-out box: cells clip with `overflow: hidden`,
|
|
180
188
|
* so a squeezed cell reports the width it *was given*, not the width it needs. */
|
|
181
189
|
private neededWidth;
|
|
190
|
+
/** Width a header cell needs, measured from its children instead of the cell's own
|
|
191
|
+
* scrollWidth. A header is not just text: it holds the label plus a sort icon (and a filter
|
|
192
|
+
* icon once the column is filtered), with the drag handle absolutely positioned on top of
|
|
193
|
+
* the right padding. Summing the in-flow children makes the icons part of the width by
|
|
194
|
+
* construction — and a child's own rect is never clipped by the header's `overflow: hidden`,
|
|
195
|
+
* so it stays correct even when the header is already truncated on screen.
|
|
196
|
+
* Returns 0 when nothing can be measured, so callers fall back to neededWidth(). */
|
|
197
|
+
private neededHeaderWidth;
|
|
182
198
|
/** Width each column needs for its header and its rendered page-0 cells — what the columns
|
|
183
199
|
* are locked to, so they never end up narrower than their content.
|
|
184
200
|
*
|
|
@@ -188,6 +204,20 @@ export declare class MrdTable {
|
|
|
188
204
|
* exceed the container again, and `.mrd-table__scroll` scrolls. Capped per column at
|
|
189
205
|
* MAX_AUTOFIT_WIDTH so one outlier value can't blow up the layout — same cap as auto-fit. */
|
|
190
206
|
private measureContentWidths;
|
|
207
|
+
/** Data and totals cells of one column. The totals row is included everywhere the data
|
|
208
|
+
* cells are: it is fixed, always-visible content, so it must never be clipped. */
|
|
209
|
+
private columnCellSelector;
|
|
210
|
+
/** Width the header and totals cells of each column need. Null when nothing has a box. */
|
|
211
|
+
private measureFixedContentWidths;
|
|
212
|
+
/** Widen columns whose header or totals cell does not fit. Data cells may be ellipsised —
|
|
213
|
+
* that is what the lock is for — but the header and the totals row are fixed content that
|
|
214
|
+
* is always on screen, so clipping them just hides information with no way to reveal it.
|
|
215
|
+
*
|
|
216
|
+
* It runs as a second pass because the totals only arrive with setAggregations(), long
|
|
217
|
+
* after the widths were frozen on page 0. Grow-only and once per totals change, so it can
|
|
218
|
+
* never turn into the per-page re-proportioning the lock exists to prevent. Hand-set
|
|
219
|
+
* widths are left alone. */
|
|
220
|
+
private growToFixedContent;
|
|
191
221
|
/** Re-reads the rendered header widths into colWidths so a drag starts from what is
|
|
192
222
|
* actually on screen — and locks the columns if they weren't locked yet.
|
|
193
223
|
*
|
|
@@ -55,5 +55,8 @@ export declare const Toolbar: FunctionalComponent<{
|
|
|
55
55
|
viewPopoverOpen: boolean;
|
|
56
56
|
createPickerOpen: boolean;
|
|
57
57
|
createTypes?: ClientCreateType[] | null;
|
|
58
|
+
/** True when a viewer-role user has read-only access: mutating actions are
|
|
59
|
+
* disabled and their tooltip explains why instead of just repeating the label. */
|
|
60
|
+
readOnly?: boolean;
|
|
58
61
|
cb: ToolbarCallbacks;
|
|
59
62
|
}>;
|
|
@@ -161,6 +161,11 @@ export namespace Components {
|
|
|
161
161
|
* @default ''
|
|
162
162
|
*/
|
|
163
163
|
"parentId": string;
|
|
164
|
+
/**
|
|
165
|
+
* When true, this dashboard is read-only: New folder and Upload are disabled (with a tooltip explaining why) and the embedded table/list get it passed through so their own create/upload/drag-drop paths are disabled too.
|
|
166
|
+
* @default false
|
|
167
|
+
*/
|
|
168
|
+
"readOnly": boolean;
|
|
164
169
|
/**
|
|
165
170
|
* Lookup key used for the embedded `data-doclist` / `data-view` attributes.
|
|
166
171
|
* @default ''
|
|
@@ -193,7 +198,7 @@ export namespace Components {
|
|
|
193
198
|
*/
|
|
194
199
|
"containerHref": string;
|
|
195
200
|
/**
|
|
196
|
-
* Start creating a folder under the current target. Called by the host toolbar (mrd-document-container). No-op when there is no valid target.
|
|
201
|
+
* Start creating a folder under the current target. Called by the host toolbar (mrd-document-container). No-op when there is no valid target, or read-only.
|
|
197
202
|
*/
|
|
198
203
|
"createFolder": () => Promise<void>;
|
|
199
204
|
/**
|
|
@@ -210,6 +215,11 @@ export namespace Components {
|
|
|
210
215
|
* @default ''
|
|
211
216
|
*/
|
|
212
217
|
"parentId": string;
|
|
218
|
+
/**
|
|
219
|
+
* When true, folder creation, file upload (button and drag-drop) and moving a document between folders are all disabled — a viewer-role user can browse but not mutate anything. Drives mrdCanCreate(false) so the host toolbar's New folder / Upload buttons stay disabled too.
|
|
220
|
+
* @default false
|
|
221
|
+
*/
|
|
222
|
+
"readOnly": boolean;
|
|
213
223
|
/**
|
|
214
224
|
* Host callback with the created document's self href, so the optimistic row becomes navigable without waiting for a reload.
|
|
215
225
|
*/
|
|
@@ -529,6 +539,11 @@ export namespace Components {
|
|
|
529
539
|
* Open the lightbox directly with a URL (e.g. after mrdDownload on a FILE field).
|
|
530
540
|
*/
|
|
531
541
|
"openImagePreview": (url: string) => Promise<void>;
|
|
542
|
+
/**
|
|
543
|
+
* When true, this dashboard is read-only (viewer role): the embedded mrd-table's create ("+") action and the documents view's New folder / Upload are disabled with a tooltip explaining why, so it's clear at a glance the user can't mutate data.
|
|
544
|
+
* @default false
|
|
545
|
+
*/
|
|
546
|
+
"readOnly": boolean;
|
|
532
547
|
/**
|
|
533
548
|
* Provide a resolved URL for an IMAGE field. Shows as thumbnail; clicking opens the lightbox.
|
|
534
549
|
*/
|
|
@@ -824,6 +839,11 @@ export namespace Components {
|
|
|
824
839
|
* @default ''
|
|
825
840
|
*/
|
|
826
841
|
"parentId": string;
|
|
842
|
+
/**
|
|
843
|
+
* When true, the toolbar's create ("+") action is disabled (with a tooltip explaining why) so a viewer-role user can see at a glance that this dashboard is read-only. Sorting, filtering and export stay available — those don't mutate data.
|
|
844
|
+
* @default false
|
|
845
|
+
*/
|
|
846
|
+
"readOnly": boolean;
|
|
827
847
|
/**
|
|
828
848
|
* Time (ms) to wait for setPage() before retrying a page request; after MAX_RETRY_ATTEMPTS retries the page is marked failed (see failedPages).
|
|
829
849
|
* @default 15000
|
|
@@ -1848,6 +1868,11 @@ declare namespace LocalJSX {
|
|
|
1848
1868
|
* @default ''
|
|
1849
1869
|
*/
|
|
1850
1870
|
"parentId"?: string;
|
|
1871
|
+
/**
|
|
1872
|
+
* When true, this dashboard is read-only: New folder and Upload are disabled (with a tooltip explaining why) and the embedded table/list get it passed through so their own create/upload/drag-drop paths are disabled too.
|
|
1873
|
+
* @default false
|
|
1874
|
+
*/
|
|
1875
|
+
"readOnly"?: boolean;
|
|
1851
1876
|
/**
|
|
1852
1877
|
* Lookup key used for the embedded `data-doclist` / `data-view` attributes.
|
|
1853
1878
|
* @default ''
|
|
@@ -1925,6 +1950,11 @@ declare namespace LocalJSX {
|
|
|
1925
1950
|
* @default ''
|
|
1926
1951
|
*/
|
|
1927
1952
|
"parentId"?: string;
|
|
1953
|
+
/**
|
|
1954
|
+
* When true, folder creation, file upload (button and drag-drop) and moving a document between folders are all disabled — a viewer-role user can browse but not mutate anything. Drives mrdCanCreate(false) so the host toolbar's New folder / Upload buttons stay disabled too.
|
|
1955
|
+
* @default false
|
|
1956
|
+
*/
|
|
1957
|
+
"readOnly"?: boolean;
|
|
1928
1958
|
}
|
|
1929
1959
|
/**
|
|
1930
1960
|
* Archetype-driven single-document view. Given a `commons.document` binding and a
|
|
@@ -2320,6 +2350,11 @@ declare namespace LocalJSX {
|
|
|
2320
2350
|
* An external file was dropped on a document view; host uploads and calls setViewFileReference(name, uri).
|
|
2321
2351
|
*/
|
|
2322
2352
|
"onMrdViewUpload"?: (event: MrdLayoutSectionCustomEvent<{ name: string; file: File }>) => void;
|
|
2353
|
+
/**
|
|
2354
|
+
* When true, this dashboard is read-only (viewer role): the embedded mrd-table's create ("+") action and the documents view's New folder / Upload are disabled with a tooltip explaining why, so it's clear at a glance the user can't mutate data.
|
|
2355
|
+
* @default false
|
|
2356
|
+
*/
|
|
2357
|
+
"readOnly"?: boolean;
|
|
2323
2358
|
/**
|
|
2324
2359
|
* Legacy: view metadata map (ClientDashboardMetadata.views). Not needed in new flat format.
|
|
2325
2360
|
* @default {}
|
|
@@ -2613,6 +2648,11 @@ declare namespace LocalJSX {
|
|
|
2613
2648
|
* @default ''
|
|
2614
2649
|
*/
|
|
2615
2650
|
"parentId"?: string;
|
|
2651
|
+
/**
|
|
2652
|
+
* When true, the toolbar's create ("+") action is disabled (with a tooltip explaining why) so a viewer-role user can see at a glance that this dashboard is read-only. Sorting, filtering and export stay available — those don't mutate data.
|
|
2653
|
+
* @default false
|
|
2654
|
+
*/
|
|
2655
|
+
"readOnly"?: boolean;
|
|
2616
2656
|
/**
|
|
2617
2657
|
* Time (ms) to wait for setPage() before retrying a page request; after MAX_RETRY_ATTEMPTS retries the page is marked failed (see failedPages).
|
|
2618
2658
|
* @default 15000
|
|
@@ -2769,11 +2809,13 @@ declare namespace LocalJSX {
|
|
|
2769
2809
|
"viewKey": string;
|
|
2770
2810
|
"height": number;
|
|
2771
2811
|
"locale": string;
|
|
2812
|
+
"readOnly": boolean;
|
|
2772
2813
|
}
|
|
2773
2814
|
interface MrdDocumentListAttributes {
|
|
2774
2815
|
"parentId": string;
|
|
2775
2816
|
"containerHref": string;
|
|
2776
2817
|
"locale": string;
|
|
2818
|
+
"readOnly": boolean;
|
|
2777
2819
|
}
|
|
2778
2820
|
interface MrdDocumentViewAttributes {
|
|
2779
2821
|
"locale": string;
|
|
@@ -2833,6 +2875,7 @@ declare namespace LocalJSX {
|
|
|
2833
2875
|
}
|
|
2834
2876
|
interface MrdLayoutSectionAttributes {
|
|
2835
2877
|
"locale": string;
|
|
2878
|
+
"readOnly": boolean;
|
|
2836
2879
|
}
|
|
2837
2880
|
interface MrdListFieldAttributes {
|
|
2838
2881
|
"name": string;
|
|
@@ -2901,6 +2944,7 @@ declare namespace LocalJSX {
|
|
|
2901
2944
|
"rowHeight": number;
|
|
2902
2945
|
"tableHeight": number;
|
|
2903
2946
|
"requestTimeoutMs": number;
|
|
2947
|
+
"readOnly": boolean;
|
|
2904
2948
|
}
|
|
2905
2949
|
interface MrdTextFieldAttributes {
|
|
2906
2950
|
"name": string;
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cell-renderer-B8u5BCK-.js","sources":["src/utils/cell-renderer.ts"],"sourcesContent":["import { formatNumber, formatPercentage, formatCurrency, formatDate, formatDateTime, formatTime } from './format';\nimport { ClientLayoutItem, ClientLayoutItemType } from '../types/client-layout';\n\n/** TableColumn is an alias for ClientLayoutItem — used for table column definitions. */\nexport type TableColumn = ClientLayoutItem;\n\n/** One entry in the alternativeViews array for mrd-table. */\nexport interface AlternativeView {\n /** Named view identifier, emitted in mrdSwitchView. */\n name: string;\n /** Display text; falls back to name when absent. */\n label?: string;\n /** Optional class override (TypeFQN); emitted in mrdSwitchView. */\n class?: string;\n}\n\n/** Defines a toolbar action button for mrd-table. */\nexport interface TableAction {\n /** Machine-readable identifier, e.g. 'create' | 'export'. Emitted in mrdAction event. */\n action: string;\n /** Tooltip text (and label fallback when no icon is provided). */\n label: string;\n /** SVG sprite href, e.g. \"assets/sprites.svg#icon-plus\". Optional. */\n icon?: string;\n /** Button style variant. Defaults to 'secondary'. */\n variant?: 'primary' | 'secondary' | 'danger';\n disabled?: boolean;\n basicType?: string;\n}\n\n/** Represents an active filter on a single column. */\nexport interface ColumnFilter {\n field: string;\n dataType: string;\n /** Text operator — only relevant for text-like data types. */\n operator?: 'contains' | 'startsWith' | 'equals' | 'isEmpty' | 'isNotEmpty';\n /** Single value (boolean, exact text/number/date). */\n value?: string | number | boolean | null;\n /** Range start (≥) — future API support. */\n from?: string | number | null;\n /** Range end (≤) — future API support. */\n to?: string | number | null;\n /** LIST: keys of selected items to include. */\n values?: string[];\n}\n\nexport class CellRenderer {\n static render(column: TableColumn, row: Record<string, any>, locale: string): string {\n if (column.type === ClientLayoutItemType.RELATION) {\n const name = column.name ?? '';\n const link = row?._links?.[name];\n if (!link) return '';\n if (Array.isArray(link)) return link.map((l: any) => l.name ?? '').filter(Boolean).join(', ');\n return link.name ?? '';\n }\n\n if (column.type !== ClientLayoutItemType.FIELD) return '';\n\n const name = column.name ?? '';\n const dataType = column.dataType;\n const listItems = column.listItems;\n let raw = row?.[name];\n // History-enabled fields are stored as { current, history: [...] } — render\n // the current value, same as mrd-layout-section's field rendering.\n if (column.historyEnabled && raw != null && typeof raw === 'object' && !Array.isArray(raw) && 'current' in raw) {\n raw = (raw as any).current;\n }\n if (raw == null || raw === '') return '';\n\n const values = Array.isArray(raw) ? raw : [raw];\n return values\n .map(v => CellRenderer.renderValue(dataType ?? 'TEXT', v, listItems ?? [], locale))\n .filter(s => s !== '')\n .join(', ');\n }\n\n static renderValue(\n dataType: string,\n value: any,\n listItems: Array<{ key: string; label: string }>,\n locale: string,\n ): string {\n switch (dataType) {\n case 'INTEGER':\n return formatNumber(Number(value), locale, { maximumFractionDigits: 0 });\n case 'DECIMAL':\n return formatNumber(Number(value), locale);\n case 'PERCENTAGE':\n return formatPercentage(Number(value), locale);\n case 'CURRENCY': {\n const { amount, currency } = typeof value === 'object' && value !== null\n ? value\n : { amount: value, currency: '' };\n return currency\n ? formatCurrency(Number(amount), currency, locale)\n : formatNumber(Number(amount), locale);\n }\n case 'DATE':\n return formatDate(value, locale);\n case 'DATETIME':\n return formatDateTime(value, locale);\n case 'TIME':\n return formatTime(value, locale);\n case 'BOOLEAN':\n return value ? '✓' : '';\n case 'FILE':\n case 'IMAGE':\n return typeof value === 'object' && value !== null ? (value.fileName ?? '') : '';\n case 'LIST': {\n const item = listItems.find(li => li.key === String(value));\n return item?.label ?? String(value);\n }\n case 'TEXTBLOCK': {\n const stripped = String(value).replace(/<[^>]*>/g, '');\n const txt = document.createElement('textarea');\n txt.innerHTML = stripped;\n return txt.value.trim();\n }\n case 'LONGTEXT':\n return String(value).replace(/[\\r\\n]+/g, ' ').trim();\n case 'JSON': {\n const str = typeof value === 'object' ? JSON.stringify(value) : String(value);\n return str.replace(/[\\r\\n]+/g, ' ').trim();\n }\n case 'SECRET':\n return value ? '••••••••' : '';\n default:\n return String(value);\n }\n }\n\n /**\n * Returns syntax-highlighted JSON as an HTML string with inline styles.\n * compact=true → single line (no indentation); compact=false → pretty-printed.\n */\n static formatJson(value: any, compact = false): string {\n try {\n const parsed = typeof value === 'string' ? JSON.parse(value) : value;\n const json = compact ? JSON.stringify(parsed) : JSON.stringify(parsed, null, 2);\n return json.replace(\n /(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,\n match => {\n let style = 'color:#2aa198';\n if (/^\"/.test(match)) {\n style = /:$/.test(match) ? 'color:#881391' : 'color:#268bd2';\n } else if (/true|false/.test(match)) {\n style = 'color:#b58900';\n } else if (/null/.test(match)) {\n style = 'color:#dc322f';\n }\n return `<span style=\"${style}\">${match}</span>`;\n },\n );\n } catch {\n return String(value);\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client-layout-Bc42CfJB.js","sources":["src/types/client-layout.ts"],"sourcesContent":["// ─── Layout type ──────────────────────────────────────────────────────────────\n\nexport enum ClientLayoutType {\n OBJECT_FORM_DASHBOARD = 'OBJECT_FORM_DASHBOARD',\n CLASS_DASHBOARD = 'CLASS_DASHBOARD',\n GENERAL_DASHBOARD = 'GENERAL_DASHBOARD',\n NAVIGATION_PANE = 'NAVIGATION_PANE',\n}\n\n// ─── Item types ───────────────────────────────────────────────────────────────\n\nexport enum ClientLayoutItemType {\n // Form / data input\n FIELD = 'FIELD',\n RELATION = 'RELATION',\n // Layout structure\n SECTION = 'SECTION',\n GROUP = 'GROUP',\n // Read-only / display\n HEADER = 'HEADER',\n TEXT = 'TEXT',\n // Navigation / actions\n NAVIGATE = 'NAVIGATE',\n ACTION = 'ACTION',\n SEARCH = 'SEARCH',\n // Dashboard views\n VIEW = 'VIEW',\n RELATED_VIEW = 'RELATED_VIEW',\n RELATED_OBJECT = 'RELATED_OBJECT',\n}\n\n// ─── Field data types ─────────────────────────────────────────────────────────\n\nexport enum ClientLayoutItemFieldDataType {\n TEXT = 'TEXT',\n TEXTBLOCK = 'TEXTBLOCK',\n INTEGER = 'INTEGER',\n DECIMAL = 'DECIMAL',\n PERCENTAGE = 'PERCENTAGE',\n CURRENCY = 'CURRENCY',\n BOOLEAN = 'BOOLEAN',\n DATE = 'DATE',\n DATETIME = 'DATETIME',\n TIME = 'TIME',\n EMAIL = 'EMAIL',\n HYPERLINK = 'HYPERLINK',\n LIST = 'LIST',\n FILE = 'FILE',\n IMAGE = 'IMAGE',\n LONGTEXT = 'LONGTEXT',\n JSON = 'JSON',\n SECRET = 'SECRET',\n}\n\n// ─── Relation display / edit behaviour ───────────────────────────────────────\n\nexport enum ClientLayoutItemRelationDisplayType {\n SEARCH = 'SEARCH',\n DROPDOWN = 'DROPDOWN',\n CHECKBOX = 'CHECKBOX',\n}\n\nexport enum ClientLayoutItemRelationEditBehavior {\n SEARCH = 'SEARCH',\n DROPDOWN = 'DROPDOWN',\n CHECKBOX = 'CHECKBOX',\n}\n\n// ─── VIEW / RELATED_VIEW navigate behaviour ──────────────────────────────────\n\n/** How navigating from a row/document in this VIEW or RELATED_VIEW should open\n * its target: a full page navigation, or an overlay on top of the current page. */\nexport enum ClientLayoutNavigateBehaviour {\n PAGE = 'PAGE',\n OVERLAY_PAGE = 'OVERLAY_PAGE',\n}\n\n// ─── Data object link types (API _links shape) ───────────────────────────────\n\n/** A single sub-link within a multi-value relation link. */\nexport interface DataObjectSubLink {\n href: string;\n name: string;\n}\n\n/** Link object as returned by the API on a data object's `_links` map. */\nexport interface DataObjectLink {\n href: string;\n name?: string;\n values?: DataObjectSubLink[];\n}\n\n// ─── Shared value types ───────────────────────────────────────────────────────\n\n/** A selectable list item as returned by the API. */\nexport interface ClientListValue {\n /** Raw key stored in the database (API uses `key`, older code used `value`). */\n key: string;\n label: string;\n color?: string | null;\n backgroundColor?: string | null;\n}\n\nexport interface CurrencyValue {\n amount: number | null;\n currency: string;\n decimals?: number;\n}\n\nexport interface HyperlinkValue {\n href: string;\n name?: string;\n}\n\nexport interface RelationSearchResult {\n id: string;\n label: string;\n description?: string;\n}\n\n/** A single file belonging to a `commons.document`-archetype record. The host\n * resolves `href` to a signed URL and decides how (or whether) to render it\n * inline — the component only ever hands over the reference. */\nexport interface DocumentAttachment {\n href: string;\n fileName: string;\n mimeType?: string;\n}\n\n// ─── Archetypes (semantic type contracts) ────────────────────────────────────\n\n/**\n * A resolved archetype binding as published on a dashboard.\n * `archetype` is the platform-defined id (e.g. `commons.document`); `slots` maps\n * each slot name to the concrete field/relation name on this type. The client\n * keys on the archetype id and reads values from the data endpoint via the map;\n * the slot kind (value vs relation) is known from the archetype id itself and is\n * not published.\n */\nexport interface ClientArchetype {\n archetype: string;\n slots: Record<string, string>;\n}\n\n/** Well-known archetype ids the client renders specially. */\nexport const ARCHETYPE_DOCUMENT = 'commons.document';\nexport const ARCHETYPE_INVOICE = 'commons.invoice';\nexport const ARCHETYPE_EMAIL = 'commons.email';\n/** Bound by a `commons.invoice`'s `lines` relation target class. Used to find the\n * RELATED_VIEW item for the line items generically, by archetype id rather than\n * by name/class string. */\nexport const ARCHETYPE_INVOICE_LINE = 'commons.invoiceLine';\n\n/**\n * Find a binding for `archetypeId` in a published `archetypes` list.\n * Returns `undefined` when the archetype is absent — callers fall back to the\n * generic table/field rendering.\n */\nexport function resolveArchetype(\n archetypes: ClientArchetype[] | null | undefined,\n archetypeId: string,\n): ClientArchetype | undefined {\n return (archetypes ?? []).find(a => a.archetype === archetypeId);\n}\n\n// ─── Item definitions ─────────────────────────────────────────────────────────\n\nexport interface ClientLayoutItemField {\n name: string;\n label: string;\n dataType: ClientLayoutItemFieldDataType;\n required: boolean;\n disabled?: boolean;\n multiple?: boolean;\n header?: boolean;\n defaultValue?: string | null;\n listItems?: ClientListValue[] | null;\n // UI hints — optional, not sent by API\n placeholder?: string;\n accept?: string;\n maxSize?: number;\n decimalPrecision?: number;\n currencyCode?: string;\n /** Aggregate function to render in the table totals row. */\n aggregate?: 'sum' | 'avg' | 'count' | null;\n historyEnabled?: boolean;\n /** Render the item on an OBJECT_DASHBOARD even when it has no value. */\n showEmpty?: boolean;\n}\n\n/** Response shape from the /aggregations endpoint. */\nexport interface AggregationResult {\n total?: number;\n count?: Record<string, number>;\n sum?: Record<string, number>;\n avg?: Record<string, number>;\n}\n\nexport interface ClientLayoutItemRelation {\n name: string;\n label: string;\n relatedClass: string;\n mostSignificantClass?: string;\n displayType?: ClientLayoutItemRelationDisplayType;\n editBehavior?: ClientLayoutItemRelationEditBehavior | null;\n commonRelation?: string;\n required: boolean;\n disabled?: boolean;\n multiple?: boolean;\n defaultValue?: string | null;\n dropdownValues?: ClientListValue[];\n /** Render the item on an OBJECT_DASHBOARD even when it has no value. */\n showEmpty?: boolean;\n}\n\nexport interface ClientLayoutItemNavigate {\n dataClass: string;\n icon?: string | null;\n navigationType?: string | null;\n}\n\nexport interface ClientLayoutItemRelatedView {\n name: string;\n fromClass?: string | null;\n relatedClass: string;\n filterClass?: string | null;\n showTitle: boolean;\n}\n\nexport interface ClientLayoutItemRelatedObject {\n name: string;\n relatedClass: string;\n}\n\nexport interface ClientLayoutItemSearch {\n dataClass: string;\n showTitle: boolean;\n}\n\n// ─── Generic item ─────────────────────────────────────────────────────────────\n\nexport interface ClientCreateType {\n type: string;\n label: string;\n}\n\n/**\n * A single item in a ClientLayout. The `type` discriminator determines which\n * optional fields are present. Components should only act on types they\n * understand and ignore others.\n */\nexport interface ClientLayoutItem {\n type: ClientLayoutItemType;\n label?: string;\n\n // FIELD\n field?: ClientLayoutItemField;\n\n // RELATION\n relation?: ClientLayoutItemRelation;\n\n // SECTION / GROUP — nested items\n items?: ClientLayoutItem[];\n\n // NAVIGATE\n navigate?: ClientLayoutItemNavigate;\n\n // VIEW — embedded view config (new flat format)\n view?: ClientViewMetadata;\n\n // RELATED_VIEW\n relatedView?: ClientLayoutItemRelatedView;\n\n // RELATED_OBJECT\n relatedObject?: ClientLayoutItemRelatedObject;\n\n // SEARCH\n search?: ClientLayoutItemSearch;\n\n /**\n * Archetype bindings for this item. The API publishes them on the item itself\n * (sibling of `view`), for two cases:\n * - object dashboard top-level: the type of the object itself → mrd-layout-section\n * renders a recognisable single-document view instead of generic fields;\n * - a VIEW / RELATED_VIEW item: → mrd-layout-section offers the document\n * collection view (folder tree) alongside the generic table.\n */\n archetypes?: ClientArchetype[];\n\n // ─── Flat API fields ──────────────────────────────────────────────────────\n // Shared / ACTION / VIEW\n name?: string;\n showTitle?: boolean;\n /** Embedded alternative view configs (new flat format). */\n alternativeViews?: Array<{ label?: string; dataClass?: string; fromClass?: string | null; filterClass?: string | null; view?: ClientViewMetadata }>;\n /** Toolbar buttons for embedded views. null/omitted = [\"NEW\",\"EXPORT\"]; [] = none. */\n actions?: string[] | null;\n /** Concrete subtypes available for create. When set, the NEW button expands into one button per entry. */\n createTypes?: ClientCreateType[] | null;\n\n // FIELD (flat)\n dataType?: ClientLayoutItemFieldDataType;\n required?: boolean;\n disabled?: boolean;\n multiple?: boolean;\n header?: boolean;\n defaultValue?: string | null;\n listItems?: ClientListValue[] | null;\n aggregate?: 'sum' | 'avg' | 'count' | null;\n placeholder?: string;\n accept?: string;\n maxSize?: number;\n decimalPrecision?: number;\n currencyCode?: string;\n historyEnabled?: boolean;\n /** FIELD / RELATION — render the item on an OBJECT_DASHBOARD even when it has\n * no value, instead of hiding it (the default). */\n showEmpty?: boolean;\n\n // RELATION (flat)\n relatedClass?: string;\n mostSignificantClass?: string;\n displayType?: ClientLayoutItemRelationDisplayType;\n editBehavior?: ClientLayoutItemRelationEditBehavior | null;\n commonRelation?: string;\n dropdownValues?: ClientListValue[];\n\n // VIEW / NAVIGATE / SEARCH (flat) — API sends 'dataClass' (renamed from reserved 'class')\n dataClass?: string;\n\n // RELATED_VIEW (flat)\n fromClass?: string | null;\n filterClass?: string | null;\n /** Name of the relation on the related object that points back to the\n * `fromClass` parent (e.g. a document's `dossier` relation). When it equals\n * the `commons.document` archetype's `container` slot, the view is a single\n * container context (see mrd-document-list seeding). */\n inverseRelation?: string | null;\n /** How navigating out of this VIEW/RELATED_VIEW opens its target. Defaults to\n * `PAGE` (full navigation) when absent. mrd-layout-section reads this off the\n * item and includes it in the mrdNavigate event detail it relays upward. */\n navigateBehaviour?: ClientLayoutNavigateBehaviour;\n\n // NAVIGATE (flat)\n icon?: string | null;\n navigationType?: string | null;\n\n // ACTION (flat)\n actionType?: string;\n}\n\n// ─── Layout ───────────────────────────────────────────────────────────────────\n\nexport interface ClientLayout {\n type?: ClientLayoutType;\n label?: string;\n /** Used as the form title (mrd-form). */\n title?: string;\n tabPage?: boolean;\n items: ClientLayoutItem[];\n}\n\n// ─── ViewMetadata (from DashboardMetadata.views) ─────────────────────────────\n\nexport interface ViewFilter {\n name: string;\n value?: string | null;\n operator?: 'EQUALS' | 'FROM' | 'TO' | 'STARTS_WITH' | 'NOT_EMPTY' | 'EMPTY' | null;\n}\n\nexport interface ClientViewMetadata {\n name: string | null;\n defaultView: boolean;\n defaultSort?: string | null;\n /** Column definitions — each item is a FIELD or RELATION item. */\n values: ClientLayoutItem[];\n /** Static query-param filters baked into the view definition. */\n filter?: ViewFilter[] | null;\n type?: string;\n referenceType?: string | null;\n filterType?: string | null;\n singularLabel?: string;\n pluralLabel?: string;\n /**\n * Archetype bindings published on this VIEW / RELATED_VIEW item. When it\n * contains `commons.document`, mrd-layout-section offers the document\n * collection view (folder tree) alongside the generic table.\n */\n archetypes?: ClientArchetype[];\n}\n\n// ─── DashboardMetadata ────────────────────────────────────────────────────────\n\nexport interface ClientDashboardMetadata {\n layouts: ClientLayout[];\n /** Top-level archetypes on an object dashboard (the object's own type). Drives the\n * single-document view; passed to the main layout's mrd-layout-section. */\n archetypes?: ClientArchetype[];\n /** Legacy: view metadata map keyed by generated name. Absent in new flat format. */\n views?: Record<string, ClientViewMetadata>;\n layoutType: ClientLayoutType;\n _links?: Record<string, { href: string }>;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"document-attachments-BufPmMRv.js","sources":["src/utils/document-attachments.ts"],"sourcesContent":["import { ClientArchetype, DocumentAttachment } from '../types/client-layout';\n\n/**\n * Extract an archetype's file slot from a data record as a `DocumentAttachment[]` —\n * empty when the slot is unmapped or has no value. `slot` defaults to `'file'` (the\n * commons.document single-file slot); pass `'attachments'` for the multi-file slots\n * on commons.email / commons.invoice. A single-object slot value yields a one-entry\n * array, an array-valued slot yields one entry per item.\n * Shared by mrd-document-view / mrd-invoice-view / mrd-email-view (on load/data-change)\n * and mrd-document-container (row-click prefetch on mrdNavigate), so all report the\n * exact same shape.\n */\nexport function attachmentsFromRecord(\n archetype: ClientArchetype | null | undefined,\n record: Record<string, unknown> | null | undefined,\n slot: string = 'file',\n): DocumentAttachment[] {\n const field = archetype?.slots?.[slot];\n if (!field) return [];\n const raw = (record as any)?.[field];\n if (!raw) return [];\n const items = Array.isArray(raw) ? raw : [raw];\n return items.filter(Boolean).map(item => ({\n href: item.href,\n fileName: item.fileName ?? String(item),\n mimeType: item.mimeType ?? item.contentType ?? undefined,\n }));\n}\n\n/** Dedup key for the componentDidLoad/@Watch('data') \"emit mrdAttachments only on\n * change\" guard shared by mrd-document-view / mrd-invoice-view / mrd-email-view. */\nexport function attachmentsKey(attachments: DocumentAttachment[]): string {\n return attachments.map(a => a.href).join('|');\n}\n"],"names":[],"mappings":"AAEA;;;;;;;;;AASG;AACG,SAAU,qBAAqB,CACnC,SAA6C,EAC7C,MAAkD,EAClD,OAAe,MAAM,EAAA;;IAErB,MAAM,KAAK,GAAG,CAAA,EAAA,GAAA,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,SAAS,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAG,IAAI,CAAC;AACtC,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;IACrB,MAAM,GAAG,GAAI,MAAc,KAAA,IAAA,IAAd,MAAM,uBAAN,MAAM,CAAW,KAAK,CAAC;AACpC,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,OAAO,EAAE;AACnB,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IAC9C,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAG;;AAAC,QAAA,QAAC;YACxC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,MAAA,IAAI,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,MAAM,CAAC,IAAI,CAAC;AACvC,YAAA,QAAQ,EAAE,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,IAAI,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,SAAS;AACzD,SAAA;AAAC,KAAA,CAAC;AACL;AAEA;AACqF;AAC/E,SAAU,cAAc,CAAC,WAAiC,EAAA;AAC9D,IAAA,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC/C;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-helpers-CUJsHr1V.js","sources":["src/components/fields/field-helpers.tsx"],"sourcesContent":["import { FunctionalComponent, h } from '@stencil/core';\nimport { t } from '../../utils/i18n';\nimport { validateRequired } from '../../utils/validation';\n\n/**\n * Shared building blocks for the leaf field components.\n * `base` is the BEM block name, e.g. 'mrd-text-field'.\n */\n\nexport const FieldLabel: FunctionalComponent<{ base: string; label: string; required: boolean }> = ({ base, label, required }) =>\n label ? <label class={`${base}__label${required ? ` ${base}__label--required` : ''}`}>{label}</label> : null;\n\nexport const FieldError: FunctionalComponent<{ base: string; error: string }> = ({ base, error }) =>\n error ? <span class={`${base}__error`}>{error}</span> : null;\n\n/** Class string for the form control, with the --error modifier when applicable. */\nexport function controlClass(base: string, hasError: boolean, element: string = 'input'): string {\n return `${base}__${element}${hasError ? ` ${base}__${element}--error` : ''}`;\n}\n\n/** Returns the localised required-error, or '' when the value passes. */\nexport function requiredError(value: unknown, required: boolean, locale: string): string {\n return required && !validateRequired(value) ? t('required', locale) : '';\n}\n"],"names":[],"mappings":";;;;AAIA;;;AAGG;MAEU,UAAU,GAA4E,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAC3H,KAAK,GAAG,aAAO,KAAK,EAAE,CAAA,EAAG,IAAI,CAAA,OAAA,EAAU,QAAQ,GAAG,CAAA,CAAA,EAAI,IAAI,CAAA,iBAAA,CAAmB,GAAG,EAAE,CAAA,CAAE,IAAG,KAAK,CAAS,GAAG;AAEnG,MAAM,UAAU,GAAyD,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAC9F,KAAK,GAAG,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAE,GAAG,IAAI,CAAA,OAAA,CAAS,EAAA,EAAG,KAAK,CAAQ,GAAG;AAE1D;AACM,SAAU,YAAY,CAAC,IAAY,EAAE,QAAiB,EAAE,UAAkB,OAAO,EAAA;AACrF,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,EAAG,QAAQ,GAAG,IAAI,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,OAAA,CAAS,GAAG,EAAE,EAAE;AAC9E;AAEA;SACgB,aAAa,CAAC,KAAc,EAAE,QAAiB,EAAE,MAAc,EAAA;IAC7E,OAAO,QAAQ,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,EAAE;AAC1E;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload-common-DdTDuxEU.js","sources":["src/components/fields/file-upload-common.ts"],"sourcesContent":["import { t } from '../../utils/i18n';\n\n/**\n * Shared upload behaviour for mrd-file-field and mrd-image-field:\n * file validation, drop-zone class building and drag-drop wiring.\n */\n\n/** A resolved file/image value, matching the shape the API returns for an already-persisted\n * file (mrd-table cell renderer, mrd-document-view, mrd-layout-section all read `.href` /\n * `.fileName` the same way) — also what a freshly-completed upload resolves to (host builds\n * `{ href: uri, fileName: file.name }` client-side). May carry extra metadata (`contentType`,\n * `size`, …) that this library ignores. */\nexport interface UploadedFileRef {\n href: string;\n fileName: string;\n [key: string]: unknown;\n}\n\n/** A single field entry: a pending `File` (upload in progress), a resolved `UploadedFileRef`,\n * or a bare href string (legacy shape — still supported so older hosts keep working unchanged). */\nexport type FileEntry = File | UploadedFileRef | string;\n\n/** True while the entry is still a local `File` awaiting upload resolution. */\nexport function isPending(entry: FileEntry): boolean {\n return entry instanceof File;\n}\n\n/** Display name for an entry: the `File`'s own name, the resolved `fileName`, or — for the\n * legacy bare-href shape — a best-effort basename of the URI. */\nexport function entryLabel(entry: FileEntry): string {\n if (entry instanceof File) return entry.name;\n if (typeof entry !== 'string') return entry.fileName || entry.href;\n const base = entry.split('/').pop() ?? entry;\n try {\n return decodeURIComponent(base);\n } catch {\n return base;\n }\n}\n\n/** Validates a selected/dropped file; returns a localised error message or '' when accepted. */\nexport function validateUploadFile(file: File, maxSize: number, locale: string, requireImage = false): string {\n if (maxSize > 0 && file.size > maxSize) return t('file_too_large', locale);\n if (requireImage && !file.type.startsWith('image/')) return t('invalid_image', locale);\n return '';\n}\n\n/** BEM class string for the drop zone, e.g. base 'mrd-file-field' → 'mrd-file-field__zone …'. */\nexport function uploadZoneClass(base: string, opts: { dragging: boolean; error: boolean; disabled: boolean }): string {\n return [\n `${base}__zone`,\n opts.dragging ? `${base}__zone--dragging` : '',\n opts.error ? `${base}__zone--error` : '',\n opts.disabled ? `${base}__zone--disabled` : '',\n ].filter(Boolean).join(' ');\n}\n\n/** Drag-drop handlers for the drop zone; the component owns the dragging state and file handling. */\nexport function makeDragHandlers(setDragging: (dragging: boolean) => void, onFiles: (files: File[]) => void) {\n return {\n onDragOver: (e: DragEvent) => {\n e.preventDefault();\n setDragging(true);\n },\n onDragLeave: () => setDragging(false),\n onDrop: (e: DragEvent) => {\n e.preventDefault();\n setDragging(false);\n onFiles(Array.from(e.dataTransfer?.files ?? []));\n },\n };\n}\n"],"names":[],"mappings":";;AAsBA;AACM,SAAU,SAAS,CAAC,KAAgB,EAAA;IACxC,OAAO,KAAK,YAAY,IAAI;AAC9B;AAEA;AACkE;AAC5D,SAAU,UAAU,CAAC,KAAgB,EAAA;;IACzC,IAAI,KAAK,YAAY,IAAI;QAAE,OAAO,KAAK,CAAC,IAAI;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI;AAClE,IAAA,MAAM,IAAI,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,KAAK;AAC5C,IAAA,IAAI;AACF,QAAA,OAAO,kBAAkB,CAAC,IAAI,CAAC;;IAC/B,OAAA,EAAA,EAAM;AACN,QAAA,OAAO,IAAI;;AAEf;AAEA;AACM,SAAU,kBAAkB,CAAC,IAAU,EAAE,OAAe,EAAE,MAAc,EAAE,YAAY,GAAG,KAAK,EAAA;IAClG,IAAI,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,OAAO;AAAE,QAAA,OAAO,CAAC,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAC1E,IAAI,YAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAAE,QAAA,OAAO,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC;AACtF,IAAA,OAAO,EAAE;AACX;AAEA;AACM,SAAU,eAAe,CAAC,IAAY,EAAE,IAA8D,EAAA;IAC1G,OAAO;AACL,QAAA,CAAA,EAAG,IAAI,CAAA,MAAA,CAAQ;QACf,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAA,gBAAA,CAAkB,GAAG,EAAE;QAC9C,IAAI,CAAC,KAAK,GAAG,CAAA,EAAG,IAAI,CAAA,aAAA,CAAe,GAAG,EAAE;QACxC,IAAI,CAAC,QAAQ,GAAG,CAAA,EAAG,IAAI,CAAA,gBAAA,CAAkB,GAAG,EAAE;KAC/C,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7B;AAEA;AACM,SAAU,gBAAgB,CAAC,WAAwC,EAAE,OAAgC,EAAA;IACzG,OAAO;AACL,QAAA,UAAU,EAAE,CAAC,CAAY,KAAI;YAC3B,CAAC,CAAC,cAAc,EAAE;YAClB,WAAW,CAAC,IAAI,CAAC;SAClB;AACD,QAAA,WAAW,EAAE,MAAM,WAAW,CAAC,KAAK,CAAC;AACrC,QAAA,MAAM,EAAE,CAAC,CAAY,KAAI;;YACvB,CAAC,CAAC,cAAc,EAAE;YAClB,WAAW,CAAC,KAAK,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAA,CAAA,EAAA,GAAA,CAAC,CAAC,YAAY,0CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,EAAE,CAAC,CAAC;SACjD;KACF;AACH;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-gcecItcD.js","sources":["src/utils/format.ts"],"sourcesContent":["export function formatNumber(value: number, locale: string, options?: Intl.NumberFormatOptions): string {\n if (value === null || value === undefined || isNaN(value)) return '';\n return new Intl.NumberFormat(locale, options).format(value);\n}\n\nexport function formatCurrency(amount: number, currency: string, locale: string): string {\n if (amount === null || amount === undefined || isNaN(amount)) return '';\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(amount);\n}\n\nexport function formatPercentage(value: number, locale: string, decimalPrecision = 2): string {\n if (value === null || value === undefined || isNaN(value)) return '';\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: decimalPrecision,\n maximumFractionDigits: decimalPrecision,\n }).format(value);\n}\n\nexport function formatDate(value: string | Date, locale: string): string {\n if (!value) return '';\n const date = typeof value === 'string' ? new Date(value) : value;\n if (isNaN(date.getTime())) return '';\n return new Intl.DateTimeFormat(locale, { year: 'numeric', month: '2-digit', day: '2-digit' }).format(date);\n}\n\nexport function formatDateTime(value: string | Date, locale: string): string {\n if (!value) return '';\n const date = typeof value === 'string' ? new Date(value) : value;\n if (isNaN(date.getTime())) return '';\n return new Intl.DateTimeFormat(locale, {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n}\n\nexport function formatTime(value: string, locale: string): string {\n if (!value) return '';\n // value is HH:MM or HH:MM:SS\n const [hours, minutes] = value.split(':').map(Number);\n const date = new Date();\n date.setHours(hours, minutes, 0, 0);\n return new Intl.DateTimeFormat(locale, { hour: '2-digit', minute: '2-digit' }).format(date);\n}\n\nexport function parseLocalizedNumber(str: string, locale: string): number | null {\n if (!str || !str.trim()) return null;\n // Detect decimal and thousands separators from the locale\n const parts = new Intl.NumberFormat(locale).formatToParts(1234567.89);\n const groupSep = parts.find((p: Intl.NumberFormatPart) => p.type === 'group')?.value ?? ',';\n const decimalSep = parts.find((p: Intl.NumberFormatPart) => p.type === 'decimal')?.value ?? '.';\n\n // Remove group separators, replace decimal separator with '.'\n const normalized = str\n .replace(new RegExp(`\\\\${groupSep}`, 'g'), '')\n .replace(new RegExp(`\\\\${decimalSep}`), '.')\n .replace('%', '')\n .trim();\n\n const parsed = parseFloat(normalized);\n return isNaN(parsed) ? null : parsed;\n}\n"],"names":[],"mappings":"SAAgB,YAAY,CAAC,KAAa,EAAE,MAAc,EAAE,OAAkC,EAAA;IAC5F,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;AACpE,IAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAC7D;SAEgB,cAAc,CAAC,MAAc,EAAE,QAAgB,EAAE,MAAc,EAAA;IAC7E,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,EAAE;AACvE,IAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACnC,QAAA,KAAK,EAAE,UAAU;QACjB,QAAQ;AACR,QAAA,qBAAqB,EAAE,CAAC;AACxB,QAAA,qBAAqB,EAAE,CAAC;AACzB,KAAA,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACnB;AAEM,SAAU,gBAAgB,CAAC,KAAa,EAAE,MAAc,EAAE,gBAAgB,GAAG,CAAC,EAAA;IAClF,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE;AACpE,IAAA,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;AACnC,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,qBAAqB,EAAE,gBAAgB;AACvC,QAAA,qBAAqB,EAAE,gBAAgB;AACxC,KAAA,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;AAClB;AAEM,SAAU,UAAU,CAAC,KAAoB,EAAE,MAAc,EAAA;AAC7D,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AACrB,IAAA,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AAChE,IAAA,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAAE,QAAA,OAAO,EAAE;IACpC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AAC5G;AAEM,SAAU,cAAc,CAAC,KAAoB,EAAE,MAAc,EAAA;AACjE,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AACrB,IAAA,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK;AAChE,IAAA,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAAE,QAAA,OAAO,EAAE;AACpC,IAAA,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;AACrC,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,GAAG,EAAE,SAAS;AACd,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,MAAM,EAAE,SAAS;AAClB,KAAA,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AACjB;AAEM,SAAU,UAAU,CAAC,KAAa,EAAE,MAAc,EAAA;AACtD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;;AAErB,IAAA,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AACrD,IAAA,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE;IACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACnC,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;AAC7F;AAEM,SAAU,oBAAoB,CAAC,GAAW,EAAE,MAAc,EAAA;;AAC9D,IAAA,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;AAAE,QAAA,OAAO,IAAI;;AAEpC,IAAA,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAwB,KAAK,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,GAAG;IAC3F,MAAM,UAAU,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,KAAK,CAAC,IAAI,CAAC,CAAC,CAAwB,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAI,GAAG;;IAG/F,MAAM,UAAU,GAAG;AAChB,SAAA,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAE,EAAE,GAAG,CAAC,EAAE,EAAE;SAC5C,OAAO,CAAC,IAAI,MAAM,CAAC,CAAA,EAAA,EAAK,UAAU,CAAA,CAAE,CAAC,EAAE,GAAG;AAC1C,SAAA,OAAO,CAAC,GAAG,EAAE,EAAE;AACf,SAAA,IAAI,EAAE;AAET,IAAA,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC;AACrC,IAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,GAAG,MAAM;AACtC;;;;"}
|