@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,84 @@
1
+ <!--
2
+ Une MITM rangee dans un projet (portage de pages/hubr/heart/mitm/[id] de
3
+ fr_drugs_app). La page relit le document par son code CIS puis renvoie a la
4
+ fiche marque, onglet MITM : on monte cette fiche, sur ce CIS. Sans marque,
5
+ le bandeau de la page et le detail MITM du CIS.
6
+
7
+ `id` est l'`_id` du document (projet), ou son code CIS quand `by="cis"`
8
+ (lien vers la page de fr_drugs_app).
9
+ -->
10
+ <template>
11
+ <div class="oip-drugs oip-drugs-rv-mitm">
12
+ <RmLoadingState v-if="pending" spinner />
13
+
14
+ <OipDrugsFichesBrandFiche
15
+ v-else-if="brand"
16
+ v-model:tab="tab"
17
+ :brand="brand"
18
+ :cis="cisCode"
19
+ :lang="lang"
20
+ :highlight="highlight"
21
+ >
22
+ <template #title-link><slot name="title-link" /></template>
23
+ </OipDrugsFichesBrandFiche>
24
+
25
+ <div v-else-if="source" class="arg_page_layout">
26
+ <RmPageHeader eyebrow="MITM">
27
+ <template #title>
28
+ {{ source.cis_label }} (CIS:{{ cisCode }})
29
+ <slot name="title-link" />
30
+ </template>
31
+ <p class="oip_caption">
32
+ {{ lang === 'en' ? source.atc5_english_code_label : source.atc5_french_code_label }}, {{ source.owner_regroup }}
33
+ </p>
34
+ </RmPageHeader>
35
+
36
+ <OipDrugsHeartMitmDetailsOverview :cis="source" @select="drawerRecord = $event" />
37
+
38
+ <OipDrugsHeartResultsDetailsRecordDrawer
39
+ :record="drawerRecord"
40
+ :source-label="drawerRecord?.sourceLabel"
41
+ @close="drawerRecord = null"
42
+ />
43
+ </div>
44
+
45
+ <RmEmptyState
46
+ v-else
47
+ icon="FileX"
48
+ :title="lang === 'en' ? 'Record unavailable' : 'Fiche indisponible'"
49
+ :text="lang === 'en' ? 'The record is no longer in the data.' : 'La fiche n\'est plus dans la donnée.'"
50
+ />
51
+ </div>
52
+ </template>
53
+
54
+ <script setup lang="ts">
55
+ import { oipEsSearch } from "../../../composables/useOipResources";
56
+ import { ES_INDEX } from "../../../oip-drugs/esIndices";
57
+
58
+ const props = withDefaults(
59
+ defineProps<{ id: string; type?: string; by?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
60
+ { type: "FrMitm", by: "", highlight: () => [], lang: "fr" },
61
+ );
62
+
63
+ /** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
64
+ const tab = ref("mitm");
65
+ const drawerRecord = ref<any>(null);
66
+
67
+ // Meme requete que la page quand l'id est un code CIS ; par `_id` sinon.
68
+ const { data: hit, pending } = useAsyncData(
69
+ () => `oip-drugs-mitm-${props.by}-${props.id}`,
70
+ async () => {
71
+ const body =
72
+ props.by === "cis"
73
+ ? { query: { match: { "cis_code.keyword": props.id } }, size: 100 }
74
+ : { query: { ids: { values: [props.id] } }, size: 1 };
75
+ const response = await oipEsSearch<any>("drugs", ES_INDEX.MITM_BDPM, body);
76
+ return response?.hits?.hits?.[0] ?? null;
77
+ },
78
+ { server: false, watch: [() => props.id, () => props.by] },
79
+ );
80
+
81
+ const source = computed(() => hit.value?._source ?? null);
82
+ const cisCode = computed(() => (source.value?.cis_code != null ? String(source.value.cis_code) : props.by === "cis" ? props.id : ""));
83
+ const brand = computed(() => (source.value?.brand ? String(source.value.brand) : ""));
84
+ </script>
@@ -0,0 +1,93 @@
1
+ <!--
2
+ Vue de ressource d'un compte rendu de commission de l'Assemblee nationale
3
+ (FrNationalAssemblySession) : le document relu par son `_id`, sans son
4
+ texte (jusqu'a 200 000 caracteres), monte dans la carte que le tiroir des
5
+ projets de fr_drugs_app montrait. La lecture s'ouvre dans la visionneuse.
6
+ -->
7
+ <template>
8
+ <div class="oip-drugs oip_list gap-12 full">
9
+
10
+ <RmLoadingState v-if="loading" />
11
+ <RmEmptyState v-else-if="!report" :title="t('oipDrugs.heart.errors.results')" icon="Prohibit" />
12
+ <OipDrugsHeartAssociationsNationalAssemblyCard
13
+ v-else
14
+ :report="report"
15
+ :report-id="id"
16
+ :store-search-bar="highlight"
17
+ @read="openReport"
18
+ />
19
+
20
+ <OipDocumentPreview
21
+ v-model="reportOpen"
22
+ :src="reportSrc"
23
+ :title="reportTitle"
24
+ :external-src="reportExternal"
25
+ :query="reportQuery"
26
+ :anchor="reportAnchor"
27
+ :fallback-src="reportFallback"
28
+ />
29
+ </div>
30
+ </template>
31
+
32
+ <script setup lang="ts">
33
+ import { ES_INDEX } from "../../../oip-drugs/esIndices";
34
+ import { NATIONAL_ASSEMBLY_FIELDS } from "../../../oip-drugs/utils/associationFields";
35
+ import { oipEsSearch } from "../../../composables/useOipResources";
36
+
37
+ const props = withDefaults(
38
+ defineProps<{
39
+ id: string;
40
+ type?: string;
41
+ lang?: "fr" | "en";
42
+ highlight?: string[];
43
+ }>(),
44
+ { type: "FrNationalAssemblySession", lang: "fr", highlight: () => [] },
45
+ );
46
+
47
+ const { t } = useI18n();
48
+
49
+ const report = ref<any>(null);
50
+ const loading = ref(true);
51
+
52
+ watch(
53
+ () => props.id,
54
+ async (id) => {
55
+ loading.value = true;
56
+ report.value = null;
57
+ try {
58
+ const res: any = await oipEsSearch("drugs", ES_INDEX.ASSOCIATION_COMMISSION_SESSION_NATIONAL_ASSEMBLY, {
59
+ size: 1,
60
+ _source: { excludes: [NATIONAL_ASSEMBLY_FIELDS.text] },
61
+ query: { ids: { values: [id] } },
62
+ });
63
+ report.value = res?.hits?.hits?.[0]?._source ?? null;
64
+ } catch {
65
+ report.value = null;
66
+ }
67
+ loading.value = false;
68
+ },
69
+ { immediate: true },
70
+ );
71
+
72
+ const reportOpen = ref(false);
73
+ const reportSrc = ref<string | null>(null);
74
+ const reportTitle = ref("");
75
+ const reportExternal = ref<string | null>(null);
76
+ /** La copie Tekkare telle quelle : iframe de repli et base des liens. */
77
+ const reportFallback = ref<string | null>(null);
78
+ const reportQuery = ref<string[]>([]);
79
+ const reportAnchor = ref<string | null>(null);
80
+
81
+ /** Comme la liste de fr_drugs_app : la copie passe par le proxy du layer. */
82
+ function openReport(doc: any, terms?: string[], anchor?: string) {
83
+ reportQuery.value = terms?.length ? terms : props.highlight;
84
+ reportAnchor.value = anchor || null;
85
+ const url = doc[NATIONAL_ASSEMBLY_FIELDS.tekkareUrl];
86
+ reportSrc.value = url ? `/api/oip/pdf?url=${encodeURIComponent(url)}` : null;
87
+ reportFallback.value = url || null;
88
+ reportExternal.value = doc[NATIONAL_ASSEMBLY_FIELDS.htmlUrl] || null;
89
+ reportTitle.value =
90
+ doc[NATIONAL_ASSEMBLY_FIELDS.agenda] || t("oipDrugs.heart.associations.nationalAssembly.card.untitled");
91
+ reportOpen.value = true;
92
+ }
93
+ </script>
@@ -0,0 +1,97 @@
1
+ <!--
2
+ Vue de ressource d'une marque Outpatient (FrOutpatientBrand) : son
3
+ evolution annuelle, comme le tiroir de projet de fr_drugs_app
4
+ (outpatient/productEvolution au niveau marque). La marque est le
5
+ `resourceId` sans `_TOTAL`. La mesure, que fr_drugs_app lisait dans le store
6
+ outpatient, se choisit ici comme sur la vue Medic'AM.
7
+ -->
8
+ <template>
9
+ <div class="oip-drugs v-sales">
10
+ <RmPageHeader>
11
+ <template #title>
12
+ <span class="v-sales__title">{{ brand }}</span>
13
+ <slot name="title-link" />
14
+ </template>
15
+ </RmPageHeader>
16
+
17
+ <div class="v-sales__body">
18
+ <RmEmptyState
19
+ v-if="pageEmpty"
20
+ icon="MagnifyingGlassMinus"
21
+ :title="en ? 'No data' : 'Aucune donnée'"
22
+ :text="en ? 'No outpatient sales for this brand.' : 'Aucune vente Outpatient pour cette marque.'"
23
+ />
24
+ <!-- Le bloc reste monte : il dit lui-meme s'il est vide. -->
25
+ <div v-show="!pageEmpty" class="v-sales__stack">
26
+ <RmSegmented
27
+ v-model="measure"
28
+ size="sm"
29
+ :options="options"
30
+ :aria-label="en ? 'Measure' : 'Mesure'"
31
+ />
32
+ <OipDrugsOutpatientProductEvolution
33
+ :key="brand"
34
+ :es-index="ES_INDEX.OUTPATIENT_BRAND"
35
+ :selected-item="[brand]"
36
+ :selected-label="[{ code: brand, label: brand, code_label: brand }]"
37
+ :selected-switch="true"
38
+ :measure-index="measureIndex"
39
+ :lang="lang"
40
+ :source="source"
41
+ :verified="verified"
42
+ />
43
+ </div>
44
+ </div>
45
+ </div>
46
+ </template>
47
+
48
+ <script setup lang="ts">
49
+ import { ES_INDEX } from "../../../oip-drugs/esIndices";
50
+ import { usePageEmpty } from "../../../oip-drugs/composables/usePageEmpty";
51
+ import {
52
+ OUTPATIENT_DEFAULT_MEASURE,
53
+ OUTPATIENT_MEASURES,
54
+ measureOptions,
55
+ salesBrandOf,
56
+ } from "../../../oip-drugs/utils/v-salesSeries";
57
+ import { useSalesSource } from "../../../oip-drugs/composables/v-useSalesSource";
58
+
59
+ const props = withDefaults(
60
+ defineProps<{ id: string; type?: string; lang?: "fr" | "en"; highlight?: string[] }>(),
61
+ { type: "FrOutpatientBrand", lang: "fr", highlight: () => [] },
62
+ );
63
+
64
+ const en = computed(() => props.lang === "en");
65
+ const brand = computed(() => salesBrandOf("FrOutpatientBrand", props.id));
66
+ const { source, verified } = useSalesSource("OUTPATIENT", () => props.lang);
67
+ const pageEmpty = usePageEmpty();
68
+
69
+ // Ex-store outpatient : la mesure lue, en etat local (defaut : prix public).
70
+ const measure = ref(OUTPATIENT_MEASURES.variables[OUTPATIENT_DEFAULT_MEASURE]!);
71
+ const measureIndex = computed(() => Math.max(0, OUTPATIENT_MEASURES.variables.indexOf(measure.value)));
72
+ const options = computed(() => measureOptions(OUTPATIENT_MEASURES, en.value));
73
+ </script>
74
+
75
+ <style scoped>
76
+ .v-sales__title {
77
+ display: block;
78
+ }
79
+
80
+ /* Les gouttieres de la colonne de contenu, comme les onglets d'OipResourceView. */
81
+ .v-sales__body {
82
+ box-sizing: border-box;
83
+ margin-top: var(--space-24);
84
+ padding: 0 var(--space-24) var(--space-32);
85
+ }
86
+
87
+ .v-sales__stack {
88
+ display: flex;
89
+ flex-direction: column;
90
+ gap: var(--space-16);
91
+ }
92
+
93
+ /* Le rail de mesures garde sa largeur. */
94
+ .v-sales__stack > :first-child {
95
+ align-self: flex-start;
96
+ }
97
+ </style>
@@ -0,0 +1,24 @@
1
+ <!--
2
+ Vue de ressource FrPnds : le `resourceId` est le `_id` du protocole, l'id
3
+ meme de la fiche PNDS.
4
+ -->
5
+ <template>
6
+ <div class="oip-drugs">
7
+ <OipDrugsFichesPndsFiche :id="id" :lang="lang" :highlight="highlight">
8
+ <template #title-link><slot name="title-link" /></template>
9
+ </OipDrugsFichesPndsFiche>
10
+ </div>
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ withDefaults(
15
+ defineProps<{
16
+ /** Le `resourceId` : `_id` du protocole dans l'index PNDS. */
17
+ id: string;
18
+ type?: string;
19
+ lang?: "fr" | "en";
20
+ highlight?: string[];
21
+ }>(),
22
+ { type: "FrPnds", lang: undefined, highlight: () => [] },
23
+ );
24
+ </script>
@@ -0,0 +1,106 @@
1
+ <!--
2
+ Une presentation du suivi des prix rangee dans un projet (portage de
3
+ pages/hubr/heart/prices/details/[id] de fr_drugs_app). La page relit la
4
+ presentation par son code CIP (`local_drug_id`) puis renvoie a la fiche
5
+ marque, onglet Prix : on monte cette fiche. Sans marque, la carte de la
6
+ presentation (celle de la liste des prix) ; sans document, le message de la
7
+ page.
8
+
9
+ `id` est l'`_id` du document (projet), ou son `local_drug_id` quand
10
+ `by="local_drug_id"` (lien vers la page de fr_drugs_app).
11
+ -->
12
+ <template>
13
+ <div class="oip-drugs oip-drugs-rv-price">
14
+ <RmLoadingState v-if="pending" spinner />
15
+
16
+ <OipDrugsFichesBrandFiche
17
+ v-else-if="brand"
18
+ v-model:tab="tab"
19
+ :brand="brand"
20
+ :lang="lang"
21
+ :highlight="highlight"
22
+ >
23
+ <template #title-link><slot name="title-link" /></template>
24
+ </OipDrugsFichesBrandFiche>
25
+
26
+ <template v-else-if="product">
27
+ <RmPageHeader eyebrow="🇫🇷 France">
28
+ <template #title>
29
+ {{ product.label }}
30
+ <slot name="title-link" />
31
+ </template>
32
+ </RmPageHeader>
33
+ <div class="oip-drugs-rv-price__body">
34
+ <OipDrugsHeartFranceBrandGroupCard :group="group" :search-queries="highlight" />
35
+ </div>
36
+ </template>
37
+
38
+ <div v-else class="oip_row v-center centered full_width mt-32">
39
+ <p>
40
+ {{
41
+ lang === "en"
42
+ ? "This product is not in the price database."
43
+ : "Ce produit n'est pas dans la base des prix."
44
+ }}
45
+ </p>
46
+ </div>
47
+ </div>
48
+ </template>
49
+
50
+ <script setup lang="ts">
51
+ import { oipEsSearch } from "../../../composables/useOipResources";
52
+ import { ES_INDEX } from "../../../oip-drugs/esIndices";
53
+
54
+ const props = withDefaults(
55
+ defineProps<{ id: string; type?: string; by?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
56
+ { type: "FrDrugPrice", by: "", highlight: () => [], lang: "fr" },
57
+ );
58
+
59
+ /** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
60
+ const tab = ref("price");
61
+
62
+ // Meme requete que la page quand l'id est un code CIP ; par `_id` sinon.
63
+ const { data: hit, pending } = useAsyncData(
64
+ () => `oip-drugs-price-${props.by}-${props.id}`,
65
+ async () => {
66
+ const query =
67
+ props.by === "local_drug_id"
68
+ ? { bool: { must: [{ match: { local_drug_id: props.id } }] } }
69
+ : { ids: { values: [props.id] } };
70
+ const response = await oipEsSearch<any>("drugs", ES_INDEX.DRUG_CARDS, {
71
+ from: 0,
72
+ query,
73
+ size: 1,
74
+ track_total_hits: true,
75
+ });
76
+ return response?.hits?.hits?.[0] ?? null;
77
+ },
78
+ { server: false, watch: [() => props.id, () => props.by] },
79
+ );
80
+
81
+ const product = computed(() => hit.value?._source ?? null);
82
+ const brand = computed(() => (product.value?.brand ? String(product.value.brand) : ""));
83
+
84
+ /** La presentation seule, au format des groupes de la liste des prix (useHeartGroupedPrice). */
85
+ const group = computed(() => {
86
+ const p = product.value ?? {};
87
+ const id = hit.value?._id ?? props.id;
88
+ return {
89
+ group_key: id,
90
+ brand: p.brand || p.label || "",
91
+ count: 1,
92
+ last_price_update: p.last_price_update ?? null,
93
+ manufacturers: [p.manufacturer].filter(Boolean),
94
+ molecules: [p.molecule].filter(Boolean),
95
+ products: [{ ...p, id }],
96
+ ids: [id],
97
+ };
98
+ });
99
+ </script>
100
+
101
+ <style scoped>
102
+ .oip-drugs-rv-price__body {
103
+ box-sizing: border-box;
104
+ padding: var(--space-24);
105
+ }
106
+ </style>
@@ -0,0 +1,143 @@
1
+ <!--
2
+ Une P.U.T. rangee dans un projet (portage de pages/hubr/heart/put/[id] de
3
+ fr_drugs_app). La page relit le protocole par son `_id` puis renvoie a la
4
+ fiche marque, onglet PUT : on monte cette fiche. Sans marque, ce que la page
5
+ montre alors : le bandeau, la carte du protocole et ses documents.
6
+ -->
7
+ <template>
8
+ <div class="oip-drugs oip-drugs-rv-put">
9
+ <RmLoadingState v-if="pending" spinner />
10
+
11
+ <OipDrugsFichesBrandFiche
12
+ v-else-if="brand"
13
+ v-model:tab="tab"
14
+ :brand="brand"
15
+ :lang="lang"
16
+ :highlight="highlight"
17
+ >
18
+ <template #title-link><slot name="title-link" /></template>
19
+ </OipDrugsFichesBrandFiche>
20
+
21
+ <div v-else-if="source" class="arg_page_layout" style="align-items: flex-start;">
22
+ <RmPageHeader :eyebrow="$t('oipDrugs.heart.put.titleShort')">
23
+ <template #title>
24
+ {{ source.specialty_dci || $t('oipDrugs.heart.put.detailsPage.title') }}
25
+ <slot name="title-link" />
26
+ </template>
27
+ <p v-if="source.authorization_date" class="oip_filter_label">
28
+ {{ heartFormatDate(source.authorization_date) }}
29
+ </p>
30
+ </RmPageHeader>
31
+
32
+ <div class="oip_list gap-12 full">
33
+ <OipDrugsHeartElasticSourceContainerElastic
34
+ :uuid="HEART_SOURCE_UUIDS.PUT"
35
+ :last-label="$t('oipDrugs.heart.sources.lastAuthorization')"
36
+ :last-date="source.authorization_date"
37
+ />
38
+
39
+ <OipDrugsHeartPutCard
40
+ class="full ml-24"
41
+ :product="source"
42
+ :product-id="docId"
43
+ :store-search-bar="highlight"
44
+ :in-details="true"
45
+ />
46
+
47
+ <!-- Documents Tekkare (docx) -->
48
+ <div v-if="docLinks.length > 0" class="oip_card oip_list gap-16 oip_body full ml-24 put_docs">
49
+ <div class="oip_list gap-4">
50
+ <p class="oip_heading">Documents</p>
51
+ <p class="put_doc_info">
52
+ {{ lang === 'fr'
53
+ ? "Vous permet d'accéder aux documents même en cas d'indisponibilité du site HAS."
54
+ : 'Allows you to access documents even if the HAS website is unavailable.' }}
55
+ </p>
56
+ </div>
57
+ <div class="oip_list gap-8">
58
+ <div v-for="(link, index) in docLinks" :key="'doc-' + index" class="oip_row gap-8 v-center">
59
+ <RmButton prefix-icon="DownloadSimple" variant="secondary" @click="openPdf(link)">
60
+ {{ $t('oipDrugs.heart.put.detailsPage.downloadPdf') }} - {{ getFileName(link) }}
61
+ </RmButton>
62
+ </div>
63
+ </div>
64
+ </div>
65
+
66
+ <!-- Documents PDF -->
67
+ <div v-if="pdfLinks.length > 0" class="oip_card oip_list gap-16 oip_body full ml-24 put_docs">
68
+ <p class="oip_heading">PDF</p>
69
+ <div class="oip_list gap-8">
70
+ <div v-for="(link, index) in pdfLinks" :key="'pdf-' + index" class="oip_row gap-8 v-center">
71
+ <RmButton prefix-icon="DownloadSimple" variant="secondary" @click="openPdf(link)">
72
+ {{ $t('oipDrugs.heart.put.detailsPage.downloadPdf') }} - {{ getFileName(link) }}
73
+ </RmButton>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+
80
+ <RmEmptyState
81
+ v-else
82
+ icon="FileX"
83
+ :title="lang === 'en' ? 'Record unavailable' : 'Fiche indisponible'"
84
+ :text="lang === 'en' ? 'The record is no longer in the data.' : 'La fiche n\'est plus dans la donnée.'"
85
+ />
86
+ </div>
87
+ </template>
88
+
89
+ <script setup lang="ts">
90
+ import { oipEsGet } from "../../../composables/useOipResources";
91
+ import { ES_INDEX } from "../../../oip-drugs/esIndices";
92
+ import { HEART_SOURCE_UUIDS } from "../../../oip-drugs/utils/sourceUuids";
93
+ import { heartFormatDate } from "../../../oip-drugs/utils/heartStyleAndFormat";
94
+
95
+ const props = withDefaults(
96
+ defineProps<{ id: string; type?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
97
+ { type: "FrHasPut", highlight: () => [], lang: "fr" },
98
+ );
99
+
100
+ /** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
101
+ const tab = ref("put");
102
+
103
+ const { data: hit, pending } = useAsyncData(
104
+ () => `oip-drugs-put-${props.id}`,
105
+ () => oipEsGet<any>("drugs", ES_INDEX.PUT_HAS, props.id),
106
+ { server: false, watch: [() => props.id] },
107
+ );
108
+
109
+ const source = computed(() => hit.value?._source ?? null);
110
+ const docId = computed(() => hit.value?._id ?? props.id);
111
+ /** La marque de la redirection de la page (`heartBrandPath(brand)`). */
112
+ const brand = computed(() => (source.value?.brand ? String(source.value.brand) : ""));
113
+
114
+ const docLinks = computed<string[]>(() => source.value?.tekkare_doc_links || []);
115
+ const pdfLinks = computed<string[]>(() => source.value?.tekkare_pdf_links || []);
116
+
117
+ function getFileName(url: string) {
118
+ if (!url) return "";
119
+ const parts = url.split("/");
120
+ return decodeURIComponent(parts[parts.length - 1]!);
121
+ }
122
+
123
+ function openPdf(url: string) {
124
+ if (url) window.open(url, "_blank");
125
+ }
126
+ </script>
127
+
128
+ <style scoped>
129
+ .ml-24 {
130
+ margin-left: 24px;
131
+ }
132
+
133
+ .put_docs {
134
+ box-sizing: border-box;
135
+ width: calc(100% - 24px);
136
+ }
137
+
138
+ .put_doc_info {
139
+ font-size: 13px;
140
+ color: var(--dark, #6c6c8a);
141
+ font-weight: 500;
142
+ }
143
+ </style>