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