@tekkare/romulus 0.1.251 → 0.1.253

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 (267) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/utils/projects.d.ts +8 -0
  3. package/dist/runtime/utils/projects.js +8 -5
  4. package/layer/app/app.config.ts +6 -0
  5. package/layer/app/components/OipPubmedSummary.vue +223 -0
  6. package/layer/app/components/OipResourceDrawer.vue +331 -0
  7. package/layer/app/components/OipResourceDrawerLink.vue +40 -0
  8. package/layer/app/components/OipResourceField.vue +41 -0
  9. package/layer/app/components/OipResourceGenericCard.vue +54 -0
  10. package/layer/app/components/OipResourceSource.vue +50 -0
  11. package/layer/app/components/OipResourceTags.vue +65 -0
  12. package/layer/app/components/OipResourceView.vue +107 -0
  13. package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
  14. package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
  15. package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
  16. package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
  17. package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
  18. package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
  19. package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
  20. package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
  21. package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
  22. package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
  23. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
  24. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
  25. package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
  26. package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
  27. package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
  28. package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
  29. package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
  30. package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
  31. package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
  32. package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
  33. package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
  34. package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
  35. package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
  36. package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
  37. package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
  38. package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
  39. package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
  40. package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
  41. package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
  42. package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
  43. package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
  44. package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
  45. package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
  46. package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
  47. package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
  48. package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
  49. package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
  50. package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
  51. package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
  52. package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
  53. package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
  54. package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
  55. package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
  56. package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
  57. package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
  58. package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
  59. package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
  60. package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
  61. package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
  62. package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
  63. package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
  64. package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
  65. package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
  66. package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
  67. package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
  68. package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
  69. package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
  70. package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
  71. package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
  72. package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
  73. package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
  74. package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
  75. package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
  76. package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
  77. package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
  78. package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
  79. package/layer/app/components/oip-science/common/Form.vue +73 -0
  80. package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
  81. package/layer/app/components/oip-science/common/NoData.vue +16 -0
  82. package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
  83. package/layer/app/components/oip-science/common/Source.vue +31 -0
  84. package/layer/app/components/oip-science/common/TableTags.vue +279 -0
  85. package/layer/app/components/oip-science/common/Timeline.vue +104 -0
  86. package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
  87. package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
  88. package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
  89. package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
  90. package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
  91. package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
  92. package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
  93. package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
  94. package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
  95. package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
  96. package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
  97. package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
  98. package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
  99. package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
  100. package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
  101. package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
  102. package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
  103. package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
  104. package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
  105. package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
  106. package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
  107. package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
  108. package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
  109. package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
  110. package/layer/app/components/oip-science/euct/Locations.vue +102 -0
  111. package/layer/app/components/oip-science/euct/Products.vue +101 -0
  112. package/layer/app/components/oip-science/euct/Publications.vue +89 -0
  113. package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
  114. package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
  115. package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
  116. package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
  117. package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
  118. package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
  119. package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
  120. package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
  121. package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
  122. package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
  123. package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
  124. package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
  125. package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
  126. package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
  127. package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
  128. package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
  129. package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
  130. package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
  131. package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
  132. package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
  133. package/layer/app/composables/useOipChapterScroll.ts +43 -0
  134. package/layer/app/composables/useOipResourceHooks.ts +27 -0
  135. package/layer/app/composables/useOipResourceNav.ts +66 -0
  136. package/layer/app/composables/useOipResourceViews.ts +117 -0
  137. package/layer/app/composables/useOipResources.ts +83 -0
  138. package/layer/app/oip-drugs/PORTING.md +120 -0
  139. package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
  140. package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
  141. package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
  142. package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
  143. package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
  144. package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
  145. package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
  146. package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
  147. package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
  148. package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
  149. package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
  150. package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
  151. package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
  152. package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
  153. package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
  154. package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
  155. package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
  156. package/layer/app/oip-drugs/drugs.css +500 -0
  157. package/layer/app/oip-drugs/esIndices.ts +322 -0
  158. package/layer/app/oip-drugs/kinds.ts +264 -0
  159. package/layer/app/oip-drugs/locales/en.json +1571 -0
  160. package/layer/app/oip-drugs/locales/fr.json +1571 -0
  161. package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
  162. package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
  163. package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
  164. package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
  165. package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
  166. package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
  167. package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
  168. package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
  169. package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
  170. package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
  171. package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
  172. package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
  173. package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
  174. package/layer/app/oip-drugs/types/elastic.ts +113 -0
  175. package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
  176. package/layer/app/oip-drugs/types/es/directory.ts +54 -0
  177. package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
  178. package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
  179. package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
  180. package/layer/app/oip-drugs/types/es/portal.ts +130 -0
  181. package/layer/app/oip-drugs/types/es/retail.ts +107 -0
  182. package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
  183. package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
  184. package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
  185. package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
  186. package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
  187. package/layer/app/oip-drugs/utils/contributions.ts +36 -0
  188. package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
  189. package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
  190. package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
  191. package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
  192. package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
  193. package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
  194. package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
  195. package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
  196. package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
  197. package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
  198. package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
  199. package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
  200. package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
  201. package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
  202. package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
  203. package/layer/app/oip-science/PORTING.md +93 -0
  204. package/layer/app/oip-science/assets/smartSelection.json +428 -0
  205. package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
  206. package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
  207. package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
  208. package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
  209. package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
  210. package/layer/app/oip-science/composables/useEuct.ts +418 -0
  211. package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
  212. package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
  213. package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
  214. package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
  215. package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
  216. package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
  217. package/layer/app/oip-science/composables/usePubmed.ts +487 -0
  218. package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
  219. package/layer/app/oip-science/indexConfig.json +794 -0
  220. package/layer/app/oip-science/locales/en.json +483 -0
  221. package/layer/app/oip-science/locales/fr.json +483 -0
  222. package/layer/app/oip-science/science.css +1182 -0
  223. package/layer/app/oip-science/utils/a-openCard.ts +23 -0
  224. package/layer/app/oip-science/utils/b-openCard.ts +35 -0
  225. package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
  226. package/layer/app/oip-science/utils/f-types.ts +241 -0
  227. package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
  228. package/layer/app/oip-science/utils/matchMethod.ts +53 -0
  229. package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
  230. package/layer/app/oip-science/utils/sources.ts +15 -0
  231. package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
  232. package/layer/app/oip-science/utils/toPresets.ts +7 -0
  233. package/layer/app/oip-science/utils/valueTable.ts +126 -0
  234. package/layer/app/plugins/oip-science-i18n.ts +17 -0
  235. package/layer/app/utils/oipFicheRoutes.ts +118 -0
  236. package/layer/app/utils/oipResources.ts +440 -0
  237. package/layer/nuxt.config.ts +22 -2
  238. package/layer/public/reports/blincyto-has.html +292 -0
  239. package/layer/public/reports/blincyto-has.pdf +0 -0
  240. package/layer/public/reports/darzalex-has.html +279 -0
  241. package/layer/public/reports/darzalex-has.pdf +0 -0
  242. package/layer/public/reports/dupixent-has.html +217 -0
  243. package/layer/public/reports/dupixent-has.pdf +0 -0
  244. package/layer/public/reports/enhertu-has.html +283 -0
  245. package/layer/public/reports/enhertu-has.pdf +0 -0
  246. package/layer/public/reports/has-sein-2023.html +1639 -0
  247. package/layer/public/reports/ibrance-has.html +280 -0
  248. package/layer/public/reports/ibrance-has.pdf +0 -0
  249. package/layer/public/reports/imfinzi-has.html +297 -0
  250. package/layer/public/reports/imfinzi-has.pdf +0 -0
  251. package/layer/public/reports/keytruda-has.html +337 -0
  252. package/layer/public/reports/keytruda-has.pdf +0 -0
  253. package/layer/public/reports/kisqali-has.html +202 -0
  254. package/layer/public/reports/kisqali-has.pdf +0 -0
  255. package/layer/public/reports/opdivo-has.html +232 -0
  256. package/layer/public/reports/opdivo-has.pdf +0 -0
  257. package/layer/public/reports/ozempic-has.html +188 -0
  258. package/layer/public/reports/ozempic-has.pdf +0 -0
  259. package/layer/public/reports/tecentriq-has.html +315 -0
  260. package/layer/public/reports/tecentriq-has.pdf +0 -0
  261. package/layer/public/reports/yescarta-has.html +275 -0
  262. package/layer/public/reports/yescarta-has.pdf +0 -0
  263. package/layer/server/api/oip/es.post.ts +99 -0
  264. package/layer/server/api/oip/pdf.get.ts +70 -0
  265. package/layer/server/api/oip/reports.get.ts +98 -0
  266. package/layer/server/api/oip/resource-types.get.ts +22 -0
  267. package/package.json +1 -1
@@ -0,0 +1,743 @@
1
+ <template>
2
+ <!-- Component for global result card -->
3
+ <!-- I would advise to create a separate card component for France results as there is more info displayed on the card -->
4
+ <RmSectionCard
5
+ class="oip-drugs"
6
+ v-if="getLatestHistory !== undefined"
7
+ :class="inDetails ? '' : 'action'"
8
+ position="top"
9
+ >
10
+ <template #header>
11
+ <div class="oip_row v-center justify-between full_flex" style="width: 100%">
12
+ <div class="oip_row gap-8 wrap v-center">
13
+ <RmTag
14
+ v-if="
15
+ isEco &&
16
+ getLatestHistory.is_ceesp === 1
17
+ "
18
+ variant="indigo"
19
+ >{{ $t("oipDrugs.heart.card.eco") }}</RmTag>
20
+ <RmTag v-if="inDetails && isFirst" variant="green">{{
21
+ $t("oipDrugs.heart.card.first")
22
+ }}</RmTag>
23
+
24
+ <RmTag v-if="getLatestHistory.biosimilar_brand" variant="blue">{{
25
+ $t("oipDrugs.heart.card.biosimilar")
26
+ }}</RmTag>
27
+ <RmTag v-if="opinionMatch" variant="green">
28
+ Match : {{ opinionMatch.fields.map(f => f.label).join(', ') }} - {{ $t('oipDrugs.heart.card.history.opinion') }} <RmDate :lang="locale" :date="opinionMatch.date" />
29
+ </RmTag>
30
+ <RmTag v-if="filterMatches.length > 0" variant="green">
31
+ Match : {{ filterMatches.join(', ') }}
32
+ </RmTag>
33
+ <RmTag variant="teal">{{ opinionCount }} {{ opinionCount > 1 ? (locale === 'fr' ? 'avis' : 'opinions') : (locale === 'fr' ? 'avis' : 'opinion') }}</RmTag>
34
+ <div class="oip_row v-center gap-8" v-if="locale === 'en'">
35
+ <p>{{ $t("oipDrugs.heart.translation") }}</p>
36
+ <div class="link" @click="showOriginal = !showOriginal">
37
+ {{ showOriginal ? $t("oipDrugs.heart.card.lang") : $t("oipDrugs.heart.card.original") }}
38
+ </div>
39
+ </div>
40
+ </div>
41
+ <div v-if="!inDetails" class="oip_row v-center gap-8" style="margin-left: auto">
42
+ <a
43
+ :href="detailsHref"
44
+ @click="onDetails"
45
+ >
46
+ <RmButton prefix-icon="Eye" variant="secondary">{{ $t("oipDrugs.heart.card.details") }}</RmButton>
47
+ </a>
48
+ </div>
49
+ </div>
50
+ </template>
51
+ <div class="card_display">
52
+ <div class="card_top">
53
+ <div class="oip_row gap-32 space-between">
54
+ <div class="card_header">
55
+ <div class="card_title">
56
+ <oip-drugs-heart-text-highlight
57
+ :text="`${product._source.brand_group} - ${getLatestHistory.molecule}`"
58
+ :queries="getMolHighlight.concat(getHighlight(['brand']))"
59
+ class="has_product_title"
60
+ />
61
+ </div>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="oip_row v-center gap-8 card_head_text wrap">
66
+ <RmDate :date="getLatestHistory.decision_date" :lang="locale" />
67
+ <div class="sep">&nbsp;</div>
68
+ <span v-if="getLatestHistory.has_code"><strong class="has_code_prefix">{{ getLatestHistory.has_code.slice(0, 2) }}</strong>{{ getLatestHistory.has_code.slice(2) }}</span>
69
+ <span
70
+ v-if="
71
+ (getLatestHistory.has_code &&
72
+ getLatestHistory.has_code !== null &&
73
+ (locale === 'fr' || showOriginal) &&
74
+ (getLatestHistory.nature_of_request_regroup !== null ||
75
+ getLatestHistory.nature_of_request !== null)) ||
76
+ (locale === 'en' &&
77
+ !showOriginal &&
78
+ ((getLatestHistory.nature_of_request_regroup_en &&
79
+ getLatestHistory.nature_of_request_regroup_en !== null) ||
80
+ (getLatestHistory.nature_of_request_en &&
81
+ getLatestHistory.nature_of_request_en !== null)))
82
+ "
83
+ >-</span
84
+ >
85
+ <oip-drugs-heart-text-highlight
86
+ :text="
87
+ !showOriginal && locale === 'en'
88
+ ? getLatestHistory.nature_of_request_regroup_en !== null
89
+ ? getLatestHistory.nature_of_request_regroup_en
90
+ : getLatestHistory.nature_of_request_en
91
+ : getLatestHistory.nature_of_request_regroup !== null
92
+ ? getLatestHistory.nature_of_request_regroup
93
+ : getLatestHistory.nature_of_request
94
+ "
95
+ :queries="getStore('motif')"
96
+ v-if="
97
+ ((locale === 'fr' || showOriginal) &&
98
+ (getLatestHistory.nature_of_request_regroup !== null ||
99
+ getLatestHistory.nature_of_request !== null)) ||
100
+ (locale === 'en' &&
101
+ !showOriginal &&
102
+ ((getLatestHistory.nature_of_request_regroup_en &&
103
+ getLatestHistory.nature_of_request_regroup_en !== null) ||
104
+ (getLatestHistory.nature_of_request_en &&
105
+ getLatestHistory.nature_of_request_en !== null)))
106
+ "
107
+ />
108
+ </div>
109
+ </div>
110
+ <div class="oip_row v-center gap-8">
111
+ <div class="oip_list v-start gap-4">
112
+ <p class="oip_filter_label">ATC5</p>
113
+ <RmTag variant="transparent">
114
+ <oip-drugs-heart-text-highlight
115
+ v-if="getLatestHistory.atc5_code !== null"
116
+ :text="getLatestHistory.atc5_code?.join(', ')"
117
+ :queries="getMolHighlight"
118
+ />
119
+ <span v-else>{{ $t("oipDrugs.heart.card.not_provided") }}</span></RmTag>
120
+ </div>
121
+ <div
122
+ v-if="allCompanies.length > 0"
123
+ class="oip_list v-start gap-4"
124
+ style="flex: 1; min-width: 0;"
125
+ >
126
+ <p class="oip_filter_label">{{ $t("oipDrugs.heart.card.labels.comps") }}</p>
127
+ <RmTag variant="transparent">
128
+ <oip-drugs-heart-text-highlight
129
+ v-for="(comp, i) in allCompanies"
130
+ :key="i"
131
+ :text="comp"
132
+ :queries="getHighlight(['company'])"
133
+ />
134
+ </RmTag>
135
+ </div>
136
+ </div>
137
+
138
+ <oip-drugs-heart-text-highlight
139
+ :key="textKey"
140
+ crop
141
+ have-read-more
142
+ :queries="getHighlightQueries"
143
+ :lang="locale"
144
+ :text="
145
+ locale === 'fr' || showOriginal
146
+ ? getLatestHistory.syn_indication !== null
147
+ ? getLatestHistory.syn_indication
148
+ : getLatestHistory.indication
149
+ : getLatestHistory.syn_indication_en !== null
150
+ ? getLatestHistory.syn_indication_en
151
+ : getLatestHistory.indication_en
152
+ "
153
+ v-if="
154
+ (locale === 'fr' &&
155
+ (getLatestHistory.syn_indication !== null ||
156
+ getLatestHistory.indication !== null)) ||
157
+ (locale === 'en' &&
158
+ (getLatestHistory.syn_indication_en !== null ||
159
+ getLatestHistory.indication_en !== null))
160
+ "
161
+ class="oip_body"
162
+ :id="`indic_${getLatestHistory.brand}_${getLatestHistory.opinion_id}`"
163
+ />
164
+
165
+ <div class="oip_row v-start gap-32 wrap">
166
+ <div class="oip_list v-start gap-4">
167
+ <p class="oip_filter_label">SMR</p>
168
+ <div class="oip_row v-center gap-8">
169
+ <div
170
+ v-if="
171
+ getLatestHistory.smr &&
172
+ getLatestHistory.smr !== null &&
173
+ getLatestHistory.smr.length > 0
174
+ "
175
+ class="oip_row v-center gap-4 wrap"
176
+ >
177
+ <div v-for="(smr, index) in getLatestHistory.smr" :key="index">
178
+ <RmTag variant="gray">
179
+ <oip-drugs-heart-text-highlight
180
+ :text="mapSMR(smr.type) ?? ''"
181
+ :queries="getHighlight(['smr'])"
182
+ /></RmTag>
183
+ </div>
184
+ </div>
185
+ <div v-else class="unavailable">N/A</div>
186
+ </div>
187
+ </div>
188
+ <oip-drugs-heart-results-asmr-cursor :asmr="getLatestHistory.asmr" />
189
+ </div>
190
+ <div
191
+ v-if="(product._source.rare_diseases || product._source.rare_diseases_en) || oncologyIcd10.length > 0 || oncologyTerms.length > 0 || getLatestHistory.biosimilar_brand"
192
+ class="oip_list v-start gap-16"
193
+ >
194
+ <div
195
+ v-if="product._source.rare_diseases || product._source.rare_diseases_en"
196
+ class="indic_category_row"
197
+ >
198
+ <div class="indic_category_label">
199
+ <RmIcon name="Virus" :size="16" color="#4A4A4A" />
200
+ <p class="oip_filter_label">
201
+ {{ locale === "fr" ? "Maladies Rares" : "Rare Diseases" }}
202
+ </p>
203
+ </div>
204
+ <div class="indic_tags_wrap">
205
+ <div v-for="(rare, index) in rareList.slice(0, maxTags)" :key="index">
206
+ <RmTag variant="gray">
207
+ <oip-drugs-heart-text-highlight
208
+ :text="rare"
209
+ :queries="getHighlight(['rare'])"
210
+ /></RmTag>
211
+ </div>
212
+ <div v-if="rareList.length > maxTags" class="indic_more_tag" @mouseenter="rareTooltip = true" @mouseleave="rareTooltip = false">
213
+ <RmTag variant="gray">+{{ rareList.length - maxTags }}</RmTag>
214
+ <div v-if="rareTooltip" class="indic_tooltip">
215
+ <RmTag variant="gray" v-for="(rare, i) in rareList.slice(maxTags)" :key="'rare-tip-' + i">
216
+ {{ rare }}
217
+ </RmTag>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ <div v-if="oncologyIcd10.length > 0" class="indic_category_row">
223
+ <div class="indic_category_label">
224
+ <RmIcon name="Dna" :size="16" color="#4A4A4A" />
225
+ <p class="oip_filter_label">Oncology ICD-10</p>
226
+ </div>
227
+ <div class="indic_tags_wrap">
228
+ <RmTag v-for="(item, i) in oncologyIcd10.slice(0, maxTags)" :key="'icd-' + i" variant="gray">
229
+ {{ item }}
230
+ </RmTag>
231
+ <div v-if="oncologyIcd10.length > maxTags" class="indic_more_tag" @mouseenter="icdTooltip = true" @mouseleave="icdTooltip = false">
232
+ <RmTag variant="gray">+{{ oncologyIcd10.length - maxTags }}</RmTag>
233
+ <div v-if="icdTooltip" class="indic_tooltip">
234
+ <RmTag v-for="(item, i) in oncologyIcd10.slice(maxTags)" :key="'icd-tip-' + i" variant="gray">
235
+ {{ item }}
236
+ </RmTag>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ <div v-if="oncologyTerms.length > 0" class="indic_category_row">
242
+ <div class="indic_category_label">
243
+ <RmIcon name="Stethoscope" :size="16" color="#4A4A4A" />
244
+ <p class="oip_filter_label">Oncology Terms</p>
245
+ </div>
246
+ <div class="indic_tags_wrap">
247
+ <RmTag v-for="(term, i) in oncologyTerms.slice(0, maxTags)" :key="'onco-' + i" variant="gray">
248
+ {{ term }}
249
+ </RmTag>
250
+ <div v-if="oncologyTerms.length > maxTags" class="indic_more_tag" @mouseenter="termsTooltip = true" @mouseleave="termsTooltip = false">
251
+ <RmTag variant="gray">+{{ oncologyTerms.length - maxTags }}</RmTag>
252
+ <div v-if="termsTooltip" class="indic_tooltip">
253
+ <RmTag v-for="(term, i) in oncologyTerms.slice(maxTags)" :key="'onco-tip-' + i" variant="gray">
254
+ {{ term }}
255
+ </RmTag>
256
+ </div>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ <div v-if="getLatestHistory.biosimilar_brand" class="indic_category_row">
261
+ <div class="indic_category_label">
262
+ <RmIcon name="Pill" :size="16" color="#4A4A4A" />
263
+ <p class="oip_filter_label">
264
+ {{ locale === "fr" ? "Biosimilaire" : "Biosimilar" }}
265
+ </p>
266
+ </div>
267
+ <div class="indic_tags_wrap">
268
+ <RmTag variant="gray">
269
+ <oip-drugs-heart-text-highlight
270
+ :text="getLatestHistory.biosimilar_brand"
271
+ :queries="getHighlight(['rare'])"
272
+ /></RmTag>
273
+ </div>
274
+ </div>
275
+ </div>
276
+ <!-- Pied de carte : la source voyage avec le resultat plutot
277
+ qu'en tete de page. Elle est posee ici, dernier enfant de
278
+ .card_display, et non dans le slot #footer : celui-ci ne
279
+ s'affiche qu'avec `position="bottom"`, ce qui supprimerait
280
+ le slot #header dont la carte a besoin. Et pas en frere de
281
+ .card_display non plus : `.card_content` d'Auriga est un
282
+ flex row, le pied y deviendrait une colonne de droite. -->
283
+ <div class="card_source_footer">
284
+ <oip-drugs-heart-search-page-dynamic-source
285
+ :last-label="$t('oipDrugs.heart.sources.lastIndication')"
286
+ :last-date="getLatestHistory?.decision_date"
287
+ />
288
+ </div>
289
+ </div>
290
+ </RmSectionCard>
291
+ </template>
292
+
293
+ <script setup lang="ts">
294
+ import {
295
+ heartGetBestOpinionMatch,
296
+ heartGetMatchedFields,
297
+ heartGetRareHighlightTerms,
298
+ heartGetTaggingHighlightWords,
299
+ heartSplitSearchTerms,
300
+ } from "../../../../oip-drugs/composables/useHeartDetailSearches";
301
+ import { heartFilterKeys, heartMapSmr } from "../../../../oip-drugs/utils/heartStyleAndFormat";
302
+ import { drugsBrandPath } from "../../../../oip-drugs/kinds";
303
+ import { useOipResourceNav } from "../../../../composables/useOipResourceNav";
304
+ // product = one result from ES query
305
+ const props = defineProps({
306
+ product: {
307
+ type: Object as PropType<Record<string, any>>,
308
+ required: true,
309
+ },
310
+ inDetails: {
311
+ type: Boolean,
312
+ default: false,
313
+ },
314
+ isFirst: {
315
+ type: Boolean,
316
+ default: false,
317
+ },
318
+ pathName: {
319
+ type: String,
320
+ require: true,
321
+ },
322
+ /** Avis economiques (ex-`useLayoutConfig().resultType === 6`). */
323
+ isEco: {
324
+ type: Boolean,
325
+ default: false,
326
+ },
327
+ /** Termes cherches a surligner (ex-filterStore de la page de recherche). */
328
+ highlight: {
329
+ type: Array as PropType<string[]>,
330
+ default: () => [],
331
+ },
332
+ });
333
+
334
+ const showModal = ref(false);
335
+ const { locale, t } = useI18n();
336
+ const nav = useOipResourceNav();
337
+ const showOriginal = ref(false);
338
+
339
+ const textKey = ref(0);
340
+
341
+ const oncologyIcd10 = computed(() => {
342
+ const tagging = locale.value === 'fr'
343
+ ? props.product._source?.oncology_tagging_fr
344
+ : props.product._source?.oncology_tagging_en;
345
+ if (!tagging || !Array.isArray(tagging)) return [];
346
+ const labels = new Set<string>();
347
+ tagging.forEach((t: any) => {
348
+ if (t.icd10 && Array.isArray(t.icd10)) {
349
+ t.icd10.forEach((icd: any) => {
350
+ if (icd.combined_label) labels.add(icd.combined_label);
351
+ });
352
+ }
353
+ });
354
+ return [...labels];
355
+ });
356
+
357
+ const oncologyTerms = computed(() => {
358
+ const tagging = locale.value === 'fr'
359
+ ? props.product._source?.oncology_tagging_fr
360
+ : props.product._source?.oncology_tagging_en;
361
+ if (!tagging || !Array.isArray(tagging)) return [];
362
+ const terms = new Set<string>();
363
+ tagging.forEach((t: any) => {
364
+ if (t.preferred_label) terms.add(t.preferred_label);
365
+ });
366
+ return [...terms];
367
+ });
368
+
369
+ const rareList = computed(() => {
370
+ const src = locale.value === 'fr' || showOriginal.value
371
+ ? props.product._source?.rare_diseases
372
+ : props.product._source?.rare_diseases_en;
373
+ return src?.map((a: any) => a.concat_disease_name_orpha_code) ?? [];
374
+ });
375
+
376
+ const maxTags = 4;
377
+
378
+ const rareTooltip = ref(false);
379
+ const icdTooltip = ref(false);
380
+ const termsTooltip = ref(false);
381
+
382
+ watch(
383
+ () => showOriginal.value,
384
+ () => {
385
+ textKey.value += 1;
386
+ }
387
+ );
388
+
389
+ function getHistoryLabel(hist: any) {
390
+ if (hist.opinion_type === "early_access_decision") {
391
+ return `AP`;
392
+ } else {
393
+ return `CT`;
394
+ }
395
+ }
396
+
397
+ function mapSMR(val: any) {
398
+ return heartMapSmr(val, locale.value, "get");
399
+ }
400
+
401
+ // fr_drugs_app relisait les filtres de sa page de recherche (filterStore) ;
402
+ // le layer ne recoit que les termes cherches (`highlight`).
403
+ const getStore = (filter: string): any[] => {
404
+ return filter === "Search Filter" ? props.highlight ?? [] : [];
405
+ };
406
+
407
+ const isHistoryMatch = computed(() => {
408
+ const innerHits = props.product.inner_hits
409
+ ? Object.keys(props.product.inner_hits)
410
+ : [];
411
+
412
+ const isSearchMatch = ref(false);
413
+
414
+ let match = ref(true);
415
+ innerHits.forEach((hit) => {
416
+ if (
417
+ props.product.inner_hits[hit].hits.total.value > 0 &&
418
+ props.product.inner_hits[hit].hits.hits.filter(
419
+ (f: any) => f._source.opinion_id === getLatestHistory.value.opinion_id
420
+ ).length === 0
421
+ ) {
422
+ hit.includes("SearchInput")
423
+ ? (match.value = true)
424
+ : (match.value = false);
425
+ } else if (
426
+ hit.includes("SearchInput") &&
427
+ props.product.inner_hits[hit].hits.hits.filter(
428
+ (f: any) => f._source.opinion_id === getLatestHistory.value.opinion_id
429
+ ).length > 0
430
+ ) {
431
+ isSearchMatch.value = true;
432
+ }
433
+ });
434
+
435
+ return innerHits.filter((f) => f.includes("SearchInput")).length > 0
436
+ ? match.value && isSearchMatch.value
437
+ : match.value;
438
+ });
439
+
440
+ const hasHeaderContent = computed(() => {
441
+ return (props.isEco && getLatestHistory.value?.is_ceesp === 1) ||
442
+ (props.inDetails && props.isFirst) ||
443
+ !!getLatestHistory.value?.biosimilar_brand ||
444
+ !!opinionMatch.value ||
445
+ filterMatches.value.length > 0 ||
446
+ locale.value === 'en';
447
+ });
448
+
449
+ const opinionMatch = computed(() => {
450
+ return heartGetBestOpinionMatch(
451
+ props.product._source.brand_history,
452
+ getSearches.value,
453
+ locale.value
454
+ );
455
+ });
456
+
457
+ const taggingData = computed(() => {
458
+ return locale.value === 'fr'
459
+ ? props.product._source?.oncology_tagging_fr
460
+ : props.product._source?.oncology_tagging_en;
461
+ });
462
+
463
+ const filterMatches = computed(() => {
464
+ const opinion = getLatestHistory.value;
465
+ if (!opinion) return [];
466
+ const parts: string[] = [];
467
+
468
+ const oncoTermsValues = getStore('oncologyTerms');
469
+ if (oncoTermsValues?.length > 0 && oncologyTerms.value.length > 0) {
470
+ const highlightWords = heartGetTaggingHighlightWords(taggingData.value, oncoTermsValues);
471
+ const fields = highlightWords.length > 0 ? heartGetMatchedFields(opinion, highlightWords, locale.value) : [];
472
+ parts.push(fields.length > 0 ? `Oncology Terms (${fields.map(f => f.label).join(', ')})` : 'Oncology Terms');
473
+ }
474
+
475
+ const oncoIcdValues = getStore('oncologyIcd10');
476
+ if (oncoIcdValues?.length > 0 && oncologyIcd10.value.length > 0) {
477
+ const highlightWords = heartGetTaggingHighlightWords(taggingData.value, oncoIcdValues);
478
+ const fields = highlightWords.length > 0 ? heartGetMatchedFields(opinion, highlightWords, locale.value) : [];
479
+ parts.push(fields.length > 0 ? `Oncology ICD-10 (${fields.map(f => f.label).join(', ')})` : 'Oncology ICD-10');
480
+ }
481
+
482
+ const rareFilterValues = getStore('rare');
483
+ if (rareFilterValues?.length > 0 && rareList.value.length > 0) {
484
+ const label = locale.value === 'en' ? 'Rare Diseases' : 'Maladies Rares';
485
+ parts.push(label);
486
+ }
487
+
488
+ return parts;
489
+ });
490
+
491
+ /** La fiche marque dans fr_drugs_app, sur l'avis matche. */
492
+ const detailsPath = computed(() => {
493
+ const base = drugsBrandPath(props.product._source.brand_group);
494
+ const code = opinionMatch.value?.hasCode;
495
+ return code ? `${base}?code=${encodeURIComponent(code)}` : base;
496
+ });
497
+ const detailsHref = computed(() => nav.appHref("fr_drugs_app", detailsPath.value));
498
+
499
+ /** Le clic garde le Ctrl/Cmd-clic du navigateur (nouvel onglet). */
500
+ function onDetails(event: MouseEvent) {
501
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.button === 1) return;
502
+ event.preventDefault();
503
+ nav.openApp("fr_drugs_app", detailsPath.value);
504
+ }
505
+
506
+
507
+ function getHighlight(filters: string[]) {
508
+ const filterValues = ref<any[]>([]);
509
+ filters.forEach((filter) => {
510
+ filterValues.value.push(getStore(filter));
511
+ });
512
+ return filterValues.value
513
+ .concat(getSearches.value)
514
+ .flat()
515
+ .filter((f) => f && f.length > 0);
516
+ }
517
+
518
+ const getMolHighlight = computed(() => {
519
+ const mols = getStore("molecule");
520
+ const finalMolArray: any = [];
521
+ if (mols.length > 0) {
522
+ mols.forEach((mol: any) => {
523
+ finalMolArray.push(
524
+ mol.split(" (ATC5: ")[0],
525
+ mol.split(" (ATC5: ")[1]?.replace(")", "")
526
+ );
527
+ });
528
+ }
529
+ return finalMolArray.filter(Boolean);
530
+ });
531
+
532
+ const getSearches = computed(() => {
533
+ const searches = getStore("Search Filter");
534
+ if (searches && searches.length > 0) {
535
+ return heartSplitSearchTerms(searches);
536
+ } else return [];
537
+ });
538
+
539
+ const getHighlightQueries = computed(() => {
540
+ const terms = [...getSearches.value];
541
+ const oncoTermsValues = getStore('oncologyTerms');
542
+ if (oncoTermsValues?.length > 0) {
543
+ terms.push(...heartGetTaggingHighlightWords(taggingData.value, oncoTermsValues));
544
+ }
545
+ const oncoIcdValues = getStore('oncologyIcd10');
546
+ if (oncoIcdValues?.length > 0) {
547
+ terms.push(...heartGetTaggingHighlightWords(taggingData.value, oncoIcdValues));
548
+ }
549
+ const rareValues = getStore('rare');
550
+ if (rareValues?.length > 0) {
551
+ terms.push(...heartGetRareHighlightTerms(rareValues));
552
+ }
553
+ return [...new Set(terms)];
554
+ });
555
+
556
+ const opinionCount = computed(() => {
557
+ return props.product._source.brand_history.filter((a: any) => a.document_type !== 'alert').length;
558
+ });
559
+
560
+ const getLatestHistory = computed(() => {
561
+ return props.product._source.brand_history?.[0]?.opinion_type === "drug_opinion"
562
+ ? props.product._source.brand_history[0]
563
+ : props.product._source.brand_history?.find(
564
+ (a: any) => a.opinion_type === "drug_opinion"
565
+ );
566
+ });
567
+
568
+ const allCompanies = computed(() => {
569
+ return [...new Set<string>(
570
+ props.product._source.brand_history
571
+ .map((h: any) => h.company)
572
+ .filter((c: any) => c !== null && c !== undefined && c.length > 0)
573
+ )];
574
+ });
575
+
576
+ const nestedResults = computed(() => {
577
+ const nestedCommonHits = ref<any[]>([]);
578
+
579
+ if (props.product.inner_hits !== undefined) {
580
+ const tempHits = Object.values(
581
+ heartFilterKeys(props.product.inner_hits, ["searchType"])
582
+ ).map((innerHit: any) => innerHit.hits.hits);
583
+
584
+ const common =
585
+ tempHits.length > 0
586
+ ? tempHits.reduce((acc, currentArray) => {
587
+ return acc.filter((item: any) =>
588
+ currentArray.some(
589
+ (currentItem: any) =>
590
+ item._source.opinion_id === currentItem._source.opinion_id
591
+ )
592
+ );
593
+ })
594
+ : [];
595
+
596
+ if (common.length > 0) {
597
+ common.forEach((item: any) => {
598
+ nestedCommonHits.value.push(item);
599
+ });
600
+ }
601
+ return nestedCommonHits.value
602
+ .map((a) => a._source)
603
+ .sort(
604
+ (a, b) =>
605
+ new Date(b.decision_date).getTime() -
606
+ new Date(a.decision_date).getTime()
607
+ );
608
+ } else {
609
+ return props.product._source.brand_history;
610
+ }
611
+ });
612
+
613
+ const nestedEcoResults = computed(() => {
614
+ const nestedCommonHits = ref<any[]>([]);
615
+
616
+ if (props.product.inner_hits !== undefined) {
617
+ const tempHits = Object.values(props.product.inner_hits).map(
618
+ (innerHit: any) => innerHit.hits.hits
619
+ );
620
+
621
+ const common =
622
+ tempHits.length > 0
623
+ ? tempHits.reduce((acc, currentArray) => {
624
+ return acc.filter((item: any) =>
625
+ currentArray.some(
626
+ (currentItem: any) =>
627
+ item._source.opinion_id === currentItem._source.opinion_id
628
+ )
629
+ );
630
+ })
631
+ : [];
632
+ if (common.length > 0) {
633
+ common.forEach((item: any) => {
634
+ nestedCommonHits.value.push(item);
635
+ });
636
+ }
637
+ return nestedCommonHits.value
638
+ .map((a) => a._source)
639
+ .sort(
640
+ (a, b) =>
641
+ new Date(b.decision_date).getTime() -
642
+ new Date(a.decision_date).getTime()
643
+ );
644
+ } else {
645
+ return props.product._source.brand_history;
646
+ }
647
+ });
648
+
649
+ const getMatchDate = computed(() => {
650
+ return props.isEco
651
+ ? nestedEcoResults.value[0]?.decision_date
652
+ : nestedResults.value[0]?.decision_date;
653
+ });
654
+
655
+ </script>
656
+
657
+ <style scoped>
658
+ /* Pied de source, cale sur `.drug-card-foot` du design system : libelle
659
+ atenue, 11px, filet clair. Le bleu primaire d'arg-source-container y
660
+ attirait l'oeil autant que le titre du resultat, alors que la provenance
661
+ se lit apres. */
662
+ .card_source_footer {
663
+ display: flex;
664
+ align-items: center;
665
+ /* Pas de marge haute : `.card_display` porte deja `gap: 20px`, qui separe
666
+ le pied du dernier bloc de contenu. S'y ajouter faisait 28px au-dessus
667
+ du filet contre 25 en dessous, d'ou le desequilibre. */
668
+ padding-top: 6px;
669
+ border-top: 1px solid var(--light);
670
+ font-size: 11px;
671
+ }
672
+
673
+ /* Auriga pose 24px de padding sous le contenu de la carte, pensés pour un
674
+ bloc de texte, pas pour un pied de provenance : ça laissait 25px de vide
675
+ sous le filet. La charte en met 8 sous ce texte (`.drug-card-foot`).
676
+ Cible la carte courante via son style scope, pas toutes les
677
+ `arg_section_card` de l'app. */
678
+ :deep(.card_content) {
679
+ padding-bottom: 8px;
680
+ }
681
+
682
+ .card_source_footer :deep(a),
683
+ .card_source_footer :deep(span) {
684
+ color: var(--medium) !important;
685
+ font-size: 11px;
686
+ }
687
+
688
+
689
+ /* Le pied reste cliquable — il ouvre le tiroir Sources. En gris il n'a plus
690
+ de couleur pour le dire, donc le survol assombrit au lieu de repasser au
691
+ primaire : l'affordance survit sans reintroduire le bleu. */
692
+ .card_source_footer:hover :deep(a),
693
+ .card_source_footer:hover :deep(span) {
694
+ color: var(--darkest) !important;
695
+ }
696
+
697
+
698
+ .has_code_prefix {
699
+ font-weight: 700;
700
+ }
701
+ .indic_category_row {
702
+ display: flex;
703
+ flex-direction: row;
704
+ align-items: flex-start;
705
+ gap: 12px;
706
+ }
707
+ .indic_category_label {
708
+ display: flex;
709
+ align-items: center;
710
+ gap: 6px;
711
+ min-width: 160px;
712
+ white-space: nowrap;
713
+ padding-top: 4px;
714
+ }
715
+ .indic_tags_wrap {
716
+ display: flex;
717
+ flex-wrap: wrap;
718
+ gap: 4px;
719
+ flex: 1;
720
+ min-width: 0;
721
+ }
722
+ .indic_more_tag {
723
+ position: relative;
724
+ cursor: pointer;
725
+ }
726
+ .indic_tooltip {
727
+ position: absolute;
728
+ bottom: calc(100% + 8px);
729
+ right: 0;
730
+ z-index: 100;
731
+ background: var(--bg-surface);
732
+ border: 1px solid #e0e0e0;
733
+ border-radius: 8px;
734
+ padding: 8px;
735
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
736
+ display: flex;
737
+ flex-wrap: wrap;
738
+ gap: 4px;
739
+ max-width: 400px;
740
+ max-height: 300px;
741
+ overflow-y: auto;
742
+ }
743
+ </style>