@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,40 @@
1
+ <!--
2
+ Le lien du tiroir vers la fiche dans son app d'origine, pose sous le titre
3
+ du bandeau : « Ouvrir la page » dans l'app d'origine elle-meme (navigation
4
+ sur place, le tiroir se ferme), « Ouvrir dans <app> » ailleurs (onglet).
5
+ -->
6
+ <template>
7
+ <template v-if="origin">
8
+ <NuxtLink v-if="origin.local" :to="origin.url" class="oip-rdl" @click="emit('leave')">
9
+ {{ lang === "en" ? "Open the page" : "Ouvrir la page" }}
10
+ <RmIcon name="ArrowSquareOut" :size="14" />
11
+ </NuxtLink>
12
+ <a v-else :href="origin.url" target="_blank" rel="noopener" class="oip-rdl">
13
+ {{ lang === "en" ? `Open in ${origin.name}` : `Ouvrir dans ${origin.name}` }}
14
+ <RmIcon name="ArrowSquareOut" :size="14" />
15
+ </a>
16
+ </template>
17
+ </template>
18
+
19
+ <script setup lang="ts">
20
+ defineProps<{
21
+ origin: { local: boolean; url: string; name: string } | null;
22
+ lang?: "fr" | "en";
23
+ }>();
24
+ const emit = defineEmits<{ leave: [] }>();
25
+ </script>
26
+
27
+ <style scoped>
28
+ .oip-rdl {
29
+ display: inline-flex;
30
+ align-items: center;
31
+ gap: var(--space-4);
32
+ width: fit-content;
33
+ margin-top: var(--space-4);
34
+ color: var(--color-primary);
35
+ font-family: var(--font-sans);
36
+ font-size: var(--font-12);
37
+ font-weight: 400;
38
+ text-decoration: underline;
39
+ }
40
+ </style>
@@ -0,0 +1,41 @@
1
+ <!--
2
+ Un champ texte d'une fiche de ressource : son intitule, puis sa valeur,
3
+ surlignee par la recherche en cours. Rendu des fiches de France Augmented
4
+ Science (anciennement CommonForm), partage par les vues du layer.
5
+ -->
6
+ <template>
7
+ <div class="oip-rf">
8
+ <p class="oip-rf__label">{{ label }}</p>
9
+ <RmTextHighlight class="oip-rf__value" :queries="highlight" :text="text" :lang="lang" />
10
+ </div>
11
+ </template>
12
+
13
+ <script setup lang="ts">
14
+ withDefaults(
15
+ defineProps<{
16
+ label: string;
17
+ text: string;
18
+ highlight?: string[];
19
+ lang?: "fr" | "en";
20
+ }>(),
21
+ { highlight: () => [], lang: "fr" },
22
+ );
23
+ </script>
24
+
25
+ <style scoped>
26
+ .oip-rf {
27
+ display: grid;
28
+ gap: var(--space-4);
29
+ }
30
+ .oip-rf__label {
31
+ margin: 0;
32
+ color: var(--text-primary);
33
+ font-size: var(--font-12);
34
+ line-height: 14px;
35
+ }
36
+ .oip-rf__value {
37
+ color: var(--text-primary);
38
+ font-size: var(--font-14);
39
+ line-height: 160%;
40
+ }
41
+ </style>
@@ -0,0 +1,54 @@
1
+ <!--
2
+ La carte d'une ressource que le layer n'a pas de vue pour montrer : famille,
3
+ icone, titre et sous-titre, tels que le registre des types de l'API les
4
+ decrit (`display`). Un type ajoute au registre s'affiche ainsi dans toutes
5
+ les apps, sans attendre une vue a lui.
6
+ -->
7
+ <template>
8
+ <RmLoadingState v-if="pending" spinner />
9
+ <RmResultCard v-else :actions="false" :lang="lang">
10
+ <template #title>
11
+ <span class="oip-rg__title">
12
+ <RmIcon :name="display?.icon || 'File'" :size="16" />
13
+ {{ heading }}
14
+ </span>
15
+ </template>
16
+ <template v-if="subtitle || family" #subtitle>{{ [family, subtitle].filter(Boolean).join(" · ") }}</template>
17
+ </RmResultCard>
18
+ </template>
19
+
20
+ <script setup lang="ts">
21
+ import { oipFirstTemplate, oipJoinTemplates } from "../utils/oipResources";
22
+ import { useOipResourceTypes } from "../composables/useOipResources";
23
+
24
+ const props = withDefaults(
25
+ defineProps<{
26
+ type: string;
27
+ id: string;
28
+ title?: string;
29
+ source?: Record<string, unknown> | null;
30
+ lang?: "fr" | "en";
31
+ }>(),
32
+ { title: "", source: null, lang: "fr" },
33
+ );
34
+
35
+ const { data: entry, pending } = useAsyncData(
36
+ () => `oip-resource-type-${props.type}`,
37
+ async () => (await useOipResourceTypes()).find((e) => e.key === props.type) ?? null,
38
+ { server: false, watch: [() => props.type] },
39
+ );
40
+
41
+ const display = computed(() => entry.value?.display ?? null);
42
+ const doc = computed(() => props.source ?? {});
43
+ const heading = computed(() => oipFirstTemplate(display.value?.title, doc.value, props.id) || props.title || props.id);
44
+ const subtitle = computed(() => oipJoinTemplates(display.value?.subtitle, doc.value, props.id));
45
+ const family = computed(() => display.value?.label?.[props.lang] || entry.value?.label || props.type);
46
+ </script>
47
+
48
+ <style scoped>
49
+ .oip-rg__title {
50
+ display: inline-flex;
51
+ align-items: center;
52
+ gap: var(--space-8);
53
+ }
54
+ </style>
@@ -0,0 +1,50 @@
1
+ <!--
2
+ La ligne « Source » d'une fiche de ressource : fournisseur, jeu de donnees et
3
+ date de la fiche Directus, lus par /api/oip/sources. Le clic ouvre le
4
+ panneau Sources de l'app sur cette fiche (cf. useOipResourceHooks).
5
+ -->
6
+ <template>
7
+ <RmSourceLine
8
+ v-if="source"
9
+ tone="primary"
10
+ :source="name"
11
+ :verified="source.latest_download_date || undefined"
12
+ :lang="lang"
13
+ @click="onClick"
14
+ />
15
+ </template>
16
+
17
+ <script setup lang="ts">
18
+ import { useOipResourceHooks } from "../composables/useOipResourceHooks";
19
+
20
+ const props = withDefaults(defineProps<{ uuid: string; lang?: "fr" | "en" }>(), { lang: "fr" });
21
+ const emit = defineEmits<{ open: [uuid: string] }>();
22
+ const hooks = useOipResourceHooks();
23
+
24
+ const { data } = useFetch<{ sources: any[] }>("/api/oip/sources", {
25
+ method: "POST",
26
+ body: computed(() => ({ uuids: [props.uuid] })),
27
+ key: computed(() => `oip-resource-source-${props.uuid}`),
28
+ server: false,
29
+ });
30
+ const source = computed(() => data.value?.sources?.[0] ?? null);
31
+
32
+ /** Traduction dans la langue, sinon la premiere. */
33
+ function translated(list: any[] | undefined, field: string): string {
34
+ const rows = list ?? [];
35
+ const row = rows.find((r) => String(r?.languages_code ?? "").startsWith(props.lang)) ?? rows[0];
36
+ return row?.[field] ?? "";
37
+ }
38
+
39
+ /** « Fournisseur - Jeu de donnees », comme les fiches de France Augmented Science. */
40
+ const name = computed(() => {
41
+ const provider = translated(source.value?.provider?.translations, "provider_name");
42
+ const dataset = translated(source.value?.translations, "source_name");
43
+ return [provider, dataset].filter(Boolean).join(" - ") || source.value?.Nickname || "";
44
+ });
45
+
46
+ function onClick() {
47
+ emit("open", props.uuid);
48
+ hooks.openSource?.(props.uuid);
49
+ }
50
+ </script>
@@ -0,0 +1,65 @@
1
+ <!--
2
+ Une liste d'etiquettes d'une fiche de ressource (types d'article, termes
3
+ MeSH...) : icone et intitule, puis les valeurs, surlignees par la recherche
4
+ en cours. Rendu des fiches de France Augmented Science (anciennement
5
+ CommonTableTags, en colonne), partage par les vues du layer.
6
+ -->
7
+ <template>
8
+ <div class="oip-rt">
9
+ <div class="oip-rt__head">
10
+ <RmIcon v-if="icon" :name="icon" :size="12" color="var(--text-muted)" />
11
+ <p class="oip-rt__label">{{ label }}</p>
12
+ </div>
13
+ <div v-if="values.length" class="oip-rt__tags">
14
+ <RmTag v-for="(value, index) in values" :key="index" variant="gray">
15
+ <RmTextHighlight :queries="highlight" :text="value" :lang="lang" />
16
+ </RmTag>
17
+ </div>
18
+ <p v-else class="oip-rt__empty">
19
+ {{ lang === "en" ? `No ${label.toLowerCase()}` : `Aucun élément (${label.toLowerCase()})` }}
20
+ </p>
21
+ </div>
22
+ </template>
23
+
24
+ <script setup lang="ts">
25
+ withDefaults(
26
+ defineProps<{
27
+ label: string;
28
+ values: string[];
29
+ icon?: string;
30
+ highlight?: string[];
31
+ lang?: "fr" | "en";
32
+ }>(),
33
+ { icon: "", highlight: () => [], lang: "fr" },
34
+ );
35
+ </script>
36
+
37
+ <style scoped>
38
+ .oip-rt {
39
+ display: grid;
40
+ gap: var(--space-4);
41
+ }
42
+ .oip-rt__head {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: var(--space-4);
46
+ }
47
+ .oip-rt__label {
48
+ margin: 0;
49
+ color: var(--text-muted);
50
+ font-size: var(--font-12);
51
+ font-weight: 500;
52
+ }
53
+ .oip-rt__tags {
54
+ display: flex;
55
+ flex-wrap: wrap;
56
+ align-items: center;
57
+ gap: var(--space-8);
58
+ }
59
+ .oip-rt__empty {
60
+ margin: 0;
61
+ color: var(--text-secondary);
62
+ font-size: var(--font-12);
63
+ font-style: italic;
64
+ }
65
+ </style>
@@ -0,0 +1,107 @@
1
+ <!--
2
+ Une fiche de ressource entiere, ses onglets compris, telle que son app
3
+ d'origine la montre : un seul bandeau (titre, lien vers l'app d'origine
4
+ sous le titre, onglets), puis l'onglet actif. Montee par le tiroir des
5
+ projets (cf. OipResourceDrawer) ; les pages de l'app d'origine montent
6
+ directement l'onglet de leur route.
7
+ -->
8
+ <template>
9
+ <div class="oip-rv" :class="{ 'oip-rv--whole': wholeView }">
10
+ <!-- Fiche d'un seul tenant (fr_drugs_app) : elle porte son bandeau et ses onglets. -->
11
+ <component
12
+ :is="wholeView"
13
+ v-if="wholeView"
14
+ :key="`${type}-${id}`"
15
+ :id="id"
16
+ :type="type"
17
+ :highlight="highlight"
18
+ :lang="lang"
19
+ >
20
+ <template #title-link><slot name="title-link" /></template>
21
+ </component>
22
+ <template v-else>
23
+ <RmPageHeader
24
+ :tabs="tabs.length > 1 ? headerTabs : []"
25
+ :tabs-label="en ? 'Record sections' : 'Sections de la fiche'"
26
+ @tab="active = $event"
27
+ >
28
+ <template #title>
29
+ <span class="oip-rv__title">{{ title || id }}</span>
30
+ <slot name="title-link" />
31
+ </template>
32
+ </RmPageHeader>
33
+ <component
34
+ :is="current.component"
35
+ v-if="current"
36
+ :key="`${type}-${id}-${current.key}`"
37
+ class="oip-rv__body"
38
+ :id="routeId"
39
+ :highlight="highlight"
40
+ :lang="lang"
41
+ @source="emit('source', $event)"
42
+ />
43
+ </template>
44
+ </div>
45
+ </template>
46
+
47
+ <script setup lang="ts">
48
+ import { oipResourceViewSpec } from "../utils/oipResources";
49
+ import { oipResourceTabComponent, oipResourceViewComponent } from "../composables/useOipResourceViews";
50
+
51
+ const props = withDefaults(
52
+ defineProps<{
53
+ type: string;
54
+ id: string;
55
+ /** Titre du bandeau (celui de la ligne du projet, ou relu). */
56
+ title?: string;
57
+ /** Onglet ouvert d'abord. Absent : le premier. */
58
+ tab?: string;
59
+ highlight?: string[];
60
+ lang?: "fr" | "en";
61
+ }>(),
62
+ { title: "", tab: "", highlight: () => [], lang: "fr" },
63
+ );
64
+
65
+ const emit = defineEmits<{ source: [uuid: string] }>();
66
+
67
+ const en = computed(() => props.lang === "en");
68
+
69
+ /** La fiche du type, ou de celui dont il est l'alias (essais ranges par fr_drugs_app). */
70
+ const spec = computed(() => oipResourceViewSpec(props.type));
71
+
72
+ const wholeView = computed(() => (spec.value?.view ? oipResourceViewComponent(spec.value.view) : null));
73
+
74
+ /** L'identifiant que les onglets lisent, celui des routes de l'app d'origine. */
75
+ const routeId = computed(() => spec.value?.routeId(props.id) ?? props.id);
76
+
77
+ const tabs = computed(() =>
78
+ (spec.value?.tabs ?? [])
79
+ .map((tab) => ({ ...tab, component: oipResourceTabComponent(spec.value!.type, tab.key) }))
80
+ .filter((tab) => tab.component),
81
+ );
82
+
83
+ const active = ref(props.tab);
84
+ watch(
85
+ () => [props.type, props.id, props.tab] as const,
86
+ () => (active.value = props.tab),
87
+ );
88
+
89
+ const current = computed(() => tabs.value.find((tab) => tab.key === active.value) ?? tabs.value[0] ?? null);
90
+
91
+ const headerTabs = computed(() =>
92
+ tabs.value.map((tab) => ({ key: tab.key, label: tab.label[props.lang], active: tab.key === current.value?.key })),
93
+ );
94
+ </script>
95
+
96
+ <style scoped>
97
+ .oip-rv__title {
98
+ display: block;
99
+ }
100
+ /* Les gouttieres de la colonne de contenu, rendues au contenu seul : le
101
+ bandeau, lui, reste bord a bord comme dans la page. */
102
+ .oip-rv__body {
103
+ box-sizing: border-box;
104
+ margin-top: var(--space-24);
105
+ padding: 0 var(--space-24) var(--space-32);
106
+ }
107
+ </style>