@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.
- package/dist/module.json +1 -1
- package/dist/runtime/utils/projects.d.ts +8 -0
- package/dist/runtime/utils/projects.js +8 -5
- package/layer/app/app.config.ts +6 -0
- package/layer/app/components/OipPubmedSummary.vue +223 -0
- package/layer/app/components/OipResourceDrawer.vue +331 -0
- package/layer/app/components/OipResourceDrawerLink.vue +40 -0
- package/layer/app/components/OipResourceField.vue +41 -0
- package/layer/app/components/OipResourceGenericCard.vue +54 -0
- package/layer/app/components/OipResourceSource.vue +50 -0
- package/layer/app/components/OipResourceTags.vue +65 -0
- package/layer/app/components/OipResourceView.vue +107 -0
- package/layer/app/components/oip-drugs/fiches/AssociationFiche.vue +775 -0
- package/layer/app/components/oip-drugs/fiches/BrandFiche.vue +1111 -0
- package/layer/app/components/oip-drugs/fiches/IndicationFiche.vue +182 -0
- package/layer/app/components/oip-drugs/fiches/JoFiche.vue +101 -0
- package/layer/app/components/oip-drugs/fiches/PndsFiche.vue +279 -0
- package/layer/app/components/oip-drugs/heart/JoCard.vue +314 -0
- package/layer/app/components/oip-drugs/heart/TextHighlight.vue +326 -0
- package/layer/app/components/oip-drugs/heart/ansm/BrandCard.vue +187 -0
- package/layer/app/components/oip-drugs/heart/ansm/CisDetail.vue +363 -0
- package/layer/app/components/oip-drugs/heart/ansm/CisTable.vue +167 -0
- package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyCard.vue +373 -0
- package/layer/app/components/oip-drugs/heart/associations/NationalAssemblyFiche.vue +372 -0
- package/layer/app/components/oip-drugs/heart/associations/TranscriptionCard.vue +55 -0
- package/layer/app/components/oip-drugs/heart/elastic/SourceContainerElastic.vue +103 -0
- package/layer/app/components/oip-drugs/heart/france/BrandGroupCard.vue +450 -0
- package/layer/app/components/oip-drugs/heart/mitm/Card.vue +199 -0
- package/layer/app/components/oip-drugs/heart/mitm/Source.vue +23 -0
- package/layer/app/components/oip-drugs/heart/mitm/details/Overview.vue +381 -0
- package/layer/app/components/oip-drugs/heart/put/Card.vue +212 -0
- package/layer/app/components/oip-drugs/heart/results/AccesCard.vue +696 -0
- package/layer/app/components/oip-drugs/heart/results/AlertCard.vue +342 -0
- package/layer/app/components/oip-drugs/heart/results/AsmrCursor.vue +229 -0
- package/layer/app/components/oip-drugs/heart/results/EvalCard.vue +370 -0
- package/layer/app/components/oip-drugs/heart/results/IndicCard.vue +743 -0
- package/layer/app/components/oip-drugs/heart/results/MatchExplain.vue +243 -0
- package/layer/app/components/oip-drugs/heart/results/PrefRows.vue +105 -0
- package/layer/app/components/oip-drugs/heart/results/details/HasHistory.vue +487 -0
- package/layer/app/components/oip-drugs/heart/results/details/InternationalCountryCard.vue +461 -0
- package/layer/app/components/oip-drugs/heart/results/details/InternationalOverview.vue +200 -0
- package/layer/app/components/oip-drugs/heart/results/details/InternationalPriceDrawer.vue +647 -0
- package/layer/app/components/oip-drugs/heart/results/details/Monograph.vue +128 -0
- package/layer/app/components/oip-drugs/heart/results/details/OpinionDrawer.vue +535 -0
- package/layer/app/components/oip-drugs/heart/results/details/PresentationDrawer.vue +738 -0
- package/layer/app/components/oip-drugs/heart/results/details/Price.vue +227 -0
- package/layer/app/components/oip-drugs/heart/results/details/PriceOverview.vue +1261 -0
- package/layer/app/components/oip-drugs/heart/results/details/RecordDrawer.vue +494 -0
- package/layer/app/components/oip-drugs/heart/results/details/RecordList.vue +426 -0
- package/layer/app/components/oip-drugs/heart/results/les/Card.vue +340 -0
- package/layer/app/components/oip-drugs/heart/results/les/Drawer.vue +67 -0
- package/layer/app/components/oip-drugs/heart/results/les/IndicationDetail.vue +149 -0
- package/layer/app/components/oip-drugs/heart/results/les/Source.vue +20 -0
- package/layer/app/components/oip-drugs/heart/results/les/SourceTag.vue +39 -0
- package/layer/app/components/oip-drugs/heart/searchPage/DynamicSource.vue +29 -0
- package/layer/app/components/oip-drugs/medicam/market/Chart.vue +121 -0
- package/layer/app/components/oip-drugs/outpatient/ProductEvolution.vue +236 -0
- package/layer/app/components/oip-drugs/resources/Ansm.vue +75 -0
- package/layer/app/components/oip-drugs/resources/Association.vue +30 -0
- package/layer/app/components/oip-drugs/resources/Brand.vue +65 -0
- package/layer/app/components/oip-drugs/resources/Contribution.vue +216 -0
- package/layer/app/components/oip-drugs/resources/Hospital.vue +151 -0
- package/layer/app/components/oip-drugs/resources/Indication.vue +54 -0
- package/layer/app/components/oip-drugs/resources/Jo.vue +57 -0
- package/layer/app/components/oip-drugs/resources/Medicam.vue +140 -0
- package/layer/app/components/oip-drugs/resources/Mitm.vue +84 -0
- package/layer/app/components/oip-drugs/resources/NationalAssembly.vue +93 -0
- package/layer/app/components/oip-drugs/resources/Outpatient.vue +97 -0
- package/layer/app/components/oip-drugs/resources/Pnds.vue +24 -0
- package/layer/app/components/oip-drugs/resources/Price.vue +106 -0
- package/layer/app/components/oip-drugs/resources/Put.vue +143 -0
- package/layer/app/components/oip-science/appel-a-projet/Cards.vue +162 -0
- package/layer/app/components/oip-science/clinical-trials/Cards.vue +382 -0
- package/layer/app/components/oip-science/clinical-trials/CardsGlobal.vue +273 -0
- package/layer/app/components/oip-science/clinical-trials/LinkedList.vue +366 -0
- package/layer/app/components/oip-science/clinical-trials/PairBadge.vue +25 -0
- package/layer/app/components/oip-science/clinical-trials/PairBody.vue +182 -0
- package/layer/app/components/oip-science/clinical-trials/SitesDrawer.vue +95 -0
- package/layer/app/components/oip-science/common/Form.vue +73 -0
- package/layer/app/components/oip-science/common/MatchAvgTag.vue +283 -0
- package/layer/app/components/oip-science/common/NoData.vue +16 -0
- package/layer/app/components/oip-science/common/ScoreBadge.vue +35 -0
- package/layer/app/components/oip-science/common/Source.vue +31 -0
- package/layer/app/components/oip-science/common/TableTags.vue +279 -0
- package/layer/app/components/oip-science/common/Timeline.vue +104 -0
- package/layer/app/components/oip-science/common/ToolTips.vue +89 -0
- package/layer/app/components/oip-science/cross/publicationPubmed.vue +484 -0
- package/layer/app/components/oip-science/crossData/CrossDataLocations.vue +71 -0
- package/layer/app/components/oip-science/ctgov/Investigators.vue +148 -0
- package/layer/app/components/oip-science/ctgov/Locations.vue +102 -0
- package/layer/app/components/oip-science/ctgov/Publications.vue +52 -0
- package/layer/app/components/oip-science/ctgov/Sponsors.vue +66 -0
- package/layer/app/components/oip-science/ctgov/StudyDescription.vue +1136 -0
- package/layer/app/components/oip-science/ctgov-centers/ClinicalTrials.vue +40 -0
- package/layer/app/components/oip-science/ctgov-centers/Publications.vue +50 -0
- package/layer/app/components/oip-science/ctgov-investigators/ClinicalTrials.vue +43 -0
- package/layer/app/components/oip-science/ctgov-investigators/Informations.vue +171 -0
- package/layer/app/components/oip-science/ctgov-investigators/Publications.vue +44 -0
- package/layer/app/components/oip-science/elastic/DateRangeFilter.vue +209 -0
- package/layer/app/components/oip-science/elastic/Filter.vue +719 -0
- package/layer/app/components/oip-science/elastic/MatchExplain.vue +152 -0
- package/layer/app/components/oip-science/establishments/Cards.vue +183 -0
- package/layer/app/components/oip-science/establishments/ClinicalTrials.vue +62 -0
- package/layer/app/components/oip-science/establishments/Hcps.vue +227 -0
- package/layer/app/components/oip-science/establishments/Informations.vue +263 -0
- package/layer/app/components/oip-science/establishments/LinkedList.vue +153 -0
- package/layer/app/components/oip-science/establishments/MatchedLabels.vue +194 -0
- package/layer/app/components/oip-science/establishments/PublicFinance.vue +62 -0
- package/layer/app/components/oip-science/euct/Investigators.vue +125 -0
- package/layer/app/components/oip-science/euct/Locations.vue +102 -0
- package/layer/app/components/oip-science/euct/Products.vue +101 -0
- package/layer/app/components/oip-science/euct/Publications.vue +89 -0
- package/layer/app/components/oip-science/euct/Sponsors.vue +86 -0
- package/layer/app/components/oip-science/euct/StudyDescription.vue +1075 -0
- package/layer/app/components/oip-science/euct-centers/ClinicalTrials.vue +40 -0
- package/layer/app/components/oip-science/euct-centers/Publications.vue +55 -0
- package/layer/app/components/oip-science/euct-investigators/ClinicalTrials.vue +41 -0
- package/layer/app/components/oip-science/euct-investigators/Informations.vue +171 -0
- package/layer/app/components/oip-science/euct-investigators/Publications.vue +51 -0
- package/layer/app/components/oip-science/hcps/AppelsAProjet.vue +62 -0
- package/layer/app/components/oip-science/hcps/Cards.vue +237 -0
- package/layer/app/components/oip-science/hcps/ClinicalTrials.vue +78 -0
- package/layer/app/components/oip-science/hcps/Informations.vue +296 -0
- package/layer/app/components/oip-science/hcps/LinkedList.vue +153 -0
- package/layer/app/components/oip-science/hcps/MatchedLabels.vue +207 -0
- package/layer/app/components/oip-science/hcps/Pubmed.vue +128 -0
- package/layer/app/components/oip-science/local/SliderTabs.vue +99 -0
- package/layer/app/components/oip-science/local/SliderTabsFull.vue +135 -0
- package/layer/app/components/oip-science/pubmed/Authors.vue +128 -0
- package/layer/app/components/oip-science/pubmed/Cards.vue +417 -0
- package/layer/app/components/oip-science/pubmed/ClinicalTrials.vue +71 -0
- package/layer/app/components/oip-science/resources/Phrc.vue +39 -0
- package/layer/app/composables/useOipChapterScroll.ts +43 -0
- package/layer/app/composables/useOipResourceHooks.ts +27 -0
- package/layer/app/composables/useOipResourceNav.ts +66 -0
- package/layer/app/composables/useOipResourceViews.ts +117 -0
- package/layer/app/composables/useOipResources.ts +83 -0
- package/layer/app/oip-drugs/PORTING.md +120 -0
- package/layer/app/oip-drugs/composables/useAssociationDetail.ts +220 -0
- package/layer/app/oip-drugs/composables/useAssociationExport.ts +63 -0
- package/layer/app/oip-drugs/composables/useAssociationLookup.ts +105 -0
- package/layer/app/oip-drugs/composables/useCardPrefOptions.ts +201 -0
- package/layer/app/oip-drugs/composables/useCurrency.ts +121 -0
- package/layer/app/oip-drugs/composables/useDirectusSources.ts +224 -0
- package/layer/app/oip-drugs/composables/useHeartBrandMatches.ts +112 -0
- package/layer/app/oip-drugs/composables/useHeartDetailSearches.ts +479 -0
- package/layer/app/oip-drugs/composables/useHeartIntlApprovals.ts +661 -0
- package/layer/app/oip-drugs/composables/useHeartLesIndication.ts +168 -0
- package/layer/app/oip-drugs/composables/useHeartMatchExplain.ts +231 -0
- package/layer/app/oip-drugs/composables/useHeartReports.ts +239 -0
- package/layer/app/oip-drugs/composables/useHeartSearchFields.ts +233 -0
- package/layer/app/oip-drugs/composables/useMergeByKey.ts +23 -0
- package/layer/app/oip-drugs/composables/useOipDrugsElastic.ts +621 -0
- package/layer/app/oip-drugs/composables/usePageEmpty.ts +58 -0
- package/layer/app/oip-drugs/composables/v-useSalesSource.ts +64 -0
- package/layer/app/oip-drugs/drugs.css +500 -0
- package/layer/app/oip-drugs/esIndices.ts +322 -0
- package/layer/app/oip-drugs/kinds.ts +264 -0
- package/layer/app/oip-drugs/locales/en.json +1571 -0
- package/layer/app/oip-drugs/locales/fr.json +1571 -0
- package/layer/app/oip-drugs/monographs/blincyto-has.vue +289 -0
- package/layer/app/oip-drugs/monographs/darzalex-has.vue +276 -0
- package/layer/app/oip-drugs/monographs/dupixent-has.vue +216 -0
- package/layer/app/oip-drugs/monographs/enhertu-has.vue +280 -0
- package/layer/app/oip-drugs/monographs/has-sein-2023.vue +1649 -0
- package/layer/app/oip-drugs/monographs/ibrance-has.vue +277 -0
- package/layer/app/oip-drugs/monographs/imfinzi-has.vue +293 -0
- package/layer/app/oip-drugs/monographs/keytruda-has.vue +334 -0
- package/layer/app/oip-drugs/monographs/kisqali-has.vue +201 -0
- package/layer/app/oip-drugs/monographs/opdivo-has.vue +231 -0
- package/layer/app/oip-drugs/monographs/ozempic-has.vue +186 -0
- package/layer/app/oip-drugs/monographs/tecentriq-has.vue +312 -0
- package/layer/app/oip-drugs/monographs/yescarta-has.vue +272 -0
- package/layer/app/oip-drugs/types/elastic.ts +113 -0
- package/layer/app/oip-drugs/types/es/agencies.ts +152 -0
- package/layer/app/oip-drugs/types/es/directory.ts +54 -0
- package/layer/app/oip-drugs/types/es/docByIndex.ts +151 -0
- package/layer/app/oip-drugs/types/es/openmedic.ts +67 -0
- package/layer/app/oip-drugs/types/es/outpatient.ts +71 -0
- package/layer/app/oip-drugs/types/es/portal.ts +130 -0
- package/layer/app/oip-drugs/types/es/retail.ts +107 -0
- package/layer/app/oip-drugs/types/es/statistics.ts +29 -0
- package/layer/app/oip-drugs/types/heart/CurrencyRate.ts +16 -0
- package/layer/app/oip-drugs/types/heart/ansm.ts +106 -0
- package/layer/app/oip-drugs/types/heart/tag.ts +29 -0
- package/layer/app/oip-drugs/utils/associationFields.ts +118 -0
- package/layer/app/oip-drugs/utils/contributions.ts +36 -0
- package/layer/app/oip-drugs/utils/countryMapping.ts +387 -0
- package/layer/app/oip-drugs/utils/esHighlight.ts +21 -0
- package/layer/app/oip-drugs/utils/exportSheets.ts +57 -0
- package/layer/app/oip-drugs/utils/heartIntlPrice.ts +228 -0
- package/layer/app/oip-drugs/utils/heartStyleAndFormat.ts +262 -0
- package/layer/app/oip-drugs/utils/heartStyleAnsm.ts +71 -0
- package/layer/app/oip-drugs/utils/latestDate.ts +31 -0
- package/layer/app/oip-drugs/utils/p-heartCardTags.ts +53 -0
- package/layer/app/oip-drugs/utils/priceExport.ts +269 -0
- package/layer/app/oip-drugs/utils/q-hasRatings.ts +43 -0
- package/layer/app/oip-drugs/utils/s-openCard.ts +20 -0
- package/layer/app/oip-drugs/utils/sourceUuids.ts +155 -0
- package/layer/app/oip-drugs/utils/styleAndFormat.ts +40 -0
- package/layer/app/oip-drugs/utils/v-salesSeries.ts +156 -0
- package/layer/app/oip-drugs/utils/v-scopeTags.ts +23 -0
- package/layer/app/oip-science/PORTING.md +93 -0
- package/layer/app/oip-science/assets/smartSelection.json +428 -0
- package/layer/app/oip-science/composables/useAuthorMatching.ts +342 -0
- package/layer/app/oip-science/composables/useCTCenter.ts +107 -0
- package/layer/app/oip-science/composables/useCTInvestigators.ts +107 -0
- package/layer/app/oip-science/composables/useEstablishmentCrossData.ts +139 -0
- package/layer/app/oip-science/composables/useEstablishmentMatching.ts +176 -0
- package/layer/app/oip-science/composables/useEuct.ts +418 -0
- package/layer/app/oip-science/composables/useEuctCenter.ts +107 -0
- package/layer/app/oip-science/composables/useEuctInvestigators.ts +107 -0
- package/layer/app/oip-science/composables/useGlobalClinicalTrials.ts +624 -0
- package/layer/app/oip-science/composables/useLinkedTrials.ts +83 -0
- package/layer/app/oip-science/composables/useOipElastic.ts +658 -0
- package/layer/app/oip-science/composables/useOipSearchExplain.ts +166 -0
- package/layer/app/oip-science/composables/usePubmed.ts +487 -0
- package/layer/app/oip-science/composables/useSearchFields.ts +153 -0
- package/layer/app/oip-science/indexConfig.json +794 -0
- package/layer/app/oip-science/locales/en.json +483 -0
- package/layer/app/oip-science/locales/fr.json +483 -0
- package/layer/app/oip-science/science.css +1182 -0
- package/layer/app/oip-science/utils/a-openCard.ts +23 -0
- package/layer/app/oip-science/utils/b-openCard.ts +35 -0
- package/layer/app/oip-science/utils/c-filterContext.ts +81 -0
- package/layer/app/oip-science/utils/f-types.ts +241 -0
- package/layer/app/oip-science/utils/frDiseaseTerms.ts +269 -0
- package/layer/app/oip-science/utils/matchMethod.ts +53 -0
- package/layer/app/oip-science/utils/sliderTabs.ts +13 -0
- package/layer/app/oip-science/utils/sources.ts +15 -0
- package/layer/app/oip-science/utils/styleAndFormat.ts +608 -0
- package/layer/app/oip-science/utils/toPresets.ts +7 -0
- package/layer/app/oip-science/utils/valueTable.ts +126 -0
- package/layer/app/plugins/oip-science-i18n.ts +17 -0
- package/layer/app/utils/oipFicheRoutes.ts +118 -0
- package/layer/app/utils/oipResources.ts +440 -0
- package/layer/nuxt.config.ts +22 -2
- package/layer/public/reports/blincyto-has.html +292 -0
- package/layer/public/reports/blincyto-has.pdf +0 -0
- package/layer/public/reports/darzalex-has.html +279 -0
- package/layer/public/reports/darzalex-has.pdf +0 -0
- package/layer/public/reports/dupixent-has.html +217 -0
- package/layer/public/reports/dupixent-has.pdf +0 -0
- package/layer/public/reports/enhertu-has.html +283 -0
- package/layer/public/reports/enhertu-has.pdf +0 -0
- package/layer/public/reports/has-sein-2023.html +1639 -0
- package/layer/public/reports/ibrance-has.html +280 -0
- package/layer/public/reports/ibrance-has.pdf +0 -0
- package/layer/public/reports/imfinzi-has.html +297 -0
- package/layer/public/reports/imfinzi-has.pdf +0 -0
- package/layer/public/reports/keytruda-has.html +337 -0
- package/layer/public/reports/keytruda-has.pdf +0 -0
- package/layer/public/reports/kisqali-has.html +202 -0
- package/layer/public/reports/kisqali-has.pdf +0 -0
- package/layer/public/reports/opdivo-has.html +232 -0
- package/layer/public/reports/opdivo-has.pdf +0 -0
- package/layer/public/reports/ozempic-has.html +188 -0
- package/layer/public/reports/ozempic-has.pdf +0 -0
- package/layer/public/reports/tecentriq-has.html +315 -0
- package/layer/public/reports/tecentriq-has.pdf +0 -0
- package/layer/public/reports/yescarta-has.html +275 -0
- package/layer/public/reports/yescarta-has.pdf +0 -0
- package/layer/server/api/oip/es.post.ts +99 -0
- package/layer/server/api/oip/pdf.get.ts +70 -0
- package/layer/server/api/oip/reports.get.ts +98 -0
- package/layer/server/api/oip/resource-types.get.ts +22 -0
- package/package.json +1 -1
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Une MITM rangee dans un projet (portage de pages/hubr/heart/mitm/[id] de
|
|
3
|
+
fr_drugs_app). La page relit le document par son code CIS puis renvoie a la
|
|
4
|
+
fiche marque, onglet MITM : on monte cette fiche, sur ce CIS. Sans marque,
|
|
5
|
+
le bandeau de la page et le detail MITM du CIS.
|
|
6
|
+
|
|
7
|
+
`id` est l'`_id` du document (projet), ou son code CIS quand `by="cis"`
|
|
8
|
+
(lien vers la page de fr_drugs_app).
|
|
9
|
+
-->
|
|
10
|
+
<template>
|
|
11
|
+
<div class="oip-drugs oip-drugs-rv-mitm">
|
|
12
|
+
<RmLoadingState v-if="pending" spinner />
|
|
13
|
+
|
|
14
|
+
<OipDrugsFichesBrandFiche
|
|
15
|
+
v-else-if="brand"
|
|
16
|
+
v-model:tab="tab"
|
|
17
|
+
:brand="brand"
|
|
18
|
+
:cis="cisCode"
|
|
19
|
+
:lang="lang"
|
|
20
|
+
:highlight="highlight"
|
|
21
|
+
>
|
|
22
|
+
<template #title-link><slot name="title-link" /></template>
|
|
23
|
+
</OipDrugsFichesBrandFiche>
|
|
24
|
+
|
|
25
|
+
<div v-else-if="source" class="arg_page_layout">
|
|
26
|
+
<RmPageHeader eyebrow="MITM">
|
|
27
|
+
<template #title>
|
|
28
|
+
{{ source.cis_label }} (CIS:{{ cisCode }})
|
|
29
|
+
<slot name="title-link" />
|
|
30
|
+
</template>
|
|
31
|
+
<p class="oip_caption">
|
|
32
|
+
{{ lang === 'en' ? source.atc5_english_code_label : source.atc5_french_code_label }}, {{ source.owner_regroup }}
|
|
33
|
+
</p>
|
|
34
|
+
</RmPageHeader>
|
|
35
|
+
|
|
36
|
+
<OipDrugsHeartMitmDetailsOverview :cis="source" @select="drawerRecord = $event" />
|
|
37
|
+
|
|
38
|
+
<OipDrugsHeartResultsDetailsRecordDrawer
|
|
39
|
+
:record="drawerRecord"
|
|
40
|
+
:source-label="drawerRecord?.sourceLabel"
|
|
41
|
+
@close="drawerRecord = null"
|
|
42
|
+
/>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<RmEmptyState
|
|
46
|
+
v-else
|
|
47
|
+
icon="FileX"
|
|
48
|
+
:title="lang === 'en' ? 'Record unavailable' : 'Fiche indisponible'"
|
|
49
|
+
:text="lang === 'en' ? 'The record is no longer in the data.' : 'La fiche n\'est plus dans la donnée.'"
|
|
50
|
+
/>
|
|
51
|
+
</div>
|
|
52
|
+
</template>
|
|
53
|
+
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { oipEsSearch } from "../../../composables/useOipResources";
|
|
56
|
+
import { ES_INDEX } from "../../../oip-drugs/esIndices";
|
|
57
|
+
|
|
58
|
+
const props = withDefaults(
|
|
59
|
+
defineProps<{ id: string; type?: string; by?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
|
|
60
|
+
{ type: "FrMitm", by: "", highlight: () => [], lang: "fr" },
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
/** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
|
|
64
|
+
const tab = ref("mitm");
|
|
65
|
+
const drawerRecord = ref<any>(null);
|
|
66
|
+
|
|
67
|
+
// Meme requete que la page quand l'id est un code CIS ; par `_id` sinon.
|
|
68
|
+
const { data: hit, pending } = useAsyncData(
|
|
69
|
+
() => `oip-drugs-mitm-${props.by}-${props.id}`,
|
|
70
|
+
async () => {
|
|
71
|
+
const body =
|
|
72
|
+
props.by === "cis"
|
|
73
|
+
? { query: { match: { "cis_code.keyword": props.id } }, size: 100 }
|
|
74
|
+
: { query: { ids: { values: [props.id] } }, size: 1 };
|
|
75
|
+
const response = await oipEsSearch<any>("drugs", ES_INDEX.MITM_BDPM, body);
|
|
76
|
+
return response?.hits?.hits?.[0] ?? null;
|
|
77
|
+
},
|
|
78
|
+
{ server: false, watch: [() => props.id, () => props.by] },
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const source = computed(() => hit.value?._source ?? null);
|
|
82
|
+
const cisCode = computed(() => (source.value?.cis_code != null ? String(source.value.cis_code) : props.by === "cis" ? props.id : ""));
|
|
83
|
+
const brand = computed(() => (source.value?.brand ? String(source.value.brand) : ""));
|
|
84
|
+
</script>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Vue de ressource d'un compte rendu de commission de l'Assemblee nationale
|
|
3
|
+
(FrNationalAssemblySession) : le document relu par son `_id`, sans son
|
|
4
|
+
texte (jusqu'a 200 000 caracteres), monte dans la carte que le tiroir des
|
|
5
|
+
projets de fr_drugs_app montrait. La lecture s'ouvre dans la visionneuse.
|
|
6
|
+
-->
|
|
7
|
+
<template>
|
|
8
|
+
<div class="oip-drugs oip_list gap-12 full">
|
|
9
|
+
|
|
10
|
+
<RmLoadingState v-if="loading" />
|
|
11
|
+
<RmEmptyState v-else-if="!report" :title="t('oipDrugs.heart.errors.results')" icon="Prohibit" />
|
|
12
|
+
<OipDrugsHeartAssociationsNationalAssemblyCard
|
|
13
|
+
v-else
|
|
14
|
+
:report="report"
|
|
15
|
+
:report-id="id"
|
|
16
|
+
:store-search-bar="highlight"
|
|
17
|
+
@read="openReport"
|
|
18
|
+
/>
|
|
19
|
+
|
|
20
|
+
<OipDocumentPreview
|
|
21
|
+
v-model="reportOpen"
|
|
22
|
+
:src="reportSrc"
|
|
23
|
+
:title="reportTitle"
|
|
24
|
+
:external-src="reportExternal"
|
|
25
|
+
:query="reportQuery"
|
|
26
|
+
:anchor="reportAnchor"
|
|
27
|
+
:fallback-src="reportFallback"
|
|
28
|
+
/>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script setup lang="ts">
|
|
33
|
+
import { ES_INDEX } from "../../../oip-drugs/esIndices";
|
|
34
|
+
import { NATIONAL_ASSEMBLY_FIELDS } from "../../../oip-drugs/utils/associationFields";
|
|
35
|
+
import { oipEsSearch } from "../../../composables/useOipResources";
|
|
36
|
+
|
|
37
|
+
const props = withDefaults(
|
|
38
|
+
defineProps<{
|
|
39
|
+
id: string;
|
|
40
|
+
type?: string;
|
|
41
|
+
lang?: "fr" | "en";
|
|
42
|
+
highlight?: string[];
|
|
43
|
+
}>(),
|
|
44
|
+
{ type: "FrNationalAssemblySession", lang: "fr", highlight: () => [] },
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
const { t } = useI18n();
|
|
48
|
+
|
|
49
|
+
const report = ref<any>(null);
|
|
50
|
+
const loading = ref(true);
|
|
51
|
+
|
|
52
|
+
watch(
|
|
53
|
+
() => props.id,
|
|
54
|
+
async (id) => {
|
|
55
|
+
loading.value = true;
|
|
56
|
+
report.value = null;
|
|
57
|
+
try {
|
|
58
|
+
const res: any = await oipEsSearch("drugs", ES_INDEX.ASSOCIATION_COMMISSION_SESSION_NATIONAL_ASSEMBLY, {
|
|
59
|
+
size: 1,
|
|
60
|
+
_source: { excludes: [NATIONAL_ASSEMBLY_FIELDS.text] },
|
|
61
|
+
query: { ids: { values: [id] } },
|
|
62
|
+
});
|
|
63
|
+
report.value = res?.hits?.hits?.[0]?._source ?? null;
|
|
64
|
+
} catch {
|
|
65
|
+
report.value = null;
|
|
66
|
+
}
|
|
67
|
+
loading.value = false;
|
|
68
|
+
},
|
|
69
|
+
{ immediate: true },
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const reportOpen = ref(false);
|
|
73
|
+
const reportSrc = ref<string | null>(null);
|
|
74
|
+
const reportTitle = ref("");
|
|
75
|
+
const reportExternal = ref<string | null>(null);
|
|
76
|
+
/** La copie Tekkare telle quelle : iframe de repli et base des liens. */
|
|
77
|
+
const reportFallback = ref<string | null>(null);
|
|
78
|
+
const reportQuery = ref<string[]>([]);
|
|
79
|
+
const reportAnchor = ref<string | null>(null);
|
|
80
|
+
|
|
81
|
+
/** Comme la liste de fr_drugs_app : la copie passe par le proxy du layer. */
|
|
82
|
+
function openReport(doc: any, terms?: string[], anchor?: string) {
|
|
83
|
+
reportQuery.value = terms?.length ? terms : props.highlight;
|
|
84
|
+
reportAnchor.value = anchor || null;
|
|
85
|
+
const url = doc[NATIONAL_ASSEMBLY_FIELDS.tekkareUrl];
|
|
86
|
+
reportSrc.value = url ? `/api/oip/pdf?url=${encodeURIComponent(url)}` : null;
|
|
87
|
+
reportFallback.value = url || null;
|
|
88
|
+
reportExternal.value = doc[NATIONAL_ASSEMBLY_FIELDS.htmlUrl] || null;
|
|
89
|
+
reportTitle.value =
|
|
90
|
+
doc[NATIONAL_ASSEMBLY_FIELDS.agenda] || t("oipDrugs.heart.associations.nationalAssembly.card.untitled");
|
|
91
|
+
reportOpen.value = true;
|
|
92
|
+
}
|
|
93
|
+
</script>
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Vue de ressource d'une marque Outpatient (FrOutpatientBrand) : son
|
|
3
|
+
evolution annuelle, comme le tiroir de projet de fr_drugs_app
|
|
4
|
+
(outpatient/productEvolution au niveau marque). La marque est le
|
|
5
|
+
`resourceId` sans `_TOTAL`. La mesure, que fr_drugs_app lisait dans le store
|
|
6
|
+
outpatient, se choisit ici comme sur la vue Medic'AM.
|
|
7
|
+
-->
|
|
8
|
+
<template>
|
|
9
|
+
<div class="oip-drugs v-sales">
|
|
10
|
+
<RmPageHeader>
|
|
11
|
+
<template #title>
|
|
12
|
+
<span class="v-sales__title">{{ brand }}</span>
|
|
13
|
+
<slot name="title-link" />
|
|
14
|
+
</template>
|
|
15
|
+
</RmPageHeader>
|
|
16
|
+
|
|
17
|
+
<div class="v-sales__body">
|
|
18
|
+
<RmEmptyState
|
|
19
|
+
v-if="pageEmpty"
|
|
20
|
+
icon="MagnifyingGlassMinus"
|
|
21
|
+
:title="en ? 'No data' : 'Aucune donnée'"
|
|
22
|
+
:text="en ? 'No outpatient sales for this brand.' : 'Aucune vente Outpatient pour cette marque.'"
|
|
23
|
+
/>
|
|
24
|
+
<!-- Le bloc reste monte : il dit lui-meme s'il est vide. -->
|
|
25
|
+
<div v-show="!pageEmpty" class="v-sales__stack">
|
|
26
|
+
<RmSegmented
|
|
27
|
+
v-model="measure"
|
|
28
|
+
size="sm"
|
|
29
|
+
:options="options"
|
|
30
|
+
:aria-label="en ? 'Measure' : 'Mesure'"
|
|
31
|
+
/>
|
|
32
|
+
<OipDrugsOutpatientProductEvolution
|
|
33
|
+
:key="brand"
|
|
34
|
+
:es-index="ES_INDEX.OUTPATIENT_BRAND"
|
|
35
|
+
:selected-item="[brand]"
|
|
36
|
+
:selected-label="[{ code: brand, label: brand, code_label: brand }]"
|
|
37
|
+
:selected-switch="true"
|
|
38
|
+
:measure-index="measureIndex"
|
|
39
|
+
:lang="lang"
|
|
40
|
+
:source="source"
|
|
41
|
+
:verified="verified"
|
|
42
|
+
/>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script setup lang="ts">
|
|
49
|
+
import { ES_INDEX } from "../../../oip-drugs/esIndices";
|
|
50
|
+
import { usePageEmpty } from "../../../oip-drugs/composables/usePageEmpty";
|
|
51
|
+
import {
|
|
52
|
+
OUTPATIENT_DEFAULT_MEASURE,
|
|
53
|
+
OUTPATIENT_MEASURES,
|
|
54
|
+
measureOptions,
|
|
55
|
+
salesBrandOf,
|
|
56
|
+
} from "../../../oip-drugs/utils/v-salesSeries";
|
|
57
|
+
import { useSalesSource } from "../../../oip-drugs/composables/v-useSalesSource";
|
|
58
|
+
|
|
59
|
+
const props = withDefaults(
|
|
60
|
+
defineProps<{ id: string; type?: string; lang?: "fr" | "en"; highlight?: string[] }>(),
|
|
61
|
+
{ type: "FrOutpatientBrand", lang: "fr", highlight: () => [] },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const en = computed(() => props.lang === "en");
|
|
65
|
+
const brand = computed(() => salesBrandOf("FrOutpatientBrand", props.id));
|
|
66
|
+
const { source, verified } = useSalesSource("OUTPATIENT", () => props.lang);
|
|
67
|
+
const pageEmpty = usePageEmpty();
|
|
68
|
+
|
|
69
|
+
// Ex-store outpatient : la mesure lue, en etat local (defaut : prix public).
|
|
70
|
+
const measure = ref(OUTPATIENT_MEASURES.variables[OUTPATIENT_DEFAULT_MEASURE]!);
|
|
71
|
+
const measureIndex = computed(() => Math.max(0, OUTPATIENT_MEASURES.variables.indexOf(measure.value)));
|
|
72
|
+
const options = computed(() => measureOptions(OUTPATIENT_MEASURES, en.value));
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
<style scoped>
|
|
76
|
+
.v-sales__title {
|
|
77
|
+
display: block;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Les gouttieres de la colonne de contenu, comme les onglets d'OipResourceView. */
|
|
81
|
+
.v-sales__body {
|
|
82
|
+
box-sizing: border-box;
|
|
83
|
+
margin-top: var(--space-24);
|
|
84
|
+
padding: 0 var(--space-24) var(--space-32);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.v-sales__stack {
|
|
88
|
+
display: flex;
|
|
89
|
+
flex-direction: column;
|
|
90
|
+
gap: var(--space-16);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Le rail de mesures garde sa largeur. */
|
|
94
|
+
.v-sales__stack > :first-child {
|
|
95
|
+
align-self: flex-start;
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Vue de ressource FrPnds : le `resourceId` est le `_id` du protocole, l'id
|
|
3
|
+
meme de la fiche PNDS.
|
|
4
|
+
-->
|
|
5
|
+
<template>
|
|
6
|
+
<div class="oip-drugs">
|
|
7
|
+
<OipDrugsFichesPndsFiche :id="id" :lang="lang" :highlight="highlight">
|
|
8
|
+
<template #title-link><slot name="title-link" /></template>
|
|
9
|
+
</OipDrugsFichesPndsFiche>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
|
|
13
|
+
<script setup lang="ts">
|
|
14
|
+
withDefaults(
|
|
15
|
+
defineProps<{
|
|
16
|
+
/** Le `resourceId` : `_id` du protocole dans l'index PNDS. */
|
|
17
|
+
id: string;
|
|
18
|
+
type?: string;
|
|
19
|
+
lang?: "fr" | "en";
|
|
20
|
+
highlight?: string[];
|
|
21
|
+
}>(),
|
|
22
|
+
{ type: "FrPnds", lang: undefined, highlight: () => [] },
|
|
23
|
+
);
|
|
24
|
+
</script>
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Une presentation du suivi des prix rangee dans un projet (portage de
|
|
3
|
+
pages/hubr/heart/prices/details/[id] de fr_drugs_app). La page relit la
|
|
4
|
+
presentation par son code CIP (`local_drug_id`) puis renvoie a la fiche
|
|
5
|
+
marque, onglet Prix : on monte cette fiche. Sans marque, la carte de la
|
|
6
|
+
presentation (celle de la liste des prix) ; sans document, le message de la
|
|
7
|
+
page.
|
|
8
|
+
|
|
9
|
+
`id` est l'`_id` du document (projet), ou son `local_drug_id` quand
|
|
10
|
+
`by="local_drug_id"` (lien vers la page de fr_drugs_app).
|
|
11
|
+
-->
|
|
12
|
+
<template>
|
|
13
|
+
<div class="oip-drugs oip-drugs-rv-price">
|
|
14
|
+
<RmLoadingState v-if="pending" spinner />
|
|
15
|
+
|
|
16
|
+
<OipDrugsFichesBrandFiche
|
|
17
|
+
v-else-if="brand"
|
|
18
|
+
v-model:tab="tab"
|
|
19
|
+
:brand="brand"
|
|
20
|
+
:lang="lang"
|
|
21
|
+
:highlight="highlight"
|
|
22
|
+
>
|
|
23
|
+
<template #title-link><slot name="title-link" /></template>
|
|
24
|
+
</OipDrugsFichesBrandFiche>
|
|
25
|
+
|
|
26
|
+
<template v-else-if="product">
|
|
27
|
+
<RmPageHeader eyebrow="🇫🇷 France">
|
|
28
|
+
<template #title>
|
|
29
|
+
{{ product.label }}
|
|
30
|
+
<slot name="title-link" />
|
|
31
|
+
</template>
|
|
32
|
+
</RmPageHeader>
|
|
33
|
+
<div class="oip-drugs-rv-price__body">
|
|
34
|
+
<OipDrugsHeartFranceBrandGroupCard :group="group" :search-queries="highlight" />
|
|
35
|
+
</div>
|
|
36
|
+
</template>
|
|
37
|
+
|
|
38
|
+
<div v-else class="oip_row v-center centered full_width mt-32">
|
|
39
|
+
<p>
|
|
40
|
+
{{
|
|
41
|
+
lang === "en"
|
|
42
|
+
? "This product is not in the price database."
|
|
43
|
+
: "Ce produit n'est pas dans la base des prix."
|
|
44
|
+
}}
|
|
45
|
+
</p>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</template>
|
|
49
|
+
|
|
50
|
+
<script setup lang="ts">
|
|
51
|
+
import { oipEsSearch } from "../../../composables/useOipResources";
|
|
52
|
+
import { ES_INDEX } from "../../../oip-drugs/esIndices";
|
|
53
|
+
|
|
54
|
+
const props = withDefaults(
|
|
55
|
+
defineProps<{ id: string; type?: string; by?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
|
|
56
|
+
{ type: "FrDrugPrice", by: "", highlight: () => [], lang: "fr" },
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
/** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
|
|
60
|
+
const tab = ref("price");
|
|
61
|
+
|
|
62
|
+
// Meme requete que la page quand l'id est un code CIP ; par `_id` sinon.
|
|
63
|
+
const { data: hit, pending } = useAsyncData(
|
|
64
|
+
() => `oip-drugs-price-${props.by}-${props.id}`,
|
|
65
|
+
async () => {
|
|
66
|
+
const query =
|
|
67
|
+
props.by === "local_drug_id"
|
|
68
|
+
? { bool: { must: [{ match: { local_drug_id: props.id } }] } }
|
|
69
|
+
: { ids: { values: [props.id] } };
|
|
70
|
+
const response = await oipEsSearch<any>("drugs", ES_INDEX.DRUG_CARDS, {
|
|
71
|
+
from: 0,
|
|
72
|
+
query,
|
|
73
|
+
size: 1,
|
|
74
|
+
track_total_hits: true,
|
|
75
|
+
});
|
|
76
|
+
return response?.hits?.hits?.[0] ?? null;
|
|
77
|
+
},
|
|
78
|
+
{ server: false, watch: [() => props.id, () => props.by] },
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const product = computed(() => hit.value?._source ?? null);
|
|
82
|
+
const brand = computed(() => (product.value?.brand ? String(product.value.brand) : ""));
|
|
83
|
+
|
|
84
|
+
/** La presentation seule, au format des groupes de la liste des prix (useHeartGroupedPrice). */
|
|
85
|
+
const group = computed(() => {
|
|
86
|
+
const p = product.value ?? {};
|
|
87
|
+
const id = hit.value?._id ?? props.id;
|
|
88
|
+
return {
|
|
89
|
+
group_key: id,
|
|
90
|
+
brand: p.brand || p.label || "",
|
|
91
|
+
count: 1,
|
|
92
|
+
last_price_update: p.last_price_update ?? null,
|
|
93
|
+
manufacturers: [p.manufacturer].filter(Boolean),
|
|
94
|
+
molecules: [p.molecule].filter(Boolean),
|
|
95
|
+
products: [{ ...p, id }],
|
|
96
|
+
ids: [id],
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
<style scoped>
|
|
102
|
+
.oip-drugs-rv-price__body {
|
|
103
|
+
box-sizing: border-box;
|
|
104
|
+
padding: var(--space-24);
|
|
105
|
+
}
|
|
106
|
+
</style>
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Une P.U.T. rangee dans un projet (portage de pages/hubr/heart/put/[id] de
|
|
3
|
+
fr_drugs_app). La page relit le protocole par son `_id` puis renvoie a la
|
|
4
|
+
fiche marque, onglet PUT : on monte cette fiche. Sans marque, ce que la page
|
|
5
|
+
montre alors : le bandeau, la carte du protocole et ses documents.
|
|
6
|
+
-->
|
|
7
|
+
<template>
|
|
8
|
+
<div class="oip-drugs oip-drugs-rv-put">
|
|
9
|
+
<RmLoadingState v-if="pending" spinner />
|
|
10
|
+
|
|
11
|
+
<OipDrugsFichesBrandFiche
|
|
12
|
+
v-else-if="brand"
|
|
13
|
+
v-model:tab="tab"
|
|
14
|
+
:brand="brand"
|
|
15
|
+
:lang="lang"
|
|
16
|
+
:highlight="highlight"
|
|
17
|
+
>
|
|
18
|
+
<template #title-link><slot name="title-link" /></template>
|
|
19
|
+
</OipDrugsFichesBrandFiche>
|
|
20
|
+
|
|
21
|
+
<div v-else-if="source" class="arg_page_layout" style="align-items: flex-start;">
|
|
22
|
+
<RmPageHeader :eyebrow="$t('oipDrugs.heart.put.titleShort')">
|
|
23
|
+
<template #title>
|
|
24
|
+
{{ source.specialty_dci || $t('oipDrugs.heart.put.detailsPage.title') }}
|
|
25
|
+
<slot name="title-link" />
|
|
26
|
+
</template>
|
|
27
|
+
<p v-if="source.authorization_date" class="oip_filter_label">
|
|
28
|
+
{{ heartFormatDate(source.authorization_date) }}
|
|
29
|
+
</p>
|
|
30
|
+
</RmPageHeader>
|
|
31
|
+
|
|
32
|
+
<div class="oip_list gap-12 full">
|
|
33
|
+
<OipDrugsHeartElasticSourceContainerElastic
|
|
34
|
+
:uuid="HEART_SOURCE_UUIDS.PUT"
|
|
35
|
+
:last-label="$t('oipDrugs.heart.sources.lastAuthorization')"
|
|
36
|
+
:last-date="source.authorization_date"
|
|
37
|
+
/>
|
|
38
|
+
|
|
39
|
+
<OipDrugsHeartPutCard
|
|
40
|
+
class="full ml-24"
|
|
41
|
+
:product="source"
|
|
42
|
+
:product-id="docId"
|
|
43
|
+
:store-search-bar="highlight"
|
|
44
|
+
:in-details="true"
|
|
45
|
+
/>
|
|
46
|
+
|
|
47
|
+
<!-- Documents Tekkare (docx) -->
|
|
48
|
+
<div v-if="docLinks.length > 0" class="oip_card oip_list gap-16 oip_body full ml-24 put_docs">
|
|
49
|
+
<div class="oip_list gap-4">
|
|
50
|
+
<p class="oip_heading">Documents</p>
|
|
51
|
+
<p class="put_doc_info">
|
|
52
|
+
{{ lang === 'fr'
|
|
53
|
+
? "Vous permet d'accéder aux documents même en cas d'indisponibilité du site HAS."
|
|
54
|
+
: 'Allows you to access documents even if the HAS website is unavailable.' }}
|
|
55
|
+
</p>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="oip_list gap-8">
|
|
58
|
+
<div v-for="(link, index) in docLinks" :key="'doc-' + index" class="oip_row gap-8 v-center">
|
|
59
|
+
<RmButton prefix-icon="DownloadSimple" variant="secondary" @click="openPdf(link)">
|
|
60
|
+
{{ $t('oipDrugs.heart.put.detailsPage.downloadPdf') }} - {{ getFileName(link) }}
|
|
61
|
+
</RmButton>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
<!-- Documents PDF -->
|
|
67
|
+
<div v-if="pdfLinks.length > 0" class="oip_card oip_list gap-16 oip_body full ml-24 put_docs">
|
|
68
|
+
<p class="oip_heading">PDF</p>
|
|
69
|
+
<div class="oip_list gap-8">
|
|
70
|
+
<div v-for="(link, index) in pdfLinks" :key="'pdf-' + index" class="oip_row gap-8 v-center">
|
|
71
|
+
<RmButton prefix-icon="DownloadSimple" variant="secondary" @click="openPdf(link)">
|
|
72
|
+
{{ $t('oipDrugs.heart.put.detailsPage.downloadPdf') }} - {{ getFileName(link) }}
|
|
73
|
+
</RmButton>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
<RmEmptyState
|
|
81
|
+
v-else
|
|
82
|
+
icon="FileX"
|
|
83
|
+
:title="lang === 'en' ? 'Record unavailable' : 'Fiche indisponible'"
|
|
84
|
+
:text="lang === 'en' ? 'The record is no longer in the data.' : 'La fiche n\'est plus dans la donnée.'"
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
</template>
|
|
88
|
+
|
|
89
|
+
<script setup lang="ts">
|
|
90
|
+
import { oipEsGet } from "../../../composables/useOipResources";
|
|
91
|
+
import { ES_INDEX } from "../../../oip-drugs/esIndices";
|
|
92
|
+
import { HEART_SOURCE_UUIDS } from "../../../oip-drugs/utils/sourceUuids";
|
|
93
|
+
import { heartFormatDate } from "../../../oip-drugs/utils/heartStyleAndFormat";
|
|
94
|
+
|
|
95
|
+
const props = withDefaults(
|
|
96
|
+
defineProps<{ id: string; type?: string; highlight?: string[]; lang?: "fr" | "en" }>(),
|
|
97
|
+
{ type: "FrHasPut", highlight: () => [], lang: "fr" },
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
/** L'onglet de la fiche marque, tenu ici (la page l'ecrivait dans `?tab=`). */
|
|
101
|
+
const tab = ref("put");
|
|
102
|
+
|
|
103
|
+
const { data: hit, pending } = useAsyncData(
|
|
104
|
+
() => `oip-drugs-put-${props.id}`,
|
|
105
|
+
() => oipEsGet<any>("drugs", ES_INDEX.PUT_HAS, props.id),
|
|
106
|
+
{ server: false, watch: [() => props.id] },
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const source = computed(() => hit.value?._source ?? null);
|
|
110
|
+
const docId = computed(() => hit.value?._id ?? props.id);
|
|
111
|
+
/** La marque de la redirection de la page (`heartBrandPath(brand)`). */
|
|
112
|
+
const brand = computed(() => (source.value?.brand ? String(source.value.brand) : ""));
|
|
113
|
+
|
|
114
|
+
const docLinks = computed<string[]>(() => source.value?.tekkare_doc_links || []);
|
|
115
|
+
const pdfLinks = computed<string[]>(() => source.value?.tekkare_pdf_links || []);
|
|
116
|
+
|
|
117
|
+
function getFileName(url: string) {
|
|
118
|
+
if (!url) return "";
|
|
119
|
+
const parts = url.split("/");
|
|
120
|
+
return decodeURIComponent(parts[parts.length - 1]!);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function openPdf(url: string) {
|
|
124
|
+
if (url) window.open(url, "_blank");
|
|
125
|
+
}
|
|
126
|
+
</script>
|
|
127
|
+
|
|
128
|
+
<style scoped>
|
|
129
|
+
.ml-24 {
|
|
130
|
+
margin-left: 24px;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.put_docs {
|
|
134
|
+
box-sizing: border-box;
|
|
135
|
+
width: calc(100% - 24px);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.put_doc_info {
|
|
139
|
+
font-size: 13px;
|
|
140
|
+
color: var(--dark, #6c6c8a);
|
|
141
|
+
font-weight: 500;
|
|
142
|
+
}
|
|
143
|
+
</style>
|