@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.
- package/dist/module.json +1 -1
- package/dist/runtime/components/BarChart.vue +1 -0
- package/dist/runtime/components/ChoroplethMap.vue +4 -1
- package/dist/runtime/internal/geo/fr-regions.json +1 -1
- package/dist/runtime/utils/chart.d.ts +6 -3
- package/dist/runtime/utils/chart.js +15 -2
- 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,340 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Carte d'indication du referentiel LES (JO).
|
|
3
|
+
|
|
4
|
+
Une carte = une indication (RmResultCard) : quel(s) produit(s), combien de
|
|
5
|
+
presentations, quel statut et quel libelle. L'historique complet vit dans la
|
|
6
|
+
fiche, ouverte au clic sur la carte entiere (les actions internes gardent
|
|
7
|
+
la main). Les liens passent par useOipResourceNav (chemins de fr_drugs_app).
|
|
8
|
+
|
|
9
|
+
En mode `inDetails` (tete de la fiche), la carte n'est plus cliquable et le
|
|
10
|
+
libelle s'affiche en entier.
|
|
11
|
+
-->
|
|
12
|
+
<template>
|
|
13
|
+
<RmResultCard
|
|
14
|
+
class="oip-drugs"
|
|
15
|
+
:clickable="!inDetails"
|
|
16
|
+
:count="result.products.length"
|
|
17
|
+
:count-label="countLabel"
|
|
18
|
+
:count-extra="allBrands.length > 1 ? `${allBrands.length} ${locale === 'fr' ? 'marques' : 'brands'}` : ''"
|
|
19
|
+
:more-label="inDetails ? '' : locale === 'fr' ? 'Voir le détail' : 'See details'"
|
|
20
|
+
:lang="dateLang"
|
|
21
|
+
:link="detailsHref"
|
|
22
|
+
@click="!inDetails && openCard($event)"
|
|
23
|
+
>
|
|
24
|
+
<template #title>
|
|
25
|
+
<OipDrugsHeartTextHighlight :text="allBrands.join(', ')" :queries="getHighlight(['brand'])" />
|
|
26
|
+
</template>
|
|
27
|
+
<template v-if="subtitle || allBrands.length > 1" #subtitle>
|
|
28
|
+
<OipDrugsHeartTextHighlight v-if="subtitle" :text="subtitle" :queries="getHighlight(['molecule', 'company'])" />
|
|
29
|
+
<!-- Plusieurs marques : un lien par marque, la carte ne peut pas choisir. -->
|
|
30
|
+
<div v-if="allBrands.length > 1" class="brand_links">
|
|
31
|
+
<span>{{ locale === "fr" ? "Fiches marque :" : "Brand pages:" }}</span>
|
|
32
|
+
<a
|
|
33
|
+
v-for="brand in allBrands"
|
|
34
|
+
:key="brand"
|
|
35
|
+
:href="nav.appHref('fr_drugs_app', brandUrl(brand))"
|
|
36
|
+
class="brand_link"
|
|
37
|
+
@click="openBrand($event, brand)"
|
|
38
|
+
>
|
|
39
|
+
{{ brand }}
|
|
40
|
+
</a>
|
|
41
|
+
</div>
|
|
42
|
+
</template>
|
|
43
|
+
|
|
44
|
+
<!-- Une carte LES porte une indication et les produits qui la portent :
|
|
45
|
+
c'est cette liste de documents qui part dans le projet. -->
|
|
46
|
+
<template #actions>
|
|
47
|
+
<!-- Emplacement libre pour un appelant (la fiche projet y pose son
|
|
48
|
+
bouton « Commenter ») avant le bouton projet : vide partout ailleurs. -->
|
|
49
|
+
<slot name="hubr-actions" />
|
|
50
|
+
<component
|
|
51
|
+
:is="projectButton"
|
|
52
|
+
v-if="projectButton"
|
|
53
|
+
:resource-id="indicationIds"
|
|
54
|
+
type="FrHasIndication"
|
|
55
|
+
:label="allBrands.join(', ')"
|
|
56
|
+
compact
|
|
57
|
+
/>
|
|
58
|
+
</template>
|
|
59
|
+
|
|
60
|
+
<template #meta>
|
|
61
|
+
<span class="rm-rcard__label">
|
|
62
|
+
{{ locale === "fr" ? "Dernière date début" : "Last start date" }} ·
|
|
63
|
+
<RmDate :date="lastStart[0]" :lang="dateLang" />
|
|
64
|
+
</span>
|
|
65
|
+
<span class="rm-rcard__ref">{{ result.indication }}</span>
|
|
66
|
+
<OipDrugsHeartResultsLesSourceTag
|
|
67
|
+
v-for="(source, index) in allSource"
|
|
68
|
+
:key="index"
|
|
69
|
+
:sourceValue="source"
|
|
70
|
+
/>
|
|
71
|
+
</template>
|
|
72
|
+
|
|
73
|
+
<p class="rm-rcard__lead" :class="{ 'rm-rcard__clamp': !inDetails }">
|
|
74
|
+
<OipDrugsHeartTextHighlight :text="indicationText" :queries="getSearches" :id="result.indication" />
|
|
75
|
+
</p>
|
|
76
|
+
|
|
77
|
+
<!-- Rangees choisies dans « Personnaliser ». -->
|
|
78
|
+
<OipDrugsHeartResultsPrefRows scope="les" :values="prefValues" />
|
|
79
|
+
|
|
80
|
+
<!-- Ce que le moteur a reellement matche, cumule sur les lignes fusionnees
|
|
81
|
+
sous cette indication. -->
|
|
82
|
+
<OipDrugsHeartResultsMatchExplain :hit="{ highlight: result.highlight }" />
|
|
83
|
+
|
|
84
|
+
<template #footer>
|
|
85
|
+
<OipDrugsHeartElasticSourceContainerElastic
|
|
86
|
+
:uuid="HEART_SOURCE_UUIDS.LES"
|
|
87
|
+
:last-label="$t('oipDrugs.heart.sources.lastIndication')"
|
|
88
|
+
:last-date="lastStart"
|
|
89
|
+
/>
|
|
90
|
+
</template>
|
|
91
|
+
</RmResultCard>
|
|
92
|
+
</template>
|
|
93
|
+
|
|
94
|
+
<script setup lang="ts">
|
|
95
|
+
import type { PropType } from "vue";
|
|
96
|
+
import { HEART_SOURCE_UUIDS } from "../../../../../oip-drugs/utils/sourceUuids";
|
|
97
|
+
import { heartFormatDate } from "../../../../../oip-drugs/utils/heartStyleAndFormat";
|
|
98
|
+
import { drugsBrandPath } from "../../../../../oip-drugs/kinds";
|
|
99
|
+
import { useOipResourceHooks } from "../../../../../composables/useOipResourceHooks";
|
|
100
|
+
import { useOipResourceNav } from "../../../../../composables/useOipResourceNav";
|
|
101
|
+
|
|
102
|
+
const props = defineProps({
|
|
103
|
+
result: {
|
|
104
|
+
required: true,
|
|
105
|
+
type: Object,
|
|
106
|
+
},
|
|
107
|
+
inDetails: {
|
|
108
|
+
type: Boolean,
|
|
109
|
+
default: false,
|
|
110
|
+
},
|
|
111
|
+
/** Termes a surligner (ex-filterStore de la page de recherche). */
|
|
112
|
+
highlight: {
|
|
113
|
+
type: Array as PropType<string[]>,
|
|
114
|
+
default: () => [],
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const { locale } = useI18n();
|
|
119
|
+
const nav = useOipResourceNav();
|
|
120
|
+
const { projectButton } = useOipResourceHooks();
|
|
121
|
+
|
|
122
|
+
const dateLang = computed(() => (locale.value === "en" ? "en" : "fr"));
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Les documents que porte la carte : la fusion par indication (cf. la page
|
|
126
|
+
* Indications) empile un produit par marque, et `card_id` vaut le `_id` du
|
|
127
|
+
* document dans l'index. C'est ce que le projet range.
|
|
128
|
+
*/
|
|
129
|
+
const indicationIds = computed(() =>
|
|
130
|
+
(props.result.products ?? [])
|
|
131
|
+
.map((product: any) => product?.card_id)
|
|
132
|
+
.filter((id: any) => id != null),
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* La fiche marque, onglet LES, tiroir ouvert sur cette indication. La marque
|
|
137
|
+
* est le pivot du hub : la carte y mene, la fiche indication reste accessible
|
|
138
|
+
* depuis le tableau (colonne ID).
|
|
139
|
+
*/
|
|
140
|
+
function brandUrl(brand: string) {
|
|
141
|
+
const query = new URLSearchParams({ tab: "les", indication: String(props.result.indication ?? "") });
|
|
142
|
+
return `${drugsBrandPath(brand)}?${query.toString()}`;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** La carte entiere mene a la premiere marque ; les autres ont leur lien dans le sous-titre. */
|
|
146
|
+
const detailsUrl = computed(() =>
|
|
147
|
+
allBrands.value.length > 0
|
|
148
|
+
? brandUrl(allBrands.value[0]!)
|
|
149
|
+
: `/hubr/heart/indication/${encodeURIComponent(String(props.result.indication ?? ""))}`
|
|
150
|
+
);
|
|
151
|
+
const detailsHref = computed(() => nav.appHref("fr_drugs_app", detailsUrl.value));
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Les elements qui portent leur propre action (lien, bouton, champ) gardent
|
|
155
|
+
* la main : le clic qui en vient est ignore (cf. heartOpenCard).
|
|
156
|
+
*/
|
|
157
|
+
const OWN_ACTION = "a, button, input, select, textarea, [role='menu'], .rm-tooltip";
|
|
158
|
+
|
|
159
|
+
function openCard(event: MouseEvent) {
|
|
160
|
+
const target = event.target as HTMLElement | null;
|
|
161
|
+
if (target?.closest(OWN_ACTION)) return;
|
|
162
|
+
nav.openApp("fr_drugs_app", detailsUrl.value);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Lien de marque : Ctrl/Cmd-clic laisse faire le navigateur. */
|
|
166
|
+
function openBrand(event: MouseEvent, brand: string) {
|
|
167
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.button === 1) return;
|
|
168
|
+
event.preventDefault();
|
|
169
|
+
nav.openApp("fr_drugs_app", brandUrl(brand));
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const allBrands = computed(() => {
|
|
173
|
+
return [
|
|
174
|
+
...new Set(props.result.products.map((a: any) => a.brand).filter(Boolean)),
|
|
175
|
+
] as string[];
|
|
176
|
+
});
|
|
177
|
+
const allATC = computed(() => {
|
|
178
|
+
return [
|
|
179
|
+
...new Set(props.result.products.map((a: any) => a.atc5_fr).filter(Boolean)),
|
|
180
|
+
] as string[];
|
|
181
|
+
});
|
|
182
|
+
const allCompanies = computed(() => {
|
|
183
|
+
return [
|
|
184
|
+
...new Set(
|
|
185
|
+
props.result.products.map((a: any) => a.owner_regroup).filter(Boolean)
|
|
186
|
+
),
|
|
187
|
+
] as string[];
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
/** « MOLECULE (ATC5) · FABRICANT », comme le sous-titre de la carte de marque. */
|
|
191
|
+
const subtitle = computed(() =>
|
|
192
|
+
[allATC.value.join(", "), allCompanies.value.join(", ")]
|
|
193
|
+
.filter(Boolean)
|
|
194
|
+
.join(" · ")
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
const countLabel = computed(() => {
|
|
198
|
+
const n = props.result.products.length;
|
|
199
|
+
if (locale.value === "en") return n > 1 ? "products" : "product";
|
|
200
|
+
return n > 1 ? "produits" : "produit";
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
const indicationText = computed(() => {
|
|
204
|
+
const label = props.result.indication_label_fr ?? "";
|
|
205
|
+
return label.charAt(0) + label.slice(1)?.toLowerCase();
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
// Tags maladies rares / oncologie : identiques pour tous les produits d'une même
|
|
209
|
+
// indication (dérivés du libellé), on lit donc le premier produit.
|
|
210
|
+
const tagSource = computed(() => props.result.products?.[0] ?? {});
|
|
211
|
+
|
|
212
|
+
const rareList = computed(() => {
|
|
213
|
+
const src =
|
|
214
|
+
locale.value === "fr"
|
|
215
|
+
? tagSource.value.rare_diseases_fr
|
|
216
|
+
: tagSource.value.rare_diseases_en;
|
|
217
|
+
return Array.isArray(src)
|
|
218
|
+
? ([
|
|
219
|
+
...new Set(
|
|
220
|
+
src.map((a: any) => a.concat_disease_name_orpha_code).filter(Boolean)
|
|
221
|
+
),
|
|
222
|
+
] as string[])
|
|
223
|
+
: [];
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
const oncologyTerms = computed(() => {
|
|
227
|
+
const tagging =
|
|
228
|
+
locale.value === "fr"
|
|
229
|
+
? tagSource.value.oncology_tagging_fr
|
|
230
|
+
: tagSource.value.oncology_tagging_en;
|
|
231
|
+
if (!Array.isArray(tagging)) return [];
|
|
232
|
+
const terms = new Set<string>();
|
|
233
|
+
tagging.forEach((t: any) => {
|
|
234
|
+
if (t.preferred_label) terms.add(t.preferred_label);
|
|
235
|
+
});
|
|
236
|
+
return [...terms];
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
const oncologyIcd10 = computed(() => {
|
|
240
|
+
const tagging =
|
|
241
|
+
locale.value === "fr"
|
|
242
|
+
? tagSource.value.oncology_tagging_fr
|
|
243
|
+
: tagSource.value.oncology_tagging_en;
|
|
244
|
+
if (!Array.isArray(tagging)) return [];
|
|
245
|
+
const labels = new Set<string>();
|
|
246
|
+
tagging.forEach((t: any) => {
|
|
247
|
+
const icd = t.icd10;
|
|
248
|
+
if (Array.isArray(icd)) {
|
|
249
|
+
icd.forEach((x: any) => x?.combined_label && labels.add(x.combined_label));
|
|
250
|
+
} else if (icd?.combined_label) {
|
|
251
|
+
labels.add(icd.combined_label);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
return [...labels];
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Ce que la carte peut montrer en plus, si « Personnaliser » le demande.
|
|
259
|
+
* Les valeurs sont dedupliquees : une indication porte souvent plusieurs
|
|
260
|
+
* produits qui repetent le meme statut ou le meme type.
|
|
261
|
+
*/
|
|
262
|
+
const prefValues = computed(() => {
|
|
263
|
+
const products: any[] = props.result.products ?? [];
|
|
264
|
+
const uniq = (values: any[]) =>
|
|
265
|
+
[...new Set(values.map((v) => (typeof v === "string" ? v.trim() : v)).filter(Boolean))] as string[];
|
|
266
|
+
|
|
267
|
+
return {
|
|
268
|
+
rare: rareList.value,
|
|
269
|
+
oncoIcd10: oncologyIcd10.value,
|
|
270
|
+
oncoTerms: oncologyTerms.value,
|
|
271
|
+
statut: uniq(products.map((p) => p.statut_title)),
|
|
272
|
+
// La date de fin porte son motif quand il est connu : « fini » sans
|
|
273
|
+
// pourquoi n'aide personne.
|
|
274
|
+
endDate: uniq(
|
|
275
|
+
products
|
|
276
|
+
.filter((p) => p.end_date)
|
|
277
|
+
.map((p) =>
|
|
278
|
+
[heartFormatDate(p.end_date), p.end_motive ? `(${p.end_motive})` : null]
|
|
279
|
+
.filter(Boolean)
|
|
280
|
+
.join(" ")
|
|
281
|
+
)
|
|
282
|
+
),
|
|
283
|
+
// Le referentiel melange les casses (« Générique » / « générique »).
|
|
284
|
+
drugType: uniq(
|
|
285
|
+
products.map((p) =>
|
|
286
|
+
typeof p.drug_type === "string" && p.drug_type.trim()
|
|
287
|
+
? p.drug_type.trim().charAt(0).toUpperCase() + p.drug_type.trim().slice(1).toLowerCase()
|
|
288
|
+
: null
|
|
289
|
+
)
|
|
290
|
+
),
|
|
291
|
+
ucd: uniq(products.map((p) => p.ucd13_code)),
|
|
292
|
+
};
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
const allSource = computed(() => {
|
|
297
|
+
return [
|
|
298
|
+
...new Set(props.result.products.map((a: any) => `${a.source}`)),
|
|
299
|
+
] as string[];
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
const lastStart = computed(() => {
|
|
303
|
+
return [
|
|
304
|
+
// Sans le filtre, les dates nulles devenaient la chaine "null" et
|
|
305
|
+
// passaient dans le tri.
|
|
306
|
+
...new Set(props.result.products.map((a: any) => a.start_date).filter(Boolean)),
|
|
307
|
+
].sort(
|
|
308
|
+
(a: any, b: any) => new Date(b).getTime() - new Date(a)?.getTime()
|
|
309
|
+
) as string[];
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Termes surlignes. fr_drugs_app y ajoutait les filtres marque, molecule et
|
|
314
|
+
* fabricant de la page de recherche : la prop `highlight` les porte tous.
|
|
315
|
+
*/
|
|
316
|
+
function getHighlight(_filters: string[]) {
|
|
317
|
+
return getSearches.value;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
const getSearches = computed(() =>
|
|
321
|
+
(props.highlight ?? []).filter((f: any) => typeof f === "string" && f.length > 0),
|
|
322
|
+
);
|
|
323
|
+
</script>
|
|
324
|
+
|
|
325
|
+
<style scoped>
|
|
326
|
+
.brand_links {
|
|
327
|
+
display: flex;
|
|
328
|
+
flex-wrap: wrap;
|
|
329
|
+
align-items: center;
|
|
330
|
+
gap: 4px 8px;
|
|
331
|
+
margin-top: 4px;
|
|
332
|
+
}
|
|
333
|
+
.brand_link {
|
|
334
|
+
color: var(--primary);
|
|
335
|
+
font-weight: 600;
|
|
336
|
+
}
|
|
337
|
+
.brand_link:hover {
|
|
338
|
+
text-decoration: underline;
|
|
339
|
+
}
|
|
340
|
+
</style>
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Tiroir d'une indication de la liste en sus, depuis la fiche marque.
|
|
3
|
+
|
|
4
|
+
Meme coque que les tiroirs Alertes, P.U.T et Contributions ; le corps est
|
|
5
|
+
celui de la page indication/[id] (carte + historique des produits), charge a
|
|
6
|
+
l'ouverture pour le code choisi.
|
|
7
|
+
-->
|
|
8
|
+
<script setup lang="ts">
|
|
9
|
+
import { HEART_SOURCE_UUIDS } from "../../../../../oip-drugs/utils/sourceUuids";
|
|
10
|
+
import useDirectusSources from "../../../../../oip-drugs/composables/useDirectusSources";
|
|
11
|
+
import { useHeartLesIndicationLoader } from "../../../../../oip-drugs/composables/useHeartLesIndication";
|
|
12
|
+
|
|
13
|
+
const props = defineProps<{
|
|
14
|
+
/** Code d'indication a montrer ; `null` ferme le tiroir. */
|
|
15
|
+
code: string | null;
|
|
16
|
+
title?: string | null;
|
|
17
|
+
date?: string | null;
|
|
18
|
+
}>();
|
|
19
|
+
|
|
20
|
+
const emit = defineEmits<{ (event: "close"): void }>();
|
|
21
|
+
|
|
22
|
+
const { locale } = useI18n();
|
|
23
|
+
const { results, isLoading, load } = useHeartLesIndicationLoader();
|
|
24
|
+
|
|
25
|
+
watch(
|
|
26
|
+
() => props.code,
|
|
27
|
+
(code) => {
|
|
28
|
+
results.value = null;
|
|
29
|
+
if (code) load(code);
|
|
30
|
+
},
|
|
31
|
+
{ immediate: true },
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const record = computed(() =>
|
|
35
|
+
props.code
|
|
36
|
+
? {
|
|
37
|
+
typeLabel: "Liste en sus",
|
|
38
|
+
icon: "ListChecks",
|
|
39
|
+
date: props.date ?? null,
|
|
40
|
+
title: props.title || `Indication ${props.code}`,
|
|
41
|
+
}
|
|
42
|
+
: null,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
// La date vient de Directus, comme le panneau « Sources » du rail.
|
|
46
|
+
const { load: loadSourceMeta, verifiedRaw } = useDirectusSources();
|
|
47
|
+
loadSourceMeta([HEART_SOURCE_UUIDS.LES]);
|
|
48
|
+
const checkedAt = computed(() => verifiedRaw(HEART_SOURCE_UUIDS.LES));
|
|
49
|
+
</script>
|
|
50
|
+
|
|
51
|
+
<template>
|
|
52
|
+
<OipDrugsHeartResultsDetailsRecordDrawer
|
|
53
|
+
:record="record"
|
|
54
|
+
:source-label="locale === 'en' ? 'Ministry of Health (LES)' : 'Ministère de la Santé (LES)'"
|
|
55
|
+
:checked-at="checkedAt"
|
|
56
|
+
wide
|
|
57
|
+
@close="emit('close')"
|
|
58
|
+
>
|
|
59
|
+
<RmLoadingState v-if="isLoading" />
|
|
60
|
+
<OipDrugsHeartResultsLesIndicationDetail
|
|
61
|
+
v-else-if="code && results"
|
|
62
|
+
:code="code"
|
|
63
|
+
:results="results"
|
|
64
|
+
table-max-height="480px"
|
|
65
|
+
/>
|
|
66
|
+
</OipDrugsHeartResultsDetailsRecordDrawer>
|
|
67
|
+
</template>
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Detail d'une indication de la liste en sus : sa carte, puis l'historique de
|
|
3
|
+
ses produits. Un seul rendu pour la page indication/[id] et le tiroir LES de
|
|
4
|
+
la fiche marque, pour que les deux disent la meme chose.
|
|
5
|
+
-->
|
|
6
|
+
<script setup lang="ts">
|
|
7
|
+
import { valueTable } from "../../../../../utils/valueTable";
|
|
8
|
+
import {
|
|
9
|
+
heartLesCardData,
|
|
10
|
+
heartLesHistoryTable,
|
|
11
|
+
} from "../../../../../oip-drugs/composables/useHeartLesIndication";
|
|
12
|
+
const props = withDefaults(
|
|
13
|
+
defineProps<{
|
|
14
|
+
code: string;
|
|
15
|
+
/** Lignes de l'index LES pour ce code (cf. useHeartLesIndicationLoader). */
|
|
16
|
+
results: any[] | null;
|
|
17
|
+
tableMaxHeight?: string;
|
|
18
|
+
}>(),
|
|
19
|
+
{ tableMaxHeight: "600px" },
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const { locale, t } = useI18n();
|
|
23
|
+
|
|
24
|
+
const cardData = computed(() => heartLesCardData(props.code, props.results));
|
|
25
|
+
const table = computed(() =>
|
|
26
|
+
heartLesHistoryTable(props.results, locale.value, t("oipDrugs.heart.filters.company")),
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
/** L'inscription la plus recente de l'historique affiche. */
|
|
30
|
+
const lastIndicationDates = computed(() =>
|
|
31
|
+
(props.results ?? []).map((row: any) => row?.start_date),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
/** OUI / YES en vert, le reste en gris. */
|
|
35
|
+
const isYes = (value: string) => /^(oui|yes)$/i.test(String(value).trim());
|
|
36
|
+
|
|
37
|
+
// Le tableau etait ecrit pour `arg-table` : des libelles de tete et des lignes
|
|
38
|
+
// `{ values: [...] }`. La conversion en colonnes de RmTable est mecanique,
|
|
39
|
+
// cf. `valueTable`.
|
|
40
|
+
const lesTable = computed(() =>
|
|
41
|
+
valueTable(table.value.header, table.value.data, table.value.type, table.value.style),
|
|
42
|
+
);
|
|
43
|
+
</script>
|
|
44
|
+
|
|
45
|
+
<template>
|
|
46
|
+
<div class="ldetail oip-drugs">
|
|
47
|
+
<OipDrugsHeartResultsLesCard v-if="cardData" :result="cardData" in-details />
|
|
48
|
+
<RmTableCard class="stretch">
|
|
49
|
+
<template #header>
|
|
50
|
+
<div>
|
|
51
|
+
<div class="oip_list v-start gap-4">
|
|
52
|
+
<p class="oip_heading">{{ t("oipDrugs.heart.indication.history") }}</p>
|
|
53
|
+
<OipDrugsHeartResultsLesSource
|
|
54
|
+
:last-label="t('oipDrugs.heart.sources.lastIndication')"
|
|
55
|
+
:last-date="lastIndicationDates"
|
|
56
|
+
/>
|
|
57
|
+
</div>
|
|
58
|
+
</div>
|
|
59
|
+
</template>
|
|
60
|
+
<RmTable
|
|
61
|
+
:columns="lesTable.columns"
|
|
62
|
+
:rows="lesTable.rows"
|
|
63
|
+
:max-height="tableMaxHeight"
|
|
64
|
+
>
|
|
65
|
+
<template v-for="key in lesTable.typeKeys.product" :key="key" #[key]="{ value }">
|
|
66
|
+
<div class="lprod">
|
|
67
|
+
<div class="lprod_tags">
|
|
68
|
+
<RmTag v-if="value.company" variant="gray">{{ value.company }}</RmTag>
|
|
69
|
+
<RmTag v-if="value.ucd" variant="transparent">UCD {{ value.ucd }}</RmTag>
|
|
70
|
+
<RmTag v-if="value.type" variant="gray">{{ value.type }}</RmTag>
|
|
71
|
+
</div>
|
|
72
|
+
<p class="lprod_name">{{ value.label }}</p>
|
|
73
|
+
</div>
|
|
74
|
+
</template>
|
|
75
|
+
<template v-for="key in lesTable.typeKeys.date" :key="key" #[key]="{ value }">
|
|
76
|
+
<RmDate
|
|
77
|
+
v-if="value && value !== '-'"
|
|
78
|
+
:date="value"
|
|
79
|
+
:lang="locale"
|
|
80
|
+
compact
|
|
81
|
+
/>
|
|
82
|
+
<p v-else>-</p>
|
|
83
|
+
</template>
|
|
84
|
+
<template v-for="key in lesTable.typeKeys.period" :key="key" #[key]="{ value }">
|
|
85
|
+
<p v-if="value.start || value.end" class="lperiod">
|
|
86
|
+
<RmDate v-if="value.start" :date="value.start" :lang="locale" compact />
|
|
87
|
+
<span v-else>?</span>
|
|
88
|
+
<RmIcon name="ArrowRight" :size="12" />
|
|
89
|
+
<RmDate v-if="value.end" :date="value.end" :lang="locale" compact />
|
|
90
|
+
<span v-else>{{ locale === "en" ? "ongoing" : "en cours" }}</span>
|
|
91
|
+
</p>
|
|
92
|
+
<p v-else>-</p>
|
|
93
|
+
</template>
|
|
94
|
+
<template v-for="key in lesTable.typeKeys.source" :key="key" #[key]="{ value }">
|
|
95
|
+
<OipDrugsHeartResultsLesSourceTag v-if="value" :source-value="value" />
|
|
96
|
+
<p v-else>-</p>
|
|
97
|
+
</template>
|
|
98
|
+
<template v-for="key in lesTable.typeKeys.flag" :key="key" #[key]="{ value }">
|
|
99
|
+
<RmTag v-if="value" :variant="isYes(value) ? 'green' : 'gray'">
|
|
100
|
+
{{ value }}
|
|
101
|
+
</RmTag>
|
|
102
|
+
<p v-else>-</p>
|
|
103
|
+
</template>
|
|
104
|
+
<template v-for="key in lesTable.typeKeys.tag" :key="key" #[key]="{ value }">
|
|
105
|
+
<RmTag v-if="value" variant="gray">{{ value }}</RmTag>
|
|
106
|
+
<p v-else>-</p>
|
|
107
|
+
</template>
|
|
108
|
+
</RmTable>
|
|
109
|
+
</RmTableCard>
|
|
110
|
+
</div>
|
|
111
|
+
</template>
|
|
112
|
+
|
|
113
|
+
<style scoped>
|
|
114
|
+
.ldetail {
|
|
115
|
+
display: flex;
|
|
116
|
+
flex-direction: column;
|
|
117
|
+
align-items: stretch;
|
|
118
|
+
gap: 16px;
|
|
119
|
+
width: 100%;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.stretch {
|
|
123
|
+
align-self: stretch;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.lprod {
|
|
127
|
+
display: flex;
|
|
128
|
+
flex-direction: column;
|
|
129
|
+
gap: 6px;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.lprod_tags {
|
|
133
|
+
display: flex;
|
|
134
|
+
flex-wrap: wrap;
|
|
135
|
+
gap: 4px;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.lprod_name {
|
|
139
|
+
font-weight: 600;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.lperiod {
|
|
143
|
+
display: inline-flex;
|
|
144
|
+
flex-wrap: wrap;
|
|
145
|
+
align-items: center;
|
|
146
|
+
gap: 4px;
|
|
147
|
+
white-space: nowrap;
|
|
148
|
+
}
|
|
149
|
+
</style>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<OipDrugsHeartElasticSourceContainerElastic
|
|
3
|
+
class="oip-drugs"
|
|
4
|
+
:uuid="HEART_SOURCE_UUIDS.LES"
|
|
5
|
+
tone="primary"
|
|
6
|
+
:last-label="lastLabel"
|
|
7
|
+
:last-date="lastDate"
|
|
8
|
+
/>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import { HEART_SOURCE_UUIDS } from "../../../../../oip-drugs/utils/sourceUuids";
|
|
13
|
+
|
|
14
|
+
// Le pied dit aussi, quand l'appelant la connait, la date du dernier
|
|
15
|
+
// mouvement de ce qu'il affiche (cf. sourceContainerElastic).
|
|
16
|
+
defineProps<{
|
|
17
|
+
lastLabel?: string;
|
|
18
|
+
lastDate?: string | number | null | Array<string | number | null | undefined>;
|
|
19
|
+
}>();
|
|
20
|
+
</script>
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<RmTag class="oip-drugs" :variant="getStyle">{{ sourceValue }}</RmTag>
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
sourceValue: {
|
|
8
|
+
type: String,
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const getStyle = computed(() => {
|
|
14
|
+
if (props.sourceValue.includes("AAC")) {
|
|
15
|
+
return "yellow";
|
|
16
|
+
} else if (props.sourceValue.includes("AAP")) {
|
|
17
|
+
return "indigo";
|
|
18
|
+
} else if (props.sourceValue.includes("AP")) {
|
|
19
|
+
return "rose";
|
|
20
|
+
} else if (props.sourceValue.includes("ATUC")) {
|
|
21
|
+
return "fushia";
|
|
22
|
+
} else if (props.sourceValue.includes("AAP")) {
|
|
23
|
+
return "purple";
|
|
24
|
+
} else {
|
|
25
|
+
switch (props.sourceValue) {
|
|
26
|
+
case "Liste en sus":
|
|
27
|
+
return "green";
|
|
28
|
+
case "CPC en cours":
|
|
29
|
+
return "orange";
|
|
30
|
+
case "Dérogatoire par NI":
|
|
31
|
+
return "sky";
|
|
32
|
+
case "Post-ATUc":
|
|
33
|
+
return "violet";
|
|
34
|
+
case "ATU terminée":
|
|
35
|
+
return "teal";
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
</script>
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<OipDrugsHeartElasticSourceContainerElastic
|
|
3
|
+
v-if="sourceUuid"
|
|
4
|
+
class="oip-drugs"
|
|
5
|
+
:uuid="sourceUuid"
|
|
6
|
+
:last-label="lastLabel"
|
|
7
|
+
:last-date="lastDate"
|
|
8
|
+
/>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup lang="ts">
|
|
12
|
+
import { HEART_SOURCE_UUIDS } from "../../../../oip-drugs/utils/sourceUuids";
|
|
13
|
+
|
|
14
|
+
// Le pied dit aussi, quand l'appelant la connait, la date du dernier
|
|
15
|
+
// mouvement de ce qu'il affiche (cf. SourceContainerElastic).
|
|
16
|
+
// fr_drugs_app choisissait la source sur le chemin (ANSM sous /hubr/heart/ansm,
|
|
17
|
+
// HAS ailleurs) : le layer la recoit en prop, HAS par defaut.
|
|
18
|
+
const props = withDefaults(
|
|
19
|
+
defineProps<{
|
|
20
|
+
lastLabel?: string;
|
|
21
|
+
lastDate?: string | number | null | Array<string | number | null | undefined>;
|
|
22
|
+
/** La fiche Directus citee ; HAS par defaut (HEART_SOURCE_UUIDS.ANSM pour l'ANSM). */
|
|
23
|
+
uuid?: string;
|
|
24
|
+
}>(),
|
|
25
|
+
{ lastLabel: undefined, lastDate: undefined, uuid: HEART_SOURCE_UUIDS.HAS },
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
const sourceUuid = computed(() => props.uuid || HEART_SOURCE_UUIDS.HAS);
|
|
29
|
+
</script>
|