arengibook 3.1.28-main → 3.1.51-itemWithTooltip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1438 -212
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -13488,7 +13488,7 @@ var LOCALES = {
13488
13488
  var css_248z$6 = "@charset \"UTF-8\";\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateX(40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes toastIconPop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 60% {\n transform: scale(1.2);\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes toastTextSlide {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n/* Force une largeur à 100% de l'input Calendar */\n.datepicker-fullwidth {\n width: 100%;\n}\n\n.datepicker-fullwidth > .dp-input-wrapper {\n width: 100%;\n}\n.datepicker-fullwidth > .dp-input-wrapper > .p-calendar {\n width: 100%;\n}\n\n.dp-input-wrapper {\n position: relative;\n display: inline-flex;\n}\n.dp-input-wrapper .dp-clear-btn {\n position: absolute;\n right: 7px;\n top: 50%;\n transform: translateY(-50%);\n background: none;\n border: none;\n cursor: pointer;\n padding: 2.8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #b0b8c4;\n z-index: 1;\n border-radius: 50%;\n line-height: 1;\n}\n.dp-input-wrapper .dp-clear-btn:hover {\n color: #1a1e26;\n background-color: rgba(0, 0, 0, 0.06);\n}\n.dp-input-wrapper .dp-clear-btn .pi {\n font-size: 9.1px;\n}\n\n/* Application du mixin field sur l'input du Calendar */\n.p-calendar > .p-inputtext {\n font-family: \"Roboto\", sans-serif;\n min-height: 40px;\n padding: 0 12px;\n background: #ffffff;\n border: 1.5px solid #e0e3e8;\n border-radius: 7px;\n color: #1a1e26;\n outline: none;\n transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-calendar > .p-inputtext:hover:not(:focus):not(:focus-within):not([disabled]):not(.is-disabled) {\n border-color: #c8cdd6;\n}\n.p-calendar > .p-inputtext:focus, .p-calendar > .p-inputtext:focus-within, .p-calendar > .p-inputtext.is-open {\n border-color: #3f3f3f;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);\n}\n.p-calendar > .p-inputtext[disabled], .p-calendar > .p-inputtext.is-disabled {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n.p-calendar > .p-inputtext[readonly], .p-calendar > .p-inputtext.is-readonly {\n background: #f4f5f6;\n cursor: default;\n box-shadow: none;\n}\n.p-calendar > .p-inputtext[readonly]:hover, .p-calendar > .p-inputtext.is-readonly:hover {\n border-color: #e0e3e8;\n}\n.p-calendar > .p-inputtext.is-error {\n border-color: #dc2626;\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);\n}\n.p-calendar > .p-inputtext.is-success {\n border-color: #15803d;\n box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.12);\n}\n.p-calendar > .p-inputtext:hover {\n border-color: #c8cdd6 !important;\n}\n.p-calendar > .p-inputtext:focus, .p-calendar > .p-inputtext.p-focus {\n border-color: #3f3f3f !important;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1) !important;\n outline: none;\n}\n\n/* Panel invisible jusqu'au repositionnement (évite le flash position basse → haute) */\n.datepickerbook:not(.dp-ready) {\n visibility: hidden !important;\n}\n\n/* Neutralise les styles hérités */\n.datepickerbook table,\n.datepickerbook tbody,\n.datepickerbook tr,\n.datepickerbook td,\n.datepickerbook th {\n background-color: unset !important;\n color: inherit !important;\n border: none;\n}\n\n/* Restaure les couleurs et l'entete du calendrier */\n.datepickerbook .p-datepicker {\n background-color: #ffffff !important;\n color: #1a1e26 !important;\n border-radius: 7px;\n box-shadow: 0 0 8px rgba(0, 0, 0, 0.1);\n}\n\n.datepickerbook .datepicker-custom-header {\n display: flex;\n flex-direction: column;\n gap: 7px;\n padding: 7px 10.5px;\n}\n\n.datepickerbook .datepicker-spinner {\n display: flex;\n flex-direction: column;\n align-items: center;\n font-size: 11.9px;\n}\n\n.datepickerbook .dp-label {\n margin: 3.5px 0;\n font-weight: 500;\n}\n\n.p-datepicker .p-datepicker-title,\n.p-datepicker .p-datepicker-prev,\n.p-datepicker .p-datepicker-next {\n display: none !important;\n}\n\n.datepickerbook .p-datepicker-header {\n justify-content: center;\n}\n\n.datepickerbook .dp-popup {\n position: absolute;\n top: 100%;\n margin-top: 3.5px;\n background: #ffffff;\n border: 1px solid #e0e3e8;\n border-radius: 4px;\n padding: 3.5px;\n z-index: 10;\n}\n\n.datepickerbook .dp-popup-months,\n.datepickerbook .dp-popup-years {\n display: grid;\n grid-template-columns: repeat(3, auto);\n gap: 3.5px;\n}\n\n.datepickerbook .dp-popup-item {\n border: none;\n background: transparent;\n padding: 2.1px 5.6px;\n cursor: pointer;\n font-size: 11.2px;\n}\n\n.datepickerbook .dp-popup-item:hover {\n background: #f4f5f6;\n}\n\n/*.datepickerbook .dp-header-top {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 10.5px;\n}*/\n.datepickerbook .dp-header-part {\n display: flex;\n align-items: center;\n gap: 3.5px;\n}\n\n.datepickerbook .dp-label-button {\n border: none;\n background: transparent;\n cursor: pointer;\n font-weight: 800;\n font-size: 16px;\n margin: 3.5px 0;\n}\n\n.datepickerbook.dp-monthyear-mode .dp-monthyear-header {\n padding-bottom: 3.5px;\n}\n\n.datepickerbook {\n display: flex;\n align-items: center;\n gap: 7px;\n margin-bottom: 3.5px;\n}\n\n.datepickerbook .dp-back-button {\n border: none;\n background: transparent;\n cursor: pointer;\n font-size: 12.6px;\n}\n\n.datepickerbook .dp-title {\n font-weight: 600;\n font-size: 12.6px;\n}\n\n/* Colonnes mois / années */\n.datepickerbook .dp-header-lists {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 7px;\n}\n\n.datepickerbook .dp-month-list,\n.datepickerbook .dp-year-list {\n padding-right: 3.5px;\n display: flex;\n flex-direction: column;\n gap: 2.1px;\n}\n\n.datepickerbook .dp-list-item:hover {\n background: #f4f5f6;\n}\n\n.p-datepicker-header.datepicker-custom-header.dp-monthyear-header {\n margin: auto;\n}\n\n/*.p-monthpicker*/\n.p-datepicker.dp-monthyear-mode {\n box-shadow: none !important;\n border-radius: 0px;\n}\n.p-datepicker.dp-monthyear-mode .dp-header-top-alt {\n display: none !important;\n}\n\n.p-datepicker-monthpicker.dp-monthyear-mode {\n box-shadow: none !important;\n border-radius: 0px;\n}\n.p-datepicker-monthpicker.dp-monthyear-mode .dp-header-top-alt {\n display: none !important;\n}\n\n.p-datepicker {\n width: 331px !important;\n min-width: 331px !important;\n max-width: 331px !important;\n}\n.p-datepicker .dp-arrow {\n border: none;\n background-color: transparent;\n color: #b0b8c4;\n cursor: pointer;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1), background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-datepicker .dp-arrow:hover {\n color: #3f3f3f;\n background-color: rgba(63, 63, 63, 0.08);\n}\n.p-datepicker.dp-year-only {\n box-shadow: none !important;\n width: auto !important;\n min-width: unset !important;\n max-width: unset !important;\n}\n.p-datepicker.dp-year-only .dp-header-top-alt {\n display: none !important;\n}\n.p-datepicker.dp-year-only .dp-monthyear-header {\n width: 205px;\n min-width: 205px;\n max-width: 205px;\n}\n.p-datepicker.dp-year-only .dp-monthyear-header .dp-year-container {\n width: 100%;\n}\n.p-datepicker.dp-year-only .dp-year-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-arrow-container {\n width: 100%;\n border-top: 1px solid #e0e3e8;\n height: 51px;\n display: flex;\n align-items: center;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-up {\n border-right: 1px solid #e0e3e8;\n border-radius: 0px 0px 0px 5px !important;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-down {\n border-radius: 0px 0px 5px 0px !important;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-year {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 49%;\n border-radius: 0px;\n flex: 1;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-year:hover {\n background-color: rgba(63, 63, 63, 0.08);\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-year-list {\n width: 100%;\n gap: 0px;\n padding: 0px;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-list-item-active {\n width: 100%;\n color: #ffffff !important;\n background-color: #3f3f3f !important;\n border-bottom: 1px solid #3f3f3f !important;\n font-weight: 600;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-list-item {\n background-color: transparent;\n border: none;\n color: #1a1e26;\n transition: 0s !important;\n height: 25px;\n font-size: 16px;\n border-radius: 0px;\n border-bottom: 1px solid #e0e3e8;\n width: 100%;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-list-item:not(.dp-list-item-big) {\n padding: 3px 10px !important;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-list-item:not(.dp-list-item-big):hover {\n background-color: rgba(63, 63, 63, 0.08) !important;\n color: #3f3f3f;\n}\n.p-datepicker.dp-year-only .dp-year-container .dp-list-item {\n padding: 3px 10px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.dp-monthyear-mode .p-datepicker-group, .p-datepicker-monthpicker .p-datepicker-group, .dp-year-only .p-datepicker-group {\n padding: 0px !important;\n border: 0px solid transparent !important;\n}\n.dp-monthyear-mode .dp-monthyear-header, .p-datepicker-monthpicker .dp-monthyear-header, .dp-year-only .dp-monthyear-header {\n justify-content: flex-start;\n gap: 0;\n background: #ffffff;\n border: 1px solid rgba(255, 255, 255, 0.33);\n border-radius: 8px;\n position: absolute;\n top: 0;\n left: 0;\n padding: 0px !important;\n width: 331px;\n min-width: 331px;\n max-width: 331px;\n}\n.dp-monthyear-mode .dp-header-top-alt, .p-datepicker-monthpicker .dp-header-top-alt, .dp-year-only .dp-header-top-alt {\n width: 100%;\n height: 50px !important;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid #e0e3e8;\n}\n.dp-monthyear-mode .dp-header-top-alt .dp-header-top-alt-part:first-child, .p-datepicker-monthpicker .dp-header-top-alt .dp-header-top-alt-part:first-child, .dp-year-only .dp-header-top-alt .dp-header-top-alt-part:first-child {\n border-right: 1px solid #e0e3e8;\n}\n.dp-monthyear-mode .dp-header-top-alt .dp-header-top-alt-part, .p-datepicker-monthpicker .dp-header-top-alt .dp-header-top-alt-part, .dp-year-only .dp-header-top-alt .dp-header-top-alt-part {\n width: 49%;\n height: 50px;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n font-weight: 600;\n color: #1a1e26;\n font-size: 16px;\n text-transform: capitalize;\n}\n.dp-monthyear-mode .p-datepicker-calendar-container, .p-datepicker-monthpicker .p-datepicker-calendar-container, .dp-year-only .p-datepicker-calendar-container {\n display: none;\n}\n.dp-monthyear-mode .dp-actions, .p-datepicker-monthpicker .dp-actions, .dp-year-only .dp-actions {\n width: 100%;\n background-color: #ffffff;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-radius: 0px 0px 5px 5px;\n padding: 0px 10px 10px 10px;\n}\n.dp-monthyear-mode .dp-actions .p-button:first-child, .p-datepicker-monthpicker .dp-actions .p-button:first-child, .dp-year-only .dp-actions .p-button:first-child {\n border: 0px solid transparent;\n color: #3f3f3f;\n}\n.dp-monthyear-mode .dp-actions .p-button:last-child, .p-datepicker-monthpicker .dp-actions .p-button:last-child, .dp-year-only .dp-actions .p-button:last-child {\n background-color: #ffffff;\n border: 1px solid #3f3f3f;\n color: #3f3f3f;\n}\n.dp-monthyear-mode .dp-actions .p-button:last-child:hover, .p-datepicker-monthpicker .dp-actions .p-button:last-child:hover, .dp-year-only .dp-actions .p-button:last-child:hover {\n background-color: #3f3f3f;\n color: #ffffff;\n}\n.dp-monthyear-mode .dp-actions .p-button, .p-datepicker-monthpicker .dp-actions .p-button, .dp-year-only .dp-actions .p-button {\n padding: 10px 15px;\n}\n.dp-monthyear-mode .dp-actions .p-button .p-button-icon, .p-datepicker-monthpicker .dp-actions .p-button .p-button-icon, .dp-year-only .dp-actions .p-button .p-button-icon {\n display: none;\n}\n.dp-monthyear-mode .dp-header-lists, .p-datepicker-monthpicker .dp-header-lists, .dp-year-only .dp-header-lists {\n width: calc(100% - 20px);\n height: 300px;\n display: flex;\n align-items: flex-start;\n gap: initial;\n padding: 0px;\n margin: 10px;\n}\n.dp-monthyear-mode .dp-month-list, .p-datepicker-monthpicker .dp-month-list, .dp-year-only .dp-month-list {\n transition: none !important;\n border: 1px solid #e0e3e8;\n margin: 0px 10px 0px 0px !important;\n gap: 0px;\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item-active, .p-datepicker-monthpicker .dp-month-list .dp-list-item-active, .dp-year-only .dp-month-list .dp-list-item-active {\n width: 100%;\n color: #ffffff !important;\n background-color: #3f3f3f !important;\n border-bottom: 1px solid #3f3f3f !important;\n font-weight: 600;\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item, .p-datepicker-monthpicker .dp-month-list .dp-list-item, .dp-year-only .dp-month-list .dp-list-item {\n border: none;\n height: 25px;\n background-color: transparent;\n font-size: 16px;\n text-transform: capitalize;\n border-radius: 0px;\n margin: 0px;\n padding: 3px;\n width: calc(100% - 0px);\n border-bottom: 1px solid #e0e3e8;\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item:hover, .p-datepicker-monthpicker .dp-month-list .dp-list-item:hover, .dp-year-only .dp-month-list .dp-list-item:hover {\n background-color: rgba(63, 63, 63, 0.08);\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item:last-child, .p-datepicker-monthpicker .dp-month-list .dp-list-item:last-child, .dp-year-only .dp-month-list .dp-list-item:last-child {\n border: none;\n}\n.dp-monthyear-mode .dp-year-container, .p-datepicker-monthpicker .dp-year-container, .dp-year-only .dp-year-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n border: 1px solid #e0e3e8;\n}\n.dp-monthyear-mode .dp-year-container .dp-arrow-container, .p-datepicker-monthpicker .dp-year-container .dp-arrow-container, .dp-year-only .dp-year-container .dp-arrow-container {\n width: 100%;\n border-top: 1px solid #e0e3e8;\n height: 51px;\n display: flex;\n align-items: center;\n}\n.dp-monthyear-mode .dp-year-container .dp-arrow-container .dp-arrow-up, .p-datepicker-monthpicker .dp-year-container .dp-arrow-container .dp-arrow-up, .dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-up {\n border-right: 1px solid #e0e3e8;\n}\n.dp-monthyear-mode .dp-year-container .dp-arrow-container .dp-arrow-year, .p-datepicker-monthpicker .dp-year-container .dp-arrow-container .dp-arrow-year, .dp-year-only .dp-year-container .dp-arrow-container .dp-arrow-year {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 49%;\n border-radius: 0px;\n flex: 1;\n}\n.dp-monthyear-mode .dp-year-container .dp-year-list, .p-datepicker-monthpicker .dp-year-container .dp-year-list, .dp-year-only .dp-year-container .dp-year-list {\n width: 100%;\n gap: 0px;\n padding: 0px;\n}\n.dp-monthyear-mode .dp-year-container .dp-list-item-active, .p-datepicker-monthpicker .dp-year-container .dp-list-item-active, .dp-year-only .dp-year-container .dp-list-item-active {\n width: 100%;\n color: #ffffff !important;\n background-color: #3f3f3f !important;\n border-bottom: 1px solid #3f3f3f !important;\n font-weight: 600;\n}\n.dp-monthyear-mode .dp-year-container .dp-list-item, .p-datepicker-monthpicker .dp-year-container .dp-list-item, .dp-year-only .dp-year-container .dp-list-item {\n background-color: transparent;\n border: none;\n color: #1a1e26;\n transition: 0s !important;\n height: 25px;\n font-size: 16px;\n border-radius: 0px;\n border-bottom: 1px solid #e0e3e8;\n width: 100%;\n padding: 3px 10px;\n}\n.dp-monthyear-mode .dp-year-container .dp-list-item:not(.dp-list-item-big), .p-datepicker-monthpicker .dp-year-container .dp-list-item:not(.dp-list-item-big), .dp-year-only .dp-year-container .dp-list-item:not(.dp-list-item-big) {\n padding: 3px 10px !important;\n}\n.dp-monthyear-mode .dp-year-container .dp-list-item:not(.dp-list-item-big):hover, .p-datepicker-monthpicker .dp-year-container .dp-list-item:not(.dp-list-item-big):hover, .dp-year-only .dp-year-container .dp-list-item:not(.dp-list-item-big):hover {\n background-color: rgba(63, 63, 63, 0.08) !important;\n color: #3f3f3f;\n}\n.dp-monthyear-mode .dp-month-list, .dp-monthyear-mode .dp-year-container, .p-datepicker-monthpicker .dp-month-list, .p-datepicker-monthpicker .dp-year-container, .dp-year-only .dp-month-list, .dp-year-only .dp-year-container {\n width: 49%;\n flex: 1;\n margin: 0px;\n background-color: transparent;\n padding: 0px;\n height: 100%;\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item, .dp-monthyear-mode .dp-year-container .dp-list-item, .p-datepicker-monthpicker .dp-month-list .dp-list-item, .p-datepicker-monthpicker .dp-year-container .dp-list-item, .dp-year-only .dp-month-list .dp-list-item, .dp-year-only .dp-year-container .dp-list-item {\n cursor: pointer;\n}\n.dp-monthyear-mode .dp-month-list .dp-list-item:hover, .dp-monthyear-mode .dp-year-container .dp-list-item:hover, .p-datepicker-monthpicker .dp-month-list .dp-list-item:hover, .p-datepicker-monthpicker .dp-year-container .dp-list-item:hover, .dp-year-only .dp-month-list .dp-list-item:hover, .dp-year-only .dp-year-container .dp-list-item:hover {\n color: #3f3f3f;\n border-bottom: 1px solid rgba(63, 63, 63, 0.08);\n}\n.dp-monthyear-mode .dp-month-list:hover, .dp-monthyear-mode .dp-year-container:hover, .p-datepicker-monthpicker .dp-month-list:hover, .p-datepicker-monthpicker .dp-year-container:hover, .dp-year-only .dp-month-list:hover, .dp-year-only .dp-year-container:hover {\n background-color: rgba(255, 255, 255, 0.31);\n}\n\n.p-datepicker {\n padding: 0px;\n background-color: #ffffff;\n box-shadow: 1px 2px 26px rgba(0, 0, 0, 0.21);\n width: 321px;\n}\n.p-datepicker .p-datepicker-group-container {\n width: 100%;\n}\n.p-datepicker .p-datepicker-group {\n background: #ffffff;\n border-radius: 8px;\n padding-bottom: 1px;\n}\n.p-datepicker .p-datepicker-header {\n padding: 0px;\n /*position: fixed;\n left: 0;*/\n height: 50px;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top {\n width: 100%;\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n border-bottom: 1px solid #e0e3e8;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-month {\n border-right: 1px solid #e0e3e8;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-month .dp-arrow-left {\n border-radius: 7px 0px 0px 0px;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-year .dp-arrow-right {\n border-radius: 0px 7px 0px 0px;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part {\n width: 49%;\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part .dp-arrow {\n width: 30px;\n height: 49px;\n min-width: 30px;\n min-height: 49px;\n max-width: 30px;\n max-height: 49px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part .dp-arrow:hover {\n background-color: rgba(63, 63, 63, 0.08);\n color: #3f3f3f;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part .dp-label-button {\n width: calc(100% - 60px);\n display: flex;\n align-items: center;\n justify-content: center;\n height: 50px;\n margin: 0px;\n text-transform: capitalize;\n color: #3f3f3f;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part .dp-label-button:hover {\n background-color: rgba(63, 63, 63, 0.08);\n font-weight: 800;\n}\n.p-datepicker .p-datepicker-header .datepicker-custom-header .dp-header-top .dp-header-part:hover {\n background-color: rgba(255, 255, 255, 0.31);\n}\n.p-datepicker .p-datepicker-calendar-container {\n padding: 10px;\n /* margin-top: 50px;*/\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar {\n margin: 0px;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar thead tr th {\n padding: 2px;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar thead tr th span {\n color: #1a1e26;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr .p-datepicker-today {\n background-color: transparent;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr .p-datepicker-today span {\n background-color: transparent;\n font-weight: 600;\n color: #3f3f3f;\n border: 1px solid #3f3f3f;\n text-decoration: underline;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr td {\n padding: 0px;\n border: 1px solid #f4f5f6;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr td .p-highlight {\n color: #ffffff !important;\n background-color: #3f3f3f !important;\n box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.31);\n font-weight: 600;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr td .p-disabled {\n opacity: 0.3;\n cursor: not-allowed;\n background-color: transparent !important;\n font-size: 12px;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr td span {\n margin: 0;\n width: 100%;\n border-radius: 0px;\n}\n.p-datepicker .p-datepicker-calendar-container .p-datepicker-calendar tbody tr td span:hover {\n background-color: rgba(63, 63, 63, 0.08) !important;\n color: #3f3f3f;\n box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.31);\n}\n\n/* WRAPPER GLOBAL */\n.dp-monthyear-header {\n width: 360px;\n background: #ffffff;\n border-radius: 18px;\n padding: 24px 26px;\n box-shadow: 0 8px 26px rgba(0, 0, 0, 0.1);\n display: flex;\n flex-direction: column;\n font-family: Inter, sans-serif;\n gap: 22px;\n}\n\n/* TITRE */\n.dp-header-top-alt .dp-title {\n font-size: 21.7px;\n font-weight: 700;\n text-align: center;\n color: #1a1e26;\n margin-bottom: 2px;\n}\n\n/* HOVER ANNÉES */\n.datepickerbook .dp-year-list .dp-list-item:hover {\n background: rgba(63, 63, 63, 0.15);\n}\n\n.dp-month-list .dp-list-item-active {\n background: #ffffff;\n font-weight: 600;\n}\n\n/* Centrage parfait */\n.dp-year-list {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 0;\n}\n\n/* Année normale */\n.dp-year-list .dp-list-item {\n font-size: 16.8px;\n color: #b0b8c4;\n padding: 4px 0;\n cursor: pointer;\n transition: 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.dp-year-list .dp-list-item:hover {\n color: #1a1e26;\n}\n\n/* FLECHES */\n.dp-arrow-up,\n.dp-arrow-down {\n font-size: 21px;\n color: #1a1e26;\n padding: 6px;\n border: none;\n background: none;\n cursor: pointer;\n margin: 4px 0;\n}\n\n/* ACTIONS BAS – GROS BOUTONS */\n.dp-actions {\n display: flex;\n justify-content: center;\n gap: 20px;\n padding-top: 5px;\n padding-bottom: 10px;\n}\n\n/* TITRE MOIS ANNEE */\n.dp-header-top {\n margin: auto;\n}\n\n/*DATEPICKER MENSUEL CUSTOMISE*/\n.p-monthpicker {\n display: none !important;\n margin: auto;\n}\n\n.datepickerbook .p-datepicker-header {\n border: none !important;\n border-bottom: none !important;\n box-shadow: none !important;\n background: transparent !important;\n}\n\n.datepickerbook.p-datepicker {\n padding: 0 !important;\n margin: 0 !important;\n}\n\n/*DATEPICKER ANNUEL CUSTOMISE*/\n.p-yearpicker {\n display: none !important;\n}\n\n.datepickerbook .p-datepicker-footer {\n margin-bottom: 20px;\n}\n\n.dp-error-message {\n color: red !important;\n font-style: italic !important;\n display: block !important;\n width: 100% !important;\n max-width: 100% !important;\n white-space: normal !important;\n word-break: break-word !important;\n overflow-wrap: break-word !important;\n line-height: 1.4 !important;\n font-size: 12.25px !important;\n margin-top: 2px !important;\n float: none !important;\n position: static !important;\n}";
13489
13489
  styleInject(css_248z$6);
13490
13490
 
13491
- var _excluded$4 = ["value", "onChange", "placeholder", "dateFormat", "displayMask", "view", "invalid", "errorMessage", "disabled", "locale", "showTime", "showIcon", "icon", "iconBgButton", "iconPos", "name", "id", "fullWidth", "inputProps", "onBlur", "onSelect", "onClick", "showClear", "reopenOnClick", "invalidDateMessage", "onPanelShow", "onPanelHide"];
13491
+ var _excluded$5 = ["value", "onChange", "placeholder", "dateFormat", "displayMask", "view", "invalid", "errorMessage", "disabled", "locale", "showTime", "showIcon", "icon", "iconBgButton", "iconPos", "name", "id", "fullWidth", "inputProps", "onBlur", "onSelect", "onClick", "showClear", "reopenOnClick", "invalidDateMessage", "onPanelShow", "onPanelHide"];
13492
13492
  var normalizeDate = function normalizeDate(v) {
13493
13493
  if (!v) return null;
13494
13494
  return v instanceof Date ? v : new Date(v);
@@ -13542,7 +13542,7 @@ var DatePicker = function DatePicker(_ref) {
13542
13542
  _ref.invalidDateMessage;
13543
13543
  var onPanelShow = _ref.onPanelShow,
13544
13544
  onPanelHide = _ref.onPanelHide,
13545
- rest = _objectWithoutProperties$1(_ref, _excluded$4);
13545
+ rest = _objectWithoutProperties$1(_ref, _excluded$5);
13546
13546
  var _useState = useState(function () {
13547
13547
  return normalizeDate(value);
13548
13548
  }),
@@ -33444,7 +33444,7 @@ var HeaderCell = /*#__PURE__*/React.memo(function (props) {
33444
33444
  });
33445
33445
  HeaderCell.displayName = 'HeaderCell';
33446
33446
 
33447
- var _excluded$3 = ["unstyled", "__TYPE", "ptOptions"];
33447
+ var _excluded$4 = ["unstyled", "__TYPE", "ptOptions"];
33448
33448
  function ownKeys$1$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
33449
33449
  function _objectSpread$1$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1$4(Object(t), true).forEach(function (r) { _defineProperty$7(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
33450
33450
  var TableHeader = /*#__PURE__*/React.memo(function (props) {
@@ -33675,7 +33675,7 @@ var TableHeader = /*#__PURE__*/React.memo(function (props) {
33675
33675
  unstyled = _RowBase$getProps.unstyled;
33676
33676
  _RowBase$getProps.__TYPE;
33677
33677
  _RowBase$getProps.ptOptions;
33678
- var rest = _objectWithoutProperties(_RowBase$getProps, _excluded$3);
33678
+ var rest = _objectWithoutProperties(_RowBase$getProps, _excluded$4);
33679
33679
  var headerRowProps = mergeProps({
33680
33680
  role: 'row'
33681
33681
  }, unstyled ? _objectSpread$1$4({
@@ -37016,8 +37016,13 @@ var PopupPresets = {
37016
37016
  }
37017
37017
  };
37018
37018
 
37019
+ var css_248z$5 = "@charset \"UTF-8\";\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateX(40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes toastIconPop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 60% {\n transform: scale(1.2);\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes toastTextSlide {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.dropdownbook.p-dropdown-panel {\n z-index: 999999 !important;\n}\n\n.p-tooltip {\n z-index: 1000000 !important;\n}\n\n.dropdown-tooltip-item {\n position: relative;\n width: 100%;\n cursor: pointer;\n}\n\n/* ===== ItemWithTooltip : deux colonnes (libellé à gauche / picto i à l'extrême droite) ===== */\n/* PrimeReact enveloppe le template dans un span inline (.p-dropdown-item-label)\n qui empêche l'item de s'étirer sur toute la largeur du panel */\n.p-dropdown-item .p-dropdown-item-label:has(.dropdown-item-two-cols) {\n display: block;\n width: 100%;\n}\n\n.p-dropdown-items .p-dropdown-item:has(.dropdown-item-two-cols) {\n padding-right: 10px;\n}\n\n.dropdown-item-two-cols {\n display: flex !important;\n align-items: center;\n justify-content: space-between;\n width: 100% !important;\n max-width: none !important;\n}\n\n.dropdown-item-info-icon {\n font-size: 14px;\n color: #6b7280;\n}\n\n/* Application du mixin field sur le wrapper du Dropdown */\n.dropdown-container .p-dropdown {\n font-family: \"Roboto\", sans-serif;\n min-height: 40px;\n padding: 0 12px;\n background: #ffffff;\n border: 1.5px solid #e0e3e8;\n border-radius: 7px;\n color: #1a1e26;\n outline: none;\n transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.dropdown-container .p-dropdown:hover:not(:focus):not(:focus-within):not([disabled]):not(.is-disabled) {\n border-color: #c8cdd6;\n}\n.dropdown-container .p-dropdown:focus, .dropdown-container .p-dropdown:focus-within, .dropdown-container .p-dropdown.is-open {\n border-color: #3f3f3f;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);\n}\n.dropdown-container .p-dropdown[disabled], .dropdown-container .p-dropdown.is-disabled {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n.dropdown-container .p-dropdown[readonly], .dropdown-container .p-dropdown.is-readonly {\n background: #f4f5f6;\n cursor: default;\n box-shadow: none;\n}\n.dropdown-container .p-dropdown[readonly]:hover, .dropdown-container .p-dropdown.is-readonly:hover {\n border-color: #e0e3e8;\n}\n.dropdown-container .p-dropdown.is-error {\n border-color: #dc2626;\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);\n}\n.dropdown-container .p-dropdown.is-success {\n border-color: #15803d;\n box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.12);\n}\n.dropdown-container .p-dropdown {\n padding: 0;\n display: flex;\n align-items: center;\n}\n\n.dd-search-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.dd-search-row [class*=-filter-container] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n.dd-search-row [class*=-filter-container] .p-inputtext {\n width: 100%;\n height: 32px;\n padding: 0 24.5px 0 12px;\n font-size: 14px;\n box-sizing: border-box;\n}\n.dd-search-row [class*=-filter-container] [class*=-filter-icon] {\n right: 10.5px;\n color: #b0b8c4;\n}\n\n.dd-sort-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.dd-sort-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n\n.dropdownbook .p-dropdown-header:has(.dd-search-row) {\n padding: 0;\n}\n\n/* ===== Badge couleur dans les items ===== */\n.dd-color-badge {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 4px 10px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n cursor: default;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n background-color: #f4f5f6;\n color: #1a1e26;\n border: 1px solid #e0e3e8;\n border-color: var(--badge-color, #e0e3e8);\n background-color: color-mix(in srgb, var(--badge-color, #f4f5f6) 50%, transparent);\n}\n.dd-color-badge.is-selected {\n background-color: var(--badge-color, #f4f5f6);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.p-dropdown-item:hover .dd-color-badge {\n background-color: var(--badge-color) !important;\n}\n\n/* ===== Override PrimeReact default item colors ===== */\n.dropdownbook .p-dropdown-items .p-dropdown-item:not(.p-highlight):hover {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-highlight {\n background: rgba(63, 63, 63, 0.08) !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-highlight.p-focus {\n background: rgba(63, 63, 63, 0.12) !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-focus {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n\n/* ===== Override PrimeReact filter input focus ===== */\n.dropdownbook .p-dropdown-filter.p-inputtext:hover {\n border-color: #c8cdd6 !important;\n}\n.dropdownbook .p-dropdown-filter.p-inputtext:focus, .dropdownbook .p-dropdown-filter.p-inputtext.p-focus {\n border-color: #3f3f3f !important;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1) !important;\n outline: none;\n}";
37020
+ styleInject(css_248z$5);
37021
+
37022
+ var _excluded$3 = ["style", "className"],
37023
+ _excluded2$2 = ["class"];
37019
37024
  var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37020
- var _window$Translator, _window$Translator2;
37025
+ var _computedOptions$, _window$Translator, _window$Translator2;
37021
37026
  var value = _ref.value,
37022
37027
  options = _ref.options,
37023
37028
  _ref$placeholder = _ref.placeholder,
@@ -37028,6 +37033,7 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37028
37033
  optionLabel = _ref$optionLabel === void 0 ? 'label' : _ref$optionLabel,
37029
37034
  _ref$optionValue = _ref.optionValue,
37030
37035
  optionValue = _ref$optionValue === void 0 ? 'value' : _ref$optionValue,
37036
+ optionsUrl = _ref.optionsUrl,
37031
37037
  _ref$invalid = _ref.invalid,
37032
37038
  invalid = _ref$invalid === void 0 ? false : _ref$invalid,
37033
37039
  _ref$errorMessage = _ref.errorMessage,
@@ -37039,7 +37045,7 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37039
37045
  _ref$editable = _ref.editable,
37040
37046
  editable = _ref$editable === void 0 ? false : _ref$editable,
37041
37047
  _ref$filter = _ref.filter,
37042
- filter = _ref$filter === void 0 ? filter : _ref$filter,
37048
+ filter = _ref$filter === void 0 ? false : _ref$filter,
37043
37049
  _ref$selectMetaConfig = _ref.selectMetaConfig,
37044
37050
  selectMetaConfig = _ref$selectMetaConfig === void 0 ? {
37045
37051
  labelStyle: null,
@@ -37048,7 +37054,79 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37048
37054
  _ref$objValue = _ref.objValue,
37049
37055
  objValue = _ref$objValue === void 0 ? null : _ref$objValue,
37050
37056
  _ref$required = _ref.required,
37051
- required = _ref$required === void 0 ? false : _ref$required;
37057
+ required = _ref$required === void 0 ? false : _ref$required,
37058
+ _ref$attr = _ref.attr,
37059
+ attr = _ref$attr === void 0 ? {} : _ref$attr,
37060
+ _ref$choice_attr = _ref.choice_attr,
37061
+ choice_attr = _ref$choice_attr === void 0 ? function () {
37062
+ return {};
37063
+ } : _ref$choice_attr,
37064
+ _ref$optionClassname = _ref.optionClassname,
37065
+ optionClassname = _ref$optionClassname === void 0 ? null : _ref$optionClassname,
37066
+ _ref$valueClassname = _ref.valueClassname,
37067
+ valueClassname = _ref$valueClassname === void 0 ? null : _ref$valueClassname,
37068
+ _ref$isGroupedOption = _ref.isGroupedOption,
37069
+ isGroupedOption = _ref$isGroupedOption === void 0 ? false : _ref$isGroupedOption,
37070
+ _ref$showTooltipGroup = _ref.showTooltipGroup,
37071
+ showTooltipGroup = _ref$showTooltipGroup === void 0 ? false : _ref$showTooltipGroup,
37072
+ _ref$prevTextShowTool = _ref.prevTextShowTooltip,
37073
+ prevTextShowTooltip = _ref$prevTextShowTool === void 0 ? null : _ref$prevTextShowTool,
37074
+ onSearch = _ref.onSearch,
37075
+ _ref$readOnly = _ref.readOnly,
37076
+ readOnly = _ref$readOnly === void 0 ? false : _ref$readOnly,
37077
+ _ref$loading = _ref.loading,
37078
+ externalLoading = _ref$loading === void 0 ? false : _ref$loading,
37079
+ status = _ref.status,
37080
+ _ref$optionStyle = _ref.optionStyle,
37081
+ optionStyle = _ref$optionStyle === void 0 ? {
37082
+ maxWidth: '250px',
37083
+ overflow: 'hidden',
37084
+ textOverflow: 'ellipsis',
37085
+ whiteSpace: 'nowrap'
37086
+ } : _ref$optionStyle,
37087
+ _ref$showClear = _ref.showClear,
37088
+ showClear = _ref$showClear === void 0 ? true : _ref$showClear,
37089
+ _ref$groupedItemTempl = _ref.groupedItemTemplateConfig,
37090
+ groupedItemTemplateConfig = _ref$groupedItemTempl === void 0 ? {
37091
+ showIcon: false,
37092
+ iconKey: 'icon',
37093
+ showImage: false,
37094
+ imageKey: 'image',
37095
+ imageStyle: null,
37096
+ labelStyle: null,
37097
+ generalIcon: null,
37098
+ generalImage: null
37099
+ } : _ref$groupedItemTempl;
37100
+ _ref.isSelectMeta;
37101
+ var hasInfoLine = _ref.hasInfoLine,
37102
+ InfoLineValue = _ref.InfoLineValue,
37103
+ _ref$selectConfig = _ref.selectConfig,
37104
+ selectConfig = _ref$selectConfig === void 0 ? {
37105
+ labelStyle: null,
37106
+ generalIcon: null
37107
+ } : _ref$selectConfig,
37108
+ withIcon = _ref.withIcon,
37109
+ withColor = _ref.withColor,
37110
+ _ref$truncateAt = _ref.truncateAt,
37111
+ truncateAt = _ref$truncateAt === void 0 ? null : _ref$truncateAt;
37112
+ _ref.virtualScroll;
37113
+ var virtualScrollerOptions = _ref.virtualScrollerOptions,
37114
+ _ref$enableItemToolti = _ref.enableItemTooltip,
37115
+ enableItemTooltip = _ref$enableItemToolti === void 0 ? false : _ref$enableItemToolti,
37116
+ _ref$enableItemLink = _ref.enableItemLink,
37117
+ enableItemLink = _ref$enableItemLink === void 0 ? false : _ref$enableItemLink,
37118
+ _ref$openOnHover = _ref.openOnHover,
37119
+ openOnHover = _ref$openOnHover === void 0 ? false : _ref$openOnHover,
37120
+ _ref$itemsCheckedToTh = _ref.itemsCheckedToTheTop,
37121
+ itemsCheckedToTheTop = _ref$itemsCheckedToTh === void 0 ? false : _ref$itemsCheckedToTh,
37122
+ _ref$enableSorting = _ref.enableSorting,
37123
+ enableSorting = _ref$enableSorting === void 0 ? false : _ref$enableSorting,
37124
+ _ref$enableSecondaryL = _ref.enableSecondaryLabel,
37125
+ enableSecondaryLabel = _ref$enableSecondaryL === void 0 ? false : _ref$enableSecondaryL,
37126
+ _ref$secondaryLabelKe = _ref.secondaryLabelKey,
37127
+ secondaryLabelKey = _ref$secondaryLabelKe === void 0 ? 'profession' : _ref$secondaryLabelKe,
37128
+ _ref$subItem = _ref.subItem,
37129
+ subItem = _ref$subItem === void 0 ? false : _ref$subItem;
37052
37130
  var _useState = useState(null),
37053
37131
  _useState2 = _slicedToArray$d(_useState, 2),
37054
37132
  optionSelected = _useState2[0],
@@ -37066,6 +37144,7 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37066
37144
  inputValue = _useState8[0],
37067
37145
  setInputValue = _useState8[1];
37068
37146
  var dropdownRef = useRef(null);
37147
+ var dropdownComposantRef = useRef(null);
37069
37148
  useRef(null);
37070
37149
  var clickedFromList = useRef(false);
37071
37150
  var _useState9 = useState(''),
@@ -37076,15 +37155,74 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37076
37155
  _useState10 = _slicedToArray$d(_useState1, 2),
37077
37156
  showRequiredError = _useState10[0],
37078
37157
  setShowRequiredError = _useState10[1];
37158
+ var _useState11 = useState(0),
37159
+ _useState12 = _slicedToArray$d(_useState11, 2),
37160
+ tooltipKey = _useState12[0],
37161
+ setTooltipKey = _useState12[1];
37162
+ var _useState13 = useState(null),
37163
+ _useState14 = _slicedToArray$d(_useState13, 2),
37164
+ sortOrder = _useState14[0],
37165
+ setSortOrder = _useState14[1];
37166
+ var _useState15 = useState(false),
37167
+ _useState16 = _slicedToArray$d(_useState15, 2),
37168
+ isDropdownOpen = _useState16[0],
37169
+ setIsDropdownOpen = _useState16[1];
37170
+ var _useState17 = useState(''),
37171
+ _useState18 = _slicedToArray$d(_useState17, 2),
37172
+ selectedGroupLabel = _useState18[0],
37173
+ setSelectedGroupLabel = _useState18[1];
37079
37174
 
37080
37175
  // 🔹 Lazy loading
37081
- var _useState11 = useState(false),
37082
- _useState12 = _slicedToArray$d(_useState11, 2),
37083
- loading = _useState12[0],
37084
- setLoading = _useState12[1];
37176
+ var _useState19 = useState(false),
37177
+ _useState20 = _slicedToArray$d(_useState19, 2),
37178
+ loading = _useState20[0],
37179
+ setLoading = _useState20[1];
37085
37180
  var loadLazyTimeout = useRef();
37086
- useRef(1);
37087
- useRef('');
37181
+ var currentPageRef = useRef(1);
37182
+ var hasMoreRef = useRef(true);
37183
+ var isLoadingRef = useRef(false);
37184
+ var searchTermRef = useRef('');
37185
+ var loadedOptionsRef = useRef([]);
37186
+ var updateLoadedOptions = function updateLoadedOptions(opts) {
37187
+ loadedOptionsRef.current = opts;
37188
+ setLoadedOptions(opts);
37189
+ };
37190
+ var inverseColor = function inverseColor(hexColor) {
37191
+ var r = parseInt(hexColor.substr(1, 2), 16);
37192
+ var g = parseInt(hexColor.substr(3, 2), 16);
37193
+ var b = parseInt(hexColor.substr(5, 2), 16);
37194
+ var luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
37195
+ return luminance > 0.18 ? '#000000' : '#FFFFFF';
37196
+ };
37197
+ var truncateLabel = function truncateLabel(label) {
37198
+ if (!label || typeof label !== 'string') return label;
37199
+ if (!truncateAt || label.length <= truncateAt) return label;
37200
+ return label.slice(0, truncateAt) + '…';
37201
+ };
37202
+
37203
+ // PrimeReact 10 ignore la prop `escape` : sa Tooltip écrit toujours via
37204
+ // createTextNode. Un MutationObserver rescande les `.p-tooltip-text` pour
37205
+ // convertir le texte contenant du HTML en innerHTML rendu.
37206
+ useEffect(function () {
37207
+ if (!enableItemTooltip) return undefined;
37208
+ var rewrite = function rewrite() {
37209
+ document.querySelectorAll('.p-tooltip .p-tooltip-text').forEach(function (el) {
37210
+ var raw = el.textContent;
37211
+ if (raw && /<[a-z][\s\S]*>/i.test(raw) && el.innerHTML !== raw) {
37212
+ el.innerHTML = raw;
37213
+ }
37214
+ });
37215
+ };
37216
+ var observer = new MutationObserver(rewrite);
37217
+ observer.observe(document.body, {
37218
+ childList: true,
37219
+ subtree: true,
37220
+ characterData: true
37221
+ });
37222
+ return function () {
37223
+ return observer.disconnect();
37224
+ };
37225
+ }, [enableItemTooltip]);
37088
37226
  var optionTemplate = function optionTemplate(option) {
37089
37227
  var _ref2 = selectMetaConfig || {},
37090
37228
  labelStyle = _ref2.labelStyle,
@@ -37092,17 +37230,115 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37092
37230
  var styleLabel = {
37093
37231
  marginLeft: '10px'
37094
37232
  };
37095
- return /*#__PURE__*/React__default.createElement("div", {
37233
+ var tooltipProps = enableItemTooltip ? {
37234
+ 'data-pr-tooltip': (option === null || option === void 0 ? void 0 : option.tooltip) || (option === null || option === void 0 ? void 0 : option.description),
37235
+ 'data-pr-position': 'right'
37236
+ } : {};
37237
+ var tooltipContent = (option === null || option === void 0 ? void 0 : option.tooltip) || (option === null || option === void 0 ? void 0 : option.description);
37238
+ var hasTooltip = Boolean(enableItemTooltip && tooltipContent);
37239
+ var infoIcon = hasTooltip ? /*#__PURE__*/React__default.createElement("i", {
37240
+ className: "pi pi-info-circle dropdown-item-info-icon"
37241
+ }) : null;
37242
+ var secondaryLabel = enableSecondaryLabel ? option === null || option === void 0 ? void 0 : option[secondaryLabelKey] : null;
37243
+ var isLink = enableItemLink && (option === null || option === void 0 ? void 0 : option.link);
37244
+ var handleLinkClick = function handleLinkClick(e) {
37245
+ if (isLink) {
37246
+ e.preventDefault();
37247
+ e.stopPropagation();
37248
+ window.open(option.link, '_blank', 'noopener,noreferrer');
37249
+ }
37250
+ };
37251
+ var optionAttrs = typeof choice_attr === 'function' ? choice_attr(option) : {};
37252
+ var attrStyle = optionAttrs.style,
37253
+ attrClassName = optionAttrs.className,
37254
+ restAttrs = _objectWithoutProperties$1(optionAttrs, _excluded$3);
37255
+ var className = "flex align-items-center dropdown-tooltip-item ".concat(attrClassName || optionClassname || '').trim();
37256
+ if (hasTooltip) {
37257
+ // Deux colonnes : libellé à l'extrême gauche, picto "i" à l'extrême droite.
37258
+ // Le tooltip est porté par l'item entier et pointe sur le picto.
37259
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
37260
+ onClick: function onClick() {
37261
+ clickedFromList.current = true;
37262
+ },
37263
+ className: "".concat(className, " dropdown-item-two-cols").trim(),
37264
+ style: _objectSpread2({
37265
+ display: 'flex',
37266
+ alignItems: 'center',
37267
+ gap: '0.5rem',
37268
+ fontSize: '14px',
37269
+ maxWidth: 'none',
37270
+ overflow: 'hidden',
37271
+ textOverflow: 'ellipsis',
37272
+ whiteSpace: 'nowrap',
37273
+ width: '100%',
37274
+ justifyContent: 'space-between'
37275
+ }, attrStyle)
37276
+ }), /*#__PURE__*/React__default.createElement("div", {
37277
+ className: "dropdown-item-label-col",
37278
+ style: {
37279
+ display: 'flex',
37280
+ alignItems: 'center',
37281
+ gap: '0.5rem',
37282
+ minWidth: 0,
37283
+ overflow: 'hidden',
37284
+ textOverflow: 'ellipsis',
37285
+ whiteSpace: 'nowrap'
37286
+ }
37287
+ }, option === null || option === void 0 ? void 0 : option[optionLabel]), /*#__PURE__*/React__default.createElement("div", {
37288
+ className: "dropdown-item-info-col",
37289
+ style: {
37290
+ flexShrink: 0,
37291
+ display: 'flex',
37292
+ alignItems: 'center',
37293
+ marginLeft: '8px'
37294
+ }
37295
+ }, infoIcon));
37296
+ }
37297
+ if (withIcon || withColor) {
37298
+ var _ref3 = selectConfig || {},
37299
+ cfgLabelStyle = _ref3.labelStyle,
37300
+ cfgGeneralIcon = _ref3.generalIcon;
37301
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
37302
+ onClick: function onClick() {
37303
+ clickedFromList.current = true;
37304
+ },
37305
+ className: className,
37306
+ style: _objectSpread2(_objectSpread2({
37307
+ fontSize: '14px',
37308
+ display: 'flex',
37309
+ alignItems: 'center',
37310
+ gap: '8px'
37311
+ }, optionStyle), attrStyle)
37312
+ }), withIcon && cfgGeneralIcon && /*#__PURE__*/React__default.createElement("i", {
37313
+ style: {
37314
+ color: option === null || option === void 0 ? void 0 : option.color
37315
+ },
37316
+ className: cfgGeneralIcon
37317
+ }), withColor && option !== null && option !== void 0 && option.color ? /*#__PURE__*/React__default.createElement("span", {
37318
+ className: "dd-color-badge".concat(optionSelected === (option === null || option === void 0 ? void 0 : option[optionValue]) ? ' is-selected' : ''),
37319
+ style: {
37320
+ '--badge-color': option.color,
37321
+ color: inverseColor(option.color)
37322
+ }
37323
+ }, option === null || option === void 0 ? void 0 : option[optionLabel]) : /*#__PURE__*/React__default.createElement("span", {
37324
+ style: _objectSpread2(_objectSpread2({}, cfgLabelStyle), subItem ? {
37325
+ flex: 1
37326
+ } : {})
37327
+ }, option === null || option === void 0 ? void 0 : option[optionLabel]));
37328
+ }
37329
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
37096
37330
  onClick: function onClick() {
37097
37331
  clickedFromList.current = true;
37098
37332
  },
37099
- className: "flex align-items-center",
37100
- style: {
37333
+ className: className,
37334
+ style: _objectSpread2({
37101
37335
  padding: '6px 10px',
37102
37336
  height: 'auto'
37103
- }
37104
- }, /*#__PURE__*/React__default.createElement("div", {
37105
- style: _objectSpread2({
37337
+ }, attrStyle)
37338
+ }), /*#__PURE__*/React__default.createElement("div", {
37339
+ style: _objectSpread2(_objectSpread2({}, subItem ? {
37340
+ flex: 1
37341
+ } : {}), {}, {
37106
37342
  fontSize: '15px',
37107
37343
  fontWeight: 'bold'
37108
37344
  }, labelStyle)
@@ -37113,9 +37349,185 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37113
37349
  className: generalIcon
37114
37350
  }), /*#__PURE__*/React__default.createElement("span", {
37115
37351
  style: styleLabel
37116
- }, option === null || option === void 0 ? void 0 : option[optionLabel])));
37352
+ }, option === null || option === void 0 ? void 0 : option[optionLabel]), secondaryLabel && /*#__PURE__*/React__default.createElement("div", {
37353
+ onClick: isLink ? handleLinkClick : undefined,
37354
+ onMouseDown: isLink ? function (e) {
37355
+ return e.stopPropagation();
37356
+ } : undefined,
37357
+ style: {
37358
+ cursor: isLink ? 'pointer' : 'default',
37359
+ marginTop: '2px',
37360
+ width: 'fit-content'
37361
+ }
37362
+ }, /*#__PURE__*/React__default.createElement("small", {
37363
+ style: {
37364
+ opacity: 0.75,
37365
+ fontSize: '12px',
37366
+ textDecoration: isLink ? 'underline' : 'none',
37367
+ color: isLink ? '#3b82f6' : 'inherit',
37368
+ fontWeight: 'normal'
37369
+ }
37370
+ }, /*#__PURE__*/React__default.createElement("span", {
37371
+ style: subItem ? {} : {
37372
+ marginLeft: '10px'
37373
+ }
37374
+ }, secondaryLabel)))));
37375
+ };
37376
+ var groupedItemTemplate = function groupedItemTemplate(option) {
37377
+ var _ref4 = groupedItemTemplateConfig || {},
37378
+ showImage = _ref4.showImage,
37379
+ imageKey = _ref4.imageKey,
37380
+ imageStyle = _ref4.imageStyle,
37381
+ showIcon = _ref4.showIcon,
37382
+ iconKey = _ref4.iconKey,
37383
+ labelStyle = _ref4.labelStyle,
37384
+ generalIcon = _ref4.generalIcon,
37385
+ generalImage = _ref4.generalImage;
37386
+ var icon = option.value && option.value[iconKey];
37387
+ var styleLabel = generalIcon || showImage && option[imageKey] || showIcon && icon ? {
37388
+ marginLeft: '10px'
37389
+ } : {};
37390
+ if (option.group) {
37391
+ return /*#__PURE__*/React__default.createElement("div", {
37392
+ className: "flex align-items-center"
37393
+ }, /*#__PURE__*/React__default.createElement("div", {
37394
+ style: _objectSpread2({
37395
+ fontSize: '15px',
37396
+ fontWeight: 'bold'
37397
+ }, labelStyle)
37398
+ }, generalIcon && /*#__PURE__*/React__default.createElement("i", {
37399
+ className: generalIcon,
37400
+ style: _objectSpread2({
37401
+ fontSize: '15px',
37402
+ fontWeight: 'bold'
37403
+ }, labelStyle)
37404
+ }), generalImage && /*#__PURE__*/React__default.createElement("img", {
37405
+ alt: "General",
37406
+ src: generalImage,
37407
+ style: imageStyle || {
37408
+ width: '18px',
37409
+ marginRight: '0.5rem'
37410
+ },
37411
+ className: "mr-2"
37412
+ }), showImage && option[imageKey] && /*#__PURE__*/React__default.createElement("img", {
37413
+ alt: option.label,
37414
+ src: option[imageKey],
37415
+ style: imageStyle || {
37416
+ width: '18px',
37417
+ marginRight: '0.5rem'
37418
+ },
37419
+ className: "mr-2"
37420
+ }), showIcon && icon && /*#__PURE__*/React__default.createElement("i", {
37421
+ className: "mr-2 ".concat(icon),
37422
+ style: _objectSpread2({
37423
+ fontSize: '15px',
37424
+ fontWeight: 'bold'
37425
+ }, labelStyle)
37426
+ }), /*#__PURE__*/React__default.createElement("span", {
37427
+ style: styleLabel
37428
+ }, option.label)));
37429
+ }
37430
+ return null;
37117
37431
  };
37118
- var isInvalidEffective = invalid || showRequiredError;
37432
+ var panelFooterTemplate = function panelFooterTemplate() {
37433
+ if (InfoLineValue) {
37434
+ return /*#__PURE__*/React__default.createElement("div", {
37435
+ style: {
37436
+ padding: '8px'
37437
+ }
37438
+ }, /*#__PURE__*/React__default.createElement("b", null, InfoLineValue));
37439
+ }
37440
+ };
37441
+ var isInvalidEffective = invalid || status === 'error' || showRequiredError;
37442
+
37443
+ // 🔹 Chargement des options depuis une URL (même contrat que MultiSelectMetaAsync)
37444
+ var fetchOptionsFromUrl = /*#__PURE__*/function () {
37445
+ var _ref5 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
37446
+ var search,
37447
+ _ref6,
37448
+ _ref6$page,
37449
+ page,
37450
+ length,
37451
+ start,
37452
+ queryParams,
37453
+ response,
37454
+ responseJSON,
37455
+ dataAjax,
37456
+ mappedOptions,
37457
+ hasMore,
37458
+ _args = arguments,
37459
+ _t;
37460
+ return _regenerator().w(function (_context) {
37461
+ while (1) switch (_context.n) {
37462
+ case 0:
37463
+ search = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
37464
+ _ref6 = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, _ref6$page = _ref6.page, page = _ref6$page === void 0 ? 1 : _ref6$page;
37465
+ _context.p = 1;
37466
+ length = 25;
37467
+ start = (page - 1) * length;
37468
+ queryParams = new URLSearchParams();
37469
+ if (search) queryParams.append('search[value]', search);
37470
+ queryParams.append('start', start);
37471
+ queryParams.append('length', length);
37472
+ _context.n = 2;
37473
+ return fetch("".concat(optionsUrl, "?").concat(queryParams.toString()));
37474
+ case 2:
37475
+ response = _context.v;
37476
+ if (response.ok) {
37477
+ _context.n = 4;
37478
+ break;
37479
+ }
37480
+ if (!(response.status === 404)) {
37481
+ _context.n = 3;
37482
+ break;
37483
+ }
37484
+ hasMoreRef.current = false;
37485
+ return _context.a(2, {
37486
+ options: [],
37487
+ hasMore: false
37488
+ });
37489
+ case 3:
37490
+ throw new Error("Erreur HTTP: ".concat(response.status));
37491
+ case 4:
37492
+ _context.n = 5;
37493
+ return response.json();
37494
+ case 5:
37495
+ responseJSON = _context.v;
37496
+ dataAjax = responseJSON.data || [];
37497
+ mappedOptions = dataAjax.map(function (opt) {
37498
+ if (opt.hasOwnProperty('color') && opt.color !== null && opt.color.length > 0) {
37499
+ opt.color = opt.color.toLowerCase();
37500
+ } else {
37501
+ delete opt.color;
37502
+ }
37503
+ opt.label = opt.nom !== undefined && opt.nom !== null ? opt.nom : opt.label;
37504
+ opt.value = opt.id;
37505
+ return opt;
37506
+ });
37507
+ hasMore = start + dataAjax.length < responseJSON.recordsTotal;
37508
+ return _context.a(2, {
37509
+ options: mappedOptions,
37510
+ hasMore: hasMore,
37511
+ additional: {
37512
+ page: page + 1
37513
+ }
37514
+ });
37515
+ case 6:
37516
+ _context.p = 6;
37517
+ _t = _context.v;
37518
+ console.error("Erreur lors de la récupération des options :", _t);
37519
+ return _context.a(2, {
37520
+ options: [],
37521
+ hasMore: false
37522
+ });
37523
+ }
37524
+ }, _callee, null, [[1, 6]]);
37525
+ }));
37526
+ return function fetchOptionsFromUrl() {
37527
+ return _ref5.apply(this, arguments);
37528
+ };
37529
+ }();
37530
+ var loadOptions = typeof options === 'function' ? options : fetchOptionsFromUrl;
37119
37531
  var style = {
37120
37532
  border: isInvalidEffective ? '1px solid red' : '1px solid #ccc',
37121
37533
  width: '100%',
@@ -37126,36 +37538,38 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37126
37538
  }, [optionSelected]);
37127
37539
  useEffect(function () {
37128
37540
  setOptionSelected(objValue ? objValue === null || objValue === void 0 ? void 0 : objValue[optionValue] : value !== null && value !== void 0 ? value : null);
37541
+ currentPageRef.current = 1;
37542
+ hasMoreRef.current = true;
37543
+ isLoadingRef.current = false;
37129
37544
  var loadInitialOptions = /*#__PURE__*/function () {
37130
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
37131
- var result, _result$options, exists;
37132
- return _regenerator().w(function (_context) {
37133
- while (1) switch (_context.n) {
37545
+ var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
37546
+ var result, initialOpts, exists;
37547
+ return _regenerator().w(function (_context2) {
37548
+ while (1) switch (_context2.n) {
37134
37549
  case 0:
37135
- _context.n = 1;
37136
- return options('', [], {
37550
+ _context2.n = 1;
37551
+ return loadOptions('', [], {
37137
37552
  page: 1
37138
37553
  });
37139
37554
  case 1:
37140
- result = _context.v;
37141
- setLoadedOptions((result === null || result === void 0 ? void 0 : result.options) || []);
37555
+ result = _context2.v;
37556
+ hasMoreRef.current = (result === null || result === void 0 ? void 0 : result.hasMore) !== false;
37557
+ initialOpts = (result === null || result === void 0 ? void 0 : result.options) || [];
37142
37558
  if (objValue) {
37143
- exists = result === null || result === void 0 || (_result$options = result.options) === null || _result$options === void 0 ? void 0 : _result$options.some(function (opt) {
37559
+ exists = initialOpts.some(function (opt) {
37144
37560
  return opt[optionValue] === objValue[optionValue];
37145
37561
  });
37146
- if (!exists) {
37147
- setLoadedOptions(function (prev) {
37148
- return [].concat(_toConsumableArray$a(prev), [objValue]);
37149
- });
37150
- }
37562
+ updateLoadedOptions(exists ? initialOpts : [].concat(_toConsumableArray$a(initialOpts), [objValue]));
37563
+ } else {
37564
+ updateLoadedOptions(initialOpts);
37151
37565
  }
37152
37566
  case 2:
37153
- return _context.a(2);
37567
+ return _context2.a(2);
37154
37568
  }
37155
- }, _callee);
37569
+ }, _callee2);
37156
37570
  }));
37157
37571
  return function loadInitialOptions() {
37158
- return _ref3.apply(this, arguments);
37572
+ return _ref7.apply(this, arguments);
37159
37573
  };
37160
37574
  }();
37161
37575
  loadInitialOptions();
@@ -37163,7 +37577,7 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37163
37577
  return function () {
37164
37578
  document.removeEventListener('mousedown', handleClickOutside);
37165
37579
  };
37166
- }, [options, objValue, value]);
37580
+ }, [options, optionsUrl, objValue, value]);
37167
37581
  var handleClickOutside = function handleClickOutside(event) {
37168
37582
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
37169
37583
  setIsEditing(false);
@@ -37181,7 +37595,39 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37181
37595
  }
37182
37596
  };
37183
37597
  }, [dropdownRef.current]);
37598
+ useEffect(function () {
37599
+ if (enableItemTooltip) {
37600
+ setTooltipKey(function (prevKey) {
37601
+ return prevKey + 1;
37602
+ });
37603
+ }
37604
+ }, [loadedOptions, enableItemTooltip, optionSelected]);
37605
+ var getSelectedGroupLabel = function getSelectedGroupLabel(selectedValue) {
37606
+ if (!isGroupedOption || !selectedValue) return '';
37607
+ var _iterator = _createForOfIteratorHelper$7(loadedOptions),
37608
+ _step;
37609
+ try {
37610
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
37611
+ var group = _step.value;
37612
+ if (showTooltipGroup && group.items && group.items.some(function (item) {
37613
+ return item.value === selectedValue;
37614
+ })) {
37615
+ if (prevTextShowTooltip) return prevTextShowTooltip + ' ' + group.label;
37616
+ return group.label;
37617
+ }
37618
+ }
37619
+ } catch (err) {
37620
+ _iterator.e(err);
37621
+ } finally {
37622
+ _iterator.f();
37623
+ }
37624
+ return '';
37625
+ };
37626
+ useEffect(function () {
37627
+ if (optionSelected) setSelectedGroupLabel(getSelectedGroupLabel(optionSelected));
37628
+ }, [optionSelected, loadedOptions]);
37184
37629
  var handleChange = function handleChange(e) {
37630
+ if (readOnly) return;
37185
37631
  setOptionSelected(e.value);
37186
37632
  if (clickedFromList.current) {
37187
37633
  var _selected$optionLabel;
@@ -37192,69 +37638,92 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37192
37638
  setInputValue((_selected$optionLabel = selected === null || selected === void 0 ? void 0 : selected[optionLabel]) !== null && _selected$optionLabel !== void 0 ? _selected$optionLabel : '');
37193
37639
  }
37194
37640
  clickedFromList.current = false;
37195
- if (onChange) onChange(e.value);
37641
+ if (typeof onChange === 'function') {
37642
+ onChange(e.value);
37643
+ } else if (typeof onChange === 'string' && typeof window[onChange] === 'function') {
37644
+ window[onChange](e.value);
37645
+ }
37196
37646
  };
37197
37647
  var handleClear = function handleClear() {
37198
37648
  setOptionSelected(null);
37199
37649
  setInputValue('');
37200
- if (onChange) onChange(null);
37201
- options('', [], {
37650
+ if (typeof onChange === 'function') {
37651
+ onChange(null);
37652
+ } else if (typeof onChange === 'string' && typeof window[onChange] === 'function') {
37653
+ window[onChange](null);
37654
+ }
37655
+ searchTermRef.current = '';
37656
+ currentPageRef.current = 1;
37657
+ hasMoreRef.current = true;
37658
+ isLoadingRef.current = false;
37659
+ loadOptions('', [], {
37202
37660
  page: 1
37203
37661
  }).then(function (result) {
37204
- setLoadedOptions((result === null || result === void 0 ? void 0 : result.options) || []);
37662
+ hasMoreRef.current = (result === null || result === void 0 ? void 0 : result.hasMore) !== false;
37663
+ updateLoadedOptions((result === null || result === void 0 ? void 0 : result.options) || []);
37205
37664
  });
37206
37665
  };
37207
37666
  var handleInputChange = /*#__PURE__*/function () {
37208
- var _ref4 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(e) {
37209
- var search, result, _result$options2, _result, filteredOptions;
37210
- return _regenerator().w(function (_context2) {
37211
- while (1) switch (_context2.n) {
37667
+ var _ref8 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3(e) {
37668
+ var search, result, _result$options, _result, filteredOptions;
37669
+ return _regenerator().w(function (_context3) {
37670
+ while (1) switch (_context3.n) {
37212
37671
  case 0:
37213
37672
  search = e.target.value;
37214
37673
  setInputValue(search);
37674
+ if (typeof onSearch === 'function') onSearch(search);
37675
+ searchTermRef.current = search;
37676
+ currentPageRef.current = 1;
37677
+ hasMoreRef.current = true;
37678
+ isLoadingRef.current = false;
37215
37679
  if (search) {
37216
- _context2.n = 2;
37680
+ _context3.n = 2;
37217
37681
  break;
37218
37682
  }
37219
- _context2.n = 1;
37220
- return options('', [], {
37683
+ _context3.n = 1;
37684
+ return loadOptions('', [], {
37221
37685
  page: 1
37222
37686
  });
37223
37687
  case 1:
37224
- result = _context2.v;
37225
- setLoadedOptions((result === null || result === void 0 ? void 0 : result.options) || []);
37226
- _context2.n = 4;
37688
+ result = _context3.v;
37689
+ hasMoreRef.current = (result === null || result === void 0 ? void 0 : result.hasMore) !== false;
37690
+ updateLoadedOptions((result === null || result === void 0 ? void 0 : result.options) || []);
37691
+ _context3.n = 4;
37227
37692
  break;
37228
37693
  case 2:
37229
- _context2.n = 3;
37230
- return options(search, [], {
37694
+ _context3.n = 3;
37695
+ return loadOptions(search, [], {
37231
37696
  page: 1
37232
37697
  });
37233
37698
  case 3:
37234
- _result = _context2.v;
37235
- filteredOptions = (_result === null || _result === void 0 || (_result$options2 = _result.options) === null || _result$options2 === void 0 ? void 0 : _result$options2.filter(function (opt) {
37699
+ _result = _context3.v;
37700
+ hasMoreRef.current = (_result === null || _result === void 0 ? void 0 : _result.hasMore) !== false;
37701
+ filteredOptions = (_result === null || _result === void 0 || (_result$options = _result.options) === null || _result$options === void 0 ? void 0 : _result$options.filter(function (opt) {
37236
37702
  return opt[optionLabel].toLowerCase().includes(search.toLowerCase());
37237
37703
  })) || [];
37238
- setLoadedOptions(filteredOptions);
37704
+ updateLoadedOptions(filteredOptions);
37239
37705
  case 4:
37240
- return _context2.a(2);
37706
+ return _context3.a(2);
37241
37707
  }
37242
- }, _callee2);
37708
+ }, _callee3);
37243
37709
  }));
37244
37710
  return function handleInputChange(_x) {
37245
- return _ref4.apply(this, arguments);
37711
+ return _ref8.apply(this, arguments);
37246
37712
  };
37247
37713
  }();
37714
+ var handleMouseEnter = function handleMouseEnter() {
37715
+ var _dropdownComposantRef;
37716
+ if (!openOnHover || disabled || readOnly) return;
37717
+ (_dropdownComposantRef = dropdownComposantRef.current) === null || _dropdownComposantRef === void 0 || _dropdownComposantRef.show();
37718
+ };
37719
+ var handleMouseLeave = function handleMouseLeave() {
37720
+ var _dropdownComposantRef2;
37721
+ if (!openOnHover) return;
37722
+ (_dropdownComposantRef2 = dropdownComposantRef.current) === null || _dropdownComposantRef2 === void 0 || _dropdownComposantRef2.hide();
37723
+ };
37248
37724
  var selectedOption = loadedOptions.find(function (opt) {
37249
37725
  return opt[optionValue] === optionSelected;
37250
37726
  });
37251
- var inverseColor = function inverseColor(hexColor) {
37252
- var r = parseInt(hexColor.substr(1, 2), 16);
37253
- var g = parseInt(hexColor.substr(3, 2), 16);
37254
- var b = parseInt(hexColor.substr(5, 2), 16);
37255
- var luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;
37256
- return luminance > 0.18 ? '#000000' : '#FFFFFF';
37257
- };
37258
37727
  var valueTemplate = function valueTemplate() {
37259
37728
  if (isEditing) return null;
37260
37729
  if (!selectedOption) return /*#__PURE__*/React__default.createElement("span", {
@@ -37262,7 +37731,42 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37262
37731
  color: '#aaa'
37263
37732
  }
37264
37733
  }, placeholder);
37265
- return /*#__PURE__*/React__default.createElement("span", {
37734
+ var valueTooltip = enableItemTooltip ? (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.tooltip) || (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.description) || (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption[optionLabel]) : null;
37735
+ var valueTooltipAttrs = valueTooltip ? {
37736
+ 'data-pr-tooltip': valueTooltip,
37737
+ 'data-pr-position': 'top'
37738
+ } : {};
37739
+ if (withIcon || withColor) {
37740
+ var _ref9 = selectConfig || {},
37741
+ labelStyle = _ref9.labelStyle,
37742
+ generalIcon = _ref9.generalIcon;
37743
+ return /*#__PURE__*/React__default.createElement("div", {
37744
+ style: _objectSpread2({
37745
+ display: 'flex',
37746
+ alignItems: 'center',
37747
+ gap: '8px',
37748
+ fontFamily: 'Arial',
37749
+ fontSize: '14px'
37750
+ }, valueStyle)
37751
+ }, withIcon && generalIcon && /*#__PURE__*/React__default.createElement("i", {
37752
+ style: {
37753
+ color: selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.color
37754
+ },
37755
+ className: generalIcon
37756
+ }), withColor && selectedOption !== null && selectedOption !== void 0 && selectedOption.color ? /*#__PURE__*/React__default.createElement("span", {
37757
+ className: "dd-color-badge is-selected",
37758
+ style: {
37759
+ '--badge-color': selectedOption.color,
37760
+ color: inverseColor(selectedOption.color)
37761
+ }
37762
+ }, truncateLabel(selectedOption[optionLabel])) : /*#__PURE__*/React__default.createElement("span", {
37763
+ className: valueClassname,
37764
+ style: labelStyle
37765
+ }, truncateLabel(selectedOption[optionLabel])));
37766
+ }
37767
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
37768
+ className: "".concat(valueClassname || '').concat(valueTooltip ? ' dropdown-tooltip-trigger' : '').trim() || undefined,
37769
+ title: valueTooltip ? undefined : selectedOption[optionLabel],
37266
37770
  style: _objectSpread2({
37267
37771
  backgroundColor: selectedOption !== null && selectedOption !== void 0 && selectedOption.color ? selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.color : '#FFFFFF',
37268
37772
  color: selectedOption !== null && selectedOption !== void 0 && selectedOption.color ? inverseColor(selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.color) : '#FFFFFF',
@@ -37273,41 +37777,53 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37273
37777
  display: 'inline-block',
37274
37778
  fontFamily: 'Arial'
37275
37779
  }, valueStyle)
37276
- }, selectedOption[optionLabel]);
37780
+ }, valueTooltipAttrs), truncateLabel(selectedOption[optionLabel]));
37277
37781
  };
37278
37782
 
37279
- // 🔹 Fonction de lazy loading (simulation d’un backend)
37783
+ // 🔹 Lazy loading paginé au scroll (même logique que MultiSelectMetaAsync)
37280
37784
  var onLazyLoad = function onLazyLoad(event) {
37281
37785
  setLoading(true);
37282
- if (loadLazyTimeout.current) {
37283
- clearTimeout(loadLazyTimeout.current);
37284
- }
37285
- loadLazyTimeout.current = setTimeout(function () {
37286
- var first = event.first,
37287
- last = event.last;
37288
- var _items = _toConsumableArray$a(loadedOptions);
37289
- for (var i = first; i < last; i++) {
37290
- if (!_items[i]) {
37291
- _items[i] = _defineProperty$g(_defineProperty$g({}, optionLabel, "Option #".concat(i)), optionValue, i);
37292
- }
37293
- }
37294
- setLoadedOptions(_items);
37295
- setLoading(false);
37296
- var virtualscroll1 = document.querySelector('.p-virtualscroller.p-dropdown-items-wrapper');
37297
- if (virtualscroll1) {
37298
- virtualscroll1.style.height = "auto";
37299
- }
37300
- var hiddenSelectDiv = document.querySelector('.p-hidden-accessible.p-dropdown-hidden-select');
37301
- if (hiddenSelectDiv) {
37302
- var nextEl = hiddenSelectDiv.nextElementSibling;
37303
- if (nextEl && nextEl.tagName === 'INPUT' && nextEl.value && nextEl.value.trim() !== '') {
37304
- var virtualscroll = document.querySelector('.p-virtualscroller.p-dropdown-items-wrapper');
37305
- if (virtualscroll) {
37306
- virtualscroll.style.height = 'auto';
37307
- }
37786
+ if (event.last < loadedOptionsRef.current.length - 1 || !hasMoreRef.current) {
37787
+ setTimeout(function () {
37788
+ return setLoading(false);
37789
+ }, 0);
37790
+ return;
37791
+ }
37792
+ if (isLoadingRef.current) return;
37793
+ isLoadingRef.current = true;
37794
+ if (loadLazyTimeout.current) clearTimeout(loadLazyTimeout.current);
37795
+ loadLazyTimeout.current = setTimeout(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
37796
+ var nextPage, result, newOptions;
37797
+ return _regenerator().w(function (_context4) {
37798
+ while (1) switch (_context4.n) {
37799
+ case 0:
37800
+ nextPage = currentPageRef.current + 1;
37801
+ _context4.n = 1;
37802
+ return loadOptions(searchTermRef.current, [], {
37803
+ page: nextPage
37804
+ });
37805
+ case 1:
37806
+ result = _context4.v;
37807
+ newOptions = (result === null || result === void 0 ? void 0 : result.options) || [];
37808
+ if (!(newOptions.length === 0)) {
37809
+ _context4.n = 2;
37810
+ break;
37811
+ }
37812
+ hasMoreRef.current = false;
37813
+ isLoadingRef.current = false;
37814
+ setLoading(false);
37815
+ return _context4.a(2);
37816
+ case 2:
37817
+ updateLoadedOptions([].concat(_toConsumableArray$a(loadedOptionsRef.current), _toConsumableArray$a(newOptions)));
37818
+ hasMoreRef.current = (result === null || result === void 0 ? void 0 : result.hasMore) !== false;
37819
+ currentPageRef.current = nextPage;
37820
+ isLoadingRef.current = false;
37821
+ setLoading(false);
37822
+ case 3:
37823
+ return _context4.a(2);
37308
37824
  }
37309
- }
37310
- }, Math.random() * 1000 + 250);
37825
+ }, _callee4);
37826
+ })), 500);
37311
37827
  };
37312
37828
  useEffect(function () {
37313
37829
  var handleAnyClick = function handleAnyClick(e) {
@@ -37334,20 +37850,105 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37334
37850
  return document.removeEventListener('click', handleAnyClick);
37335
37851
  };
37336
37852
  }, []);
37337
- return /*#__PURE__*/React__default.createElement("div", {
37338
- ref: dropdownRef,
37339
- className: "flex flex-col gap-1",
37340
- onClick: isInvalidEffective || disabled ? null : function () {
37853
+
37854
+ // 🔹 Options calculées (réordonnancement + tri, comme Dropdown)
37855
+ var smartSort = function smartSort(opts, order, labelKey) {
37856
+ if (!order) return opts;
37857
+ var dir = order === 'desc' ? 1 : -1;
37858
+ return _toConsumableArray$a(opts).sort(function (a, b) {
37859
+ var _a$labelKey, _b$labelKey;
37860
+ var aLabel = String((_a$labelKey = a === null || a === void 0 ? void 0 : a[labelKey]) !== null && _a$labelKey !== void 0 ? _a$labelKey : '').trim();
37861
+ var bLabel = String((_b$labelKey = b === null || b === void 0 ? void 0 : b[labelKey]) !== null && _b$labelKey !== void 0 ? _b$labelKey : '').trim();
37862
+ return dir * aLabel.localeCompare(bLabel, 'fr', {
37863
+ sensitivity: 'base',
37864
+ numeric: true
37865
+ });
37866
+ });
37867
+ };
37868
+ var computedOptions = useMemo(function () {
37869
+ var opts = loadedOptions;
37870
+ if (itemsCheckedToTheTop && optionSelected) {
37871
+ var selected = opts.find(function (opt) {
37872
+ return (opt === null || opt === void 0 ? void 0 : opt[optionValue]) === optionSelected;
37873
+ });
37874
+ if (selected) {
37875
+ opts = [selected].concat(_toConsumableArray$a(opts.filter(function (opt) {
37876
+ return (opt === null || opt === void 0 ? void 0 : opt[optionValue]) !== optionSelected;
37877
+ })));
37878
+ }
37879
+ }
37880
+ if (enableSorting) {
37881
+ opts = smartSort(opts, sortOrder, optionLabel);
37882
+ }
37883
+ return opts;
37884
+ }, [loadedOptions, itemsCheckedToTheTop, optionSelected, enableSorting, sortOrder, optionValue, optionLabel]);
37885
+ var toggleSortOrder = function toggleSortOrder() {
37886
+ setSortOrder(function (prev) {
37887
+ if (prev === null) return 'desc';
37888
+ if (prev === 'desc') return 'asc';
37889
+ return null;
37890
+ });
37891
+ requestAnimationFrame(function () {
37892
+ var _dropdownComposantRef3;
37893
+ (_dropdownComposantRef3 = dropdownComposantRef.current) === null || _dropdownComposantRef3 === void 0 || _dropdownComposantRef3.show();
37894
+ });
37895
+ };
37896
+ var customFilterTemplate = function customFilterTemplate(opts) {
37897
+ if (!enableSorting) return opts.element;
37898
+ return /*#__PURE__*/React__default.createElement("div", {
37899
+ className: "dd-search-row"
37900
+ }, opts.element, /*#__PURE__*/React__default.createElement("button", {
37901
+ type: "button",
37902
+ className: "dd-sort-btn",
37903
+ onClick: function onClick(e) {
37904
+ e.stopPropagation();
37905
+ toggleSortOrder();
37906
+ }
37907
+ }, /*#__PURE__*/React__default.createElement("i", {
37908
+ className: sortOrder === 'desc' ? 'pi pi-sort-amount-down' : sortOrder === 'asc' ? 'pi pi-sort-amount-up-alt' : 'pi pi-sort-alt'
37909
+ })));
37910
+ };
37911
+ var mergedClassName = "flex flex-col gap-1 ".concat(attr["class"] || '').trim();
37912
+ attr["class"];
37913
+ var cleanAttr = _objectWithoutProperties$1(attr, _excluded2$2);
37914
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({
37915
+ ref: dropdownRef
37916
+ }, cleanAttr, {
37917
+ className: mergedClassName,
37918
+ style: {
37919
+ width: '100%'
37920
+ },
37921
+ onMouseEnter: handleMouseEnter,
37922
+ onMouseLeave: handleMouseLeave,
37923
+ onClick: isInvalidEffective || disabled || readOnly ? null : function () {
37341
37924
  return setIsEditing(editable);
37342
37925
  }
37343
- }, /*#__PURE__*/React__default.createElement(Dropdown$1, {
37344
- options: loadedOptions,
37926
+ }), enableItemTooltip && /*#__PURE__*/React__default.createElement(Tooltip$1, {
37927
+ key: tooltipKey,
37928
+ target: ".dropdown-tooltip-item, .dropdown-tooltip-trigger",
37929
+ appendTo: document.body,
37930
+ position: "right",
37931
+ autoHide: false,
37932
+ hideDelay: 150,
37933
+ style: {
37934
+ zIndex: 9999999
37935
+ }
37936
+ }), /*#__PURE__*/React__default.createElement(Dropdown$1, _extends$J({
37937
+ ref: dropdownComposantRef,
37938
+ options: computedOptions,
37345
37939
  onChange: handleChange,
37940
+ onClick: function onClick(e) {
37941
+ if (readOnly) {
37942
+ e.preventDefault();
37943
+ e.stopPropagation();
37944
+ }
37945
+ },
37346
37946
  filter: filter,
37947
+ filterTemplate: filter ? customFilterTemplate : undefined,
37347
37948
  placeholder: placeholder === "" || placeholder === null ? ' ' : placeholder,
37348
37949
  optionLabel: optionLabel,
37349
37950
  optionValue: optionValue,
37350
- showClear: true,
37951
+ showClear: showClear,
37351
37952
  disabled: disabled,
37352
37953
  editable: isEditing,
37353
37954
  onFocus: function onFocus() {
@@ -37365,16 +37966,38 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37365
37966
  },
37366
37967
  dropdownMode: "current",
37367
37968
  itemTemplate: optionTemplate,
37368
- valueTemplate: valueTemplate,
37369
- virtualScrollerOptions: {
37969
+ valueTemplate: valueTemplate
37970
+ }, hasInfoLine && {
37971
+ panelFooterTemplate: panelFooterTemplate
37972
+ }, {
37973
+ optionGroupTemplate: isGroupedOption ? groupedItemTemplate : null
37974
+ }, isGroupedOption && computedOptions.length > 0 && Array.isArray((_computedOptions$ = computedOptions[0]) === null || _computedOptions$ === void 0 ? void 0 : _computedOptions$.items) && {
37975
+ optionGroupLabel: 'label',
37976
+ optionGroupChildren: 'items'
37977
+ }, {
37978
+ onShow: function onShow() {
37979
+ if (isGroupedOption && showTooltipGroup) setIsDropdownOpen(true);
37980
+ if (enableItemTooltip) setTooltipKey(function (k) {
37981
+ return k + 1;
37982
+ });
37983
+ },
37984
+ onHide: function onHide() {
37985
+ if (isGroupedOption && showTooltipGroup) setIsDropdownOpen(false);
37986
+ },
37987
+ emptyMessage: externalLoading ? 'Chargement…' : 'Aucune option disponible',
37988
+ virtualScrollerOptions: _objectSpread2({
37370
37989
  lazy: true,
37371
37990
  onLazyLoad: onLazyLoad,
37372
37991
  itemSize: 38,
37373
37992
  showLoader: true,
37374
- loading: loading,
37993
+ loading: loading || externalLoading,
37375
37994
  delay: 25
37376
- },
37377
- className: "w-full md:w-14rem"
37995
+ }, virtualScrollerOptions),
37996
+ className: "w-full"
37997
+ })), !isDropdownOpen && selectedGroupLabel && isGroupedOption && /*#__PURE__*/React__default.createElement(Tooltip$1, {
37998
+ target: ".p-dropdown-label.p-inputtext",
37999
+ content: selectedGroupLabel,
38000
+ position: "top"
37378
38001
  }), name && /*#__PURE__*/React__default.createElement("input", {
37379
38002
  type: "hidden",
37380
38003
  name: name,
@@ -37411,9 +38034,6 @@ var DropdownSelectMetaAsync = function DropdownSelectMetaAsync(_ref) {
37411
38034
  }, errorMessage || (showRequiredError ? ((_window$Translator = window.Translator) === null || _window$Translator === void 0 ? void 0 : _window$Translator.trans('error.required')) || 'Veuillez renseigner ce champ' : ((_window$Translator2 = window.Translator) === null || _window$Translator2 === void 0 ? void 0 : _window$Translator2.trans('error.invalid_selection')) || 'Sélection invalide'))));
37412
38035
  };
37413
38036
 
37414
- var css_248z$5 = "@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateX(40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes toastIconPop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 60% {\n transform: scale(1.2);\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes toastTextSlide {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.dropdownbook.p-dropdown-panel {\n z-index: 999999 !important;\n}\n\n.p-tooltip {\n z-index: 1000000 !important;\n}\n\n.dropdown-tooltip-item {\n position: relative;\n width: 100%;\n cursor: pointer;\n}\n\n/* Application du mixin field sur le wrapper du Dropdown */\n.dropdown-container .p-dropdown {\n font-family: \"Roboto\", sans-serif;\n min-height: 40px;\n padding: 0 12px;\n background: #ffffff;\n border: 1.5px solid #e0e3e8;\n border-radius: 7px;\n color: #1a1e26;\n outline: none;\n transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.dropdown-container .p-dropdown:hover:not(:focus):not(:focus-within):not([disabled]):not(.is-disabled) {\n border-color: #c8cdd6;\n}\n.dropdown-container .p-dropdown:focus, .dropdown-container .p-dropdown:focus-within, .dropdown-container .p-dropdown.is-open {\n border-color: #3f3f3f;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);\n}\n.dropdown-container .p-dropdown[disabled], .dropdown-container .p-dropdown.is-disabled {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n.dropdown-container .p-dropdown[readonly], .dropdown-container .p-dropdown.is-readonly {\n background: #f4f5f6;\n cursor: default;\n box-shadow: none;\n}\n.dropdown-container .p-dropdown[readonly]:hover, .dropdown-container .p-dropdown.is-readonly:hover {\n border-color: #e0e3e8;\n}\n.dropdown-container .p-dropdown.is-error {\n border-color: #dc2626;\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);\n}\n.dropdown-container .p-dropdown.is-success {\n border-color: #15803d;\n box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.12);\n}\n.dropdown-container .p-dropdown {\n padding: 0;\n display: flex;\n align-items: center;\n}\n\n.dd-search-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.dd-search-row [class*=-filter-container] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n.dd-search-row [class*=-filter-container] .p-inputtext {\n width: 100%;\n height: 32px;\n padding: 0 24.5px 0 12px;\n font-size: 14px;\n box-sizing: border-box;\n}\n.dd-search-row [class*=-filter-container] [class*=-filter-icon] {\n right: 10.5px;\n color: #b0b8c4;\n}\n\n.dd-sort-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.dd-sort-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n\n.dropdownbook .p-dropdown-header:has(.dd-search-row) {\n padding: 0;\n}\n\n/* ===== Badge couleur dans les items ===== */\n.dd-color-badge {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 4px 10px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n cursor: default;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n background-color: #f4f5f6;\n color: #1a1e26;\n border: 1px solid #e0e3e8;\n border-color: var(--badge-color, #e0e3e8);\n background-color: color-mix(in srgb, var(--badge-color, #f4f5f6) 50%, transparent);\n}\n.dd-color-badge.is-selected {\n background-color: var(--badge-color, #f4f5f6);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n\n.p-dropdown-item:hover .dd-color-badge {\n background-color: var(--badge-color) !important;\n}\n\n/* ===== Override PrimeReact default item colors ===== */\n.dropdownbook .p-dropdown-items .p-dropdown-item:not(.p-highlight):hover {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-highlight {\n background: rgba(63, 63, 63, 0.08) !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-highlight.p-focus {\n background: rgba(63, 63, 63, 0.12) !important;\n color: #1a1e26 !important;\n}\n.dropdownbook .p-dropdown-items .p-dropdown-item.p-focus {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n\n/* ===== Override PrimeReact filter input focus ===== */\n.dropdownbook .p-dropdown-filter.p-inputtext:hover {\n border-color: #c8cdd6 !important;\n}\n.dropdownbook .p-dropdown-filter.p-inputtext:focus, .dropdownbook .p-dropdown-filter.p-inputtext.p-focus {\n border-color: #3f3f3f !important;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1) !important;\n outline: none;\n}";
37415
- styleInject(css_248z$5);
37416
-
37417
38037
  var _excluded$2 = ["class"],
37418
38038
  _excluded2$1 = ["style", "className"];
37419
38039
  var Dropdown = function Dropdown(props) {
@@ -37519,10 +38139,11 @@ var Dropdown = function Dropdown(props) {
37519
38139
  _props$subItem = props.subItem,
37520
38140
  subItem = _props$subItem === void 0 ? false : _props$subItem,
37521
38141
  _props$required = props.required,
37522
- required = _props$required === void 0 ? false : _props$required;
38142
+ required = _props$required === void 0 ? false : _props$required,
38143
+ optionsUrl = props.optionsUrl;
37523
38144
 
37524
38145
  // --- Async delegation ---
37525
- var isAsyncOptions = typeof options === 'function';
38146
+ var isAsyncOptions = typeof options === 'function' || optionsUrl;
37526
38147
  if (isAsyncOptions) {
37527
38148
  return /*#__PURE__*/React__default.createElement(DropdownSelectMetaAsync, props);
37528
38149
  }
@@ -37628,7 +38249,7 @@ var Dropdown = function Dropdown(props) {
37628
38249
  return prevKey + 1;
37629
38250
  });
37630
38251
  }
37631
- }, [options, enableItemTooltip]);
38252
+ }, [options, enableItemTooltip, optionSelected]);
37632
38253
 
37633
38254
  // --- Helpers ---
37634
38255
  var getSelectedGroupLabel = function getSelectedGroupLabel(selectedValue) {
@@ -37665,6 +38286,34 @@ var Dropdown = function Dropdown(props) {
37665
38286
  return label.slice(0, truncateAt) + '…';
37666
38287
  };
37667
38288
 
38289
+ // --- Tooltip HTML support ---
38290
+ // PrimeReact 10 ignore la prop `escape` : sa Tooltip écrit toujours via
38291
+ // createTextNode. Un MutationObserver global rescande les `.p-tooltip-text`
38292
+ // pour convertir le texte contenant du HTML en innerHTML rendu.
38293
+ // On l'installe une seule fois côté document.body, indépendamment du montage
38294
+ // des composants — car onShow ne se déclenche pas lors du changement de
38295
+ // cible pendant que le tooltip est déjà visible.
38296
+ useEffect(function () {
38297
+ if (!enableItemTooltip) return undefined;
38298
+ var rewrite = function rewrite() {
38299
+ document.querySelectorAll('.p-tooltip .p-tooltip-text').forEach(function (el) {
38300
+ var raw = el.textContent;
38301
+ if (raw && /<[a-z][\s\S]*>/i.test(raw) && el.innerHTML !== raw) {
38302
+ el.innerHTML = raw;
38303
+ }
38304
+ });
38305
+ };
38306
+ var observer = new MutationObserver(rewrite);
38307
+ observer.observe(document.body, {
38308
+ childList: true,
38309
+ subtree: true,
38310
+ characterData: true
38311
+ });
38312
+ return function () {
38313
+ return observer.disconnect();
38314
+ };
38315
+ }, [enableItemTooltip]);
38316
+
37668
38317
  // --- Event handlers ---
37669
38318
  var handleShow = function handleShow() {
37670
38319
  return setIsDropdownOpen(true);
@@ -37712,6 +38361,11 @@ var Dropdown = function Dropdown(props) {
37712
38361
  } : {
37713
38362
  className: 'dropdown-tooltip-item'
37714
38363
  };
38364
+ var tooltipContent = option.tooltip || option.description;
38365
+ var hasTooltip = Boolean(enableItemTooltip && tooltipContent);
38366
+ var infoIcon = hasTooltip ? /*#__PURE__*/React__default.createElement("i", {
38367
+ className: "pi pi-info-circle dropdown-item-info-icon"
38368
+ }) : null;
37715
38369
  var secondaryLabel = enableSecondaryLabel ? option === null || option === void 0 ? void 0 : option[secondaryLabelKey] : null;
37716
38370
  var isLink = enableItemLink && option.link;
37717
38371
  var handleLinkClick = function handleLinkClick(e) {
@@ -37791,10 +38445,7 @@ var Dropdown = function Dropdown(props) {
37791
38445
  optionAttrs.style;
37792
38446
  optionAttrs.className;
37793
38447
  var restAttrs = _objectWithoutProperties$1(optionAttrs, _excluded2$1);
37794
- return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
37795
- className: className,
37796
- style: _style
37797
- }), imgUrl && /*#__PURE__*/React__default.createElement("img", {
38448
+ var labelContent = /*#__PURE__*/React__default.createElement(React__default.Fragment, null, imgUrl && /*#__PURE__*/React__default.createElement("img", {
37798
38449
  src: imgUrl,
37799
38450
  alt: "",
37800
38451
  style: {
@@ -37845,6 +38496,42 @@ var Dropdown = function Dropdown(props) {
37845
38496
  marginLeft: '10px'
37846
38497
  }
37847
38498
  }, secondaryLabel)))) : option[optionLabel]);
38499
+ if (hasTooltip) {
38500
+ // Deux colonnes : libellé à l'extrême gauche, picto "i" à l'extrême droite.
38501
+ // Le tooltip est porté par l'item entier (survol de toute la ligne) et,
38502
+ // en position "right" sur un item pleine largeur, il pointe sur le picto.
38503
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
38504
+ className: "".concat(className, " dropdown-item-two-cols"),
38505
+ style: _objectSpread2(_objectSpread2({}, _style), {}, {
38506
+ width: '100%',
38507
+ maxWidth: 'none',
38508
+ justifyContent: 'space-between'
38509
+ })
38510
+ }), /*#__PURE__*/React__default.createElement("div", {
38511
+ className: "dropdown-item-label-col",
38512
+ style: {
38513
+ display: 'flex',
38514
+ alignItems: 'center',
38515
+ gap: '0.5rem',
38516
+ minWidth: 0,
38517
+ overflow: 'hidden',
38518
+ textOverflow: 'ellipsis',
38519
+ whiteSpace: 'nowrap'
38520
+ }
38521
+ }, labelContent), /*#__PURE__*/React__default.createElement("div", {
38522
+ className: "dropdown-item-info-col",
38523
+ style: {
38524
+ flexShrink: 0,
38525
+ display: 'flex',
38526
+ alignItems: 'center',
38527
+ marginLeft: '8px'
38528
+ }
38529
+ }, infoIcon));
38530
+ }
38531
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, restAttrs, {
38532
+ className: className,
38533
+ style: _style
38534
+ }), labelContent);
37848
38535
  }
37849
38536
  var _ref2 = selectMetaConfig || {},
37850
38537
  labelStyle = _ref2.labelStyle,
@@ -37917,6 +38604,11 @@ var Dropdown = function Dropdown(props) {
37917
38604
  }, secondaryLabel)))));
37918
38605
  };
37919
38606
  var valueTemplate = function valueTemplate(option) {
38607
+ var valueTooltip = enableItemTooltip ? (option === null || option === void 0 ? void 0 : option.tooltip) || (option === null || option === void 0 ? void 0 : option.description) || (option === null || option === void 0 ? void 0 : option[optionLabel]) : null;
38608
+ var valueTooltipAttrs = valueTooltip ? {
38609
+ 'data-pr-tooltip': valueTooltip,
38610
+ 'data-pr-position': 'top'
38611
+ } : {};
37920
38612
  if (isSelectMeta) {
37921
38613
  if (!isEditing) {
37922
38614
  var iconColor = option !== null && option !== void 0 && option.color ? inverseColor(option === null || option === void 0 ? void 0 : option.color) : '#000000';
@@ -37986,9 +38678,10 @@ var Dropdown = function Dropdown(props) {
37986
38678
  fontSize: '14px'
37987
38679
  }, valueStyle)
37988
38680
  };
37989
- return imgUrl ? /*#__PURE__*/React__default.createElement("div", {
37990
- style: _style2
37991
- }, /*#__PURE__*/React__default.createElement("img", {
38681
+ return imgUrl ? /*#__PURE__*/React__default.createElement("div", _extends$J({
38682
+ style: _style2,
38683
+ className: valueTooltip ? 'dropdown-tooltip-trigger' : undefined
38684
+ }, valueTooltipAttrs), /*#__PURE__*/React__default.createElement("img", {
37992
38685
  src: imgUrl,
37993
38686
  alt: "",
37994
38687
  style: {
@@ -37996,15 +38689,15 @@ var Dropdown = function Dropdown(props) {
37996
38689
  height: '18px',
37997
38690
  objectFit: 'contain'
37998
38691
  }
37999
- }), /*#__PURE__*/React__default.createElement("span", null, option === null || option === void 0 ? void 0 : option[optionLabel])) : /*#__PURE__*/React__default.createElement("span", {
38000
- className: attrs.className,
38692
+ }), /*#__PURE__*/React__default.createElement("span", null, option === null || option === void 0 ? void 0 : option[optionLabel])) : /*#__PURE__*/React__default.createElement("span", _extends$J({
38693
+ className: "".concat(attrs.className || '').concat(valueTooltip ? ' dropdown-tooltip-trigger' : '').trim() || undefined,
38001
38694
  style: _objectSpread2(_objectSpread2(_objectSpread2({}, attrs.style), optionStyle), {}, {
38002
38695
  whiteSpace: 'nowrap',
38003
38696
  overflow: 'hidden',
38004
38697
  textOverflow: 'ellipsis'
38005
38698
  }),
38006
- title: option === null || option === void 0 ? void 0 : option[optionLabel]
38007
- }, truncateLabel(option === null || option === void 0 ? void 0 : option[optionLabel]) || placeholder);
38699
+ title: valueTooltip ? undefined : option === null || option === void 0 ? void 0 : option[optionLabel]
38700
+ }, valueTooltipAttrs), truncateLabel(option === null || option === void 0 ? void 0 : option[optionLabel]) || placeholder);
38008
38701
  }
38009
38702
  };
38010
38703
  var groupedItemTemplate = function groupedItemTemplate(option) {
@@ -38149,9 +38842,11 @@ var Dropdown = function Dropdown(props) {
38149
38842
  }
38150
38843
  }, enableItemTooltip && /*#__PURE__*/React__default.createElement(Tooltip$1, {
38151
38844
  key: tooltipKey,
38152
- target: ".dropdown-tooltip-item",
38845
+ target: ".dropdown-tooltip-item, .dropdown-tooltip-trigger",
38153
38846
  appendTo: document.body,
38154
38847
  position: "right",
38848
+ autoHide: false,
38849
+ hideDelay: 150,
38155
38850
  style: {
38156
38851
  zIndex: 9999999
38157
38852
  }
@@ -38659,15 +39354,19 @@ var DropdownPresets = {
38659
39354
  options: [{
38660
39355
  label: 'Option A',
38661
39356
  value: 'a',
38662
- tooltip: 'Information spécifique pour l’option A'
39357
+ tooltip: '<b>Option A</b> — <i>information</i> spécifique.<br/>Prise en charge du <u>HTML</u>.'
38663
39358
  }, {
38664
39359
  label: 'Option B',
38665
39360
  value: 'b',
38666
- tooltip: 'Détail complémentaire lié à l’option B'
39361
+ tooltip: '<span style="color:#3b82f6">Détail</span> complémentaire pour <b>B</b>'
38667
39362
  }, {
38668
39363
  label: 'Option C',
38669
39364
  value: 'c',
38670
- tooltip: 'Contexte métier propre à cette option'
39365
+ tooltip: 'Contexte métier :<ul style="margin:4px 0 0 16px;padding:0"><li>Point 1</li><li>Point 2</li></ul>'
39366
+ }, {
39367
+ label: 'Option D',
39368
+ value: 'd',
39369
+ tooltip: 'Documentation : <a href="https://example.com" target="_blank" rel="noopener" style="color:#60a5fa;text-decoration:underline">ouvrir la doc</a>'
38671
39370
  }],
38672
39371
  filter: true,
38673
39372
  enableSorting: true
@@ -41015,7 +41714,7 @@ var Badge = /*#__PURE__*/React.memo(/*#__PURE__*/React.forwardRef(function (inPr
41015
41714
  }));
41016
41715
  Badge.displayName = 'Badge';
41017
41716
 
41018
- var css_248z$4 = "@charset \"UTF-8\";\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateX(40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes toastIconPop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 60% {\n transform: scale(1.2);\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes toastTextSlide {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.multiselect-container {\n position: relative;\n display: inline-block;\n}\n\n/* Application du mixin field sur le wrapper du MultiSelect */\n.multiselect-container .p-multiselect {\n font-family: \"Roboto\", sans-serif;\n min-height: 40px;\n padding: 0 12px;\n background: #ffffff;\n border: 1.5px solid #e0e3e8;\n border-radius: 7px;\n color: #1a1e26;\n outline: none;\n transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.multiselect-container .p-multiselect:hover:not(:focus):not(:focus-within):not([disabled]):not(.is-disabled) {\n border-color: #c8cdd6;\n}\n.multiselect-container .p-multiselect:focus, .multiselect-container .p-multiselect:focus-within, .multiselect-container .p-multiselect.is-open {\n border-color: #3f3f3f;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);\n}\n.multiselect-container .p-multiselect[disabled], .multiselect-container .p-multiselect.is-disabled {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n.multiselect-container .p-multiselect[readonly], .multiselect-container .p-multiselect.is-readonly {\n background: #f4f5f6;\n cursor: default;\n box-shadow: none;\n}\n.multiselect-container .p-multiselect[readonly]:hover, .multiselect-container .p-multiselect.is-readonly:hover {\n border-color: #e0e3e8;\n}\n.multiselect-container .p-multiselect.is-error {\n border-color: #dc2626;\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);\n}\n.multiselect-container .p-multiselect.is-success {\n border-color: #15803d;\n box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.12);\n}\n.multiselect-container .p-multiselect {\n padding: 0;\n display: flex;\n align-items: center;\n height: 40px;\n overflow: hidden;\n}\n.multiselect-container .p-multiselect .p-multiselect-trigger {\n border-left: 1px solid #cccccc;\n}\n\n.selected-options-tooltip {\n position: absolute;\n background-color: #ffffff;\n border: 1px solid #e0e3e8;\n border-radius: 4px;\n padding: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: 400px;\n top: 100%;\n left: 0;\n}\n\n.selected-options-tooltip div {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.multiselect-tooltip-item {\n width: 100%;\n cursor: pointer;\n}\n\n/* ===== Checkbox hiding (replaces inline <style> tags) ===== */\n.ms-no-checkbox .p-multiselect-items .p-multiselect-item .p-checkbox {\n display: none !important;\n}\n\n.ms-no-checkbox .p-multiselect-items .p-multiselect-item {\n padding-left: 14px !important;\n align-items: center;\n}\n\n/* ===== Custom panel header ===== */\n.ms-panel-header {\n padding: 0;\n}\n\n.ms-search-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.ms-search-row [class*=-filter-container] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n.ms-search-row [class*=-filter-container] .p-inputtext {\n width: 100%;\n height: 32px;\n padding: 0 24.5px 0 12px;\n font-size: 14px;\n box-sizing: border-box;\n}\n.ms-search-row [class*=-filter-container] [class*=-filter-icon] {\n right: 10.5px;\n color: #b0b8c4;\n}\n\n.ms-sort-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-sort-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n\n.ms-selectall-row {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.ms-selectall-row > div:first-child {\n width: 16px !important;\n height: 16px !important;\n margin-right: 8px;\n display: flex;\n align-items: center;\n}\n.ms-selectall-row > div:first-child .ms-group-checkbox {\n width: 16px;\n height: 16px;\n min-width: 16px;\n min-height: 16px;\n}\n\n.ms-selectall-row .p-checkbox {\n margin-right: 0;\n}\n\n.ms-selectall-label {\n font-size: 14px;\n color: #1a1e26;\n}\n\n.ms-counter {\n font-size: 13px;\n color: #b0b8c4;\n margin-left: auto;\n white-space: nowrap;\n}\n\n/* ===== Custom panel footer ===== */\n.ms-panel-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid #e0e3e8;\n}\n\n.ms-cancel-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n padding: 6px 12px;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.ms-cancel-btn:hover {\n color: #1a1e26;\n}\n\n.ms-apply-btn {\n background: #3f3f3f;\n color: #ffffff;\n border: none;\n border-radius: 4px;\n padding: 6px 16px;\n cursor: pointer;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.ms-apply-btn:hover {\n background: #1a1e26;\n}\n\n/* ===== Group header ===== */\n.ms-group-header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 4px 0;\n user-select: none;\n}\n\n.ms-group-checkbox {\n width: 16px;\n height: 16px;\n min-width: 16px;\n min-height: 16px;\n border: 1.5px solid #e0e3e8;\n border-radius: 3px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #ffffff;\n color: #ffffff;\n font-size: 10px;\n cursor: pointer;\n transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-group-checkbox.checked, .ms-group-checkbox.p-highlight {\n background-color: #3f3f3f;\n border-color: #3f3f3f;\n}\n.ms-group-checkbox.partial {\n background: linear-gradient(to top right, #3f3f3f 50%, transparent 50%);\n border-color: #3f3f3f;\n}\n.ms-group-checkbox {\n margin-right: 8px;\n}\n\n.ms-group-label {\n font-weight: bold;\n font-size: 14px;\n flex: 1;\n min-width: 0;\n}\n\n.ms-group-collapse-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-group-collapse-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n.ms-group-collapse-btn {\n width: 20px;\n height: 20px;\n border-color: #b0b8c4;\n font-size: 10px;\n font-weight: bold;\n margin-left: 8px;\n}\n\n/* ===== Checkbox PrimeReact — ISO avec ms-group-checkbox ===== */\n.p-checkbox-input {\n display: none;\n}\n\n/* Checkbox PrimeReact — items + select all */\n.p-checkbox {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n.p-multiselect-item {\n display: flex;\n align-items: center;\n padding: 6px 12px !important;\n font-family: \"Roboto\", sans-serif;\n font-weight: 400 !important;\n}\n.p-multiselect-item > span:not([class]) {\n flex: 1;\n min-width: 0;\n}\n\n.ms-selectall-row {\n display: flex;\n align-items: center;\n}\n\n.p-checkbox .p-checkbox-box {\n width: 16px !important;\n height: 16px !important;\n min-width: 16px;\n min-height: 16px;\n border: 1.5px solid #e0e3e8;\n border-radius: 3px;\n background: #ffffff;\n transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-checkbox .p-checkbox-box svg {\n color: #ffffff;\n width: 10px;\n height: 10px;\n}\n\n.p-checkbox.p-highlight .p-checkbox-box {\n background-color: #3f3f3f !important;\n border-color: #3f3f3f !important;\n}\n.p-checkbox.p-highlight .p-checkbox-box svg {\n color: #ffffff;\n}\n\n/* ===== Tokens (chips de valeurs sélectionnées) — chevauchement ===== */\n/* Label container — prend tout l'espace disponible */\n.p-multiselect .p-multiselect-label-container {\n flex: 1 !important;\n min-width: 0 !important;\n overflow: hidden !important;\n}\n\n/* Tokens en ligne, remplissent tout le container */\n.p-multiselect .p-multiselect-label {\n overflow: hidden !important;\n white-space: nowrap !important;\n width: 100% !important;\n display: flex !important;\n align-items: center;\n gap: 0px !important;\n flex-wrap: nowrap !important;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token {\n position: relative;\n margin-right: 0 !important;\n margin-left: 0 !important;\n flex-shrink: 1;\n min-width: 25%;\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token .p-multiselect-token-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token .p-multiselect-token-icon {\n min-width: 14px;\n min-height: 14px;\n flex-shrink: 0;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:not(:first-child) {\n margin-left: -20px !important;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(1) {\n z-index: 1;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(2) {\n z-index: 2;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(3) {\n z-index: 3;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(4) {\n z-index: 4;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(5) {\n z-index: 5;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(6) {\n z-index: 6;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(7) {\n z-index: 7;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(8) {\n z-index: 8;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(9) {\n z-index: 9;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(10) {\n z-index: 10;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:hover {\n z-index: 100 !important;\n transform: translateY(-2px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n}\n\n.p-multiselect-token {\n animation: fadeIn 180ms cubic-bezier(0.4, 0, 0.2, 1) both;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 4px 4px 4px 8px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n font-weight: normal;\n font-style: normal;\n white-space: nowrap;\n border: 1px solid var(--badge-color, #e0e3e8);\n background-color: var(--badge-color, #f4f5f6);\n color: inherit;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect-token .p-multiselect-token-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.p-multiselect-token .p-multiselect-token-icon {\n cursor: pointer;\n min-width: 12px;\n min-height: 12px;\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n border-radius: 100%;\n padding: 0;\n margin-left: 0 !important;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect-token .p-multiselect-token-icon svg {\n width: 8px;\n height: 8px;\n min-width: 8px;\n min-height: 8px;\n}\n.p-multiselect-token .p-multiselect-token-icon:hover {\n background-color: #ffffff;\n}\n\n/* ===== Badge compteur (> maxSelectedLabels) ===== */\n.ms-counter-badge {\n display: inline-flex;\n align-items: center;\n gap: 5.6px;\n padding: 0;\n font-size: 11.2px;\n font-family: \"Roboto\", sans-serif;\n font-weight: 500;\n white-space: nowrap;\n background: none;\n color: #b0b8c4;\n border: none;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-badge:hover {\n color: #1a1e26;\n}\n.ms-counter-badge > span:not([class]) {\n color: #1a1e26;\n}\n\n.ms-counter-dots {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n.ms-counter-dots .ms-counter-dot {\n animation: fadeIn 180ms cubic-bezier(0.4, 0, 0.2, 1) both;\n width: 20px;\n height: 20px;\n min-width: 20px;\n border-radius: 100%;\n background-color: #e0e3e8;\n border: 1.5px solid #ffffff;\n display: block;\n cursor: pointer;\n position: relative;\n z-index: 1;\n transform: scale(1);\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-dots .ms-counter-dot:not(:first-child) {\n margin-left: -5px;\n}\n.ms-counter-dots .ms-counter-dot:hover {\n transform: scale(1.35);\n z-index: 100 !important;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(1) {\n animation-delay: 40ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(2) {\n animation-delay: 80ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(3) {\n animation-delay: 120ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(4) {\n animation-delay: 160ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(5) {\n animation-delay: 200ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(6) {\n animation-delay: 240ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(7) {\n animation-delay: 280ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(8) {\n animation-delay: 320ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(9) {\n animation-delay: 360ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(10) {\n animation-delay: 400ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(11) {\n animation-delay: 440ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(12) {\n animation-delay: 480ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(13) {\n animation-delay: 520ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(14) {\n animation-delay: 560ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(15) {\n animation-delay: 600ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(16) {\n animation-delay: 640ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(17) {\n animation-delay: 680ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(18) {\n animation-delay: 720ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(19) {\n animation-delay: 760ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(20) {\n animation-delay: 800ms;\n}\n\n.ms-counter-label {\n cursor: pointer;\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.ms-counter-end {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.ms-counter-count {\n font-size: 11.2px;\n font-weight: 600;\n color: #1a1e26;\n}\n\n/* Tooltip custom avec dots colorés */\n.ms-counter-tooltip {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 2px 0;\n}\n\n.ms-counter-tooltip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n}\n\n.ms-counter-tooltip-dot {\n width: 8px;\n height: 8px;\n min-width: 8px;\n border-radius: 100%;\n background-color: #e0e3e8;\n flex-shrink: 0;\n}\n\n.ms-counter-clear-icon {\n cursor: pointer;\n font-size: 10px;\n min-width: 16px;\n min-height: 16px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #b0b8c4;\n border-radius: 100%;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1), background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-clear-icon:hover {\n color: #1a1e26;\n background-color: rgba(0, 0, 0, 0.06);\n}\n\n.p-multiselect-token-label {\n font-size: 12.25px !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n}\n\n/* Un seul token → on autorise les ... si ça dépasse */\n.p-multiselect-token:only-child .p-multiselect-token-label {\n text-overflow: ellipsis !important;\n}\n\n/* ===== Badge couleur dans les items ===== */\n.ms-color-badge {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 4px 10px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n cursor: default;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n background-color: #f4f5f6;\n color: #1a1e26;\n border: 1px solid #e0e3e8;\n border-color: var(--badge-color, #e0e3e8);\n background-color: color-mix(in srgb, var(--badge-color, #f4f5f6) 50%, transparent);\n}\n.ms-color-badge.is-selected {\n background-color: var(--badge-color, #f4f5f6);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n.ms-color-badge {\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.p-multiselect-item:hover .ms-color-badge {\n background-color: var(--badge-color) !important;\n}\n\n/* ===== Groupes — header + indentation enfants ===== */\n.p-multiselect-item-group {\n font-size: 14px;\n font-weight: 600;\n padding: 8px 12px !important;\n position: sticky;\n top: 0;\n z-index: 5;\n background-color: #ffffff !important;\n border-bottom: 1px solid #e0e3e8;\n}\n\n/* Items enfants décalés quand il y a des groupes */\n.p-multiselect-item-group ~ .p-multiselect-item {\n padding-left: 28px !important;\n}\n\n/* ===== Override PrimeReact default item colors ===== */\n.p-multiselect-items .p-multiselect-item:not(.p-highlight):hover {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-highlight {\n background: rgba(63, 63, 63, 0.08) !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-highlight.p-focus {\n background: rgba(63, 63, 63, 0.12) !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-focus {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n\n/* ===== Override PrimeReact filter input focus ===== */\n.p-multiselect-filter.p-inputtext:hover {\n border-color: #c8cdd6 !important;\n}\n.p-multiselect-filter.p-inputtext:focus, .p-multiselect-filter.p-inputtext.p-focus {\n border-color: #3f3f3f !important;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1) !important;\n outline: none;\n}";
41717
+ var css_248z$4 = "@charset \"UTF-8\";\n@keyframes fadeIn {\n from {\n opacity: 0;\n transform: scale(0.85);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n}\n@keyframes toastSlideIn {\n from {\n opacity: 0;\n transform: translateX(40px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n}\n@keyframes toastIconPop {\n 0% {\n transform: scale(0);\n opacity: 0;\n }\n 60% {\n transform: scale(1.2);\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n}\n@keyframes toastTextSlide {\n from {\n opacity: 0;\n transform: translateY(6px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n}\n.multiselect-container {\n position: relative;\n display: inline-block;\n}\n\n/* Application du mixin field sur le wrapper du MultiSelect */\n.multiselect-container .p-multiselect {\n font-family: \"Roboto\", sans-serif;\n min-height: 40px;\n padding: 0 12px;\n background: #ffffff;\n border: 1.5px solid #e0e3e8;\n border-radius: 7px;\n color: #1a1e26;\n outline: none;\n transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.multiselect-container .p-multiselect:hover:not(:focus):not(:focus-within):not([disabled]):not(.is-disabled) {\n border-color: #c8cdd6;\n}\n.multiselect-container .p-multiselect:focus, .multiselect-container .p-multiselect:focus-within, .multiselect-container .p-multiselect.is-open {\n border-color: #3f3f3f;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);\n}\n.multiselect-container .p-multiselect[disabled], .multiselect-container .p-multiselect.is-disabled {\n opacity: 0.45;\n cursor: not-allowed;\n pointer-events: none;\n}\n.multiselect-container .p-multiselect[readonly], .multiselect-container .p-multiselect.is-readonly {\n background: #f4f5f6;\n cursor: default;\n box-shadow: none;\n}\n.multiselect-container .p-multiselect[readonly]:hover, .multiselect-container .p-multiselect.is-readonly:hover {\n border-color: #e0e3e8;\n}\n.multiselect-container .p-multiselect.is-error {\n border-color: #dc2626;\n box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.15);\n}\n.multiselect-container .p-multiselect.is-success {\n border-color: #15803d;\n box-shadow: 0 0 0 3px rgba(21, 128, 61, 0.12);\n}\n.multiselect-container .p-multiselect {\n padding: 0;\n display: flex;\n align-items: center;\n height: 40px;\n overflow: hidden;\n}\n.multiselect-container .p-multiselect .p-multiselect-trigger {\n border-left: 1px solid #cccccc;\n}\n\n.selected-options-tooltip {\n position: absolute;\n background-color: #ffffff;\n border: 1px solid #e0e3e8;\n border-radius: 4px;\n padding: 8px;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n z-index: 1000;\n width: 400px;\n top: 100%;\n left: 0;\n}\n\n.selected-options-tooltip div {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.multiselect-tooltip-item {\n width: 100%;\n cursor: pointer;\n}\n\n/* ===== ItemWithTooltip : picto info à l'extrême droite de l'item ===== */\n/* PrimeReact enveloppe le template dans un <span> sans classe ; on force ce span\n à s'étirer sur toute la largeur restante pour que le picto touche le bord droit. */\n.p-multiselect-panel .p-multiselect-item > span {\n flex: 1 1 auto;\n min-width: 0;\n display: block;\n width: 100%;\n}\n\n.multiselect-item-info-icon {\n font-size: 14px;\n color: #6b7280;\n}\n\n/* ===== Checkbox hiding (replaces inline <style> tags) ===== */\n.ms-no-checkbox .p-multiselect-items .p-multiselect-item .p-checkbox {\n display: none !important;\n}\n\n.ms-no-checkbox .p-multiselect-items .p-multiselect-item {\n padding-left: 14px !important;\n align-items: center;\n}\n\n/* ===== Custom panel header ===== */\n.ms-panel-header {\n padding: 0;\n}\n\n.ms-search-row {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.ms-search-row [class*=-filter-container] {\n flex: 1;\n min-width: 0;\n position: relative;\n}\n.ms-search-row [class*=-filter-container] .p-inputtext {\n width: 100%;\n height: 32px;\n padding: 0 24.5px 0 12px;\n font-size: 14px;\n box-sizing: border-box;\n}\n.ms-search-row [class*=-filter-container] [class*=-filter-icon] {\n right: 10.5px;\n color: #b0b8c4;\n}\n\n.ms-sort-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-sort-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n\n.ms-selectall-row {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-bottom: 1px solid #e0e3e8;\n}\n.ms-selectall-row > div:first-child {\n width: 16px !important;\n height: 16px !important;\n margin-right: 8px;\n display: flex;\n align-items: center;\n}\n.ms-selectall-row > div:first-child .ms-group-checkbox {\n width: 16px;\n height: 16px;\n min-width: 16px;\n min-height: 16px;\n}\n\n.ms-selectall-row .p-checkbox {\n margin-right: 0;\n}\n\n.ms-selectall-label {\n font-size: 14px;\n color: #1a1e26;\n}\n\n.ms-counter {\n font-size: 13px;\n color: #b0b8c4;\n margin-left: auto;\n white-space: nowrap;\n}\n\n/* ===== Custom panel footer ===== */\n.ms-panel-footer {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 12px;\n border-top: 1px solid #e0e3e8;\n}\n\n.ms-cancel-btn {\n background: none;\n border: none;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n padding: 6px 12px;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.ms-cancel-btn:hover {\n color: #1a1e26;\n}\n\n.ms-apply-btn {\n background: #3f3f3f;\n color: #ffffff;\n border: none;\n border-radius: 4px;\n padding: 6px 16px;\n cursor: pointer;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.ms-apply-btn:hover {\n background: #1a1e26;\n}\n\n/* ===== Group header ===== */\n.ms-group-header {\n display: flex;\n align-items: center;\n width: 100%;\n padding: 4px 0;\n user-select: none;\n}\n\n.ms-group-checkbox {\n width: 16px;\n height: 16px;\n min-width: 16px;\n min-height: 16px;\n border: 1.5px solid #e0e3e8;\n border-radius: 3px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n background: #ffffff;\n color: #ffffff;\n font-size: 10px;\n cursor: pointer;\n transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-group-checkbox.checked, .ms-group-checkbox.p-highlight {\n background-color: #3f3f3f;\n border-color: #3f3f3f;\n}\n.ms-group-checkbox.partial {\n background: linear-gradient(to top right, #3f3f3f 50%, transparent 50%);\n border-color: #3f3f3f;\n}\n.ms-group-checkbox {\n margin-right: 8px;\n}\n\n.ms-group-label {\n font-weight: bold;\n font-size: 14px;\n flex: 1;\n min-width: 0;\n}\n\n.ms-group-collapse-btn {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid #e0e3e8;\n border-radius: 7px;\n background: #ffffff;\n cursor: pointer;\n color: #b0b8c4;\n font-size: 14px;\n transition: background 180ms cubic-bezier(0.4, 0, 0.2, 1), color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-group-collapse-btn:hover {\n background: #f4f5f6;\n color: #1a1e26;\n}\n.ms-group-collapse-btn {\n width: 20px;\n height: 20px;\n border-color: #b0b8c4;\n font-size: 10px;\n font-weight: bold;\n margin-left: 8px;\n}\n\n/* ===== Checkbox PrimeReact — ISO avec ms-group-checkbox ===== */\n.p-checkbox-input {\n display: none;\n}\n\n/* Checkbox PrimeReact — items + select all */\n.p-checkbox {\n display: flex;\n align-items: center;\n margin-right: 8px;\n}\n\n.p-multiselect-item {\n display: flex;\n align-items: center;\n padding: 6px 12px !important;\n font-family: \"Roboto\", sans-serif;\n font-weight: 400 !important;\n}\n.p-multiselect-item > span:not([class]) {\n flex: 1;\n min-width: 0;\n}\n\n.ms-selectall-row {\n display: flex;\n align-items: center;\n}\n\n.p-checkbox .p-checkbox-box {\n width: 16px !important;\n height: 16px !important;\n min-width: 16px;\n min-height: 16px;\n border: 1.5px solid #e0e3e8;\n border-radius: 3px;\n background: #ffffff;\n transition: all 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-checkbox .p-checkbox-box svg {\n color: #ffffff;\n width: 10px;\n height: 10px;\n}\n\n.p-checkbox.p-highlight .p-checkbox-box {\n background-color: #3f3f3f !important;\n border-color: #3f3f3f !important;\n}\n.p-checkbox.p-highlight .p-checkbox-box svg {\n color: #ffffff;\n}\n\n/* ===== Tokens (chips de valeurs sélectionnées) — chevauchement ===== */\n/* Label container — prend tout l'espace disponible */\n.p-multiselect .p-multiselect-label-container {\n flex: 1 !important;\n min-width: 0 !important;\n overflow: hidden !important;\n}\n\n/* Tokens en ligne, remplissent tout le container */\n.p-multiselect .p-multiselect-label {\n overflow: hidden !important;\n white-space: nowrap !important;\n width: 100% !important;\n display: flex !important;\n align-items: center;\n gap: 0px !important;\n flex-wrap: nowrap !important;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token {\n position: relative;\n margin-right: 0 !important;\n margin-left: 0 !important;\n flex-shrink: 1;\n min-width: 25%;\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token .p-multiselect-token-label {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token .p-multiselect-token-icon {\n min-width: 14px;\n min-height: 14px;\n flex-shrink: 0;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:not(:first-child) {\n margin-left: -20px !important;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(1) {\n z-index: 1;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(2) {\n z-index: 2;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(3) {\n z-index: 3;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(4) {\n z-index: 4;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(5) {\n z-index: 5;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(6) {\n z-index: 6;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(7) {\n z-index: 7;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(8) {\n z-index: 8;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(9) {\n z-index: 9;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:nth-child(10) {\n z-index: 10;\n}\n.p-multiselect .p-multiselect-label .p-multiselect-token:hover {\n z-index: 100 !important;\n transform: translateY(-2px);\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);\n}\n\n.p-multiselect-token {\n animation: fadeIn 180ms cubic-bezier(0.4, 0, 0.2, 1) both;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n padding: 4px 4px 4px 8px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n font-weight: normal;\n font-style: normal;\n white-space: nowrap;\n border: 1px solid var(--badge-color, #e0e3e8);\n background-color: var(--badge-color, #f4f5f6);\n color: inherit;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect-token .p-multiselect-token-label {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.p-multiselect-token .p-multiselect-token-icon {\n cursor: pointer;\n min-width: 12px;\n min-height: 12px;\n width: 12px;\n height: 12px;\n flex-shrink: 0;\n border-radius: 100%;\n padding: 0;\n margin-left: 0 !important;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.p-multiselect-token .p-multiselect-token-icon svg {\n width: 8px;\n height: 8px;\n min-width: 8px;\n min-height: 8px;\n}\n.p-multiselect-token .p-multiselect-token-icon:hover {\n background-color: #ffffff;\n}\n\n/* ===== Badge compteur (> maxSelectedLabels) ===== */\n.ms-counter-badge {\n display: inline-flex;\n align-items: center;\n gap: 5.6px;\n padding: 0;\n font-size: 11.2px;\n font-family: \"Roboto\", sans-serif;\n font-weight: 500;\n white-space: nowrap;\n background: none;\n color: #b0b8c4;\n border: none;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-badge:hover {\n color: #1a1e26;\n}\n.ms-counter-badge > span:not([class]) {\n color: #1a1e26;\n}\n\n.ms-counter-dots {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n.ms-counter-dots .ms-counter-dot {\n animation: fadeIn 180ms cubic-bezier(0.4, 0, 0.2, 1) both;\n width: 20px;\n height: 20px;\n min-width: 20px;\n border-radius: 100%;\n background-color: #e0e3e8;\n border: 1.5px solid #ffffff;\n display: block;\n cursor: pointer;\n position: relative;\n z-index: 1;\n transform: scale(1);\n transition: transform 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-dots .ms-counter-dot:not(:first-child) {\n margin-left: -5px;\n}\n.ms-counter-dots .ms-counter-dot:hover {\n transform: scale(1.35);\n z-index: 100 !important;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(1) {\n animation-delay: 40ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(2) {\n animation-delay: 80ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(3) {\n animation-delay: 120ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(4) {\n animation-delay: 160ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(5) {\n animation-delay: 200ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(6) {\n animation-delay: 240ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(7) {\n animation-delay: 280ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(8) {\n animation-delay: 320ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(9) {\n animation-delay: 360ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(10) {\n animation-delay: 400ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(11) {\n animation-delay: 440ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(12) {\n animation-delay: 480ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(13) {\n animation-delay: 520ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(14) {\n animation-delay: 560ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(15) {\n animation-delay: 600ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(16) {\n animation-delay: 640ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(17) {\n animation-delay: 680ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(18) {\n animation-delay: 720ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(19) {\n animation-delay: 760ms;\n}\n.ms-counter-dots .ms-counter-dot:nth-child(20) {\n animation-delay: 800ms;\n}\n\n.ms-counter-label {\n cursor: pointer;\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: center;\n}\n\n.ms-counter-end {\n display: flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n margin-left: auto;\n}\n\n.ms-counter-count {\n font-size: 11.2px;\n font-weight: 600;\n color: #1a1e26;\n}\n\n/* Tooltip custom avec dots colorés */\n.ms-counter-tooltip {\n display: flex;\n flex-direction: column;\n gap: 4px;\n padding: 2px 0;\n}\n\n.ms-counter-tooltip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n}\n\n.ms-counter-tooltip-dot {\n width: 8px;\n height: 8px;\n min-width: 8px;\n border-radius: 100%;\n background-color: #e0e3e8;\n flex-shrink: 0;\n}\n\n.ms-counter-clear-icon {\n cursor: pointer;\n font-size: 10px;\n min-width: 16px;\n min-height: 16px;\n width: 16px;\n height: 16px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #b0b8c4;\n border-radius: 100%;\n transition: color 180ms cubic-bezier(0.4, 0, 0.2, 1), background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n.ms-counter-clear-icon:hover {\n color: #1a1e26;\n background-color: rgba(0, 0, 0, 0.06);\n}\n\n.p-multiselect-token-label {\n font-size: 12.25px !important;\n overflow: hidden !important;\n text-overflow: ellipsis !important;\n}\n\n/* Un seul token → on autorise les ... si ça dépasse */\n.p-multiselect-token:only-child .p-multiselect-token-label {\n text-overflow: ellipsis !important;\n}\n\n/* ===== Badge couleur dans les items ===== */\n.ms-color-badge {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 4px 10px;\n border-radius: 14px;\n font-size: 12.25px;\n font-family: \"Roboto\", sans-serif;\n white-space: nowrap;\n cursor: default;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n background-color: #f4f5f6;\n color: #1a1e26;\n border: 1px solid #e0e3e8;\n border-color: var(--badge-color, #e0e3e8);\n background-color: color-mix(in srgb, var(--badge-color, #f4f5f6) 50%, transparent);\n}\n.ms-color-badge.is-selected {\n background-color: var(--badge-color, #f4f5f6);\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.15);\n}\n.ms-color-badge {\n cursor: pointer;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n display: block;\n transition: background-color 180ms cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.p-multiselect-item:hover .ms-color-badge {\n background-color: var(--badge-color) !important;\n}\n\n/* ===== Groupes — header + indentation enfants ===== */\n.p-multiselect-item-group {\n font-size: 14px;\n font-weight: 600;\n padding: 8px 12px !important;\n position: sticky;\n top: 0;\n z-index: 5;\n background-color: #ffffff !important;\n border-bottom: 1px solid #e0e3e8;\n}\n\n/* Items enfants décalés quand il y a des groupes */\n.p-multiselect-item-group ~ .p-multiselect-item {\n padding-left: 28px !important;\n}\n\n/* ===== Override PrimeReact default item colors ===== */\n.p-multiselect-items .p-multiselect-item:not(.p-highlight):hover {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-highlight {\n background: rgba(63, 63, 63, 0.08) !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-highlight.p-focus {\n background: rgba(63, 63, 63, 0.12) !important;\n color: #1a1e26 !important;\n}\n.p-multiselect-items .p-multiselect-item.p-focus {\n background: #f4f5f6 !important;\n color: #1a1e26 !important;\n}\n\n/* ===== Override PrimeReact filter input focus ===== */\n.p-multiselect-filter.p-inputtext:hover {\n border-color: #c8cdd6 !important;\n}\n.p-multiselect-filter.p-inputtext:focus, .p-multiselect-filter.p-inputtext.p-focus {\n border-color: #3f3f3f !important;\n box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1) !important;\n outline: none;\n}";
41019
41718
  styleInject(css_248z$4);
41020
41719
 
41021
41720
  var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
@@ -41115,6 +41814,14 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41115
41814
  valueToapply = _ref.valueToapply,
41116
41815
  _ref$closeIcon = _ref.closeIcon,
41117
41816
  closeIcon = _ref$closeIcon === void 0 ? null : _ref$closeIcon,
41817
+ _ref$cancelLabel = _ref.cancelLabel,
41818
+ cancelLabel = _ref$cancelLabel === void 0 ? 'Annuler' : _ref$cancelLabel,
41819
+ _ref$applyLabel = _ref.applyLabel,
41820
+ applyLabel = _ref$applyLabel === void 0 ? 'Appliquer' : _ref$applyLabel,
41821
+ _ref$emptyMessage = _ref.emptyMessage,
41822
+ emptyMessage = _ref$emptyMessage === void 0 ? 'Aucune option disponible' : _ref$emptyMessage,
41823
+ _ref$loadingMessage = _ref.loadingMessage,
41824
+ loadingMessage = _ref$loadingMessage === void 0 ? 'Chargement…' : _ref$loadingMessage,
41118
41825
  onHide = _ref.onHide;
41119
41826
  _ref.withSearch;
41120
41827
  _ref.renderValue;
@@ -41324,9 +42031,16 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41324
42031
  _context2.n = 5;
41325
42032
  break;
41326
42033
  case 4:
41327
- result = {
41328
- options: []
41329
- };
42034
+ if (Array.isArray(options)) {
42035
+ result = {
42036
+ options: options,
42037
+ hasMore: false
42038
+ };
42039
+ } else {
42040
+ result = {
42041
+ options: []
42042
+ };
42043
+ }
41330
42044
  case 5:
41331
42045
  hasMoreRef.current = ((_result = result) === null || _result === void 0 ? void 0 : _result.hasMore) !== false;
41332
42046
  initialOpts = _flattenOptions(((_result2 = result) === null || _result2 === void 0 ? void 0 : _result2.options) || []);
@@ -41394,7 +42108,7 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41394
42108
  if (enableItemTooltip) setTooltipKey(function (k) {
41395
42109
  return k + 1;
41396
42110
  });
41397
- }, [loadedOptions, enableItemTooltip]);
42111
+ }, [loadedOptions, enableItemTooltip, selectedOptions]);
41398
42112
  var onLazyLoad = function onLazyLoad(event) {
41399
42113
  if (isOptionsArray) return;
41400
42114
  setLoading(true);
@@ -41479,6 +42193,30 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41479
42193
  var getKey = function getKey(v) {
41480
42194
  return v && _typeof$g(v) === 'object' ? v[optionValue] : v;
41481
42195
  };
42196
+
42197
+ // PrimeReact 10 ignore la prop `escape` : sa Tooltip écrit toujours via
42198
+ // createTextNode. Un MutationObserver rescande les `.p-tooltip-text` pour
42199
+ // convertir le texte contenant du HTML en innerHTML rendu.
42200
+ useEffect(function () {
42201
+ if (!enableItemTooltip) return undefined;
42202
+ var rewrite = function rewrite() {
42203
+ document.querySelectorAll('.p-tooltip .p-tooltip-text').forEach(function (el) {
42204
+ var raw = el.textContent;
42205
+ if (raw && /<[a-z][\s\S]*>/i.test(raw) && el.innerHTML !== raw) {
42206
+ el.innerHTML = raw;
42207
+ }
42208
+ });
42209
+ };
42210
+ var observer = new MutationObserver(rewrite);
42211
+ observer.observe(document.body, {
42212
+ childList: true,
42213
+ subtree: true,
42214
+ characterData: true
42215
+ });
42216
+ return function () {
42217
+ return observer.disconnect();
42218
+ };
42219
+ }, [enableItemTooltip]);
41482
42220
  var inverseColor = function inverseColor(hexColor) {
41483
42221
  if (!hexColor || !hexColor.startsWith('#')) return '#000000';
41484
42222
  var hex = hexColor;
@@ -41671,6 +42409,11 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41671
42409
  } : {
41672
42410
  className: 'multiselect-tooltip-item'
41673
42411
  };
42412
+ var tooltipContent = option.tooltip || option.description;
42413
+ var hasTooltip = Boolean(enableItemTooltip && tooltipContent);
42414
+ var infoIcon = hasTooltip ? /*#__PURE__*/React__default.createElement("i", {
42415
+ className: "pi pi-info-circle multiselect-item-info-icon"
42416
+ }) : null;
41674
42417
  var secondaryLabel = enableSecondaryLabel ? option === null || option === void 0 ? void 0 : option[secondaryLabelKey] : null;
41675
42418
  var isLink = enableItemLink && option.link;
41676
42419
  var handleLinkClick = function handleLinkClick(e) {
@@ -41716,6 +42459,41 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41716
42459
  marginLeft: '10px'
41717
42460
  }
41718
42461
  }, secondaryLabel)));
42462
+ if (hasTooltip) {
42463
+ // Deux colonnes : libellé à l'extrême gauche, picto "i" à l'extrême droite.
42464
+ // Le tooltip est porté par l'item entier et pointe sur le picto.
42465
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, {
42466
+ style: {
42467
+ display: 'flex',
42468
+ alignItems: 'center',
42469
+ gap: '0.5rem',
42470
+ fontSize: '14px',
42471
+ maxWidth: 'none',
42472
+ overflow: 'hidden',
42473
+ textOverflow: 'ellipsis',
42474
+ whiteSpace: 'nowrap',
42475
+ width: '100%',
42476
+ justifyContent: 'space-between'
42477
+ }
42478
+ }), /*#__PURE__*/React__default.createElement("div", {
42479
+ style: {
42480
+ display: 'flex',
42481
+ alignItems: 'center',
42482
+ gap: '0.5rem',
42483
+ minWidth: 0,
42484
+ overflow: 'hidden',
42485
+ textOverflow: 'ellipsis',
42486
+ whiteSpace: 'nowrap'
42487
+ }
42488
+ }, option[optionLabel]), /*#__PURE__*/React__default.createElement("div", {
42489
+ style: {
42490
+ flexShrink: 0,
42491
+ display: 'flex',
42492
+ alignItems: 'center',
42493
+ marginLeft: '8px'
42494
+ }
42495
+ }, infoIcon));
42496
+ }
41719
42497
  if (isSelectMeta) {
41720
42498
  var _ref7 = selectMetaConfig || {},
41721
42499
  labelStyle = _ref7.labelStyle,
@@ -41779,6 +42557,7 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41779
42557
  }, /*#__PURE__*/React__default.createElement("div", tooltipProps, option[optionLabel]), secondaryLabelNode);
41780
42558
  };
41781
42559
  var selectedItemTemplate = function selectedItemTemplate(paramValue) {
42560
+ var _selectedOption3, _selectedOption4, _selectedOption5;
41782
42561
  if (paramValue == null) return null;
41783
42562
  if (truncateAt) {
41784
42563
  var index = (selectedOptions || []).indexOf(paramValue);
@@ -41792,11 +42571,16 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41792
42571
  return o[optionValue] === paramValue;
41793
42572
  });
41794
42573
  if (!opt) return null;
41795
- return /*#__PURE__*/React__default.createElement("span", {
42574
+ var _optTooltip = enableItemTooltip ? opt.tooltip || opt.description || opt[optionLabel] : null;
42575
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
41796
42576
  style: _objectSpread2({
41797
42577
  marginRight: '6px'
41798
- }, valueStyle)
41799
- }, opt[optionLabel]);
42578
+ }, valueStyle),
42579
+ className: _optTooltip ? 'multiselect-selected-tooltip-trigger' : undefined
42580
+ }, _optTooltip ? {
42581
+ 'data-pr-tooltip': _optTooltip,
42582
+ 'data-pr-position': 'top'
42583
+ } : {}), opt[optionLabel]);
41800
42584
  }
41801
42585
  if (index === truncateAt) return /*#__PURE__*/React__default.createElement("span", {
41802
42586
  style: {
@@ -41867,11 +42651,16 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41867
42651
  color: objMatch.color !== undefined ? objMatch.color : selectedOption.color
41868
42652
  });
41869
42653
  var isLast = (selectedOptions || [])[(selectedOptions || []).length - 1] === paramValue;
41870
- return /*#__PURE__*/React__default.createElement("span", {
42654
+ var optTooltip = enableItemTooltip ? ((_selectedOption3 = selectedOption) === null || _selectedOption3 === void 0 ? void 0 : _selectedOption3.tooltip) || ((_selectedOption4 = selectedOption) === null || _selectedOption4 === void 0 ? void 0 : _selectedOption4.description) || ((_selectedOption5 = selectedOption) === null || _selectedOption5 === void 0 ? void 0 : _selectedOption5[optionLabel]) : null;
42655
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
41871
42656
  style: _objectSpread2({
41872
42657
  marginRight: '4px'
41873
- }, valueStyle)
41874
- }, selectedOption[optionLabel], !isLast && /*#__PURE__*/React__default.createElement("span", {
42658
+ }, valueStyle),
42659
+ className: optTooltip ? 'multiselect-selected-tooltip-trigger' : undefined
42660
+ }, optTooltip ? {
42661
+ 'data-pr-tooltip': optTooltip,
42662
+ 'data-pr-position': 'top'
42663
+ } : {}), selectedOption[optionLabel], !isLast && /*#__PURE__*/React__default.createElement("span", {
41875
42664
  style: {
41876
42665
  opacity: 0.8
41877
42666
  }
@@ -41972,7 +42761,7 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41972
42761
  var _multiSelectRef$curre4;
41973
42762
  return (_multiSelectRef$curre4 = multiSelectRef.current) === null || _multiSelectRef$curre4 === void 0 ? void 0 : _multiSelectRef$curre4.hide();
41974
42763
  }
41975
- }, "Annuler"), /*#__PURE__*/React__default.createElement("button", {
42764
+ }, cancelLabel), /*#__PURE__*/React__default.createElement("button", {
41976
42765
  type: "button",
41977
42766
  className: "ms-apply-btn",
41978
42767
  onClick: function onClick() {
@@ -41980,7 +42769,7 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
41980
42769
  handleApply();
41981
42770
  (_multiSelectRef$curre5 = multiSelectRef.current) === null || _multiSelectRef$curre5 === void 0 || _multiSelectRef$curre5.hide();
41982
42771
  }
41983
- }, "Appliquer"));
42772
+ }, applyLabel));
41984
42773
  }
41985
42774
  if (hasInfoLine) {
41986
42775
  var length = selectedOptions ? selectedOptions.length : 0;
@@ -42100,9 +42889,11 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
42100
42889
  }
42101
42890
  }, enableItemTooltip && /*#__PURE__*/React__default.createElement(Tooltip$1, {
42102
42891
  key: tooltipKey,
42103
- target: ".multiselect-tooltip-item",
42892
+ target: ".multiselect-tooltip-item, .multiselect-tooltip-trigger, .multiselect-selected-tooltip-trigger",
42104
42893
  appendTo: document.body,
42105
42894
  position: "top",
42895
+ autoHide: false,
42896
+ hideDelay: 150,
42106
42897
  style: {
42107
42898
  zIndex: '9999999'
42108
42899
  }
@@ -42248,7 +43039,7 @@ var MultiSelectMetaAsync = function MultiSelectMetaAsync(_ref) {
42248
43039
  style: style,
42249
43040
  loading: false,
42250
43041
  maxSelectedLabels: maxSelectedLabels,
42251
- emptyMessage: loading ? 'Chargement…' : 'Aucune option disponible',
43042
+ emptyMessage: loading ? loadingMessage : emptyMessage,
42252
43043
  onChange: handleChange,
42253
43044
  itemTemplate: optionTemplate,
42254
43045
  selectedItemTemplate: displayBadge ? undefined : selectedItemTemplate,
@@ -42425,7 +43216,15 @@ var MultiSelect = function MultiSelect(props) {
42425
43216
  maxVisibleCounter = props.maxVisibleCounter;
42426
43217
  props.maxVisibleChips;
42427
43218
  var _props$closeIcon = props.closeIcon,
42428
- closeIcon = _props$closeIcon === void 0 ? null : _props$closeIcon;
43219
+ closeIcon = _props$closeIcon === void 0 ? null : _props$closeIcon,
43220
+ _props$cancelLabel = props.cancelLabel,
43221
+ cancelLabel = _props$cancelLabel === void 0 ? 'Annuler' : _props$cancelLabel,
43222
+ _props$applyLabel = props.applyLabel,
43223
+ applyLabel = _props$applyLabel === void 0 ? 'Appliquer' : _props$applyLabel,
43224
+ _props$emptyMessage = props.emptyMessage,
43225
+ emptyMessage = _props$emptyMessage === void 0 ? 'Aucune option disponible' : _props$emptyMessage,
43226
+ _props$loadingMessage = props.loadingMessage,
43227
+ loadingMessage = _props$loadingMessage === void 0 ? 'Chargement…' : _props$loadingMessage;
42429
43228
  props.withSearch;
42430
43229
  var hasInfoLine = props.hasInfoLine,
42431
43230
  _props$withIcon = props.withIcon,
@@ -42691,6 +43490,11 @@ var MultiSelect = function MultiSelect(props) {
42691
43490
  } : {
42692
43491
  className: 'multiselect-tooltip-item'
42693
43492
  };
43493
+ var tooltipContent = option.tooltip || option.description;
43494
+ var hasTooltip = Boolean(enableItemTooltip && tooltipContent);
43495
+ var infoIcon = hasTooltip ? /*#__PURE__*/React__default.createElement("i", {
43496
+ className: "pi pi-info-circle multiselect-item-info-icon"
43497
+ }) : null;
42694
43498
  var secondaryLabel = enableSecondaryLabel ? option === null || option === void 0 ? void 0 : option[secondaryLabelKey] : null;
42695
43499
  var isLink = enableItemLink && option.link;
42696
43500
  var handleLinkClick = function handleLinkClick(e) {
@@ -42761,6 +43565,41 @@ var MultiSelect = function MultiSelect(props) {
42761
43565
  }
42762
43566
  }, secondaryLabel)))));
42763
43567
  }
43568
+ if (hasTooltip) {
43569
+ // Deux colonnes : libellé à l'extrême gauche, picto "i" à l'extrême droite.
43570
+ // Le tooltip est porté par l'item entier et pointe sur le picto.
43571
+ return /*#__PURE__*/React__default.createElement("div", _extends$J({}, tooltipProps, {
43572
+ style: {
43573
+ display: 'flex',
43574
+ alignItems: 'center',
43575
+ gap: '0.5rem',
43576
+ fontSize: '14px',
43577
+ maxWidth: 'none',
43578
+ overflow: 'hidden',
43579
+ textOverflow: 'ellipsis',
43580
+ whiteSpace: 'nowrap',
43581
+ width: '100%',
43582
+ justifyContent: 'space-between'
43583
+ }
43584
+ }), /*#__PURE__*/React__default.createElement("div", {
43585
+ style: {
43586
+ display: 'flex',
43587
+ alignItems: 'center',
43588
+ gap: '0.5rem',
43589
+ minWidth: 0,
43590
+ overflow: 'hidden',
43591
+ textOverflow: 'ellipsis',
43592
+ whiteSpace: 'nowrap'
43593
+ }
43594
+ }, option[optionLabel]), /*#__PURE__*/React__default.createElement("div", {
43595
+ style: {
43596
+ flexShrink: 0,
43597
+ display: 'flex',
43598
+ alignItems: 'center',
43599
+ marginLeft: '8px'
43600
+ }
43601
+ }, infoIcon));
43602
+ }
42764
43603
  if (withColor || withIcon) {
42765
43604
  var _ref2 = selectConfig || {},
42766
43605
  _labelStyle = _ref2.labelStyle,
@@ -42818,14 +43657,7 @@ var MultiSelect = function MultiSelect(props) {
42818
43657
  }
42819
43658
  }, secondaryLabel)));
42820
43659
  }
42821
- return /*#__PURE__*/React__default.createElement("div", {
42822
- style: _objectSpread2({
42823
- fontFamily: 'Arial',
42824
- fontSize: '14px',
42825
- display: 'flex',
42826
- flexDirection: 'column'
42827
- }, optionStyle)
42828
- }, /*#__PURE__*/React__default.createElement("div", tooltipProps, option[optionLabel]), secondaryLabel && /*#__PURE__*/React__default.createElement("div", {
43660
+ var secondaryContent = secondaryLabel ? /*#__PURE__*/React__default.createElement("div", {
42829
43661
  className: "secondary-link-zone",
42830
43662
  onClick: isLink ? handleLinkClick : undefined,
42831
43663
  onMouseDown: isLink ? function (e) {
@@ -42860,7 +43692,15 @@ var MultiSelect = function MultiSelect(props) {
42860
43692
  style: subItem ? {} : {
42861
43693
  marginLeft: '10px'
42862
43694
  }
42863
- }, secondaryLabel))));
43695
+ }, secondaryLabel))) : null;
43696
+ return /*#__PURE__*/React__default.createElement("div", {
43697
+ style: _objectSpread2({
43698
+ fontFamily: 'Arial',
43699
+ fontSize: '14px',
43700
+ display: 'flex',
43701
+ flexDirection: 'column'
43702
+ }, optionStyle)
43703
+ }, /*#__PURE__*/React__default.createElement("div", tooltipProps, option[optionLabel]), secondaryContent);
42864
43704
  };
42865
43705
  var inverseColor = function inverseColor(hexColor) {
42866
43706
  var r = parseInt(hexColor === null || hexColor === void 0 ? void 0 : hexColor.substr(1, 2), 16);
@@ -42878,6 +43718,31 @@ var MultiSelect = function MultiSelect(props) {
42878
43718
  window[onChange](ids);
42879
43719
  }
42880
43720
  };
43721
+
43722
+ // PrimeReact 10 ignore la prop `escape` : sa Tooltip écrit toujours via
43723
+ // createTextNode. Un MutationObserver rescande les `.p-tooltip-text` pour
43724
+ // convertir le texte contenant du HTML en innerHTML rendu — nécessaire car
43725
+ // le tooltip est réutilisé (pas de callback à chaque changement de cible).
43726
+ useEffect(function () {
43727
+ if (!enableItemTooltip) return undefined;
43728
+ var rewrite = function rewrite() {
43729
+ document.querySelectorAll('.p-tooltip .p-tooltip-text').forEach(function (el) {
43730
+ var raw = el.textContent;
43731
+ if (raw && /<[a-z][\s\S]*>/i.test(raw) && el.innerHTML !== raw) {
43732
+ el.innerHTML = raw;
43733
+ }
43734
+ });
43735
+ };
43736
+ var observer = new MutationObserver(rewrite);
43737
+ observer.observe(document.body, {
43738
+ childList: true,
43739
+ subtree: true,
43740
+ characterData: true
43741
+ });
43742
+ return function () {
43743
+ return observer.disconnect();
43744
+ };
43745
+ }, [enableItemTooltip]);
42881
43746
  var handleChange = function handleChange(e) {
42882
43747
  if (disabled || effectiveReadOnly) return;
42883
43748
  var ids = Array.isArray(e.value) ? e.value : [e.value];
@@ -42920,11 +43785,16 @@ var MultiSelect = function MultiSelect(props) {
42920
43785
  return o.value === option;
42921
43786
  });
42922
43787
  if (!_opt) return null;
42923
- return /*#__PURE__*/React__default.createElement("span", {
43788
+ var _optTooltip = enableItemTooltip ? _opt.tooltip || _opt.description || _opt[optionLabel] : null;
43789
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
42924
43790
  style: _objectSpread2({
42925
43791
  marginRight: '6px'
42926
- }, valueStyle)
42927
- }, _opt[optionLabel]);
43792
+ }, valueStyle),
43793
+ className: _optTooltip ? 'multiselect-selected-tooltip-trigger' : undefined
43794
+ }, _optTooltip ? {
43795
+ 'data-pr-tooltip': _optTooltip,
43796
+ 'data-pr-position': 'top'
43797
+ } : {}), _opt[optionLabel]);
42928
43798
  }
42929
43799
  if (index === truncateAt) {
42930
43800
  return /*#__PURE__*/React__default.createElement("span", {
@@ -42976,11 +43846,16 @@ var MultiSelect = function MultiSelect(props) {
42976
43846
  var _selectedOption = flatOptions.find(function (opt) {
42977
43847
  return opt.value === option;
42978
43848
  });
42979
- return /*#__PURE__*/React__default.createElement("span", {
43849
+ var _optTooltip2 = enableItemTooltip ? (_selectedOption === null || _selectedOption === void 0 ? void 0 : _selectedOption.tooltip) || (_selectedOption === null || _selectedOption === void 0 ? void 0 : _selectedOption.description) || (_selectedOption === null || _selectedOption === void 0 ? void 0 : _selectedOption[optionLabel]) || option : null;
43850
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
42980
43851
  style: {
42981
43852
  marginRight: '4px'
42982
- }
42983
- }, _selectedOption ? "".concat(_selectedOption.label) : "".concat(option), !isLast && /*#__PURE__*/React__default.createElement("span", {
43853
+ },
43854
+ className: _optTooltip2 ? 'multiselect-selected-tooltip-trigger' : undefined
43855
+ }, _optTooltip2 ? {
43856
+ 'data-pr-tooltip': _optTooltip2,
43857
+ 'data-pr-position': 'top'
43858
+ } : {}), _selectedOption ? "".concat(_selectedOption.label) : "".concat(option), !isLast && /*#__PURE__*/React__default.createElement("span", {
42984
43859
  style: {
42985
43860
  opacity: 0.8
42986
43861
  }
@@ -42992,11 +43867,16 @@ var MultiSelect = function MultiSelect(props) {
42992
43867
  return o.value === option;
42993
43868
  });
42994
43869
  if (!opt) return null;
42995
- return /*#__PURE__*/React__default.createElement("span", {
43870
+ var optTooltip = enableItemTooltip ? opt.tooltip || opt.description || opt[optionLabel] : null;
43871
+ return /*#__PURE__*/React__default.createElement("span", _extends$J({
42996
43872
  style: _objectSpread2({
42997
43873
  marginRight: '4px'
42998
- }, valueStyle)
42999
- }, opt[optionLabel], !isLast && /*#__PURE__*/React__default.createElement("span", {
43874
+ }, valueStyle),
43875
+ className: optTooltip ? 'multiselect-selected-tooltip-trigger' : undefined
43876
+ }, optTooltip ? {
43877
+ 'data-pr-tooltip': optTooltip,
43878
+ 'data-pr-position': 'top'
43879
+ } : {}), opt[optionLabel], !isLast && /*#__PURE__*/React__default.createElement("span", {
43000
43880
  style: {
43001
43881
  opacity: 0.8
43002
43882
  }
@@ -43058,21 +43938,6 @@ var MultiSelect = function MultiSelect(props) {
43058
43938
  }
43059
43939
  }, isCollapsed ? '+' : "\u2212"));
43060
43940
  };
43061
- var getSelectedOptionsTooltipText = function getSelectedOptionsTooltipText() {
43062
- if (selectedOptions.length === 0) return "Aucune option sélectionnée";
43063
- return selectedOptions.map(function (opt) {
43064
- if (typeof opt === 'string' || typeof opt === 'number') {
43065
- var selectedOption = flatOptions.find(function (o) {
43066
- return o.value === opt || o[optionValue] === opt;
43067
- });
43068
- return selectedOption ? selectedOption[optionLabel] : String(opt);
43069
- }
43070
- if (_typeof$g(opt) === 'object' && opt !== null) {
43071
- return opt[optionLabel];
43072
- }
43073
- return String(opt);
43074
- }).join('\n');
43075
- };
43076
43941
  var BADGE_SIZES = {
43077
43942
  small: {
43078
43943
  fontSize: '10px',
@@ -43101,7 +43966,7 @@ var MultiSelect = function MultiSelect(props) {
43101
43966
  width: '100%'
43102
43967
  };
43103
43968
  var effectiveShowClear = Boolean(showClear || typeof onClearAll === 'function');
43104
- var emptyMessage = loading ? 'Chargement…' : 'Aucune option disponible';
43969
+ var displayedEmptyMessage = loading ? loadingMessage : emptyMessage;
43105
43970
  var handleMouseEnter = function handleMouseEnter() {
43106
43971
  var _multiSelectRef$curre;
43107
43972
  if (!openOnHover || disabled || effectiveReadOnly) return;
@@ -43270,7 +44135,7 @@ var MultiSelect = function MultiSelect(props) {
43270
44135
  var _multiSelectRef$curre4;
43271
44136
  return (_multiSelectRef$curre4 = multiSelectRef.current) === null || _multiSelectRef$curre4 === void 0 ? void 0 : _multiSelectRef$curre4.hide();
43272
44137
  }
43273
- }, "Annuler"), /*#__PURE__*/React__default.createElement("button", {
44138
+ }, cancelLabel), /*#__PURE__*/React__default.createElement("button", {
43274
44139
  type: "button",
43275
44140
  className: "ms-apply-btn",
43276
44141
  onClick: function onClick() {
@@ -43278,7 +44143,7 @@ var MultiSelect = function MultiSelect(props) {
43278
44143
  handleApply();
43279
44144
  (_multiSelectRef$curre5 = multiSelectRef.current) === null || _multiSelectRef$curre5 === void 0 || _multiSelectRef$curre5.hide();
43280
44145
  }
43281
- }, "Appliquer"));
44146
+ }, applyLabel));
43282
44147
  }
43283
44148
  if (hasInfoLine) {
43284
44149
  var length = selectedOptions ? selectedOptions.length : 0;
@@ -43294,7 +44159,7 @@ var MultiSelect = function MultiSelect(props) {
43294
44159
  return prevKey + 1;
43295
44160
  });
43296
44161
  }
43297
- }, [options, enableItemTooltip]);
44162
+ }, [options, enableItemTooltip, selectedOptions]);
43298
44163
 
43299
44164
  // Ajouter cette logique dans le composant
43300
44165
  useEffect(function () {
@@ -43330,9 +44195,11 @@ var MultiSelect = function MultiSelect(props) {
43330
44195
  }
43331
44196
  }, enableItemTooltip && /*#__PURE__*/React__default.createElement(Tooltip$1, {
43332
44197
  key: tooltipKey,
43333
- target: ".multiselect-tooltip-item",
44198
+ target: ".multiselect-tooltip-item, .multiselect-tooltip-trigger, .multiselect-selected-tooltip-trigger",
43334
44199
  appendTo: document.body,
43335
44200
  position: "top",
44201
+ autoHide: false,
44202
+ hideDelay: 150,
43336
44203
  style: {
43337
44204
  zIndex: '9999999'
43338
44205
  }
@@ -43359,10 +44226,6 @@ var MultiSelect = function MultiSelect(props) {
43359
44226
  zIndex: 9999999
43360
44227
  }
43361
44228
  }), /*#__PURE__*/React__default.createElement("div", {
43362
- "data-pr-tooltip": enableItemTooltip ? getSelectedOptionsTooltipText() : null,
43363
- "data-pr-position": "right",
43364
- "data-pr-at": "right+5 top",
43365
- "data-pr-my": "left center-2",
43366
44229
  ref: containerRef,
43367
44230
  className: "multiselect-container custom-target-icon",
43368
44231
  style: {
@@ -43477,7 +44340,7 @@ var MultiSelect = function MultiSelect(props) {
43477
44340
  }, !displayBadge && {
43478
44341
  selectedItemsLabel: !displayBadge && "{0} éléments sélectionnés"
43479
44342
  }, {
43480
- emptyMessage: emptyMessage,
44343
+ emptyMessage: displayedEmptyMessage,
43481
44344
  onChange: handleChange,
43482
44345
  itemTemplate: optionTemplate,
43483
44346
  selectedItemTemplate: displayBadge ? undefined : selectedItemTemplate,
@@ -44076,17 +44939,27 @@ var MultiSelectPresets = {
44076
44939
  options: [{
44077
44940
  label: 'Option 1',
44078
44941
  value: '1',
44079
- tooltip: 'Information spécifique à l’option 1'
44942
+ tooltip: '<b>Option 1</b> — <i>information</i> spécifique.<br/>Prise en charge du <u>HTML</u>.'
44080
44943
  }, {
44081
44944
  label: 'Option 2',
44082
- value: '2',
44083
- tooltip: 'Détail complémentaire pour l’option 2'
44945
+ value: '2'
44946
+ // tooltip: '<span style="color:#3b82f6">Détail</span> complémentaire pour <b>l’option 2</b>',
44084
44947
  }, {
44085
44948
  label: 'Option 3',
44086
44949
  value: '3',
44087
- tooltip: 'Contexte métier propre à cette option'
44950
+ tooltip: 'Contexte métier :<ul style="margin:4px 0 0 16px;padding:0"><li>Point 1</li><li>Point 2</li></ul>'
44951
+ }, {
44952
+ label: 'Option 4',
44953
+ value: '4',
44954
+ tooltip: 'Documentation : <a href="https://example.com" target="_blank" rel="noopener" style="color:#60a5fa;text-decoration:underline">ouvrir la doc</a>'
44088
44955
  }],
44089
- enableItemTooltip: true
44956
+ enableItemTooltip: true,
44957
+ cancelLabel: 'Fermer',
44958
+ applyLabel: 'Appliquer',
44959
+ onApply: function onApply(values) {
44960
+ // eslint-disable-next-line no-console
44961
+ console.log('Selection appliquée :', values);
44962
+ }
44090
44963
  },
44091
44964
  ItemWithLink: {
44092
44965
  placeholder: 'Choisissez une option',
@@ -44371,6 +45244,61 @@ var MultiSelectMetaAsyncPresets = {
44371
45244
  displayCounter: true,
44372
45245
  maxVisibleCounter: 1
44373
45246
  },
45247
+ ItemWithTooltip: {
45248
+ placeholder: 'Survolez une option',
45249
+ options: [{
45250
+ label: 'Option 1',
45251
+ value: '1',
45252
+ tooltip: '<b>Option 1</b> — <i>information</i> spécifique.<br/>Prise en charge du <u>HTML</u>.'
45253
+ }, {
45254
+ label: 'Option 2',
45255
+ value: '2',
45256
+ tooltip: '<span style="color:#3b82f6">Détail</span> complémentaire pour <b>l’option 2</b>'
45257
+ }, {
45258
+ label: 'Option 3',
45259
+ value: '3',
45260
+ tooltip: 'Contexte métier :<ul style="margin:4px 0 0 16px;padding:0"><li>Point 1</li><li>Point 2</li></ul>'
45261
+ }, {
45262
+ label: 'Option 4',
45263
+ value: '4',
45264
+ tooltip: '<b>Cas particuliers</b><br/><small>Utilisation limitée</small>'
45265
+ }, {
45266
+ label: 'Option 5',
45267
+ value: '5',
45268
+ tooltip: 'Réservée aux <b style="color:#ef4444">administrateurs</b>'
45269
+ }, {
45270
+ label: 'Option 6',
45271
+ value: '6',
45272
+ tooltip: '<i>Recommandée</i> pour la <b>production</b>'
45273
+ }, {
45274
+ label: 'Option 7',
45275
+ value: '7',
45276
+ tooltip: 'Compatible avec les <u>anciens systèmes</u>'
45277
+ }, {
45278
+ label: 'Option 8',
45279
+ value: '8',
45280
+ tooltip: 'Optimisée pour les <b>grandes volumétries</b><br/>&gt; 10 M lignes'
45281
+ }, {
45282
+ label: 'Option 9',
45283
+ value: '9',
45284
+ tooltip: 'Nécessite des <span style="color:#f59e0b">droits étendus</span>'
45285
+ }, {
45286
+ label: 'Option 10',
45287
+ value: '10',
45288
+ tooltip: '<b style="color:#ef4444">⚠ À utiliser avec précaution</b>'
45289
+ }, {
45290
+ label: 'Option 11',
45291
+ value: '11',
45292
+ tooltip: 'Documentation : <a href="https://example.com" target="_blank" rel="noopener" style="color:#60a5fa;text-decoration:underline">ouvrir la doc</a>'
45293
+ }],
45294
+ enableItemTooltip: true,
45295
+ cancelLabel: 'Fermer',
45296
+ applyLabel: 'Appliquer',
45297
+ onApply: function onApply(values) {
45298
+ // eslint-disable-next-line no-console
45299
+ console.log('Selection appliquée :', values);
45300
+ }
45301
+ },
44374
45302
  SearchAjaxLoading: {
44375
45303
  placeholder: 'Rechercher (Ajax)…',
44376
45304
  filter: true,
@@ -44436,24 +45364,160 @@ var createFakeOptions = function createFakeOptions(start, length) {
44436
45364
  }
44437
45365
  return options;
44438
45366
  };
45367
+ var mockPeople = [{
45368
+ label: 'Alice Martin',
45369
+ value: 1,
45370
+ color: '#ff9900',
45371
+ profession: 'Développeuse',
45372
+ tooltip: 'Alice Martin — Développeuse',
45373
+ link: 'https://example.com'
45374
+ }, {
45375
+ label: 'Bruno Lefèvre',
45376
+ value: 2,
45377
+ color: '#3b82f6',
45378
+ profession: 'Chef de projet',
45379
+ tooltip: 'Bruno Lefèvre — Chef de projet',
45380
+ link: 'https://example.com'
45381
+ }, {
45382
+ label: 'Chloé Dubois',
45383
+ value: 3,
45384
+ color: '#10b981',
45385
+ profession: 'Designer',
45386
+ tooltip: 'Chloé Dubois — Designer',
45387
+ link: 'https://example.com'
45388
+ }, {
45389
+ label: 'David Morel',
45390
+ value: 4,
45391
+ color: '#8b5cf6',
45392
+ profession: 'Data analyst',
45393
+ tooltip: 'David Morel — Data analyst',
45394
+ link: 'https://example.com'
45395
+ }, {
45396
+ label: 'Emma Roux',
45397
+ value: 5,
45398
+ color: '#ec4899',
45399
+ profession: 'Product owner',
45400
+ tooltip: 'Emma Roux — Product owner',
45401
+ link: 'https://example.com'
45402
+ }, {
45403
+ label: 'Farid Benali',
45404
+ value: 6,
45405
+ color: '#f59e0b',
45406
+ profession: 'DevOps',
45407
+ tooltip: 'Farid Benali — DevOps',
45408
+ link: 'https://example.com'
45409
+ }, {
45410
+ label: 'Gaëlle Simon',
45411
+ value: 7,
45412
+ color: '#ef4444',
45413
+ profession: 'QA engineer',
45414
+ tooltip: 'Gaëlle Simon — QA engineer',
45415
+ link: 'https://example.com'
45416
+ }, {
45417
+ label: 'Hugo Bernard',
45418
+ value: 8,
45419
+ color: '#10b981',
45420
+ profession: 'Développeur',
45421
+ tooltip: 'Hugo Bernard — Développeur',
45422
+ link: 'https://example.com'
45423
+ }];
45424
+ var asyncPeople = /*#__PURE__*/function () {
45425
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
45426
+ var search,
45427
+ _ref2,
45428
+ _ref2$page,
45429
+ page,
45430
+ filtered,
45431
+ pageSize,
45432
+ start,
45433
+ _args = arguments;
45434
+ return _regenerator().w(function (_context) {
45435
+ while (1) switch (_context.n) {
45436
+ case 0:
45437
+ search = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
45438
+ _ref2 = _args.length > 2 && _args[2] !== undefined ? _args[2] : {}, _ref2$page = _ref2.page, page = _ref2$page === void 0 ? 1 : _ref2$page;
45439
+ _context.n = 1;
45440
+ return simulateNetworkDelay();
45441
+ case 1:
45442
+ filtered = search ? mockPeople.filter(function (opt) {
45443
+ return opt.label.toLowerCase().includes(search.toLowerCase());
45444
+ }) : mockPeople;
45445
+ pageSize = 30;
45446
+ start = (page - 1) * pageSize;
45447
+ return _context.a(2, {
45448
+ options: filtered.slice(start, start + pageSize),
45449
+ hasMore: start + pageSize < filtered.length,
45450
+ additional: {
45451
+ page: page + 1
45452
+ }
45453
+ });
45454
+ }
45455
+ }, _callee);
45456
+ }));
45457
+ return function asyncPeople() {
45458
+ return _ref.apply(this, arguments);
45459
+ };
45460
+ }();
45461
+ var mockPeopleHtmlTooltips = mockPeople.map(function (p) {
45462
+ return _objectSpread2(_objectSpread2({}, p), {}, {
45463
+ tooltip: "<b>".concat(p.label, "</b> \u2014 <i>").concat(p.profession, "</i><br/>Contact : <a href=\"mailto:").concat(p.label.split(' ')[0].toLowerCase(), "@arengi.fr\" style=\"color:#60a5fa;text-decoration:underline\">").concat(p.label.split(' ')[0].toLowerCase(), "@arengi.fr</a><br/>Doc : <a href=\"https://example.com\" target=\"_blank\" rel=\"noopener\" style=\"color:#60a5fa;text-decoration:underline\">ouvrir la doc</a>")
45464
+ });
45465
+ });
45466
+ var asyncPeopleHtmlTooltip = /*#__PURE__*/function () {
45467
+ var _ref3 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {
45468
+ var search,
45469
+ _ref4,
45470
+ _ref4$page,
45471
+ page,
45472
+ filtered,
45473
+ pageSize,
45474
+ start,
45475
+ _args2 = arguments;
45476
+ return _regenerator().w(function (_context2) {
45477
+ while (1) switch (_context2.n) {
45478
+ case 0:
45479
+ search = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : '';
45480
+ _ref4 = _args2.length > 2 && _args2[2] !== undefined ? _args2[2] : {}, _ref4$page = _ref4.page, page = _ref4$page === void 0 ? 1 : _ref4$page;
45481
+ _context2.n = 1;
45482
+ return simulateNetworkDelay();
45483
+ case 1:
45484
+ filtered = search ? mockPeopleHtmlTooltips.filter(function (opt) {
45485
+ return opt.label.toLowerCase().includes(search.toLowerCase());
45486
+ }) : mockPeopleHtmlTooltips;
45487
+ pageSize = 30;
45488
+ start = (page - 1) * pageSize;
45489
+ return _context2.a(2, {
45490
+ options: filtered.slice(start, start + pageSize),
45491
+ hasMore: start + pageSize < filtered.length,
45492
+ additional: {
45493
+ page: page + 1
45494
+ }
45495
+ });
45496
+ }
45497
+ }, _callee2);
45498
+ }));
45499
+ return function asyncPeopleHtmlTooltip() {
45500
+ return _ref3.apply(this, arguments);
45501
+ };
45502
+ }();
44439
45503
  var DropdownSelectMetaAsyncPresets = {
44440
45504
  SelectMetaAsync: {
44441
45505
  options: function () {
44442
- var _options = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
45506
+ var _options = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
44443
45507
  var search,
44444
- _ref,
45508
+ _ref5,
44445
45509
  page,
44446
45510
  allOptions,
44447
45511
  filtered,
44448
45512
  pageSize,
44449
45513
  start,
44450
- _args = arguments;
44451
- return _regenerator().w(function (_context) {
44452
- while (1) switch (_context.n) {
45514
+ _args3 = arguments;
45515
+ return _regenerator().w(function (_context3) {
45516
+ while (1) switch (_context3.n) {
44453
45517
  case 0:
44454
- search = _args.length > 0 && _args[0] !== undefined ? _args[0] : '';
44455
- _ref = _args.length > 2 ? _args[2] : undefined, page = _ref.page;
44456
- _context.n = 1;
45518
+ search = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : '';
45519
+ _ref5 = _args3.length > 2 ? _args3[2] : undefined, page = _ref5.page;
45520
+ _context3.n = 1;
44457
45521
  return simulateNetworkDelay();
44458
45522
  case 1:
44459
45523
  allOptions = createFakeOptions(0, 100);
@@ -44462,7 +45526,7 @@ var DropdownSelectMetaAsyncPresets = {
44462
45526
  });
44463
45527
  pageSize = 30;
44464
45528
  start = (page - 1) * pageSize;
44465
- return _context.a(2, {
45529
+ return _context3.a(2, {
44466
45530
  options: filtered.slice(start, start + pageSize),
44467
45531
  hasMore: start + pageSize < filtered.length,
44468
45532
  additional: {
@@ -44470,7 +45534,7 @@ var DropdownSelectMetaAsyncPresets = {
44470
45534
  }
44471
45535
  });
44472
45536
  }
44473
- }, _callee);
45537
+ }, _callee3);
44474
45538
  }));
44475
45539
  function options() {
44476
45540
  return _options.apply(this, arguments);
@@ -44492,6 +45556,141 @@ var DropdownSelectMetaAsyncPresets = {
44492
45556
  fontSize: '14px',
44493
45557
  fontFamily: 'Arial'
44494
45558
  }
45559
+ },
45560
+ Base: {
45561
+ options: asyncPeople,
45562
+ value: null,
45563
+ placeholder: 'Sélectionnez une option',
45564
+ editable: true,
45565
+ filter: false,
45566
+ showClear: true,
45567
+ valueStyle: {
45568
+ backgroundColor: 'transparent',
45569
+ color: 'inherit',
45570
+ padding: '0',
45571
+ borderRadius: '0',
45572
+ boxShadow: 'none',
45573
+ fontFamily: 'inherit'
45574
+ }
45575
+ },
45576
+ AsyncOptions: {
45577
+ options: asyncPeople,
45578
+ value: 3,
45579
+ placeholder: 'Sélectionnez une option',
45580
+ editable: true,
45581
+ showClear: true,
45582
+ selectMetaConfig: {
45583
+ labelStyle: {
45584
+ fontWeight: 'bold'
45585
+ },
45586
+ generalIcon: 'pi pi-tag'
45587
+ }
45588
+ },
45589
+ SearchAjaxLoading: {
45590
+ // En prod : optionsUrl: '/api/options' (pagination start/length, recherche search[value])
45591
+ options: asyncPeople,
45592
+ placeholder: 'Rechercher (Ajax)…',
45593
+ filter: true,
45594
+ showClear: true
45595
+ },
45596
+ Sorting: {
45597
+ options: asyncPeople,
45598
+ placeholder: 'Tri A→Z / Z→A',
45599
+ filter: true,
45600
+ enableSorting: true,
45601
+ showClear: true
45602
+ },
45603
+ ItemsCheckedToTheTop: {
45604
+ options: asyncPeople,
45605
+ value: 5,
45606
+ placeholder: 'Sélection remontée en haut',
45607
+ itemsCheckedToTheTop: true,
45608
+ showClear: true
45609
+ },
45610
+ OpenOnHover: {
45611
+ options: asyncPeople,
45612
+ placeholder: 'Ouverture au survol',
45613
+ openOnHover: true
45614
+ },
45615
+ ItemWithTooltip: {
45616
+ options: asyncPeopleHtmlTooltip,
45617
+ placeholder: 'Tooltip sur les options',
45618
+ enableItemTooltip: true
45619
+ },
45620
+ ItemWithSecondaryLabel: {
45621
+ options: asyncPeople,
45622
+ placeholder: 'Label secondaire',
45623
+ enableSecondaryLabel: true,
45624
+ secondaryLabelKey: 'profession'
45625
+ },
45626
+ ItemWithLink: {
45627
+ options: asyncPeople,
45628
+ placeholder: 'Lien sur le label secondaire',
45629
+ enableSecondaryLabel: true,
45630
+ secondaryLabelKey: 'profession',
45631
+ enableItemLink: true
45632
+ },
45633
+ Badge: {
45634
+ options: asyncPeople,
45635
+ value: 2,
45636
+ placeholder: 'Badges colorés',
45637
+ withColor: true,
45638
+ selectConfig: {
45639
+ labelStyle: null,
45640
+ generalIcon: null
45641
+ }
45642
+ },
45643
+ WithIcon: {
45644
+ options: asyncPeople,
45645
+ value: 1,
45646
+ placeholder: 'Icône devant chaque option',
45647
+ withIcon: true,
45648
+ selectConfig: {
45649
+ labelStyle: {
45650
+ fontWeight: '400'
45651
+ },
45652
+ generalIcon: 'pi pi-user'
45653
+ }
45654
+ },
45655
+ Truncate: {
45656
+ options: asyncPeople,
45657
+ value: 2,
45658
+ placeholder: 'Label tronqué',
45659
+ truncateAt: 8,
45660
+ valueStyle: {
45661
+ backgroundColor: 'transparent',
45662
+ color: 'inherit',
45663
+ padding: '0',
45664
+ borderRadius: '0',
45665
+ boxShadow: 'none',
45666
+ fontFamily: 'inherit'
45667
+ }
45668
+ },
45669
+ ReadOnly: {
45670
+ options: asyncPeople,
45671
+ value: 4,
45672
+ readOnly: true,
45673
+ showClear: false
45674
+ },
45675
+ Disabled: {
45676
+ options: asyncPeople,
45677
+ value: 4,
45678
+ disabled: true
45679
+ },
45680
+ Required: {
45681
+ options: asyncPeople,
45682
+ value: null,
45683
+ placeholder: 'Sélection obligatoire',
45684
+ required: true,
45685
+ name: 'monchamp',
45686
+ status: 'error',
45687
+ errorMessage: 'Une option doit être sélectionnée'
45688
+ },
45689
+ InfoLine: {
45690
+ options: asyncPeople,
45691
+ placeholder: 'Avec pied de panel',
45692
+ hasInfoLine: true,
45693
+ InfoLineValue: '8 utilisateurs disponibles'
44495
45694
  }
44496
45695
  };
44497
45696
 
@@ -55728,6 +56927,7 @@ var Table$1 = function Table(_ref13) {
55728
56927
  columnFilter = _ref13$columnFilter === void 0 ? true : _ref13$columnFilter,
55729
56928
  onChange = _ref13.onChange,
55730
56929
  onCellChange = _ref13.onCellChange,
56930
+ onLoad = _ref13.onLoad,
55731
56931
  tableId = _ref13.tableId,
55732
56932
  onAdd = _ref13.onAdd,
55733
56933
  _ref13$showAdd = _ref13.showAdd,
@@ -55744,12 +56944,32 @@ var Table$1 = function Table(_ref13) {
55744
56944
  locked = _useState32[0],
55745
56945
  setLocked = _useState32[1];
55746
56946
  var effectiveEditable = lockable ? editable && !locked : editable;
55747
- var _useState33 = useState(value),
56947
+ var buildAttributeData = useCallback(function () {
56948
+ var result = {};
56949
+ columns.forEach(function (col) {
56950
+ if (col.attributeData !== undefined) result[col.field] = col.attributeData;
56951
+ });
56952
+ return result;
56953
+ }, [columns]);
56954
+ var enrichRows = useCallback(function (rows) {
56955
+ var attributeData = buildAttributeData();
56956
+ if (!Object.keys(attributeData).length) return rows;
56957
+ return rows.map(function (row) {
56958
+ return _objectSpread2(_objectSpread2({}, row), {}, {
56959
+ attributeData: attributeData
56960
+ });
56961
+ });
56962
+ }, [buildAttributeData]);
56963
+ var _useState33 = useState(function () {
56964
+ return enrichRows(value);
56965
+ }),
55748
56966
  _useState34 = _slicedToArray$d(_useState33, 2),
55749
56967
  data = _useState34[0],
55750
56968
  setData = _useState34[1];
55751
56969
  useEffect(function () {
55752
- setData(value);
56970
+ var enriched = enrichRows(value);
56971
+ setData(enriched);
56972
+ onLoad === null || onLoad === void 0 || onLoad(enriched);
55753
56973
  }, [value]);
55754
56974
  var onCellChangeRef = useRef(onCellChange);
55755
56975
  useEffect(function () {
@@ -55793,7 +57013,8 @@ var Table$1 = function Table(_ref13) {
55793
57013
  var handleAddRow = useCallback(function () {
55794
57014
  // id temporaire négatif pour éviter les collisions avec les id BDD positifs
55795
57015
  var newRow = {
55796
- id: -Date.now()
57016
+ id: -Date.now(),
57017
+ attributeData: buildAttributeData()
55797
57018
  };
55798
57019
  columns.forEach(function (col) {
55799
57020
  switch (col.type) {
@@ -55812,7 +57033,7 @@ var Table$1 = function Table(_ref13) {
55812
57033
  onAdd === null || onAdd === void 0 || onAdd(newRow, updated);
55813
57034
  return updated;
55814
57035
  });
55815
- }, [columns, onChange, onAdd]);
57036
+ }, [columns, onChange, onAdd, buildAttributeData]);
55816
57037
  var _useState37 = useState({}),
55817
57038
  _useState38 = _slicedToArray$d(_useState37, 2),
55818
57039
  editingRows = _useState38[0],
@@ -56936,7 +58157,6 @@ var Table$1 = function Table(_ref13) {
56936
58157
  rowData: rowData,
56937
58158
  col: col,
56938
58159
  editable: colEditable,
56939
- isRowEditing: !!editingRows[rowData.id],
56940
58160
  onSave: function onSave(v) {
56941
58161
  var _onCellChangeRef$curr2;
56942
58162
  var enrichedFields = _defineProperty$g({}, col.field, v);
@@ -56967,6 +58187,7 @@ var Table$1 = function Table(_ref13) {
56967
58187
  newValue: v
56968
58188
  });
56969
58189
  },
58190
+ isRowEditing: !!editingRows[rowData.id],
56970
58191
  renderDisplay: displayFn !== null && displayFn !== void 0 ? displayFn : function (rd) {
56971
58192
  var _rd$col$field;
56972
58193
  return (_rd$col$field = rd[col.field]) !== null && _rd$col$field !== void 0 ? _rd$col$field : '';
@@ -58130,7 +59351,12 @@ var columnsTyped = [
58130
59351
  header: 'Inscription',
58131
59352
  type: 'date',
58132
59353
  editable: true,
58133
- dbDateFormat: 'MMMM/y'
59354
+ dbDateFormat: 'MMMM/y',
59355
+ attributeData: {
59356
+ 'data-value': 'bonjour',
59357
+ 'data-tata': 'hello',
59358
+ 'data-tab': []
59359
+ }
58134
59360
  }, {
58135
59361
  field: 'dateNaissance',
58136
59362
  header: 'Naissance',