@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,370 @@
1
+ <template>
2
+ <RmSectionCard
3
+ class="oip-drugs"
4
+ v-if="getLatestEval !== undefined"
5
+ position="top"
6
+ :class="inDetails ? '' : 'action'"
7
+ >
8
+ <template #header>
9
+ <div class="oip_row v-center justify-between full_flex" style="width: 100%">
10
+ <div class="oip_row gap-8 wrap v-center">
11
+ <RmTag v-if="opinionMatch" variant="green">
12
+ Match : {{ opinionMatch.fields.map(f => f.label).join(', ') }} - {{ $t('oipDrugs.heart.card.history.opinion') }} <RmDate :lang="locale" :date="opinionMatch.date" />
13
+ </RmTag>
14
+ <RmTag variant="teal">{{ opinionCount }} {{ opinionCount > 1 ? (locale === 'fr' ? 'avis' : 'opinions') : (locale === 'fr' ? 'avis' : 'opinion') }}</RmTag>
15
+ <div v-if="locale === 'en' || showOriginal" class="oip_row v-center gap-8">
16
+ <p>{{ $t("oipDrugs.heart.translation") }}</p>
17
+ <div class="link" @click="showOriginal = !showOriginal">
18
+ {{ showOriginal ? $t("oipDrugs.heart.card.lang") : $t("oipDrugs.heart.card.original") }}
19
+ </div>
20
+ </div>
21
+ </div>
22
+ <div class="oip_row v-center gap-8" style="margin-left: auto">
23
+ <a
24
+ :href="detailsHref"
25
+ @click="onDetails"
26
+ >
27
+ <RmButton prefix-icon="Eye" variant="secondary">{{ $t("oipDrugs.heart.card.details") }}</RmButton>
28
+ </a>
29
+ </div>
30
+ </div>
31
+ </template>
32
+ <div class="card_display">
33
+ <div class="card_top">
34
+ <!-- <RmTag
35
+ v-if="!isHistoryMatch && !inDetails"
36
+ variant="orange"
37
+ class="mb-8"
38
+ >{{ $t("oipDrugs.heart.card.history.match") }}</RmTag> -->
39
+ <div class="oip_row gap-32 space-between">
40
+ <div class="card_header">
41
+ <div class="card_title">
42
+ <oip-drugs-heart-text-highlight
43
+ :text="
44
+ getLatestEval.disease_name !== null
45
+ ? `${getLatestEval.brand} - ${
46
+ locale === 'en' && !showOriginal
47
+ ? getLatestEval.disease_name_en
48
+ : getLatestEval.disease_name
49
+ }`
50
+ : getLatestEval.brand
51
+ "
52
+ :queries="getHighlight(['brand'])"
53
+ class="has_product_title"
54
+ />
55
+ </div>
56
+ </div>
57
+
58
+ </div>
59
+
60
+ <div class="oip_row v-center gap-8 card_head_text wrap">
61
+ <RmDate :lang="locale" :date="getLatestEval.decision_date" />
62
+ <span
63
+ v-if="
64
+ ((locale === 'fr' || showOriginal) &&
65
+ (getLatestEval.nature_of_request_regroup !== null ||
66
+ getLatestEval.nature_of_request !== null)) ||
67
+ (locale === 'en' &&
68
+ !showOriginal &&
69
+ ((getLatestEval.nature_of_request_regroup_en &&
70
+ getLatestEval.nature_of_request_regroup_en !== null) ||
71
+ (getLatestEval.nature_of_request_en &&
72
+ getLatestEval.nature_of_request_en !== null)))
73
+ "
74
+ >-</span
75
+ >
76
+ <oip-drugs-heart-text-highlight
77
+ :text="
78
+ !showOriginal && locale === 'en'
79
+ ? getLatestEval.nature_of_request_en !== null
80
+ ? getLatestEval.nature_of_request_en
81
+ : getLatestEval.nature_of_request_regroup_en
82
+ : getLatestEval.nature_of_request !== null
83
+ ? getLatestEval.nature_of_request
84
+ : getLatestEval.nature_of_request_regroup
85
+ "
86
+ :queries="getStore('motif')"
87
+ v-if="
88
+ ((locale === 'fr' || showOriginal) &&
89
+ (getLatestEval.nature_of_request_regroup !== null ||
90
+ getLatestEval.nature_of_request !== null)) ||
91
+ (locale === 'en' &&
92
+ !showOriginal &&
93
+ ((getLatestEval.nature_of_request_regroup_en &&
94
+ getLatestEval.nature_of_request_regroup_en !== null) ||
95
+ (getLatestEval.nature_of_request_en &&
96
+ getLatestEval.nature_of_request_en !== null)))
97
+ "
98
+ />
99
+ </div>
100
+ </div>
101
+ <div class="oip_row v-center gap-8">
102
+ <div class="oip_list v-start gap-4">
103
+ <p class="oip_filter_label">ATC5</p>
104
+ <RmTag variant="transparent">
105
+ <oip-drugs-heart-text-highlight
106
+ v-if="getLatestEval.atc5_code !== null"
107
+ :text="getLatestEval.atc5_code?.join(', ')"
108
+ :queries="getMolHighlight"
109
+ />
110
+ <span v-else>{{ $t("oipDrugs.heart.card.not_provided") }}</span></RmTag>
111
+ </div>
112
+ <div
113
+ v-if="allCompanies.length > 0"
114
+ class="oip_list v-start gap-4"
115
+ style="flex: 1; min-width: 0;"
116
+ >
117
+ <p class="oip_filter_label">{{ $t("oipDrugs.heart.card.labels.comps") }}</p>
118
+ <RmTagRow :tags="allCompanies" />
119
+ </div>
120
+ </div>
121
+
122
+ <oip-drugs-heart-text-highlight
123
+ :key="textKey"
124
+ crop
125
+ have-read-more
126
+ :queries="getSearches"
127
+ :text="
128
+ locale === 'en' && !showOriginal
129
+ ? getLatestEval.essential_en
130
+ : getLatestEval.essential
131
+ "
132
+ v-if="
133
+ (locale === 'en' &&
134
+ !showOriginal &&
135
+ getLatestEval.essential_en !== null) ||
136
+ ((locale === 'fr' || showOriginal) &&
137
+ getLatestEval.essential !== null)
138
+ "
139
+ class="oip_body"
140
+ :id="`indic_${getLatestEval.brand}_${getLatestEval.opinion_id}`"
141
+ />
142
+
143
+ <div class="oip_row v-center gap-32 wrap">
144
+ <div class="oip_list v-start gap-4">
145
+ <p class="oip_filter_label">SMR</p>
146
+ <div class="oip_row v-center gap-8">
147
+ <div
148
+ v-if="
149
+ getLatestEval.smr &&
150
+ getLatestEval.smr !== null &&
151
+ getLatestEval.smr.length > 0
152
+ "
153
+ class="oip_row v-center gap-4 wrap"
154
+ >
155
+ <div v-for="(smr, index) in getLatestEval.smr" :key="index">
156
+ <RmTag variant="gray">{{ smr.type }}</RmTag>
157
+ </div>
158
+ </div>
159
+ <div v-else class="unavailable">N/A</div>
160
+ </div>
161
+ </div>
162
+ <oip-drugs-heart-results-asmr-cursor :asmr="getLatestEval.asmr" />
163
+ </div>
164
+ <!-- Pied de carte : la source voyage avec le resultat plutot
165
+ qu'en tete de page. Elle est posee ici, dernier enfant de
166
+ .card_display, et non dans le slot #footer : celui-ci ne
167
+ s'affiche qu'avec `position="bottom"`, ce qui supprimerait
168
+ le slot #header dont la carte a besoin. Et pas en frere de
169
+ .card_display non plus : `.card_content` d'Auriga est un
170
+ flex row, le pied y deviendrait une colonne de droite. -->
171
+ <div class="card_source_footer">
172
+ <oip-drugs-heart-search-page-dynamic-source
173
+ :last-label="$t('oipDrugs.heart.sources.lastOpinion')"
174
+ :last-date="getLatestEval?.decision_date"
175
+ />
176
+ </div>
177
+ </div>
178
+ </RmSectionCard>
179
+ </template>
180
+
181
+ <script setup lang="ts">
182
+ import {
183
+ heartGetBestOpinionMatch,
184
+ heartSplitSearchTerms,
185
+ } from "../../../../oip-drugs/composables/useHeartDetailSearches";
186
+ import { drugsBrandPath } from "../../../../oip-drugs/kinds";
187
+ import { useOipResourceNav } from "../../../../composables/useOipResourceNav";
188
+ // product = one result from ES query
189
+ const props = defineProps({
190
+ product: {
191
+ type: Object as PropType<Record<string, any>>,
192
+ required: true,
193
+ },
194
+ inDetails: {
195
+ type: Boolean,
196
+ default: false,
197
+ },
198
+ pathName: {
199
+ type: String,
200
+ require: true,
201
+ },
202
+ /** Termes cherches a surligner (ex-filterStore de la page de recherche). */
203
+ highlight: {
204
+ type: Array as PropType<string[]>,
205
+ default: () => [],
206
+ },
207
+ });
208
+
209
+ const showModal = ref(false);
210
+ const { locale } = useI18n();
211
+ const nav = useOipResourceNav();
212
+ const showOriginal = ref(false);
213
+
214
+ const textKey = ref(0);
215
+
216
+ watch(
217
+ () => showOriginal.value,
218
+ () => {
219
+ textKey.value += 1;
220
+ }
221
+ );
222
+
223
+ const opinionCount = computed(() => {
224
+ return props.product._source.brand_history.filter((a: any) => a.document_type !== 'alert').length;
225
+ });
226
+
227
+ const getLatestEval = computed(() => {
228
+ return props.product._source.brand_history?.[0]?.opinion_type === "eval"
229
+ ? props.product._source.brand_history[0]
230
+ : props.product._source.brand_history?.find(
231
+ (a: any) => a.opinion_type === "eval"
232
+ );
233
+ });
234
+
235
+ const allCompanies = computed(() => {
236
+ return [...new Set<string>(
237
+ props.product._source.brand_history
238
+ .map((h: any) => h.company)
239
+ .filter((c: any) => c !== null && c !== undefined && c.length > 0)
240
+ )];
241
+ });
242
+
243
+ // fr_drugs_app relisait les filtres de sa page de recherche (filterStore) ;
244
+ // le layer ne recoit que les termes cherches (`highlight`).
245
+ const getStore = (filter: string): any[] => {
246
+ return filter === "Search Filter" ? props.highlight ?? [] : [];
247
+ };
248
+
249
+ const isHistoryMatch = computed(() => {
250
+ const innerHits = props.product.inner_hits
251
+ ? Object.keys(props.product.inner_hits)
252
+ : [];
253
+
254
+ let match = ref(true);
255
+ innerHits.forEach((hit) => {
256
+ if (
257
+ props.product.inner_hits[hit].hits.total.value > 0 &&
258
+ props.product.inner_hits[hit].hits.hits.filter(
259
+ (f: any) => f._source.opinion_id === getLatestEval.value.opinion_id
260
+ ).length === 0
261
+ ) {
262
+ match.value = false;
263
+ }
264
+ });
265
+
266
+ return match.value;
267
+ });
268
+
269
+ const hasHeaderContent = computed(() => {
270
+ return !!opinionMatch.value || locale.value === 'en' || showOriginal.value;
271
+ });
272
+
273
+ const opinionMatch = computed(() => {
274
+ return heartGetBestOpinionMatch(
275
+ props.product._source.brand_history,
276
+ getSearches.value,
277
+ locale.value
278
+ );
279
+ });
280
+
281
+ /** La fiche marque dans fr_drugs_app, sur l'avis matche. */
282
+ const detailsPath = computed(() => {
283
+ const base = drugsBrandPath(props.product._source.brand_group);
284
+ const code = opinionMatch.value?.hasCode;
285
+ return code ? `${base}?code=${encodeURIComponent(code)}` : base;
286
+ });
287
+ const detailsHref = computed(() => nav.appHref("fr_drugs_app", detailsPath.value));
288
+
289
+ /** Le clic garde le Ctrl/Cmd-clic du navigateur (nouvel onglet). */
290
+ function onDetails(event: MouseEvent) {
291
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.button === 1) return;
292
+ event.preventDefault();
293
+ nav.openApp("fr_drugs_app", detailsPath.value);
294
+ }
295
+
296
+
297
+ function getHighlight(filters: string[]) {
298
+ const filterValues = ref<any[]>([]);
299
+ filters.forEach((filter) => {
300
+ filterValues.value.push(getStore(filter));
301
+ });
302
+ return filterValues.value
303
+ .concat(getSearches.value)
304
+ .flat()
305
+ .filter((f) => f && f.length > 0);
306
+ }
307
+
308
+ const getSearches = computed(() => {
309
+ const searches = getStore("Search Filter");
310
+ if (searches && searches.length > 0) {
311
+ return heartSplitSearchTerms(searches);
312
+ } else return [];
313
+ });
314
+ const getMolHighlight = computed(() => {
315
+ const mols = getStore("molecule");
316
+ const finalMolArray: any = [];
317
+ if (mols.length > 0) {
318
+ mols.forEach((mol: any) => {
319
+ finalMolArray.push(
320
+ mol.split(" (ATC5: ")[0],
321
+ mol.split(" (ATC5: ")[1]?.replace(")", "")
322
+ );
323
+ });
324
+ }
325
+ return finalMolArray.filter(Boolean);
326
+ });
327
+
328
+ </script>
329
+
330
+ <style scoped>
331
+ /* Pied de source, cale sur `.drug-card-foot` du design system : libelle
332
+ atenue, 11px, filet clair. Le bleu primaire d'arg-source-container y
333
+ attirait l'oeil autant que le titre du resultat, alors que la provenance
334
+ se lit apres. */
335
+ .card_source_footer {
336
+ display: flex;
337
+ align-items: center;
338
+ /* Pas de marge haute : `.card_display` porte deja `gap: 20px`, qui separe
339
+ le pied du dernier bloc de contenu. S'y ajouter faisait 28px au-dessus
340
+ du filet contre 25 en dessous, d'ou le desequilibre. */
341
+ padding-top: 6px;
342
+ border-top: 1px solid var(--light);
343
+ font-size: 11px;
344
+ }
345
+
346
+ /* Auriga pose 24px de padding sous le contenu de la carte, pensés pour un
347
+ bloc de texte, pas pour un pied de provenance : ça laissait 25px de vide
348
+ sous le filet. La charte en met 8 sous ce texte (`.drug-card-foot`).
349
+ Cible la carte courante via son style scope, pas toutes les
350
+ `arg_section_card` de l'app. */
351
+ :deep(.card_content) {
352
+ padding-bottom: 8px;
353
+ }
354
+
355
+ .card_source_footer :deep(a),
356
+ .card_source_footer :deep(span) {
357
+ color: var(--medium) !important;
358
+ font-size: 11px;
359
+ }
360
+
361
+
362
+ /* Le pied reste cliquable — il ouvre le tiroir Sources. En gris il n'a plus
363
+ de couleur pour le dire, donc le survol assombrit au lieu de repasser au
364
+ primaire : l'affordance survit sans reintroduire le bleu. */
365
+ .card_source_footer:hover :deep(a),
366
+ .card_source_footer:hover :deep(span) {
367
+ color: var(--darkest) !important;
368
+ }
369
+
370
+ </style>