@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,126 @@
1
+ /**
2
+ * valueTable - un tableau Auriga rendu par RmTable.
3
+ *
4
+ * Les analyses du portail construisent leurs tableaux comme `arg-table` les
5
+ * attendait : une liste de libelles de tete, et des lignes `{ values: [...] }`
6
+ * dans le meme ordre. RmTable, lui, lit des colonnes nommees et des lignes
7
+ * indexees par ces noms. La conversion est mecanique : elle vit ici plutot que
8
+ * recopiee dans chaque composant, et le calcul des valeurs reste ou il est.
9
+ *
10
+ * Les colonnes portent des cles positionnelles (`c0`, `c1`...) : les libelles
11
+ * de tete sont traduits et ne font pas des cles stables. `valueKeys` donne les
12
+ * colonnes de valeurs, celles dont le composant rend le contenu par un slot.
13
+ *
14
+ * `types` reprend `column-type` d'`arg-table`, `style` reprend `columnStyle`.
15
+ */
16
+ export interface ValueTableRow {
17
+ values: any[];
18
+ }
19
+
20
+ export interface ValueTableStyle {
21
+ /** Parts de largeur, comme `columnStyle.size` d'`arg-table`. */
22
+ size?: readonly number[];
23
+ /** Alignements imposes, comme `columnStyle.align`. Priment sur `types`. */
24
+ align?: readonly ("left" | "right" | "center")[];
25
+ /**
26
+ * Largeur plancher par colonne (CSS). A la difference de `size`, qui repartit
27
+ * la place restante, elle ne se rogne pas : la table defile plutot que
28
+ * d'ecraser une colonne de libelles longs.
29
+ */
30
+ minWidth?: readonly (string | undefined)[];
31
+ }
32
+
33
+ export function valueTable(
34
+ heads: any[],
35
+ contents: any[],
36
+ types?: any[],
37
+ style?: ValueTableStyle,
38
+ ) {
39
+ // Sans types, la premiere colonne porte le libelle et les suivantes des
40
+ // valeurs. Certains tableaux en ont deux (le nom puis le code) : leurs types
41
+ // de colonnes le disent deja, une colonne sans type ne porte pas un nombre.
42
+ // `url` est la colonne d'action d'`arg-table` : un bouton se centre.
43
+ const alignOf = (index: number): "left" | "right" | "center" => {
44
+ if (style?.align?.[index]) return style.align[index];
45
+ if (!types) return index === 0 ? "left" : "right";
46
+ if (!types[index]) return "left";
47
+ return types[index] === "url" ? "center" : "right";
48
+ };
49
+
50
+ // `arg-table` reglait la largeur des colonnes par des parts (`size: [1, 4, 1]`)
51
+ // : la colonne a 4 prend quatre fois la place de celle a 1. RmTable prend une
52
+ // largeur CSS, on rend donc la part en pourcentage du total.
53
+ const sizes = style?.size;
54
+ const total = sizes ? sizes.reduce((sum, part) => sum + part, 0) : 0;
55
+ const widthOf = (index: number) =>
56
+ sizes && total && sizes[index]
57
+ ? `${Math.round((sizes[index] * 1000) / total) / 10}%`
58
+ : undefined;
59
+
60
+ const allColumns = heads.map((label: any, index: number) => ({
61
+ key: `c${index}`,
62
+ label: String(label),
63
+ sortable: true,
64
+ align: alignOf(index),
65
+ width: widthOf(index),
66
+ minWidth: style?.minWidth?.[index],
67
+ }));
68
+
69
+ // La colonne de type `More` d'`arg-table` ne portait pas une valeur a lire :
70
+ // elle tenait le chevron de depliage et la charge utile du detail. RmTable
71
+ // pose son propre chevron (`expandable`) dans une colonne a lui, celle-ci
72
+ // sort donc de la tete ; la charge reste dans la ligne, sous sa cle, ou le
73
+ // slot `expanded` va la chercher.
74
+ const moreIndex = (types ?? []).findIndex((type: any) => type === "More");
75
+ // Cle vide plutot que `null` quand la table n'a pas de colonne `More` : les
76
+ // pages lisent `row[table.moreKey]` dans leurs slots, et une cle nullable ne
77
+ // s'indexe pas. Une cle vide ne designe aucune colonne, ce que `null`
78
+ // disait deja.
79
+ const moreKey = moreIndex >= 0 ? `c${moreIndex}` : "";
80
+ const columns = allColumns.filter((column) => column.key !== moreKey);
81
+
82
+ const rows = (Array.isArray(contents) ? contents : [])
83
+ .filter((row: any) => Array.isArray(row?.values))
84
+ .map((row: ValueTableRow) =>
85
+ Object.fromEntries(row.values.map((value, index) => [`c${index}`, value])),
86
+ );
87
+
88
+ // `arg-table` nommait ses slots de cellule par le type de colonne
89
+ // (`#Date`, `#Price`), plusieurs colonnes pouvant partager un type. RmTable
90
+ // nomme les siens par la cle de colonne : `typeKeys` dit quelles cles porte
91
+ // un type, pour que la page rende le slot une fois par cle.
92
+ const typeKeys: Record<string, string[]> = {};
93
+ (types ?? []).forEach((type: any, index: number) => {
94
+ if (!type || type === "More" || !allColumns[index]) return;
95
+ (typeKeys[type] ??= []).push(allColumns[index]!.key);
96
+ });
97
+
98
+ return {
99
+ columns,
100
+ rows,
101
+ typeKeys,
102
+ /** Vrai quand la table avait une colonne `More` : passer `expandable` a RmTable. */
103
+ expandable: moreIndex >= 0,
104
+ /** Cle ou vit la charge utile du detail, a lire dans le slot `expanded`. Vide sans colonne `More`. */
105
+ moreKey,
106
+ valueKeys: columns.slice(1).map((column) => column.key),
107
+ };
108
+ }
109
+
110
+ /**
111
+ * Les cles de colonne qui portent un type donne, quand la table a ete
112
+ * construite sans ses `types` : `columnKeysOfType(tableTypes, "int")` rend
113
+ * `["c2", "c3"]`, de quoi rendre le slot de cellule une fois par colonne.
114
+ *
115
+ * C'est le pendant de `typeKeys` ci-dessus pour les tableaux qui gardent
116
+ * leurs types a part, parce que les passer a `valueTable` changerait aussi
117
+ * l'alignement des colonnes. Vingt et un composants le recopiaient, sous
118
+ * trois ecritures differentes.
119
+ */
120
+ export const columnKeysOfType = (
121
+ types: readonly any[] | undefined,
122
+ wanted: string,
123
+ ): string[] =>
124
+ (types ?? [])
125
+ .map((type, index) => (type === wanted ? `c${index}` : null))
126
+ .filter((key): key is string => key !== null);
@@ -0,0 +1,17 @@
1
+ import scienceFr from "../oip-science/locales/fr.json";
2
+ import scienceEn from "../oip-science/locales/en.json";
3
+ import drugsFr from "../oip-drugs/locales/fr.json";
4
+ import drugsEn from "../oip-drugs/locales/en.json";
5
+
6
+ // Les libelles des fiches portees dans le layer, chacune sous le prefixe de
7
+ // son app d'origine : `oipScience` (France Augmented Science, cf.
8
+ // components/oip-science) et `oipDrugs` (fr_drugs_app, cf.
9
+ // components/oip-drugs). Une app qui les monte a ses propres cles
10
+ // (`common.*`...), qu'on ne doit pas ecraser. Les vues ecrivent donc
11
+ // `$t('oipScience.trial.phase')`, `$t('oipDrugs.heart.price')`.
12
+ export default defineNuxtPlugin((nuxtApp) => {
13
+ const i18n = (nuxtApp as any).$i18n;
14
+ if (!i18n?.mergeLocaleMessage) return;
15
+ i18n.mergeLocaleMessage("fr", { oipScience: scienceFr, oipDrugs: drugsFr });
16
+ i18n.mergeLocaleMessage("en", { oipScience: scienceEn, oipDrugs: drugsEn });
17
+ });
@@ -0,0 +1,118 @@
1
+ // Les chemins des fiches dans leur app d'origine, et la vue du layer qui les
2
+ // montre. Une fiche lie une autre par son chemin (la marque d'une
3
+ // contribution, l'indication d'un avis...) : dans une page, le lien navigue ;
4
+ // dans le tiroir d'un projet, la fiche visee s'empile si le layer sait la
5
+ // montrer (cf. OipResourceDrawer), comme le faisait le garde de routeur du
6
+ // tiroir de fr_drugs_app.
7
+
8
+ import { OIP_RESOURCE_SPECS, type OipResourceApp } from "./oipResources";
9
+
10
+ export interface OipFicheTarget {
11
+ /** Cle de la vue dans useOipResourceViews. */
12
+ view: string;
13
+ /** Props de la vue. */
14
+ props: Record<string, string>;
15
+ /** Titre provisoire du tiroir, en attendant mieux. */
16
+ title: string;
17
+ }
18
+
19
+ interface FicheRoute {
20
+ app: OipResourceApp;
21
+ pattern: RegExp;
22
+ build: (params: string[], query: URLSearchParams) => OipFicheTarget;
23
+ }
24
+
25
+ const decode = (value: string | undefined) => decodeURIComponent(value ?? "");
26
+
27
+ /** Les fiches de fr_drugs_app, par leur route. */
28
+ const DRUG_ROUTES: FicheRoute[] = [
29
+ {
30
+ app: "fr_drugs_app",
31
+ pattern: /^\/hubr\/heart\/details\/([^/?#]+)\/?$/,
32
+ // Comme la page : l'onglet, et la ligne a ouvrir (`code` d'un avis ou
33
+ // d'une contribution, `cis` d'une presentation, `indication` LES).
34
+ build: ([brand], query) => ({
35
+ view: "drugs-brand-fiche",
36
+ props: {
37
+ brand: decode(brand),
38
+ tab: query.get("tab") ?? "",
39
+ code: query.get("code") ?? "",
40
+ cis: query.get("cis") ?? "",
41
+ indication: query.get("indication") ?? "",
42
+ },
43
+ title: decode(brand),
44
+ }),
45
+ },
46
+ {
47
+ app: "fr_drugs_app",
48
+ pattern: /^\/hubr\/heart\/indication\/([^/?#]+)\/?$/,
49
+ build: ([code]) => ({ view: "drugs-indication-fiche", props: { code: decode(code) }, title: decode(code) }),
50
+ },
51
+ {
52
+ app: "fr_drugs_app",
53
+ pattern: /^\/hubr\/heart\/pnds\/([^/?#]+)\/?$/,
54
+ build: ([id]) => ({ view: "drugs-pnds-fiche", props: { id: decode(id) }, title: "PNDS" }),
55
+ },
56
+ {
57
+ app: "fr_drugs_app",
58
+ pattern: /^\/hubr\/heart\/prices\/jo\/([^/?#]+)\/?$/,
59
+ build: ([id]) => ({ view: "drugs-jo-fiche", props: { id: decode(id) }, title: decode(id) }),
60
+ },
61
+ {
62
+ app: "fr_drugs_app",
63
+ pattern: /^\/hubr\/heart\/associations\/(?!national-assembly)([^/?#]+)\/?$/,
64
+ build: ([label]) => ({ view: "drugs-association-fiche", props: { label: decode(label) }, title: decode(label) }),
65
+ },
66
+ // Ces pages de fr_drugs_app renvoient a la fiche marque, sur leur onglet.
67
+ {
68
+ app: "fr_drugs_app",
69
+ pattern: /^\/hubr\/heart\/put\/([^/?#]+)\/?$/,
70
+ build: ([id]) => ({ view: "drugs-put", props: { id: decode(id) }, title: "" }),
71
+ },
72
+ {
73
+ app: "fr_drugs_app",
74
+ pattern: /^\/hubr\/heart\/mitm\/([^/?#]+)\/?$/,
75
+ build: ([cis]) => ({ view: "drugs-mitm", props: { id: decode(cis), by: "cis" }, title: "" }),
76
+ },
77
+ {
78
+ app: "fr_drugs_app",
79
+ pattern: /^\/hubr\/heart\/prices\/details\/([^/?#]+)\/?$/,
80
+ build: ([id]) => ({ view: "drugs-price", props: { id: decode(id), by: "local_drug_id" }, title: "" }),
81
+ },
82
+ {
83
+ app: "fr_drugs_app",
84
+ pattern: /^\/hubr\/heart\/ansm\/details\/([^/?#]+)\/?$/,
85
+ build: ([id]) => ({ view: "drugs-ansm", props: { id: decode(id) }, title: "" }),
86
+ },
87
+ ];
88
+
89
+ /**
90
+ * La fiche d'un chemin, si le layer sait la montrer. Les fiches a onglets du
91
+ * registre (France Augmented Science) se reconnaissent a leur chemin de base.
92
+ */
93
+ export function oipFicheOf(app: OipResourceApp, path: string): OipFicheTarget | null {
94
+ const [pathname = "", search = ""] = path.split("?");
95
+ const query = new URLSearchParams(search);
96
+ for (const route of DRUG_ROUTES) {
97
+ if (route.app !== app) continue;
98
+ const match = route.pattern.exec(pathname);
99
+ if (match) return route.build(match.slice(1), query);
100
+ }
101
+ for (const spec of OIP_RESOURCE_SPECS) {
102
+ if (spec.app !== app || !spec.tabs.length) continue;
103
+ // L'onglet doit etre un des siens : /ctgov/investigators/12 n'est pas
104
+ // l'essai « investigators ».
105
+ const base = spec.base("__ID__").replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace("__ID__", "([^/?#]+)");
106
+ const tabs = spec.tabs.map((tab) => tab.key).join("|");
107
+ const match = new RegExp(`^${base}(?:/(${tabs}))?/?$`).exec(pathname);
108
+ if (match) {
109
+ const routeId = decode(match[1]);
110
+ return {
111
+ view: `resource:${spec.type}`,
112
+ props: { type: spec.type, id: spec.fromRouteId?.(routeId) ?? routeId, tab: decode(match[2]) },
113
+ title: "",
114
+ };
115
+ }
116
+ }
117
+ return null;
118
+ }