@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,372 @@
1
+ <!--
2
+ Fiche de synthese d'un compte rendu de commission (champ `fiche` de l'index,
3
+ ecrite par le traitement LLM). Portage de
4
+ heart/associations/nationalAssemblyFiche de fr_drugs_app.
5
+
6
+ Dans l'ordre de lecture : pourquoi le compte rendu compte pour la pharma,
7
+ puis chaque point de l'ordre du jour avec sa decision et ses lignes (sujet,
8
+ issue, themes pharma cites, intervenants), enfin les organisations citees.
9
+ Les controles non passes (`warnings`) ne sont montres qu'aux super-admins :
10
+ ceux qui nomment une ligne (« A3 : ... ») sous cette ligne, les autres en
11
+ tete dans une section repliee.
12
+
13
+ La fiche n'est pas indexee (`enabled: false`) : rien ici ne se filtre, tout
14
+ se lit.
15
+ -->
16
+ <template>
17
+ <div class="na_fiche">
18
+ <div v-if="relevance" class="oip_list gap-4">
19
+ <div class="oip_row gap-8 v-center wrap">
20
+ <RmTag :variant="relevanceVariant(relevance.niveau)">
21
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.relevance") }} : {{ relevance.niveau }}
22
+ </RmTag>
23
+ <span v-if="fiche.type_texte" class="oip_label">{{ fiche.type_texte }}</span>
24
+ <span v-if="fiche.presidence" class="oip_label">
25
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.chair") }} : {{ fiche.presidence }}
26
+ </span>
27
+ </div>
28
+ <p v-if="relevance.raison" class="na_fiche__text">{{ relevance.raison }}</p>
29
+ </div>
30
+
31
+ <!-- Controles du traitement LLM : utiles aux admins seulement, replies. -->
32
+ <RmCollapse
33
+ v-if="isSuperAdmin && globalWarnings.length + anomalies.length > 0"
34
+ v-model="checksOpen"
35
+ :title="t('oipDrugs.heart.associations.nationalAssembly.fiche.checks')"
36
+ :count="globalWarnings.length + anomalies.length"
37
+ icon="WarningCircle"
38
+ >
39
+ <RmCallout tone="warning">
40
+ <ul class="na_fiche__bullets">
41
+ <li v-for="(w, i) in globalWarnings" :key="`w${i}`">{{ w }}</li>
42
+ <li v-for="(a, i) in anomalies" :key="`a${i}`">{{ a }}</li>
43
+ </ul>
44
+ </RmCallout>
45
+ </RmCollapse>
46
+
47
+ <section v-for="point in points" :key="point.id" class="na_fiche__point">
48
+ <h4 class="na_fiche__point_title">{{ point.id }}. {{ point.titre }}</h4>
49
+ <p v-if="point.texte_ref" class="oip_label">{{ point.texte_ref }}</p>
50
+ <p v-if="decisionOf(point.id)" class="na_fiche__text">
51
+ <span class="na_fiche__strong">
52
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.decision") }} :
53
+ </span>
54
+ {{ decisionOf(point.id) }}
55
+ </p>
56
+
57
+ <ul class="na_fiche__lines">
58
+ <li v-for="line in linesOf(point.id)" :key="line.id" class="na_fiche__line">
59
+ <!-- L'ancre (premiere phrase du passage, copiee de la source) ouvre
60
+ le compte rendu a cet endroit ; sans ancre, pas de lien. -->
61
+ <button
62
+ v-if="line.ancre && readable"
63
+ type="button"
64
+ class="na_fiche__line_head na_fiche__line_head--link"
65
+ :title="t('oipDrugs.heart.associations.nationalAssembly.fiche.readLine')"
66
+ @click="emit('read', line.ancre)"
67
+ >
68
+ <span class="na_fiche__line_id">{{ line.id }}</span>
69
+ <span class="na_fiche__strong">{{ line.sujet }}</span>
70
+ <RmIcon name="ArrowRight" :size="14" class="na_fiche__line_arrow" />
71
+ </button>
72
+ <p v-else class="na_fiche__text">
73
+ <span class="na_fiche__line_id">{{ line.id }}</span>
74
+ <span class="na_fiche__strong">{{ line.sujet }}</span>
75
+ </p>
76
+ <p v-if="line.issue" class="na_fiche__text">{{ line.issue }}</p>
77
+
78
+ <div v-for="(tag, ti) in line.tags_pharma ?? []" :key="ti" class="na_fiche__tag">
79
+ <RmTag :variant="tag.portee === 'principale' ? 'violet' : 'gray'">
80
+ {{ tag.tag }} ({{ porteeLabel(tag.portee) }})
81
+ </RmTag>
82
+ <q v-if="tag.citation" class="na_fiche__quote">{{ tag.citation }}</q>
83
+ </div>
84
+
85
+ <p v-if="line.laboratoires_nommes?.length" class="oip_label">
86
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.labs") }} :
87
+ {{ line.laboratoires_nommes.join(", ") }}
88
+ </p>
89
+ <p v-if="line.mots_cles?.length" class="oip_label">
90
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.keywords") }} :
91
+ {{ line.mots_cles.join(", ") }}
92
+ </p>
93
+ <p v-if="line.intervenants?.length" class="oip_label">
94
+ {{ t("oipDrugs.heart.associations.nationalAssembly.fiche.speakers") }} :
95
+ {{ line.intervenants.map(speakerLabel).join(" ; ") }}
96
+ </p>
97
+ <p
98
+ v-for="(w, wi) in isSuperAdmin ? (lineWarnings.get(line.id) ?? []) : []"
99
+ :key="`lw${wi}`"
100
+ class="na_fiche__warning"
101
+ >
102
+ <RmIcon name="WarningCircle" :size="14" />
103
+ {{ w }}
104
+ </p>
105
+ </li>
106
+ </ul>
107
+ </section>
108
+
109
+ <div v-if="organisations.length > 0" class="oip_list gap-4">
110
+ <p class="oip_label">{{ t("oipDrugs.heart.associations.nationalAssembly.fiche.organisations") }}</p>
111
+ <div class="oip_row gap-8 wrap">
112
+ <template v-for="org in organisations" :key="org.nom">
113
+ <a
114
+ v-if="org.referentiel_id"
115
+ :href="nav.appHref('fr_drugs_app', drugsAssociationPath(org.referentiel_id))"
116
+ class="na_fiche__org"
117
+ @click="openAssociation($event, org.referentiel_id)"
118
+ >
119
+ {{ org.nom_normalise || org.nom }} ({{ org.role }})
120
+ </a>
121
+ <span v-else class="na_fiche__org na_fiche__org--plain">
122
+ {{ org.nom_normalise || org.nom }} ({{ org.role }})
123
+ </span>
124
+ </template>
125
+ </div>
126
+ </div>
127
+ </div>
128
+ </template>
129
+
130
+ <script lang="ts" setup>
131
+ import { drugsAssociationPath } from "../../../../oip-drugs/kinds";
132
+
133
+ const props = withDefaults(
134
+ defineProps<{
135
+ /** Le champ `fiche` du compte rendu. */
136
+ fiche: any;
137
+ /** Le champ `warnings` : les controles non passes. */
138
+ warnings?: string[];
139
+ /** Le compte rendu a une copie lisible : les ancres deviennent des liens. */
140
+ readable?: boolean;
141
+ }>(),
142
+ { warnings: () => [], readable: false },
143
+ );
144
+
145
+ /** `anchor` : l'ancre de la ligne cliquee, ou la lecture s'ouvre. */
146
+ const emit = defineEmits<{ read: [anchor: string] }>();
147
+
148
+ const { t } = useI18n();
149
+ const nav = useOipResourceNav();
150
+
151
+ /** Le Ctrl/Cmd-clic garde le lien : il ouvre un onglet. */
152
+ function openAssociation(event: MouseEvent, label: string) {
153
+ if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
154
+ event.preventDefault();
155
+ nav.openApp("fr_drugs_app", drugsAssociationPath(label));
156
+ }
157
+
158
+ /** Les controles non passes ne sont montres qu'aux super-admins. */
159
+ const { isSuperAdmin, ensureLoaded } = useAdminAccess();
160
+ onMounted(() => ensureLoaded());
161
+ const checksOpen = ref(false);
162
+
163
+ const relevance = computed(() => props.fiche?.pertinence_pharma ?? null);
164
+ const points = computed<any[]>(() => props.fiche?.points ?? []);
165
+ const anomalies = computed<string[]>(() => props.fiche?.anomalies ?? []);
166
+
167
+ const linesOf = (pointId: string) =>
168
+ (props.fiche?.sommaire ?? []).filter((line: any) => line.point === pointId);
169
+
170
+ const decisionOf = (pointId: string) =>
171
+ (props.fiche?.decisions ?? []).find((d: any) => d.point === pointId)?.texte ?? "";
172
+
173
+ /** Un controle qui commence par l'id d'une ligne (« A3 : ... ») va sous elle. */
174
+ const LINE_WARNING = /^([A-Z]\d+) : (.*)$/;
175
+
176
+ const lineWarnings = computed(() => {
177
+ const byLine = new Map<string, string[]>();
178
+ for (const warning of props.warnings) {
179
+ const match = LINE_WARNING.exec(warning);
180
+ if (!match) continue;
181
+ byLine.set(match[1]!, [...(byLine.get(match[1]!) ?? []), match[2]!]);
182
+ }
183
+ return byLine;
184
+ });
185
+
186
+ const globalWarnings = computed(() => props.warnings.filter((w) => !LINE_WARNING.test(w)));
187
+
188
+ /** Patients d'abord, puis le reste ; une organisation citee deux fois une fois. */
189
+ const organisations = computed(() => {
190
+ const seen = new Set<string>();
191
+ return [
192
+ ...(props.fiche?.associations_patients ?? []),
193
+ ...(props.fiche?.autres_organisations ?? []),
194
+ ].filter((org: any) => {
195
+ const key = (org.nom_normalise || org.nom || "").toLowerCase();
196
+ if (!key || seen.has(key)) return false;
197
+ seen.add(key);
198
+ return true;
199
+ });
200
+ });
201
+
202
+ function relevanceVariant(level: string) {
203
+ if (level === "Haute") return "violet";
204
+ if (level === "Moyenne") return "blue";
205
+ if (level === "Faible") return "sky";
206
+ return "gray";
207
+ }
208
+
209
+ function porteeLabel(portee: string) {
210
+ const key = `oipDrugs.heart.associations.nationalAssembly.fiche.portee.${portee}`;
211
+ const label = t(key);
212
+ return label === key ? portee : label;
213
+ }
214
+
215
+ function speakerLabel(speaker: any) {
216
+ const details = [speaker.groupe, positionLabel(speaker.position)].filter(Boolean).join(", ");
217
+ return details ? `${speaker.nom} (${details})` : speaker.nom;
218
+ }
219
+
220
+ function positionLabel(position: string) {
221
+ if (!position) return "";
222
+ const key = `oipDrugs.heart.associations.nationalAssembly.fiche.position.${position}`;
223
+ const label = t(key);
224
+ return label === key ? position : label;
225
+ }
226
+ </script>
227
+
228
+ <style scoped>
229
+ .na_fiche {
230
+ display: flex;
231
+ flex-direction: column;
232
+ gap: 12px;
233
+ }
234
+
235
+ .na_fiche__text {
236
+ margin: 0;
237
+ color: var(--text-primary);
238
+ font-size: 13px;
239
+ line-height: 1.5;
240
+ }
241
+
242
+ .na_fiche__strong {
243
+ font-weight: 600;
244
+ }
245
+
246
+ .na_fiche__bullets {
247
+ margin: 4px 0 0;
248
+ padding-left: 18px;
249
+ font-size: 13px;
250
+ }
251
+
252
+ .na_fiche__point {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 4px;
256
+ padding-top: 8px;
257
+ border-top: 1px solid var(--border-default);
258
+ }
259
+
260
+ .na_fiche__point_title {
261
+ margin: 0;
262
+ color: var(--text-primary);
263
+ font-size: 14px;
264
+ font-weight: 600;
265
+ }
266
+
267
+ .na_fiche__lines {
268
+ display: flex;
269
+ flex-direction: column;
270
+ gap: 8px;
271
+ margin: 4px 0 0;
272
+ padding: 0;
273
+ list-style: none;
274
+ }
275
+
276
+ /* Une ligne du sommaire : filet a gauche, comme un passage cite. */
277
+ .na_fiche__line {
278
+ display: flex;
279
+ flex-direction: column;
280
+ gap: 4px;
281
+ padding: 6px 12px;
282
+ border-left: 3px solid var(--border-default);
283
+ }
284
+
285
+ .na_fiche__line_head {
286
+ display: block;
287
+ width: 100%;
288
+ margin: 0;
289
+ padding: 0;
290
+ border: none;
291
+ background: none;
292
+ color: var(--text-primary);
293
+ font-family: inherit;
294
+ font-size: 13px;
295
+ line-height: 1.5;
296
+ text-align: left;
297
+ }
298
+
299
+ .na_fiche__line_head--link {
300
+ cursor: pointer;
301
+ }
302
+
303
+ /* Un titre qui ouvre le compte rendu se lit comme un lien, sans survol. */
304
+ .na_fiche__line_head--link .na_fiche__strong {
305
+ color: var(--primary);
306
+ text-decoration: underline;
307
+ text-underline-offset: 2px;
308
+ }
309
+
310
+ .na_fiche__line_head--link:hover .na_fiche__strong {
311
+ text-decoration-thickness: 2px;
312
+ }
313
+
314
+ .na_fiche__line_head--link .na_fiche__line_arrow {
315
+ color: var(--primary);
316
+ }
317
+
318
+ .na_fiche__line_head--link:focus-visible {
319
+ outline: 2px solid var(--primary);
320
+ outline-offset: 2px;
321
+ }
322
+
323
+ .na_fiche__line_arrow {
324
+ margin-left: 4px;
325
+ color: var(--text-muted);
326
+ vertical-align: middle;
327
+ }
328
+
329
+ .na_fiche__line_id {
330
+ margin-right: 6px;
331
+ color: var(--text-muted);
332
+ font-size: 12px;
333
+ }
334
+
335
+ .na_fiche__tag {
336
+ display: flex;
337
+ flex-direction: column;
338
+ align-items: flex-start;
339
+ gap: 2px;
340
+ }
341
+
342
+ .na_fiche__quote {
343
+ color: var(--text-secondary);
344
+ font-size: 12px;
345
+ font-style: italic;
346
+ }
347
+
348
+ .na_fiche__warning {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 4px;
352
+ margin: 0;
353
+ color: var(--text-warning, var(--text-secondary));
354
+ font-size: 12px;
355
+ }
356
+
357
+ .na_fiche__org {
358
+ color: var(--text-primary);
359
+ font-size: 13px;
360
+ text-decoration: none;
361
+ border-bottom: 1px solid var(--border-default);
362
+ }
363
+
364
+ .na_fiche__org:hover {
365
+ color: var(--primary);
366
+ border-bottom-color: currentColor;
367
+ }
368
+
369
+ .na_fiche__org--plain {
370
+ border-bottom: none;
371
+ }
372
+ </style>
@@ -0,0 +1,55 @@
1
+ <!--
2
+ Un debat de la commission de la transparence ou l'association est citee
3
+ (portage de heart/associations/transcriptionCard de fr_drugs_app).
4
+
5
+ La carte dit de quel produit et de quelle seance il s'agit, et donne les
6
+ deux sorties vers le document. Le fil des echanges, lui, s'ouvre dans le
7
+ tiroir de la fiche ; la carte ne le charge pas.
8
+ -->
9
+ <template>
10
+ <div class="oip_card oip_list gap-12 oip_body full">
11
+ <div class="oip_row v-center gap-8 wrap">
12
+ <p class="oip_heading">{{ transcription.brand || t("oipDrugs.heart.associations.detail.debate") }}</p>
13
+ <RmTag v-if="transcription.has_code" variant="gray">{{ transcription.has_code }}</RmTag>
14
+ <span class="oip_label">
15
+ <RmDate :date="transcription.session_date" :lang="dateLang" />
16
+ </span>
17
+ </div>
18
+
19
+ <div class="oip_row gap-8 wrap">
20
+ <RmButton variant="secondary" prefix-icon="ChatsCircle" @click="emit('open', transcription)">
21
+ {{ t("oipDrugs.heart.associations.detail.debateThread") }}
22
+ </RmButton>
23
+ <RmButton
24
+ v-if="transcription.transcription_url"
25
+ variant="tertiary"
26
+ ghost
27
+ prefix-icon="ArrowSquareOut"
28
+ @click="open(transcription.transcription_url)"
29
+ >
30
+ {{ t("oipDrugs.heart.associations.detail.seeOnHas") }}
31
+ </RmButton>
32
+ <RmButton
33
+ v-if="transcription.tekkare_url"
34
+ variant="tertiary"
35
+ ghost
36
+ prefix-icon="FilePdf"
37
+ @click="emit('pdf', transcription)"
38
+ >
39
+ {{ t("oipDrugs.heart.associations.detail.seePdf") }}
40
+ </RmButton>
41
+ </div>
42
+ </div>
43
+ </template>
44
+
45
+ <script setup lang="ts">
46
+ defineProps<{ transcription: any }>();
47
+ const emit = defineEmits<{ open: [transcription: any]; pdf: [transcription: any] }>();
48
+
49
+ const { t, locale } = useI18n();
50
+ const dateLang = computed(() => (locale.value === "en" ? "en" : "fr"));
51
+
52
+ function open(url: string) {
53
+ if (url) window.open(url, "_blank");
54
+ }
55
+ </script>
@@ -0,0 +1,103 @@
1
+ <!--
2
+ Pied de source d'une carte (portage de heart/elastic/sourceContainerElastic
3
+ de fr_drugs_app) : « Source : Producteur (jeu) - Derniere mise a jour : X »,
4
+ lu dans Directus par /api/oip/sources (cf. useDirectusSources). Le clic
5
+ ouvre le panneau Sources de l'app sur cette fiche, par son hook (comme
6
+ OipResourceSource).
7
+ -->
8
+ <template>
9
+ <RmSourceLine class="oip-drugs" :tone="tone" @click="onOpenSources">
10
+ <div class="oip_row v-center gap-4">
11
+ <span>{{ kindLabel }} : {{ displayName }}</span>
12
+ <span>&nbsp;-&nbsp;{{ locale === 'fr' ? 'Dernière mise à jour' : 'Last updated' }} :</span>
13
+ <span>{{ info.verified }}</span>
14
+ <!-- La derniere fois que la donnee affichee a bouge. Rien a voir avec la
15
+ date ci-dessus, qui dit quand le jeu a ete recharge : le segment
16
+ porte donc son propre libelle, et disparait quand la carte n'a pas
17
+ d'evenement date a montrer. -->
18
+ <template v-if="last">
19
+ <span>&nbsp;-&nbsp;{{ lastLabel }} :</span>
20
+ <span><RmDate :date="last" :lang="locale === 'en' ? 'en' : 'fr'" /></span>
21
+ </template>
22
+ </div>
23
+ </RmSourceLine>
24
+ </template>
25
+
26
+ <script setup lang="ts">
27
+ import useDirectusSources from "../../../../oip-drugs/composables/useDirectusSources";
28
+ import { heartLatestDate } from "../../../../oip-drugs/utils/latestDate";
29
+ import { useOipResourceHooks } from "../../../../composables/useOipResourceHooks";
30
+
31
+ const props = withDefaults(
32
+ defineProps<{
33
+ uuid: string;
34
+ /** Gris par defaut (pied de carte) ; `primary` quand la source est seule sur sa ligne. */
35
+ tone?: "muted" | "primary";
36
+ /**
37
+ * Ce que la date de fin de ligne raconte sur cette carte-la : « Dernier
38
+ * prix », « Derniere autorisation », « Dernier avis »... Le libelle arrive
39
+ * traduit, la carte seule sait de quel evenement elle parle.
40
+ */
41
+ lastLabel?: string;
42
+ /**
43
+ * La date de cet evenement, ou la liste des dates dont il faut prendre la
44
+ * plus recente. Sans elle (donnee vide, table filtree a zero), le segment
45
+ * n'est pas rendu.
46
+ */
47
+ lastDate?: string | number | null | Array<string | number | null | undefined>;
48
+ /**
49
+ * Ce que la source documente, quand la carte en cite plusieurs : « Source
50
+ * prix », « Source décisions ». Une carte a une seule source garde
51
+ * « Source » tout court.
52
+ */
53
+ kind?: string;
54
+ /**
55
+ * Nommer la source par son surnom Directus plutot que par « Producteur
56
+ * (jeu) ». Utile quand une carte en cite plusieurs : les noms complets y
57
+ * tiennent sur deux lignes chacun.
58
+ */
59
+ preferNickname?: boolean;
60
+ }>(),
61
+ {
62
+ tone: "muted",
63
+ lastLabel: undefined,
64
+ lastDate: undefined,
65
+ kind: undefined,
66
+ preferNickname: false,
67
+ }
68
+ );
69
+
70
+ const { locale } = useI18n();
71
+ const hooks = useOipResourceHooks();
72
+
73
+ const kindLabel = computed(() => props.kind || "Source");
74
+
75
+ // Le libelle et la date viennent de Directus, comme le panneau « Sources » du
76
+ // rail : le referentiel Elasticsearch donnait une autre date pour la meme
77
+ // source selon l'endroit ou on la lisait.
78
+ const { load, metaByUuid } = useDirectusSources();
79
+
80
+ watch(
81
+ () => props.uuid,
82
+ (uuid) => {
83
+ if (uuid) load([uuid]);
84
+ },
85
+ { immediate: true }
86
+ );
87
+
88
+ const info = computed(() =>
89
+ metaByUuid(props.uuid, locale.value === "en" ? "en" : "fr")
90
+ );
91
+
92
+ const displayName = computed(() =>
93
+ props.preferNickname ? info.value.nickname || info.value.name : info.value.name
94
+ );
95
+
96
+ const last = computed(() =>
97
+ props.lastLabel ? heartLatestDate(props.lastDate) : null
98
+ );
99
+
100
+ function onOpenSources() {
101
+ if (props.uuid) hooks.openSource?.(props.uuid);
102
+ }
103
+ </script>