@tekkare/romulus 0.1.250 → 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 (270) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/components/BarChart.vue +1 -0
  3. package/dist/runtime/components/ChoroplethMap.vue +4 -1
  4. package/dist/runtime/internal/geo/fr-regions.json +1 -1
  5. package/dist/runtime/utils/chart.d.ts +6 -3
  6. package/dist/runtime/utils/chart.js +15 -2
  7. package/layer/app/app.config.ts +6 -0
  8. package/layer/app/components/OipPubmedSummary.vue +223 -0
  9. package/layer/app/components/OipResourceDrawer.vue +331 -0
  10. package/layer/app/components/OipResourceDrawerLink.vue +40 -0
  11. package/layer/app/components/OipResourceField.vue +41 -0
  12. package/layer/app/components/OipResourceGenericCard.vue +54 -0
  13. package/layer/app/components/OipResourceSource.vue +50 -0
  14. package/layer/app/components/OipResourceTags.vue +65 -0
  15. package/layer/app/components/OipResourceView.vue +107 -0
  16. package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
  17. package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
  18. package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
  19. package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
  20. package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
  21. package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
  22. package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
  23. package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
  24. package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
  25. package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
  26. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
  27. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
  28. package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
  29. package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
  30. package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
  31. package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
  32. package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
  33. package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
  34. package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
  35. package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
  36. package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
  37. package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
  38. package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
  39. package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
  40. package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
  41. package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
  42. package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
  43. package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
  44. package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
  45. package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
  46. package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
  47. package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
  48. package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
  49. package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
  50. package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
  51. package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
  52. package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
  53. package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
  54. package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
  55. package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
  56. package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
  57. package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
  58. package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
  59. package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
  60. package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
  61. package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
  62. package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
  63. package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
  64. package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
  65. package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
  66. package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
  67. package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
  68. package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
  69. package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
  70. package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
  71. package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
  72. package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
  73. package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
  74. package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
  75. package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
  76. package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
  77. package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
  78. package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
  79. package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
  80. package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
  81. package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
  82. package/layer/app/components/oip-science/common/Form.vue +73 -0
  83. package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
  84. package/layer/app/components/oip-science/common/NoData.vue +16 -0
  85. package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
  86. package/layer/app/components/oip-science/common/Source.vue +31 -0
  87. package/layer/app/components/oip-science/common/TableTags.vue +279 -0
  88. package/layer/app/components/oip-science/common/Timeline.vue +104 -0
  89. package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
  90. package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
  91. package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
  92. package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
  93. package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
  94. package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
  95. package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
  96. package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
  97. package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
  98. package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
  99. package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
  100. package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
  101. package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
  102. package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
  103. package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
  104. package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
  105. package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
  106. package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
  107. package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
  108. package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
  109. package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
  110. package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
  111. package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
  112. package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
  113. package/layer/app/components/oip-science/euct/Locations.vue +102 -0
  114. package/layer/app/components/oip-science/euct/Products.vue +101 -0
  115. package/layer/app/components/oip-science/euct/Publications.vue +89 -0
  116. package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
  117. package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
  118. package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
  119. package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
  120. package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
  121. package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
  122. package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
  123. package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
  124. package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
  125. package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
  126. package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
  127. package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
  128. package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
  129. package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
  130. package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
  131. package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
  132. package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
  133. package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
  134. package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
  135. package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
  136. package/layer/app/composables/useOipChapterScroll.ts +43 -0
  137. package/layer/app/composables/useOipResourceHooks.ts +27 -0
  138. package/layer/app/composables/useOipResourceNav.ts +66 -0
  139. package/layer/app/composables/useOipResourceViews.ts +117 -0
  140. package/layer/app/composables/useOipResources.ts +83 -0
  141. package/layer/app/oip-drugs/PORTING.md +120 -0
  142. package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
  143. package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
  144. package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
  145. package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
  146. package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
  147. package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
  148. package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
  149. package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
  150. package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
  151. package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
  152. package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
  153. package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
  154. package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
  155. package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
  156. package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
  157. package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
  158. package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
  159. package/layer/app/oip-drugs/drugs.css +500 -0
  160. package/layer/app/oip-drugs/esIndices.ts +322 -0
  161. package/layer/app/oip-drugs/kinds.ts +264 -0
  162. package/layer/app/oip-drugs/locales/en.json +1571 -0
  163. package/layer/app/oip-drugs/locales/fr.json +1571 -0
  164. package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
  165. package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
  166. package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
  167. package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
  168. package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
  169. package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
  170. package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
  171. package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
  172. package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
  173. package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
  174. package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
  175. package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
  176. package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
  177. package/layer/app/oip-drugs/types/elastic.ts +113 -0
  178. package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
  179. package/layer/app/oip-drugs/types/es/directory.ts +54 -0
  180. package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
  181. package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
  182. package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
  183. package/layer/app/oip-drugs/types/es/portal.ts +130 -0
  184. package/layer/app/oip-drugs/types/es/retail.ts +107 -0
  185. package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
  186. package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
  187. package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
  188. package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
  189. package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
  190. package/layer/app/oip-drugs/utils/contributions.ts +36 -0
  191. package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
  192. package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
  193. package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
  194. package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
  195. package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
  196. package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
  197. package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
  198. package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
  199. package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
  200. package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
  201. package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
  202. package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
  203. package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
  204. package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
  205. package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
  206. package/layer/app/oip-science/PORTING.md +93 -0
  207. package/layer/app/oip-science/assets/smartSelection.json +428 -0
  208. package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
  209. package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
  210. package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
  211. package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
  212. package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
  213. package/layer/app/oip-science/composables/useEuct.ts +418 -0
  214. package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
  215. package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
  216. package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
  217. package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
  218. package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
  219. package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
  220. package/layer/app/oip-science/composables/usePubmed.ts +487 -0
  221. package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
  222. package/layer/app/oip-science/indexConfig.json +794 -0
  223. package/layer/app/oip-science/locales/en.json +483 -0
  224. package/layer/app/oip-science/locales/fr.json +483 -0
  225. package/layer/app/oip-science/science.css +1182 -0
  226. package/layer/app/oip-science/utils/a-openCard.ts +23 -0
  227. package/layer/app/oip-science/utils/b-openCard.ts +35 -0
  228. package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
  229. package/layer/app/oip-science/utils/f-types.ts +241 -0
  230. package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
  231. package/layer/app/oip-science/utils/matchMethod.ts +53 -0
  232. package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
  233. package/layer/app/oip-science/utils/sources.ts +15 -0
  234. package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
  235. package/layer/app/oip-science/utils/toPresets.ts +7 -0
  236. package/layer/app/oip-science/utils/valueTable.ts +126 -0
  237. package/layer/app/plugins/oip-science-i18n.ts +17 -0
  238. package/layer/app/utils/oipFicheRoutes.ts +118 -0
  239. package/layer/app/utils/oipResources.ts +440 -0
  240. package/layer/nuxt.config.ts +22 -2
  241. package/layer/public/reports/blincyto-has.html +292 -0
  242. package/layer/public/reports/blincyto-has.pdf +0 -0
  243. package/layer/public/reports/darzalex-has.html +279 -0
  244. package/layer/public/reports/darzalex-has.pdf +0 -0
  245. package/layer/public/reports/dupixent-has.html +217 -0
  246. package/layer/public/reports/dupixent-has.pdf +0 -0
  247. package/layer/public/reports/enhertu-has.html +283 -0
  248. package/layer/public/reports/enhertu-has.pdf +0 -0
  249. package/layer/public/reports/has-sein-2023.html +1639 -0
  250. package/layer/public/reports/ibrance-has.html +280 -0
  251. package/layer/public/reports/ibrance-has.pdf +0 -0
  252. package/layer/public/reports/imfinzi-has.html +297 -0
  253. package/layer/public/reports/imfinzi-has.pdf +0 -0
  254. package/layer/public/reports/keytruda-has.html +337 -0
  255. package/layer/public/reports/keytruda-has.pdf +0 -0
  256. package/layer/public/reports/kisqali-has.html +202 -0
  257. package/layer/public/reports/kisqali-has.pdf +0 -0
  258. package/layer/public/reports/opdivo-has.html +232 -0
  259. package/layer/public/reports/opdivo-has.pdf +0 -0
  260. package/layer/public/reports/ozempic-has.html +188 -0
  261. package/layer/public/reports/ozempic-has.pdf +0 -0
  262. package/layer/public/reports/tecentriq-has.html +315 -0
  263. package/layer/public/reports/tecentriq-has.pdf +0 -0
  264. package/layer/public/reports/yescarta-has.html +275 -0
  265. package/layer/public/reports/yescarta-has.pdf +0 -0
  266. package/layer/server/api/oip/es.post.ts +99 -0
  267. package/layer/server/api/oip/pdf.get.ts +70 -0
  268. package/layer/server/api/oip/reports.get.ts +98 -0
  269. package/layer/server/api/oip/resource-types.get.ts +22 -0
  270. package/package.json +1 -1
@@ -0,0 +1,162 @@
1
+ <!--
2
+ Carte d'un appel a projets (PHRC) (portage de components/appel-a-projet/
3
+ Cards.vue de France Augmented Science). La fiche d'un appel a projets n'est
4
+ pas une fiche du layer : elle s'ouvre dans France Augmented Science. Le menu
5
+ d'export de la carte n'est pas repris.
6
+ -->
7
+ <template>
8
+ <RmResultCard
9
+ class="oip-science"
10
+ clickable
11
+ :lang="lang"
12
+ :link="detailsUrl"
13
+ @click="openCard($event, detailsUrl, openDetails)"
14
+ >
15
+ <template #title>
16
+ <RmTextHighlight
17
+ :queries="highlight"
18
+ :text="data.title_fr || '-'"
19
+ />
20
+ </template>
21
+
22
+ <template #actions>
23
+ <component
24
+ :is="projectButton"
25
+ v-if="projectButton"
26
+ :resource-id="data?.clinical_trial_id"
27
+ type="PHRC"
28
+ :label="data?.title_fr"
29
+ compact
30
+ />
31
+ </template>
32
+
33
+ <template #meta>
34
+ <RmTag variant="purple">
35
+ {{ data.project_type || '-' }}
36
+ </RmTag>
37
+ <RmTag variant="blue">
38
+ {{ data.discipline_fr || '-' }}
39
+ </RmTag>
40
+ <span v-if="data.acronym" class="rm-rcard__ref">{{ data.acronym }}</span>
41
+ <span class="rm-rcard__label">{{ data.period || '-' }}</span>
42
+ </template>
43
+
44
+ <div class="oip_grid gap-16">
45
+ <OipScienceCommonTableTags
46
+ v-if="getEstablishmentLabel"
47
+ icon="Building"
48
+ :title="$t('oipScience.common.establishment')"
49
+ :values="[getEstablishmentLabel]"
50
+ :highlightQueries="highlight"
51
+ />
52
+
53
+ <OipScienceCommonTableTags
54
+ icon="Coin"
55
+ :title="$t('oipScience.common.funding')"
56
+ :values="data.total_amount ? [formatAmount(data.total_amount)] : []"
57
+ />
58
+
59
+ <OipScienceCommonTableTags
60
+ v-if="prefs.status"
61
+ icon="ChartBar"
62
+ :title="$t('oipScience.common.statusTranche')"
63
+ :values="data.status_code ? [data.status_code] : []"
64
+ />
65
+
66
+ <OipScienceCommonTableTags
67
+ v-if="prefs.rare && (getRareDiseases.length)"
68
+ icon="Bandaids"
69
+ :title="$t('oipScience.common.rareDiseases')"
70
+ :values="getRareDiseases"
71
+ :highlightQueries="highlight"
72
+ :isFullResults="false"
73
+ />
74
+
75
+ </div>
76
+
77
+ <template #footer>
78
+ <div class="oip_grid gap-8">
79
+ <OipScienceCommonSource :sources="['Appel à projet']" :lang="lang" />
80
+ <p v-if="data.nct_number">
81
+ {{ $t('oipScience.common.trialLinked') }}
82
+ <a
83
+ class="kk_text link cool_grey"
84
+ :href="nav.href('ClinicalTrialsNCT', data.nct_number, 'study-description')"
85
+ @click="openNct"
86
+ >
87
+ {{ $t('oipScience.common.seeOnOip') }} ↗
88
+ </a>
89
+ </p>
90
+ </div>
91
+ </template>
92
+ </RmResultCard>
93
+ </template>
94
+
95
+ <script setup lang="ts">
96
+ import type { PropType } from 'vue';
97
+ import { removeDuplicate } from '../../../oip-science/utils/styleAndFormat';
98
+ import { openCard } from '../../../oip-science/utils/a-openCard';
99
+
100
+ const props = defineProps({
101
+ data: {
102
+ type: Object as () => any,
103
+ default: () => ({}),
104
+ },
105
+ /** Termes de la recherche en cours, surlignes dans la carte. */
106
+ highlight: {
107
+ type: Array as PropType<string[]>,
108
+ default: () => [],
109
+ },
110
+ /**
111
+ * Rangees en plus (`status`, `rare`), choisies dans « Personnaliser » de la
112
+ * barre de filtres de France Augmented Science (store cardPrefs). Aucune par
113
+ * defaut, comme le store.
114
+ */
115
+ prefs: {
116
+ type: Object as PropType<Record<string, boolean>>,
117
+ default: () => ({}),
118
+ },
119
+ });
120
+
121
+ const nav = useOipResourceNav();
122
+ const { projectButton } = useOipResourceHooks();
123
+
124
+ const formatAmount = (amount: number) => {
125
+ return new Intl.NumberFormat('fr-FR', {
126
+ style: 'currency',
127
+ currency: 'EUR',
128
+ maximumFractionDigits: 0,
129
+ }).format(amount);
130
+ };
131
+
132
+ const getEstablishmentLabel = computed(() => {
133
+ const name = props.data.hco_et_label;
134
+ if (!name) return null;
135
+ return props.data.hco_ej_code ? `${name} (${props.data.hco_ej_code})` : name;
136
+ });
137
+
138
+ const getRareDiseases = computed(() => {
139
+ return removeDuplicate(
140
+ (props.data.rare_diseases_fr &&
141
+ props.data.rare_diseases_fr.map(
142
+ (res: any) => res.concat_disease_name_orpha_code
143
+ )) ??
144
+ []
145
+ );
146
+ });
147
+
148
+ const { locale } = useI18n();
149
+ const lang = computed(() => (locale.value === 'en' ? 'en' : 'fr'));
150
+ const detailsPath = computed(() => `/appel-a-projet/${props.data.clinical_trial_id}`);
151
+ const detailsUrl = computed(() =>
152
+ props.data.clinical_trial_id ? nav.appHref('france_augmented_science_app', detailsPath.value) : '',
153
+ );
154
+ const openDetails = () => nav.openApp('france_augmented_science_app', detailsPath.value);
155
+
156
+ /** Lien vers l'essai lie : Ctrl/Cmd-clic garde le nouvel onglet du navigateur. */
157
+ function openNct(event: MouseEvent) {
158
+ if (event.metaKey || event.ctrlKey || event.shiftKey) return;
159
+ event.preventDefault();
160
+ nav.open('ClinicalTrialsNCT', props.data.nct_number, 'study-description');
161
+ }
162
+ </script>
@@ -0,0 +1,382 @@
1
+ <!--
2
+ Carte d'un essai EUCT (CTIS), portee de France Augmented Science. Le menu
3
+ d'export de la carte n'exporte plus que les champs lus dans la carte (cf.
4
+ RmResultCard) : l'export complet par onglets (useGenerateExcel) reste a FAS.
5
+ -->
6
+ <template>
7
+ <RmResultCard
8
+ class="ct_card oip-science"
9
+ clickable
10
+ :count="ifNoRes(data.decision_date, 'date')"
11
+ :count-label="$t('oipScience.common.decisionDate')"
12
+ :count-extra="[$t('oipScience.common.lastUpdate'), ifNoRes(data.last_update_date, 'date')]"
13
+ :lang="lang"
14
+ :link="detailsUrl"
15
+ @click="openCard($event, nav, 'ClinicalTrialsEUCT', data.euct_number)"
16
+ >
17
+ <template #code>
18
+ <RmCopyCode v-if="data.euct_number" label="EUCT" :value="data.euct_number" :lang="lang" />
19
+ <template v-if="linkedNct">
20
+ <RmCopyCode :value="linkedNct.nct_id" :lang="lang" />
21
+ <OipScienceClinicalTrialsPairBadge />
22
+ </template>
23
+ </template>
24
+
25
+ <template #title>
26
+ <RmTextHighlight
27
+ :queries="getSearchHighlight"
28
+ :text="ifNoRes(data.public_title)"
29
+ />
30
+ </template>
31
+
32
+ <template #actions>
33
+ <component
34
+ :is="projectButton"
35
+ v-if="projectButton"
36
+ :resource-id="data.euct_number"
37
+ type="ClinicalTrialsEUCT"
38
+ :label="data.public_title"
39
+ compact
40
+ />
41
+ </template>
42
+
43
+ <template #meta>
44
+ <RmTag :variant="setColorStatus(data.global_status)">
45
+ {{ ifNoRes(data.global_status) }}
46
+ </RmTag>
47
+ <RmTag v-if="data.trial_phase" variant="violet">{{ data.trial_phase }}</RmTag>
48
+ <slot name="extra" />
49
+ </template>
50
+
51
+ <!-- BODY : seul, ou colonne gauche d'une carte double. -->
52
+ <component
53
+ :is="linkedNct ? PairBody : 'div'"
54
+ v-bind="linkedNct ? { kind: 'nct', linked: linkedNct, queries: getSearchHighlight } : {}"
55
+ >
56
+ <div class="oip_grid gap-16">
57
+ <OipScienceCommonTableTags
58
+ v-if="prefs.therapeuticArea"
59
+ icon="Clipboard"
60
+ :title="$t('oipScience.common.therapeuticArea')"
61
+ :values="data.therapeutic_area?.map((val) => val) || []"
62
+ :isFullResults="false"
63
+ ></OipScienceCommonTableTags>
64
+
65
+ <OipScienceCommonTableTags
66
+ icon="FaceMask"
67
+ :title="$t('oipScience.common.conditions')"
68
+ :values="
69
+ data.medical_condition?.map((val) => val.condition_name_en) || []
70
+ "
71
+ ></OipScienceCommonTableTags>
72
+
73
+ <OipScienceCommonTableTags
74
+ v-if="prefs.products"
75
+ icon="Pill"
76
+ :title="$t('oipScience.common.products')"
77
+ :values="
78
+ data.products?.map((val) =>
79
+ val?.productDictionaryInfo?.prodName
80
+ ? val?.productDictionaryInfo?.prodName
81
+ : val?.productDictionaryInfo?.activeSubstanceName
82
+ ) || []
83
+ "
84
+ :highlightQueries="getSearchHighlight"
85
+ :isFullResults="false"
86
+ ></OipScienceCommonTableTags>
87
+
88
+ <OipScienceCommonTableTags
89
+ v-if="prefs.countries"
90
+ icon="Globe"
91
+ :title="$t('oipScience.cards.countries')"
92
+ :values="
93
+ data.countries?.map((val) =>
94
+ getCountryEmoji(val?.country_name ?? '')
95
+ ) || []
96
+ "
97
+ :highlightQueries="getSearchHighlight"
98
+ :isFullResults="false"
99
+ ></OipScienceCommonTableTags>
100
+
101
+ <OipScienceCommonTableTags
102
+ v-if="prefs.sponsors"
103
+ icon="Briefcase"
104
+ :title="$t('oipScience.common.sponsors')"
105
+ :values="
106
+ data.co_sponsors?.map((val) => val.organisation?.name) || []
107
+ "
108
+ :highlightQueries="getSearchHighlight"
109
+ :isFullResults="false"
110
+ ></OipScienceCommonTableTags>
111
+
112
+ <OipScienceCommonTableTags
113
+ v-if="prefs.enrollment"
114
+ icon="ListBullets"
115
+ :title="$t('oipScience.cards.enrollment')"
116
+ :values="getEnrollmentSummary"
117
+ :highlightQueries="getSearchHighlight"
118
+ ></OipScienceCommonTableTags>
119
+ <!-- Second row of the Enrollment block: per-MS subject
120
+ breakdown. No title / no icon so the left column stays
121
+ empty but still reserves width via kk_block_limited_width,
122
+ keeping the country tags aligned with the summary above. -->
123
+ <OipScienceCommonTableTags
124
+ v-if="prefs.enrollment && (getEnrollmentPerCountry.length > 0)"
125
+ :show-title="false"
126
+ :values="getEnrollmentPerCountry"
127
+ :highlightQueries="getSearchHighlight"
128
+ :isFullResults="false"
129
+ :result-size-limit="10"
130
+ clickable
131
+ @tag-click="(index) => (sitesCountry = enrollmentCountries[index] ?? null)"
132
+ ></OipScienceCommonTableTags>
133
+ <OipScienceClinicalTrialsSitesDrawer v-model:country="sitesCountry" :trial="data" />
134
+
135
+ <!-- Rare diseases / Oncology (ICD-10) / Oncology Terms only
136
+ render when the trial actually carries that data — drop
137
+ the "No xxx" placeholder rows entirely to keep cards
138
+ tight for non-oncology / non-rare trials. -->
139
+ <OipScienceCommonTableTags
140
+ v-if="prefs.rare && (getRareDiseases.length > 0)"
141
+ icon="Bandaids"
142
+ :title="$t('oipScience.common.rareDiseases')"
143
+ :values="getRareDiseases"
144
+ :highlightQueries="getSearchHighlight"
145
+ :isFullResults="false"
146
+ ></OipScienceCommonTableTags>
147
+ <OipScienceCommonTableTags
148
+ v-if="prefs.oncoIcd10 && (getIcd10.length > 0)"
149
+ icon="FaceMask"
150
+ :title="$t('oipScience.common.oncologyIcd10')"
151
+ :values="getIcd10"
152
+ :highlightQueries="getSearchHighlight"
153
+ :isFullResults="false"
154
+ :result-size-limit="2"
155
+ ></OipScienceCommonTableTags>
156
+ <OipScienceCommonTableTags
157
+ v-if="prefs.oncoTerms && (getOncoTerms.length > 0)"
158
+ icon="ListMagnifyingGlass"
159
+ :title="$t('oipScience.common.oncologyTerms')"
160
+ :values="getOncoTerms"
161
+ :highlightQueries="getSearchHighlight"
162
+ :isFullResults="false"
163
+ :result-size-limit="2"
164
+ ></OipScienceCommonTableTags>
165
+ </div>
166
+ </component>
167
+
168
+ <!-- Ce que la recherche a reellement matche, extraits compris : souvent
169
+ dans un texte que la carte ne montre pas. -->
170
+ <OipScienceElasticMatchExplain :match="data._match" />
171
+
172
+ <template #footer>
173
+ <div class="oip_grid gap-8">
174
+ <OipScienceCommonSource :sources="linkedNct ? ['EUCT', 'CT.gov'] : ['EUCT']" :lang="lang" />
175
+ <p v-if="!linkedNct && data.nct_number">
176
+ {{ $t('oipScience.cards.availableOnCtgov') }}
177
+ <a
178
+ class="kk_text link cool_grey"
179
+ :href="nav.href('ClinicalTrialsNCT', data.nct_number)"
180
+ @click="followCardLink($event, nav, 'ClinicalTrialsNCT', data.nct_number)"
181
+ >
182
+ {{ $t('oipScience.cards.openNctCard') }} ↗
183
+ </a>
184
+ </p>
185
+ </div>
186
+ </template>
187
+ </RmResultCard>
188
+ </template>
189
+
190
+ <script setup lang="ts">
191
+ import PairBody from './PairBody.vue';
192
+ import {
193
+ ifNoRes,
194
+ setColorStatus,
195
+ getCountryEmoji,
196
+ removeDuplicate,
197
+ dedupNormalized,
198
+ } from '../../../oip-science/utils/styleAndFormat';
199
+ import { openCard, followCardLink } from '../../../oip-science/utils/b-openCard';
200
+
201
+ // Types de France Augmented Science (types/Euct) : pas portes.
202
+ type Euct = any;
203
+ type EuctGenomics = any;
204
+ type EuctRareDiseases = any;
205
+
206
+
207
+ const props = defineProps({
208
+ data: {
209
+ type: Object as () => Euct,
210
+ // Rangees en plus (« Personnaliser » de FAS, store cardPrefs) : hors de FAS, celles par defaut.
211
+ default: () => ({}),
212
+ },
213
+ /**
214
+ * L'essai CT.gov que cite `nct_number` (useLinkedTrials) : la carte devient
215
+ * double. `null` : absent de l'index ; absent : pas encore charge.
216
+ */
217
+ linkedNct: {
218
+ type: Object as () => any | null,
219
+ default: undefined,
220
+ },
221
+ /** Termes de la recherche a surligner (filterStore dans FAS). */
222
+ highlight: {
223
+ type: Array as () => string[],
224
+ default: () => [],
225
+ },
226
+ /** Rangees choisies (store cardPrefs de FAS) ; a defaut, celles par defaut. */
227
+ prefs: {
228
+ type: Object as () => Record<string, boolean>,
229
+ default: () => ({ products: true, sponsors: true, enrollment: true }),
230
+ },
231
+ });
232
+
233
+ const nav = useOipResourceNav();
234
+ const { projectButton } = useOipResourceHooks();
235
+
236
+ const getGenomicsSymbols = computed(() => {
237
+ if (!props.data.genomics) return [];
238
+ return props.data.genomics.map((g: EuctGenomics) => g.symbol);
239
+ });
240
+
241
+ const getRareDiseases = computed(() => {
242
+ return removeDuplicate(
243
+ (props.data.rare_diseases &&
244
+ props.data.rare_diseases.map(
245
+ (res: EuctRareDiseases) => res.concat_disease_name_orpha_code
246
+ )) ??
247
+ []
248
+ );
249
+ });
250
+
251
+ const getSearchHighlight = computed(() => props.highlight);
252
+
253
+ const { locale, t } = useI18n();
254
+ const lang = computed(() => (locale.value === 'en' ? 'en' : 'fr'));
255
+ const detailsUrl = computed(() =>
256
+ props.data.euct_number ? nav.href('ClinicalTrialsEUCT', props.data.euct_number) : '',
257
+ );
258
+
259
+ const getSexe = (hasFemale?: boolean, hasMale?: boolean) => {
260
+ if (hasFemale && hasMale) return 'Male & Female';
261
+ if (hasFemale) return 'Female';
262
+ if (hasMale) return 'Male';
263
+ return '';
264
+ };
265
+
266
+ // Libelle affiche sur la carte ; getSexe reste en anglais pour l'export.
267
+ const sexLabel = (sexe: string) =>
268
+ sexe === 'Male & Female' ? t('oipScience.cards.maleAndFemale')
269
+ : sexe === 'Female' ? t('oipScience.cards.female')
270
+ : sexe === 'Male' ? t('oipScience.cards.male')
271
+ : sexe;
272
+
273
+ const getIcd10 = computed(() => {
274
+ const icd10List = props.data.diseases
275
+ ?.map((d: any) => d.icd10?.map((y: any) => y.combined_label))
276
+ .flat()
277
+ // dedupNormalized collapses case + singular/plural duplicates
278
+ // (Cancer/cancer, Neoplasms/Neoplasm) so the tag list stays tight.
279
+ return dedupNormalized(icd10List || []);
280
+ })
281
+
282
+ const getOncoTerms = computed(() => {
283
+ const icd10List = props.data.diseases
284
+ ?.map((d: any) => d.section?.map((y: any) => y.label))
285
+ .flat()
286
+ return dedupNormalized(icd10List || []);
287
+ })
288
+
289
+ // Enrollment summary — first row of the Enrollment block.
290
+ // [total subjects + sites], [age range], [sex] — same three tags
291
+ // the card has always shown.
292
+ const getEnrollmentSummary = computed(() => {
293
+ const d = props.data as any;
294
+ const tags: string[] = [];
295
+ const total = d.enrollment_status?.total_planned_enrollment;
296
+ const sites = d?.sites?.length ?? 0;
297
+ const countries = d?.countries?.length ?? 0;
298
+ if (total != null && total !== '') {
299
+ tags.push(
300
+ t('oipScience.cards.subjectsInSites', { total, sites }, countries > 1 ? 2 : 1),
301
+ );
302
+ }
303
+ if (d.subject_population?.age_range) {
304
+ tags.push(d.subject_population.age_range);
305
+ }
306
+ const sexe = getSexe(
307
+ d.subject_population?.has_female,
308
+ d.subject_population?.has_male,
309
+ );
310
+ if (sexe) tags.push(sexLabel(sexe));
311
+ return tags;
312
+ });
313
+
314
+ // Enrollment per-country — second row of the Enrollment block.
315
+ // One tag per Member State that declared `planned_number_of_subjects`,
316
+ // formatted "🇫🇷 France: 50 subjects". Empty array when no country
317
+ // has subject-level numbers (we then hide the whole second row via
318
+ // v-if in the template).
319
+ // Pays des pastilles, dans le meme ordre : un clic ouvre leurs sites.
320
+ const enrollmentCountries = computed<string[]>(() =>
321
+ ((props.data as any).countries || [])
322
+ .filter((c: any) => c?.planned_number_of_subjects != null && c.planned_number_of_subjects !== '')
323
+ .map((c: any) => c.country_name)
324
+ );
325
+ const sitesCountry = ref<string | null>(null);
326
+
327
+ const getEnrollmentPerCountry = computed(() => {
328
+ const d = props.data as any;
329
+ const tags: string[] = [];
330
+ for (const c of d.countries || []) {
331
+ const n = c?.planned_number_of_subjects;
332
+ if (n == null || n === '') continue;
333
+ // getCountryEmoji returns "emoji Country Name" already (emoji +
334
+ // two spaces + country name). When the country isn't in its dict
335
+ // the helper returns "undefined Country Name" — fall back to the
336
+ // raw country name in that pathological case.
337
+ const labelFromHelper = c.country_name
338
+ ? getCountryEmoji(c.country_name)
339
+ : '';
340
+ const display =
341
+ labelFromHelper && !labelFromHelper.startsWith('undefined')
342
+ ? labelFromHelper
343
+ : c.country_name || '';
344
+ tags.push(`${display}: ${t('oipScience.cards.nSubjects', { n })}`);
345
+ }
346
+ return tags;
347
+ });
348
+ </script>
349
+
350
+ <style scoped>
351
+ /* Les dates prennent la place du compteur : une date longue ne tient pas
352
+ dans la colonne de 128px ni en 32px. */
353
+ .ct_card :deep(.rm-rcard__count) {
354
+ flex-basis: 176px;
355
+ align-items: flex-start;
356
+ text-align: left;
357
+ }
358
+ .ct_card :deep(.rm-rcard__count-value) {
359
+ font-size: 16px;
360
+ white-space: nowrap;
361
+ }
362
+ /* Libelle au-dessus de sa date, et "Last update" dans le meme style que
363
+ "First posted" : countExtra porte [libellé, date]. */
364
+ .ct_card :deep(.rm-rcard__count-label) { order: 1; font-size: 10px; }
365
+ .ct_card :deep(.rm-rcard__count-value) { order: 2; }
366
+ .ct_card :deep(.rm-rcard__count-extra) { order: 3; }
367
+ .ct_card :deep(.rm-rcard__count-extra:nth-child(3)) {
368
+ margin-top: 10px;
369
+ color: var(--text-muted);
370
+ font-size: 10px;
371
+ font-weight: var(--weight-semibold);
372
+ letter-spacing: 0.08em;
373
+ text-transform: uppercase;
374
+ }
375
+ .ct_card :deep(.rm-rcard__count-extra:nth-child(4)) {
376
+ margin-top: var(--space-2);
377
+ font-size: 16px;
378
+ font-weight: var(--weight-bold);
379
+ line-height: 1.1;
380
+ white-space: nowrap;
381
+ }
382
+ </style>