@tekkare/romulus 0.1.251 → 0.1.253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. package/dist/module.json +1 -1
  2. package/dist/runtime/utils/projects.d.ts +8 -0
  3. package/dist/runtime/utils/projects.js +8 -5
  4. package/layer/app/app.config.ts +6 -0
  5. package/layer/app/components/OipPubmedSummary.vue +223 -0
  6. package/layer/app/components/OipResourceDrawer.vue +331 -0
  7. package/layer/app/components/OipResourceDrawerLink.vue +40 -0
  8. package/layer/app/components/OipResourceField.vue +41 -0
  9. package/layer/app/components/OipResourceGenericCard.vue +54 -0
  10. package/layer/app/components/OipResourceSource.vue +50 -0
  11. package/layer/app/components/OipResourceTags.vue +65 -0
  12. package/layer/app/components/OipResourceView.vue +107 -0
  13. package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
  14. package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
  15. package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
  16. package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
  17. package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
  18. package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
  19. package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
  20. package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
  21. package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
  22. package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
  23. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
  24. package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
  25. package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
  26. package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
  27. package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
  28. package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
  29. package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
  30. package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
  31. package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
  32. package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
  33. package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
  34. package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
  35. package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
  36. package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
  37. package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
  38. package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
  39. package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
  40. package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
  41. package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
  42. package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
  43. package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
  44. package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
  45. package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
  46. package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
  47. package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
  48. package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
  49. package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
  50. package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
  51. package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
  52. package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
  53. package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
  54. package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
  55. package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
  56. package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
  57. package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
  58. package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
  59. package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
  60. package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
  61. package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
  62. package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
  63. package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
  64. package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
  65. package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
  66. package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
  67. package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
  68. package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
  69. package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
  70. package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
  71. package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
  72. package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
  73. package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
  74. package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
  75. package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
  76. package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
  77. package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
  78. package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
  79. package/layer/app/components/oip-science/common/Form.vue +73 -0
  80. package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
  81. package/layer/app/components/oip-science/common/NoData.vue +16 -0
  82. package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
  83. package/layer/app/components/oip-science/common/Source.vue +31 -0
  84. package/layer/app/components/oip-science/common/TableTags.vue +279 -0
  85. package/layer/app/components/oip-science/common/Timeline.vue +104 -0
  86. package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
  87. package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
  88. package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
  89. package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
  90. package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
  91. package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
  92. package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
  93. package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
  94. package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
  95. package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
  96. package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
  97. package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
  98. package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
  99. package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
  100. package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
  101. package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
  102. package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
  103. package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
  104. package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
  105. package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
  106. package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
  107. package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
  108. package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
  109. package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
  110. package/layer/app/components/oip-science/euct/Locations.vue +102 -0
  111. package/layer/app/components/oip-science/euct/Products.vue +101 -0
  112. package/layer/app/components/oip-science/euct/Publications.vue +89 -0
  113. package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
  114. package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
  115. package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
  116. package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
  117. package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
  118. package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
  119. package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
  120. package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
  121. package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
  122. package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
  123. package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
  124. package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
  125. package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
  126. package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
  127. package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
  128. package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
  129. package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
  130. package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
  131. package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
  132. package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
  133. package/layer/app/composables/useOipChapterScroll.ts +43 -0
  134. package/layer/app/composables/useOipResourceHooks.ts +27 -0
  135. package/layer/app/composables/useOipResourceNav.ts +66 -0
  136. package/layer/app/composables/useOipResourceViews.ts +117 -0
  137. package/layer/app/composables/useOipResources.ts +83 -0
  138. package/layer/app/oip-drugs/PORTING.md +120 -0
  139. package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
  140. package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
  141. package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
  142. package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
  143. package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
  144. package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
  145. package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
  146. package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
  147. package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
  148. package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
  149. package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
  150. package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
  151. package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
  152. package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
  153. package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
  154. package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
  155. package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
  156. package/layer/app/oip-drugs/drugs.css +500 -0
  157. package/layer/app/oip-drugs/esIndices.ts +322 -0
  158. package/layer/app/oip-drugs/kinds.ts +264 -0
  159. package/layer/app/oip-drugs/locales/en.json +1571 -0
  160. package/layer/app/oip-drugs/locales/fr.json +1571 -0
  161. package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
  162. package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
  163. package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
  164. package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
  165. package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
  166. package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
  167. package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
  168. package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
  169. package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
  170. package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
  171. package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
  172. package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
  173. package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
  174. package/layer/app/oip-drugs/types/elastic.ts +113 -0
  175. package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
  176. package/layer/app/oip-drugs/types/es/directory.ts +54 -0
  177. package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
  178. package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
  179. package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
  180. package/layer/app/oip-drugs/types/es/portal.ts +130 -0
  181. package/layer/app/oip-drugs/types/es/retail.ts +107 -0
  182. package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
  183. package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
  184. package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
  185. package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
  186. package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
  187. package/layer/app/oip-drugs/utils/contributions.ts +36 -0
  188. package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
  189. package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
  190. package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
  191. package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
  192. package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
  193. package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
  194. package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
  195. package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
  196. package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
  197. package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
  198. package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
  199. package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
  200. package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
  201. package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
  202. package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
  203. package/layer/app/oip-science/PORTING.md +93 -0
  204. package/layer/app/oip-science/assets/smartSelection.json +428 -0
  205. package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
  206. package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
  207. package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
  208. package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
  209. package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
  210. package/layer/app/oip-science/composables/useEuct.ts +418 -0
  211. package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
  212. package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
  213. package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
  214. package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
  215. package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
  216. package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
  217. package/layer/app/oip-science/composables/usePubmed.ts +487 -0
  218. package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
  219. package/layer/app/oip-science/indexConfig.json +794 -0
  220. package/layer/app/oip-science/locales/en.json +483 -0
  221. package/layer/app/oip-science/locales/fr.json +483 -0
  222. package/layer/app/oip-science/science.css +1182 -0
  223. package/layer/app/oip-science/utils/a-openCard.ts +23 -0
  224. package/layer/app/oip-science/utils/b-openCard.ts +35 -0
  225. package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
  226. package/layer/app/oip-science/utils/f-types.ts +241 -0
  227. package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
  228. package/layer/app/oip-science/utils/matchMethod.ts +53 -0
  229. package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
  230. package/layer/app/oip-science/utils/sources.ts +15 -0
  231. package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
  232. package/layer/app/oip-science/utils/toPresets.ts +7 -0
  233. package/layer/app/oip-science/utils/valueTable.ts +126 -0
  234. package/layer/app/plugins/oip-science-i18n.ts +17 -0
  235. package/layer/app/utils/oipFicheRoutes.ts +118 -0
  236. package/layer/app/utils/oipResources.ts +440 -0
  237. package/layer/nuxt.config.ts +22 -2
  238. package/layer/public/reports/blincyto-has.html +292 -0
  239. package/layer/public/reports/blincyto-has.pdf +0 -0
  240. package/layer/public/reports/darzalex-has.html +279 -0
  241. package/layer/public/reports/darzalex-has.pdf +0 -0
  242. package/layer/public/reports/dupixent-has.html +217 -0
  243. package/layer/public/reports/dupixent-has.pdf +0 -0
  244. package/layer/public/reports/enhertu-has.html +283 -0
  245. package/layer/public/reports/enhertu-has.pdf +0 -0
  246. package/layer/public/reports/has-sein-2023.html +1639 -0
  247. package/layer/public/reports/ibrance-has.html +280 -0
  248. package/layer/public/reports/ibrance-has.pdf +0 -0
  249. package/layer/public/reports/imfinzi-has.html +297 -0
  250. package/layer/public/reports/imfinzi-has.pdf +0 -0
  251. package/layer/public/reports/keytruda-has.html +337 -0
  252. package/layer/public/reports/keytruda-has.pdf +0 -0
  253. package/layer/public/reports/kisqali-has.html +202 -0
  254. package/layer/public/reports/kisqali-has.pdf +0 -0
  255. package/layer/public/reports/opdivo-has.html +232 -0
  256. package/layer/public/reports/opdivo-has.pdf +0 -0
  257. package/layer/public/reports/ozempic-has.html +188 -0
  258. package/layer/public/reports/ozempic-has.pdf +0 -0
  259. package/layer/public/reports/tecentriq-has.html +315 -0
  260. package/layer/public/reports/tecentriq-has.pdf +0 -0
  261. package/layer/public/reports/yescarta-has.html +275 -0
  262. package/layer/public/reports/yescarta-has.pdf +0 -0
  263. package/layer/server/api/oip/es.post.ts +99 -0
  264. package/layer/server/api/oip/pdf.get.ts +70 -0
  265. package/layer/server/api/oip/reports.get.ts +98 -0
  266. package/layer/server/api/oip/resource-types.get.ts +22 -0
  267. package/package.json +1 -1
@@ -0,0 +1,273 @@
1
+ <!--
2
+ Carte d'un essai CT.gov (NCT), 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.study_first_posted_date, 'date')"
11
+ :count-label="$t('oipScience.common.firstPosted')"
12
+ :count-extra="[$t('oipScience.common.lastUpdate'), ifNoRes(data.updated_at, 'date')]"
13
+ :lang="lang"
14
+ :link="detailsUrl"
15
+ @click="openCard($event, nav, 'ClinicalTrialsNCT', data.nct_id)"
16
+ >
17
+ <template #code>
18
+ <RmCopyCode v-if="data.nct_id" :value="data.nct_id" :lang="lang" />
19
+ <template v-if="linkedEuct">
20
+ <RmCopyCode label="EUCT" :value="linkedEuct.euct_number" :lang="lang" />
21
+ <OipScienceClinicalTrialsPairBadge />
22
+ </template>
23
+ </template>
24
+
25
+ <template #title>
26
+ <RmTextHighlight
27
+ :queries="getSearchHighlight"
28
+ :text="ifNoRes(data.official_title)"
29
+ />
30
+ </template>
31
+
32
+ <template #actions>
33
+ <component
34
+ :is="projectButton"
35
+ v-if="projectButton"
36
+ :resource-id="data.nct_id"
37
+ type="ClinicalTrialsNCT"
38
+ :label="data.official_title"
39
+ compact
40
+ />
41
+ </template>
42
+
43
+ <template #meta>
44
+ <RmTag :variant="setColorStatus(data.overall_status)">
45
+ {{ ifNoRes(data.overall_status) }}
46
+ </RmTag>
47
+ <RmTag v-if="data.study_type">{{ data.study_type }}</RmTag>
48
+ <RmTag v-if="data.phase && data.phase != 'Not Applicable'" variant="violet">
49
+ {{ data.phase }}
50
+ </RmTag>
51
+ <slot name="extra" />
52
+ </template>
53
+
54
+ <!-- BODY : seul, ou colonne gauche d'une carte double. -->
55
+ <component
56
+ :is="linkedEuct ? PairBody : 'div'"
57
+ v-bind="linkedEuct ? { kind: 'euct', linked: linkedEuct, queries: getSearchHighlight } : {}"
58
+ >
59
+ <div class="oip_grid gap-16">
60
+ <OipScienceCommonTableTags
61
+ :isShortFirstColumn="true"
62
+ icon="FaceMask"
63
+ :title="$t('oipScience.common.conditions')"
64
+ :values="data.conditions?.map((val) => val.condition_name_en) || []"
65
+ :highlightQueries="getSearchHighlight"
66
+ :isFullResults="false"
67
+ ></OipScienceCommonTableTags>
68
+
69
+ <OipScienceCommonTableTags
70
+ v-if="prefs.interventions"
71
+ :isShortFirstColumn="true"
72
+ icon="Clipboard"
73
+ :title="$t('oipScience.common.interventions')"
74
+ :values="
75
+ data.intervention?.map((val) => val.intervention_name) || []
76
+ "
77
+ :highlightQueries="getSearchHighlight"
78
+ :isFullResults="false"
79
+ ></OipScienceCommonTableTags>
80
+ <OipScienceCommonTableTags
81
+ v-if="prefs.countries"
82
+ :isShortFirstColumn="true"
83
+ icon="Globe"
84
+ :title="$t('oipScience.cards.countries')"
85
+ :values="
86
+ data.countries?.map((val) =>
87
+ getCountryEmoji(ifNoRes(val.countries_name))
88
+ ) || []
89
+ "
90
+ :highlightQueries="getSearchHighlight"
91
+ :isFullResults="false"
92
+ ></OipScienceCommonTableTags>
93
+ <OipScienceCommonTableTags
94
+ v-if="prefs.sponsors"
95
+ :isShortFirstColumn="true"
96
+ icon="Briefcase"
97
+ :title="$t('oipScience.common.sponsors')"
98
+ :values="data.sponsors?.map((val) => val.sponsor_name) || []"
99
+ :highlightQueries="getSearchHighlight"
100
+ :isFullResults="false"
101
+ ></OipScienceCommonTableTags>
102
+
103
+ <OipScienceCommonTableTags
104
+ v-if="prefs.enrollment && data.enrollment != null"
105
+ :isShortFirstColumn="true"
106
+ icon="ListBullets"
107
+ :title="$t('oipScience.cards.enrollment')"
108
+ :values="[ifNoRes(data.enrollment, 'number')]"
109
+ :isFullResults="false"
110
+ ></OipScienceCommonTableTags>
111
+ <OipScienceCommonTableTags
112
+ v-if="prefs.rare && getRareDiseases.length > 0"
113
+ :isShortFirstColumn="true"
114
+ icon="Bandaids"
115
+ :title="$t('oipScience.common.rareDiseases')"
116
+ :values="getRareDiseases"
117
+ :highlightQueries="getSearchHighlight"
118
+ :isFullResults="false"
119
+ ></OipScienceCommonTableTags>
120
+
121
+ <OipScienceCommonTableTags
122
+ v-if="prefs.oncoIcd10 && (getIcd10.length > 0)"
123
+ icon="FaceMask"
124
+ :title="$t('oipScience.common.oncologyIcd10')"
125
+ :values="getIcd10"
126
+ :highlightQueries="getSearchHighlight"
127
+ :isFullResults="false"
128
+ :result-size-limit="2"
129
+ ></OipScienceCommonTableTags>
130
+ <OipScienceCommonTableTags
131
+ v-if="prefs.oncoTerms && (getOncoTerms.length > 0)"
132
+ icon="ListMagnifyingGlass"
133
+ :title="$t('oipScience.common.oncologyTerms')"
134
+ :values="getOncoTerms"
135
+ :highlightQueries="getSearchHighlight"
136
+ :isFullResults="false"
137
+ :result-size-limit="2"
138
+ ></OipScienceCommonTableTags>
139
+ </div>
140
+ </component>
141
+
142
+ <!-- Ce que la recherche a reellement matche, extraits compris : souvent
143
+ dans un texte que la carte ne montre pas. -->
144
+ <OipScienceElasticMatchExplain :match="data._match" />
145
+
146
+ <template #footer>
147
+ <div class="oip_grid gap-8">
148
+ <OipScienceCommonSource :sources="linkedEuct ? ['CT.gov', 'EUCT'] : ['CT.gov']" :lang="lang" />
149
+ </div>
150
+ </template>
151
+ </RmResultCard>
152
+ </template>
153
+
154
+ <script setup lang="ts">
155
+ import type { PropType } from 'vue';
156
+ import PairBody from './PairBody.vue';
157
+ import {
158
+ ifNoRes,
159
+ setColorStatus,
160
+ getCountryEmoji,
161
+ removeDuplicate,
162
+ dedupNormalized,
163
+ } from '../../../oip-science/utils/styleAndFormat';
164
+ import { openCard } from '../../../oip-science/utils/b-openCard';
165
+
166
+ // Types de France Augmented Science (types/ClinicalTrials) : pas portes.
167
+ type ClinicalTrial = any;
168
+ type ClinicalTrialGenomic = any;
169
+ type ClinicalTrialRareDisease = any;
170
+
171
+
172
+ const props = defineProps({
173
+ data: {
174
+ type: Object as PropType<ClinicalTrial>,
175
+ // Rangees en plus (« Personnaliser » de FAS, store cardPrefs) : hors de FAS, celles par defaut.
176
+ default: () => ({}),
177
+ },
178
+ /**
179
+ * L'essai EUCT qui cite ce numero NCT (useLinkedTrials) : la carte devient
180
+ * double. `null` : pas de jumeau ; absent : pas encore charge.
181
+ */
182
+ linkedEuct: {
183
+ type: Object as PropType<any | null>,
184
+ default: undefined,
185
+ },
186
+ /** Termes de la recherche a surligner (filterStore dans FAS). */
187
+ highlight: {
188
+ type: Array as PropType<string[]>,
189
+ default: () => [],
190
+ },
191
+ /** Rangees choisies (store cardPrefs de FAS) ; a defaut, celles par defaut. */
192
+ prefs: {
193
+ type: Object as PropType<Record<string, boolean>>,
194
+ default: () => ({ interventions: true, sponsors: true, enrollment: true }),
195
+ },
196
+ });
197
+
198
+ const nav = useOipResourceNav();
199
+ const { projectButton } = useOipResourceHooks();
200
+
201
+ const getGenomicsSymbols = computed(() => {
202
+ if (!props.data.genomics) return [];
203
+ return props.data.genomics.map((g: ClinicalTrialGenomic) => g.symbol);
204
+ });
205
+
206
+ const getRareDiseases = computed(() => {
207
+ return removeDuplicate(
208
+ (props.data.rare_diseases &&
209
+ props.data.rare_diseases.map(
210
+ (res: ClinicalTrialRareDisease) => res.concat_disease_name_orpha_code
211
+ )) ??
212
+ []
213
+ );
214
+ });
215
+
216
+ const getSearchHighlight = computed(() => props.highlight);
217
+
218
+ const { locale } = useI18n();
219
+ const lang = computed(() => (locale.value === 'en' ? 'en' : 'fr'));
220
+ const detailsUrl = computed(() =>
221
+ props.data.nct_id ? nav.href('ClinicalTrialsNCT', props.data.nct_id) : '',
222
+ );
223
+
224
+ const getIcd10 = computed(() => {
225
+ const icd10List = props.data.diseases
226
+ ?.map((d: any) => d.icd10?.map((y: any) => y.combined_label))
227
+ .flat()
228
+ // dedupNormalized collapses case + singular/plural duplicates
229
+ // (Cancer/cancer, Neoplasms/Neoplasm) so the tag list stays tight.
230
+ return dedupNormalized(icd10List || []);
231
+ })
232
+
233
+ const getOncoTerms = computed(() => {
234
+ const icd10List = props.data.diseases
235
+ ?.map((d: any) => d.section?.map((y: any) => y.label))
236
+ .flat()
237
+ return dedupNormalized(icd10List || []);
238
+ })
239
+ </script>
240
+
241
+ <style scoped>
242
+ /* Les dates prennent la place du compteur : une date longue ne tient pas
243
+ dans la colonne de 128px ni en 32px. */
244
+ .ct_card :deep(.rm-rcard__count) {
245
+ flex-basis: 176px;
246
+ align-items: flex-start;
247
+ text-align: left;
248
+ }
249
+ .ct_card :deep(.rm-rcard__count-value) {
250
+ font-size: 16px;
251
+ white-space: nowrap;
252
+ }
253
+ /* Libelle au-dessus de sa date, et "Last update" dans le meme style que
254
+ "First posted" : countExtra porte [libellé, date]. */
255
+ .ct_card :deep(.rm-rcard__count-label) { order: 1; font-size: 10px; }
256
+ .ct_card :deep(.rm-rcard__count-value) { order: 2; }
257
+ .ct_card :deep(.rm-rcard__count-extra) { order: 3; }
258
+ .ct_card :deep(.rm-rcard__count-extra:nth-child(3)) {
259
+ margin-top: 10px;
260
+ color: var(--text-muted);
261
+ font-size: 10px;
262
+ font-weight: var(--weight-semibold);
263
+ letter-spacing: 0.08em;
264
+ text-transform: uppercase;
265
+ }
266
+ .ct_card :deep(.rm-rcard__count-extra:nth-child(4)) {
267
+ margin-top: var(--space-2);
268
+ font-size: 16px;
269
+ font-weight: var(--weight-bold);
270
+ line-height: 1.1;
271
+ white-space: nowrap;
272
+ }
273
+ </style>
@@ -0,0 +1,366 @@
1
+ <!--
2
+ Essais lies a une fiche (professionnel, etablissement, publication, centre
3
+ ou investigateur d'un registre). Les essais sont charges en entier et rendus
4
+ avec les cartes des pages /ctgov et /euct ; un essai present dans les deux
5
+ registres n'apparait qu'une fois, en carte double sur sa carte NCT.
6
+ Filtres locaux (source, statut, maladies rares, CIM-10, termes
7
+ oncologiques), recherche texte et affichage par paquets.
8
+ -->
9
+ <template>
10
+ <div class="oip-science">
11
+ <div v-if="!loading && !isLoadingDocs" class="oip_grid gap-16">
12
+ <RmFilterBar
13
+ v-if="rows.length"
14
+ class="fbar_top"
15
+
16
+ :filters-amount="activeFiltersCount"
17
+ :lang="lang"
18
+ @clear-filters="clearAllFilters"
19
+ >
20
+ <template #Search>
21
+ <RmSearchBar
22
+ v-model="searchText"
23
+ :placeholder="$t('oipScience.common.searchHcpTrials')"
24
+ :have-advanced="false"
25
+ />
26
+ </template>
27
+ <template #Filters>
28
+ <RmDropdownSelect
29
+ v-if="hasBothSources"
30
+ :label="$t('oipScience.common.source')"
31
+ :options="SOURCE_OPTIONS"
32
+ v-model="filterSource"
33
+ :search="false"
34
+ :lang="lang"
35
+ />
36
+ <RmMultipleSelect
37
+ :label="$t('oipScience.common.status')"
38
+ :options="statusOptions"
39
+ v-model="filterStatus"
40
+ :show-all="true"
41
+ :search="false"
42
+ :lang="lang"
43
+ />
44
+ <RmMultipleSelect
45
+ v-if="rareDiseasesOptions.length"
46
+ :label="$t('oipScience.common.rareDiseases')"
47
+ :options="rareDiseasesOptions"
48
+ v-model="filterRareDiseases"
49
+ :show-all="true"
50
+ :search="true"
51
+ :lang="lang"
52
+ />
53
+ <RmMultipleSelect
54
+ v-if="icd10Options.length"
55
+ :label="$t('oipScience.common.oncologyIcd10')"
56
+ :options="icd10Options"
57
+ v-model="filterIcd10"
58
+ :show-all="true"
59
+ :search="true"
60
+ :lang="lang"
61
+ />
62
+ <RmMultipleSelect
63
+ v-if="oncoTermsOptions.length"
64
+ :label="$t('oipScience.common.oncologyTerms')"
65
+ :options="oncoTermsOptions"
66
+ v-model="filterOncoTerms"
67
+ :show-all="true"
68
+ :search="true"
69
+ :lang="lang"
70
+ />
71
+ </template>
72
+ </RmFilterBar>
73
+
74
+ <RmResultsLine icon="Flask" :items="[{ count: filtered.length, label: $t('oipScience.resultKpis.trials', filtered.length) }]" />
75
+ <div class="oip_grid gap-8">
76
+ <template v-for="row in visible" :key="row.id">
77
+ <OipScienceClinicalTrialsCardsGlobal
78
+ v-if="row.kind === 'nct'"
79
+ :data="row.doc"
80
+ :linked-euct="row.linked"
81
+ :highlight="highlight"
82
+ >
83
+ <template #extra>
84
+ <RmTag v-if="row.extra?.role" variant="gray">{{ row.extra.role }}</RmTag>
85
+ <OipScienceCommonScoreBadge :score="row.extra?.score" />
86
+ </template>
87
+ </OipScienceClinicalTrialsCardsGlobal>
88
+ <OipScienceClinicalTrialsCards v-else :data="row.doc" :linked-nct="row.linked" :highlight="highlight">
89
+ <template #extra>
90
+ <RmTag v-if="row.extra?.role" variant="gray">{{ row.extra.role }}</RmTag>
91
+ <OipScienceCommonScoreBadge :score="row.extra?.score" />
92
+ </template>
93
+ </OipScienceClinicalTrialsCards>
94
+ </template>
95
+ </div>
96
+
97
+ <RmEmptyState v-if="!filtered.length" :title="$t('oipScience.common.noMatchingResult')" />
98
+ <RmButton
99
+ v-if="visible.length < filtered.length"
100
+ variant="secondary"
101
+ class="load_more"
102
+ @click="displayCount += PAGE_SIZE"
103
+ >{{ $t('oipScience.common.loadMore') }}</RmButton>
104
+ </div>
105
+ <RmLoadingState v-else :lines="3" :chart-height="240" />
106
+ </div>
107
+ </template>
108
+
109
+ <script setup lang="ts">
110
+ import indexConfig from '../../../oip-science/indexConfig.json';
111
+ import useOipElastic from '../../../oip-science/composables/useOipElastic';
112
+ import { useLinkedTrials } from '../../../oip-science/composables/useLinkedTrials';
113
+
114
+ /** Ce que la fiche sait d'un essai en plus de l'essai lui-meme. */
115
+ export type LinkedTrialExtra = { score?: number | null; role?: string | null };
116
+
117
+ type Row = {
118
+ id: string;
119
+ kind: 'nct' | 'euct';
120
+ doc: any;
121
+ /** Essai jumeau de l'autre registre, si connu. */
122
+ linked: any | null;
123
+ extra: LinkedTrialExtra | undefined;
124
+ date: number;
125
+ };
126
+
127
+ const props = withDefaults(
128
+ defineProps<{
129
+ nctIds?: string[];
130
+ euctIds?: string[];
131
+ /** Par numero d'essai (NCT ou EUCT). */
132
+ extras?: Record<string, LinkedTrialExtra>;
133
+ title: string;
134
+ sources: string[];
135
+ indexLastUpdate: string;
136
+ loading?: boolean;
137
+ /** Termes a surligner dans les cartes (filterStore dans FAS). */
138
+ highlight?: string[];
139
+ }>(),
140
+ { nctIds: () => [], euctIds: () => [], extras: () => ({}), loading: false, highlight: () => [] },
141
+ );
142
+
143
+ const { locale } = useI18n();
144
+ const lang = computed<'fr' | 'en'>(() => (locale.value === 'en' ? 'en' : 'fr'));
145
+ const { queryCustomElastic } = useOipElastic();
146
+ const { linked: linkedEuct, load: loadLinkedEuct } = useLinkedTrials('euct');
147
+ const { linked: linkedNct, load: loadLinkedNct } = useLinkedTrials('nct');
148
+
149
+ const nctDocs = ref<any[]>([]);
150
+ const euctDocs = ref<any[]>([]);
151
+ const isLoadingDocs = ref(false);
152
+
153
+ async function loadDocs() {
154
+ const nctIds = [...new Set(props.nctIds.filter(Boolean))];
155
+ const euctIds = [...new Set(props.euctIds.filter(Boolean))];
156
+ if (!nctIds.length && !euctIds.length) {
157
+ nctDocs.value = [];
158
+ euctDocs.value = [];
159
+ return;
160
+ }
161
+ isLoadingDocs.value = true;
162
+ try {
163
+ const [nctRes, euctRes] = await Promise.all([
164
+ nctIds.length
165
+ ? queryCustomElastic({
166
+ index: indexConfig.globalCT.index,
167
+ cluster: indexConfig.globalCT.cluster,
168
+ customQuery: { size: nctIds.length, query: { ids: { values: nctIds } } },
169
+ })
170
+ : Promise.resolve({ results: [] }),
171
+ euctIds.length
172
+ ? queryCustomElastic({
173
+ index: indexConfig.euct.index,
174
+ cluster: indexConfig.euct.cluster,
175
+ customQuery: {
176
+ size: euctIds.length,
177
+ query: { terms: { 'euct_number.keyword': euctIds } },
178
+ },
179
+ })
180
+ : Promise.resolve({ results: [] }),
181
+ ]);
182
+ nctDocs.value = nctRes?.results || [];
183
+ euctDocs.value = euctRes?.results || [];
184
+ // Jumeaux hors de la liste, comme sur les pages de recherche.
185
+ await Promise.all([
186
+ loadLinkedEuct(nctDocs.value.map((d) => d.nct_id)),
187
+ loadLinkedNct(euctDocs.value.map((d) => d.nct_number)),
188
+ ]);
189
+ } catch (e) {
190
+ console.error(e);
191
+ } finally {
192
+ isLoadingDocs.value = false;
193
+ }
194
+ }
195
+
196
+ watch(() => [props.nctIds, props.euctIds], loadDocs, { immediate: true, deep: true });
197
+
198
+ const rows = computed<Row[]>(() => {
199
+ const euctByNct = new Map<string, any>();
200
+ for (const d of euctDocs.value) {
201
+ if (d?.nct_number) euctByNct.set(d.nct_number, d);
202
+ }
203
+ const out: Row[] = [];
204
+ const paired = new Set<string>();
205
+ for (const doc of nctDocs.value) {
206
+ const twin = euctByNct.get(doc.nct_id) || linkedEuct.value[doc.nct_id] || null;
207
+ if (twin?.euct_number) paired.add(twin.euct_number);
208
+ out.push({
209
+ id: doc.nct_id,
210
+ kind: 'nct',
211
+ doc,
212
+ linked: twin,
213
+ extra: props.extras[doc.nct_id],
214
+ date: new Date(doc.study_first_posted_date || doc.updated_at || 0).getTime(),
215
+ });
216
+ }
217
+ for (const doc of euctDocs.value) {
218
+ // L'essai est deja sur sa carte NCT.
219
+ if (paired.has(doc.euct_number)) continue;
220
+ out.push({
221
+ id: doc.euct_number,
222
+ kind: 'euct',
223
+ doc,
224
+ linked: doc.nct_number ? linkedNct.value[doc.nct_number] || null : null,
225
+ extra: props.extras[doc.euct_number],
226
+ date: new Date(doc.decision_date || doc.last_update_date || 0).getTime(),
227
+ });
228
+ }
229
+ return out.sort((a, b) => b.date - a.date);
230
+ });
231
+
232
+ // ::::: Filtres locaux
233
+ const SOURCE_OPTIONS = ['NCT', 'EUCT'];
234
+ const searchText = ref('');
235
+ const filterSource = ref<string | undefined>(undefined);
236
+ const filterStatus = ref<string[]>([]);
237
+ const filterRareDiseases = ref<string[]>([]);
238
+ const filterIcd10 = ref<string[]>([]);
239
+ const filterOncoTerms = ref<string[]>([]);
240
+
241
+ const hasBothSources = computed(
242
+ () => rows.value.some((r) => r.kind === 'nct') && rows.value.some((r) => r.kind === 'euct'),
243
+ );
244
+
245
+ const statusOf = (row: Row) =>
246
+ row.kind === 'nct' ? row.doc.overall_status : row.doc.global_status;
247
+
248
+ // Memes champs sur NCT et EUCT, en comptant le jumeau.
249
+ const rareDiseasesOf = (doc: any): string[] =>
250
+ Array.isArray(doc?.rare_diseases)
251
+ ? doc.rare_diseases.map((r: any) => r?.concat_disease_name_orpha_code).filter(Boolean)
252
+ : [];
253
+ const icd10Of = (doc: any): string[] =>
254
+ Array.isArray(doc?.diseases)
255
+ ? doc.diseases.flatMap((d: any) =>
256
+ (d?.icd10 || []).map((i: any) => i?.combined_label).filter(Boolean),
257
+ )
258
+ : [];
259
+ const oncoTermsOf = (doc: any): string[] =>
260
+ Array.isArray(doc?.diseases)
261
+ ? doc.diseases.flatMap((d: any) => (d?.section || []).map((s: any) => s?.label).filter(Boolean))
262
+ : [];
263
+ const bothSides = (row: Row, pick: (doc: any) => string[]) => [
264
+ ...pick(row.doc),
265
+ ...pick(row.linked),
266
+ ];
267
+ const collect = (pick: (doc: any) => string[]) =>
268
+ [...new Set(rows.value.flatMap((r) => bothSides(r, pick)))].sort();
269
+
270
+ const statusOptions = computed(() =>
271
+ [...new Set(rows.value.map(statusOf).filter((s) => s && s !== '-'))].sort(),
272
+ );
273
+ const rareDiseasesOptions = computed(() => collect(rareDiseasesOf));
274
+ const icd10Options = computed(() => collect(icd10Of));
275
+ const oncoTermsOptions = computed(() => collect(oncoTermsOf));
276
+
277
+ const activeFiltersCount = computed(
278
+ () =>
279
+ [
280
+ searchText.value,
281
+ filterSource.value,
282
+ filterStatus.value.length,
283
+ filterRareDiseases.value.length,
284
+ filterIcd10.value.length,
285
+ filterOncoTerms.value.length,
286
+ ].filter(Boolean).length,
287
+ );
288
+
289
+ const clearAllFilters = () => {
290
+ searchText.value = '';
291
+ filterSource.value = undefined;
292
+ filterStatus.value = [];
293
+ filterRareDiseases.value = [];
294
+ filterIcd10.value = [];
295
+ filterOncoTerms.value = [];
296
+ };
297
+
298
+ const searchableText = (row: Row) => {
299
+ const d = row.doc;
300
+ const l = row.linked || {};
301
+ return [
302
+ row.id,
303
+ l.euct_number,
304
+ l.nct_id,
305
+ d.official_title,
306
+ d.brief_title,
307
+ d.public_title,
308
+ l.official_title,
309
+ l.public_title,
310
+ statusOf(row),
311
+ d.phase,
312
+ d.trial_phase,
313
+ d.study_type,
314
+ row.extra?.role,
315
+ ...(d.sponsors || []).map((s: any) => s?.sponsor_name),
316
+ ...(d.co_sponsors || []).map((s: any) => s?.organisation?.name),
317
+ ...(d.intervention || []).map((i: any) => i?.intervention_name),
318
+ ...(d.products || []).map(
319
+ (p: any) =>
320
+ p?.productDictionaryInfo?.prodName || p?.productDictionaryInfo?.activeSubstanceName,
321
+ ),
322
+ ]
323
+ .filter(Boolean)
324
+ .join(' ')
325
+ .toLowerCase();
326
+ };
327
+
328
+ const filtered = computed(() => {
329
+ const hasAny = (values: string[], selected: string[]) =>
330
+ selected.some((v) => values.includes(v));
331
+ let out = rows.value;
332
+ if (filterSource.value) out = out.filter((r) => r.kind === filterSource.value?.toLowerCase());
333
+ if (filterStatus.value.length) out = out.filter((r) => filterStatus.value.includes(statusOf(r)));
334
+ if (filterRareDiseases.value.length) {
335
+ out = out.filter((r) => hasAny(bothSides(r, rareDiseasesOf), filterRareDiseases.value));
336
+ }
337
+ if (filterIcd10.value.length) {
338
+ out = out.filter((r) => hasAny(bothSides(r, icd10Of), filterIcd10.value));
339
+ }
340
+ if (filterOncoTerms.value.length) {
341
+ out = out.filter((r) => hasAny(bothSides(r, oncoTermsOf), filterOncoTerms.value));
342
+ }
343
+ const q = searchText.value.trim().toLowerCase();
344
+ if (q) out = out.filter((r) => searchableText(r).includes(q));
345
+ return out;
346
+ });
347
+
348
+ const PAGE_SIZE = 20;
349
+ const displayCount = ref(PAGE_SIZE);
350
+ const visible = computed(() => filtered.value.slice(0, displayCount.value));
351
+
352
+ watch(
353
+ [searchText, filterSource, filterStatus, filterRareDiseases, filterIcd10, filterOncoTerms],
354
+ () => {
355
+ displayCount.value = PAGE_SIZE;
356
+ },
357
+ { deep: true },
358
+ );
359
+ </script>
360
+
361
+ <style scoped>
362
+ .load_more {
363
+ align-self: center;
364
+ justify-self: center;
365
+ }
366
+ </style>
@@ -0,0 +1,25 @@
1
+ <!-- Repere d'une carte double : l'essai est enregistre dans CT.gov et EUCT. -->
2
+ <template>
3
+ <span class="ct_pair_badge" :data-tooltip="$t('oipScience.cards.pairTooltip')">
4
+ <RmIcon name="ArrowsLeftRight" :size="14" />
5
+ {{ $t('oipScience.cards.pairBadge') }}
6
+ </span>
7
+ </template>
8
+
9
+ <style scoped>
10
+ /* A la hauteur des codes copiables, dans le violet clair du bandeau de projet. */
11
+ .ct_pair_badge {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ gap: var(--space-4);
15
+ padding: var(--space-2) var(--space-8);
16
+ border: 1px solid color-mix(in srgb, var(--rm-shell-accent) 40%, transparent);
17
+ border-radius: var(--radius-sm);
18
+ background: color-mix(in srgb, var(--rm-shell-accent) 16%, var(--rm-shell-surface));
19
+ color: var(--color-primary);
20
+ font-size: var(--font-13);
21
+ font-weight: var(--weight-semibold);
22
+ line-height: 1.4;
23
+ cursor: help;
24
+ }
25
+ </style>