@tekkare/romulus 0.1.251 → 0.1.252

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 (265) hide show
  1. package/dist/module.json +1 -1
  2. package/layer/app/app.config.ts +6 -0
  3. package/layer/app/components/OipPubmedSummary.vue +223 -0
  4. package/layer/app/components/OipResourceDrawer.vue +331 -0
  5. package/layer/app/components/OipResourceDrawerLink.vue +40 -0
  6. package/layer/app/components/OipResourceField.vue +41 -0
  7. package/layer/app/components/OipResourceGenericCard.vue +54 -0
  8. package/layer/app/components/OipResourceSource.vue +50 -0
  9. package/layer/app/components/OipResourceTags.vue +65 -0
  10. package/layer/app/components/OipResourceView.vue +107 -0
  11. package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
  12. package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
  13. package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
  14. package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
  15. package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
  16. package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
  17. package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
  18. package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
  19. package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
  20. package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
  21. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
  22. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
  23. package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
  24. package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
  25. package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
  26. package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
  27. package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
  28. package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
  29. package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
  30. package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
  31. package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
  32. package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
  33. package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
  34. package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
  35. package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
  36. package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
  37. package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
  38. package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
  39. package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
  40. package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
  41. package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
  42. package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
  43. package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
  44. package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
  45. package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
  46. package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
  47. package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
  48. package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
  49. package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
  50. package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
  51. package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
  52. package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
  53. package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
  54. package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
  55. package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
  56. package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
  57. package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
  58. package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
  59. package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
  60. package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
  61. package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
  62. package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
  63. package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
  64. package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
  65. package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
  66. package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
  67. package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
  68. package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
  69. package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
  70. package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
  71. package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
  72. package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
  73. package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
  74. package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
  75. package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
  76. package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
  77. package/layer/app/components/oip-science/common/Form.vue +73 -0
  78. package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
  79. package/layer/app/components/oip-science/common/NoData.vue +16 -0
  80. package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
  81. package/layer/app/components/oip-science/common/Source.vue +31 -0
  82. package/layer/app/components/oip-science/common/TableTags.vue +279 -0
  83. package/layer/app/components/oip-science/common/Timeline.vue +104 -0
  84. package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
  85. package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
  86. package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
  87. package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
  88. package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
  89. package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
  90. package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
  91. package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
  92. package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
  93. package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
  94. package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
  95. package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
  96. package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
  97. package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
  98. package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
  99. package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
  100. package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
  101. package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
  102. package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
  103. package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
  104. package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
  105. package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
  106. package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
  107. package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
  108. package/layer/app/components/oip-science/euct/Locations.vue +102 -0
  109. package/layer/app/components/oip-science/euct/Products.vue +101 -0
  110. package/layer/app/components/oip-science/euct/Publications.vue +89 -0
  111. package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
  112. package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
  113. package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
  114. package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
  115. package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
  116. package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
  117. package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
  118. package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
  119. package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
  120. package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
  121. package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
  122. package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
  123. package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
  124. package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
  125. package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
  126. package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
  127. package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
  128. package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
  129. package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
  130. package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
  131. package/layer/app/composables/useOipChapterScroll.ts +43 -0
  132. package/layer/app/composables/useOipResourceHooks.ts +27 -0
  133. package/layer/app/composables/useOipResourceNav.ts +66 -0
  134. package/layer/app/composables/useOipResourceViews.ts +117 -0
  135. package/layer/app/composables/useOipResources.ts +83 -0
  136. package/layer/app/oip-drugs/PORTING.md +120 -0
  137. package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
  138. package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
  139. package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
  140. package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
  141. package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
  142. package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
  143. package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
  144. package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
  145. package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
  146. package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
  147. package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
  148. package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
  149. package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
  150. package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
  151. package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
  152. package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
  153. package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
  154. package/layer/app/oip-drugs/drugs.css +500 -0
  155. package/layer/app/oip-drugs/esIndices.ts +322 -0
  156. package/layer/app/oip-drugs/kinds.ts +264 -0
  157. package/layer/app/oip-drugs/locales/en.json +1571 -0
  158. package/layer/app/oip-drugs/locales/fr.json +1571 -0
  159. package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
  160. package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
  161. package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
  162. package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
  163. package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
  164. package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
  165. package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
  166. package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
  167. package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
  168. package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
  169. package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
  170. package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
  171. package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
  172. package/layer/app/oip-drugs/types/elastic.ts +113 -0
  173. package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
  174. package/layer/app/oip-drugs/types/es/directory.ts +54 -0
  175. package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
  176. package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
  177. package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
  178. package/layer/app/oip-drugs/types/es/portal.ts +130 -0
  179. package/layer/app/oip-drugs/types/es/retail.ts +107 -0
  180. package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
  181. package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
  182. package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
  183. package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
  184. package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
  185. package/layer/app/oip-drugs/utils/contributions.ts +36 -0
  186. package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
  187. package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
  188. package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
  189. package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
  190. package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
  191. package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
  192. package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
  193. package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
  194. package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
  195. package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
  196. package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
  197. package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
  198. package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
  199. package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
  200. package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
  201. package/layer/app/oip-science/PORTING.md +93 -0
  202. package/layer/app/oip-science/assets/smartSelection.json +428 -0
  203. package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
  204. package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
  205. package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
  206. package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
  207. package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
  208. package/layer/app/oip-science/composables/useEuct.ts +418 -0
  209. package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
  210. package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
  211. package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
  212. package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
  213. package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
  214. package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
  215. package/layer/app/oip-science/composables/usePubmed.ts +487 -0
  216. package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
  217. package/layer/app/oip-science/indexConfig.json +794 -0
  218. package/layer/app/oip-science/locales/en.json +483 -0
  219. package/layer/app/oip-science/locales/fr.json +483 -0
  220. package/layer/app/oip-science/science.css +1182 -0
  221. package/layer/app/oip-science/utils/a-openCard.ts +23 -0
  222. package/layer/app/oip-science/utils/b-openCard.ts +35 -0
  223. package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
  224. package/layer/app/oip-science/utils/f-types.ts +241 -0
  225. package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
  226. package/layer/app/oip-science/utils/matchMethod.ts +53 -0
  227. package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
  228. package/layer/app/oip-science/utils/sources.ts +15 -0
  229. package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
  230. package/layer/app/oip-science/utils/toPresets.ts +7 -0
  231. package/layer/app/oip-science/utils/valueTable.ts +126 -0
  232. package/layer/app/plugins/oip-science-i18n.ts +17 -0
  233. package/layer/app/utils/oipFicheRoutes.ts +118 -0
  234. package/layer/app/utils/oipResources.ts +440 -0
  235. package/layer/nuxt.config.ts +22 -2
  236. package/layer/public/reports/blincyto-has.html +292 -0
  237. package/layer/public/reports/blincyto-has.pdf +0 -0
  238. package/layer/public/reports/darzalex-has.html +279 -0
  239. package/layer/public/reports/darzalex-has.pdf +0 -0
  240. package/layer/public/reports/dupixent-has.html +217 -0
  241. package/layer/public/reports/dupixent-has.pdf +0 -0
  242. package/layer/public/reports/enhertu-has.html +283 -0
  243. package/layer/public/reports/enhertu-has.pdf +0 -0
  244. package/layer/public/reports/has-sein-2023.html +1639 -0
  245. package/layer/public/reports/ibrance-has.html +280 -0
  246. package/layer/public/reports/ibrance-has.pdf +0 -0
  247. package/layer/public/reports/imfinzi-has.html +297 -0
  248. package/layer/public/reports/imfinzi-has.pdf +0 -0
  249. package/layer/public/reports/keytruda-has.html +337 -0
  250. package/layer/public/reports/keytruda-has.pdf +0 -0
  251. package/layer/public/reports/kisqali-has.html +202 -0
  252. package/layer/public/reports/kisqali-has.pdf +0 -0
  253. package/layer/public/reports/opdivo-has.html +232 -0
  254. package/layer/public/reports/opdivo-has.pdf +0 -0
  255. package/layer/public/reports/ozempic-has.html +188 -0
  256. package/layer/public/reports/ozempic-has.pdf +0 -0
  257. package/layer/public/reports/tecentriq-has.html +315 -0
  258. package/layer/public/reports/tecentriq-has.pdf +0 -0
  259. package/layer/public/reports/yescarta-has.html +275 -0
  260. package/layer/public/reports/yescarta-has.pdf +0 -0
  261. package/layer/server/api/oip/es.post.ts +99 -0
  262. package/layer/server/api/oip/pdf.get.ts +70 -0
  263. package/layer/server/api/oip/reports.get.ts +98 -0
  264. package/layer/server/api/oip/resource-types.get.ts +22 -0
  265. package/package.json +1 -1
@@ -0,0 +1,243 @@
1
+ <!--
2
+ « Pourquoi ce resultat ? »
3
+
4
+ Sous chaque carte, la liste des endroits ou les termes ont ete trouves, avec
5
+ le nombre d'avis concernes, et au depliage l'extrait exact — surligne en
6
+ `<mark>`, la balise que la feuille du hub peint en rose.
7
+
8
+ Deux sources d'extraits : ce qu'Elasticsearch a matche lui-meme (recherche
9
+ texte libre, via les inner_hits du hit) et, pour les filtres qui n'ont pas
10
+ d'inner_hits exploitable, ce qu'un appelant fournit en `extraFields` — par
11
+ exemple le texte que le pipeline de tagging oncologie a lui-meme surligne
12
+ dans `oncology_tagging.section[].highlight` (cf. `heartGetTaggingExcerpts`).
13
+ Dans les deux cas, rien n'est recalcule ici.
14
+ -->
15
+ <script setup lang="ts">
16
+ import { heartExplainMatch } from "../../../../oip-drugs/composables/useHeartMatchExplain";
17
+
18
+ export interface MatchExplainExtraField {
19
+ key: string;
20
+ label: string;
21
+ count?: number;
22
+ fragments: { html: string; date: string | null; ref?: string | null }[];
23
+ }
24
+
25
+ const props = defineProps<{
26
+ /** Le hit Elasticsearch complet, inner hits compris. */
27
+ hit: any;
28
+ /** Repli par defaut ; la fiche produit ouvre le detail d'emblee. */
29
+ open?: boolean;
30
+ /** Familles supplementaires, hors inner_hits ES (cf. commentaire ci-dessus). */
31
+ extraFields?: MatchExplainExtraField[];
32
+ }>();
33
+
34
+ const { locale } = useI18n();
35
+
36
+ const explain = computed(() => heartExplainMatch(props.hit, locale.value));
37
+
38
+ // Filtres deja couverts par un extrait `extraFields` : la pastille de filtre
39
+ // ES resterait sinon en double avec la pastille d'extrait (ex. Oncology
40
+ // ICD-10 apparaitrait a la fois nue et avec son texte).
41
+ const extraKeys = computed(() => new Set((props.extraFields ?? []).map((f) => f.key)));
42
+
43
+ const allFields = computed(() => [...(explain.value?.fields ?? []), ...(props.extraFields ?? [])]);
44
+ const allFilters = computed(() => (explain.value?.filters ?? []).filter((f) => !extraKeys.value.has(f.name)));
45
+
46
+ const expanded = ref(!!props.open);
47
+ // Les cartes d'une liste sont reutilisees d'une recherche a l'autre : le
48
+ // depliage suit la recherche en cours, pas seulement la premiere.
49
+ watch(
50
+ () => props.open,
51
+ (open) => (expanded.value = !!open),
52
+ );
53
+
54
+ /**
55
+ * Extraits de toutes les familles, du plus ancien avis au plus recent : c'est
56
+ * par la date qu'on retrouve un avis dans la fiche. Les extraits sans date
57
+ * (dont ceux du pipeline de tagging, qui ne portent pas de date d'avis)
58
+ * ferment la liste.
59
+ */
60
+ const excerpts = computed(() =>
61
+ allFields.value
62
+ .flatMap((field) =>
63
+ field.fragments
64
+ // `v-html` en aval : un extrait mal forme (donnee de tagging
65
+ // irreguliere) s'afficherait en "[object Object]" plutot que de
66
+ // disparaitre silencieusement.
67
+ .filter((fragment) => typeof fragment.html === "string" && fragment.html)
68
+ .slice(0, 2)
69
+ .map((fragment) => ({
70
+ key: `${field.key}-${fragment.html}`,
71
+ label: field.label,
72
+ date: fragment.date,
73
+ ref: fragment.ref ?? null,
74
+ html: fragment.html,
75
+ })),
76
+ )
77
+ .sort((a, b) => {
78
+ if (!a.date || !b.date) return a.date ? -1 : b.date ? 1 : 0;
79
+ return new Date(a.date).getTime() - new Date(b.date).getTime();
80
+ }),
81
+ );
82
+ </script>
83
+
84
+ <template>
85
+ <div v-if="allFields.length || allFilters.length" class="oip-drugs mx">
86
+ <!-- La carte entiere est un lien : sans `prevent`, deplier partirait sur la
87
+ fiche produit. -->
88
+ <button type="button" class="mx_head" @click.stop.prevent="expanded = !expanded">
89
+ <RmIcon name="Target" :size="14" />
90
+ <span class="mx_intro">
91
+ {{
92
+ allFields.length
93
+ ? (locale === "en" ? "Match in" : "Correspondance dans")
94
+ : (locale === "en" ? "Filters matched" : "Filtres retenus")
95
+ }}
96
+ </span>
97
+ <!-- Le decompte est celui des avis de la famille : sur un index plat il
98
+ n'y a rien a compter, la pastille reste nue. -->
99
+ <span v-for="field in allFields" :key="field.key" class="mx_chip">
100
+ {{ field.label }}
101
+ <b v-if="field.count">{{ field.count }}</b>
102
+ </span>
103
+ <!-- Filtre matche sans aucun extrait (ni ES, ni tagging) : rien a
104
+ deplier, la pastille parle directement dans l'en-tete plutot que
105
+ de rester invisible derriere un « Voir pourquoi » qui ne
106
+ s'affiche jamais. -->
107
+ <template v-if="!allFields.length">
108
+ <span v-for="filter in allFilters" :key="filter.name" class="mx_chip">
109
+ {{ filter.label }}
110
+ <b>{{ filter.count }}</b>
111
+ </span>
112
+ </template>
113
+ <span v-if="excerpts.length" class="mx_toggle">
114
+ {{ expanded ? (locale === "en" ? "Hide" : "Masquer") : (locale === "en" ? "See why" : "Voir pourquoi") }}
115
+ </span>
116
+ </button>
117
+
118
+ <div v-if="expanded && excerpts.length" class="mx_body">
119
+ <p v-for="excerpt in excerpts" :key="excerpt.key" class="mx_excerpt">
120
+ <span class="mx_excerpt_label">
121
+ {{ excerpt.label }}
122
+ <span v-if="excerpt.date" class="mx_excerpt_date">
123
+ · <RmDate :date="excerpt.date" :lang="locale === 'en' ? 'en' : 'fr'" />
124
+ </span>
125
+ <span v-if="excerpt.ref" class="mx_excerpt_date">· réf. HAS {{ excerpt.ref }}</span>
126
+ </span>
127
+ <span class="mx_excerpt_text" v-html="excerpt.html" />
128
+ </p>
129
+
130
+ <p v-if="allFilters.length" class="mx_filters">
131
+ {{ locale === "en" ? "Filters matched:" : "Filtres retenus :" }}
132
+ <span v-for="filter in allFilters" :key="filter.name" class="mx_chip">
133
+ {{ filter.label }}
134
+ <b>{{ filter.count }}</b>
135
+ </span>
136
+ </p>
137
+ </div>
138
+ </div>
139
+ </template>
140
+
141
+ <style scoped>
142
+ /* Bande de bas de carte, calee sur les gouttieres de la carte (24px) pour ne
143
+ pas donner l'impression de deborder. */
144
+ .mx {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 8px;
148
+ box-sizing: border-box;
149
+ width: 100%;
150
+ padding: 10px 24px 16px;
151
+ border-top: 1px solid var(--light);
152
+ }
153
+
154
+ .mx_head {
155
+ display: flex;
156
+ flex-wrap: wrap;
157
+ align-items: center;
158
+ gap: 6px;
159
+ padding: 0;
160
+ border: none;
161
+ background: none;
162
+ color: var(--medium);
163
+ font-family: inherit;
164
+ font-size: 13px;
165
+ text-align: left;
166
+ cursor: pointer;
167
+ }
168
+
169
+ .mx_intro {
170
+ font-weight: 600;
171
+ }
172
+
173
+ /* Meme rose que le surlignage des extraits : la pastille et le mot souligne
174
+ dans le texte parlent de la meme chose. */
175
+ .mx_chip {
176
+ display: inline-flex;
177
+ align-items: center;
178
+ gap: 5px;
179
+ padding: 2px 9px;
180
+ border-radius: 999px;
181
+ background: #ffaeff;
182
+ color: var(--darkest);
183
+ font-size: 12px;
184
+ font-weight: 700;
185
+ }
186
+
187
+ .mx_chip b {
188
+ font-weight: 800;
189
+ }
190
+
191
+ .mx_toggle {
192
+ margin-left: auto;
193
+ color: var(--primary);
194
+ font-size: 13px;
195
+ font-weight: 600;
196
+ text-decoration: underline;
197
+ }
198
+
199
+ .mx_body {
200
+ display: flex;
201
+ flex-direction: column;
202
+ gap: 8px;
203
+ }
204
+
205
+ .mx_excerpt {
206
+ display: flex;
207
+ flex-direction: column;
208
+ gap: 2px;
209
+ padding: 8px 10px;
210
+ border-radius: 8px;
211
+ background: var(--lightest);
212
+ font-size: 13px;
213
+ line-height: 1.5;
214
+ }
215
+
216
+ .mx_excerpt_label {
217
+ color: var(--medium);
218
+ font-size: 11px;
219
+ font-weight: 700;
220
+ letter-spacing: 0.04em;
221
+ text-transform: uppercase;
222
+ }
223
+
224
+ /* La date garde sa casse : « 27 août 2025 » se lit mieux que « 27 AOÛT 2025 ». */
225
+ .mx_excerpt_date {
226
+ font-weight: 600;
227
+ letter-spacing: normal;
228
+ text-transform: none;
229
+ }
230
+
231
+ .mx_excerpt_text {
232
+ color: var(--dark);
233
+ }
234
+
235
+ .mx_filters {
236
+ display: flex;
237
+ flex-wrap: wrap;
238
+ align-items: center;
239
+ gap: 6px;
240
+ color: var(--medium);
241
+ font-size: 13px;
242
+ }
243
+ </style>
@@ -0,0 +1,105 @@
1
+ <!--
2
+ Les rangees facultatives d'une carte de resultat, celles cochees dans
3
+ « Personnaliser ».
4
+
5
+ La carte passe ce qu'elle sait lire (`values`, une liste d'etiquettes par cle
6
+ d'option) ; le composant garde les rangees demandees et non vides, dans
7
+ l'ordre du catalogue (useCardPrefOptions). Rien de coche, ou rien a
8
+ montrer : il ne rend rien du tout.
9
+ -->
10
+ <script setup lang="ts">
11
+ import {
12
+ cardPrefOptions,
13
+ defaultCardPrefs,
14
+ type CardPrefs,
15
+ type CardPrefScope,
16
+ } from "../../../../oip-drugs/composables/useCardPrefOptions";
17
+
18
+ const props = withDefaults(
19
+ defineProps<{
20
+ /** Famille de page : dit quelles options existent. */
21
+ scope: CardPrefScope;
22
+ /** cle d'option → etiquettes a afficher (une chaine seule est acceptee). */
23
+ values: Record<string, string[] | string | null | undefined>;
24
+ /** Au-dela, la rangee se resume par un « +n » qui liste le reste au survol. */
25
+ maxTags?: number;
26
+ /**
27
+ * Les options cochees dans « Personnaliser » (ex-store `cardPrefs` de
28
+ * fr_drugs_app) ; par defaut celles de fr_drugs_app : rien.
29
+ */
30
+ prefs?: CardPrefs;
31
+ }>(),
32
+ { maxTags: 4, prefs: () => defaultCardPrefs() },
33
+ );
34
+
35
+ const { locale } = useI18n();
36
+
37
+ const rows = computed(() => {
38
+ const active = props.prefs ?? {};
39
+ const en = locale.value === "en";
40
+
41
+ return cardPrefOptions(props.scope)
42
+ .filter((option) => active[option.key])
43
+ .map((option) => {
44
+ const raw = props.values[option.key];
45
+ const tags = (Array.isArray(raw) ? raw : raw ? [raw] : []).filter(Boolean) as string[];
46
+ return { ...option, label: en ? option.en : option.fr, tags };
47
+ })
48
+ .filter((row) => row.tags.length > 0);
49
+ });
50
+ </script>
51
+
52
+ <template>
53
+ <div v-if="rows.length" class="oip-drugs pref_rows">
54
+ <div v-for="row in rows" :key="row.key" class="pref_row">
55
+ <div class="pref_row_label">
56
+ <RmIcon :name="row.icon" :size="16" />
57
+ <p class="oip_filter_label">{{ row.label }}</p>
58
+ </div>
59
+ <div class="pref_row_tags">
60
+ <RmTag v-for="(tag, i) in row.tags.slice(0, maxTags)" :key="i" :variant="row.variant">
61
+ {{ tag }}
62
+ </RmTag>
63
+ <RmTag
64
+ v-if="row.tags.length > maxTags"
65
+ variant="gray"
66
+ :title="row.tags.slice(maxTags).join(', ')"
67
+ >
68
+ +{{ row.tags.length - maxTags }}
69
+ </RmTag>
70
+ </div>
71
+ </div>
72
+ </div>
73
+ </template>
74
+
75
+ <style scoped>
76
+ .pref_rows {
77
+ display: flex;
78
+ flex-direction: column;
79
+ gap: 8px;
80
+ margin-top: 4px;
81
+ }
82
+
83
+ .pref_row {
84
+ display: flex;
85
+ align-items: flex-start;
86
+ gap: 12px;
87
+ }
88
+
89
+ .pref_row_label {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 6px;
93
+ min-width: 160px;
94
+ padding-top: 4px;
95
+ white-space: nowrap;
96
+ }
97
+
98
+ .pref_row_tags {
99
+ display: flex;
100
+ flex: 1;
101
+ flex-wrap: wrap;
102
+ gap: 4px;
103
+ min-width: 0;
104
+ }
105
+ </style>