@sfgrp/taxonpages 0.1.0
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/README.markdown +432 -0
- package/bin/taxonpages.js +78 -0
- package/index.html +22 -0
- package/package.json +82 -0
- package/postcss.config.cjs +17 -0
- package/server.js +142 -0
- package/src/App.vue +31 -0
- package/src/assets/css/leaflet.css +24 -0
- package/src/assets/css/main.css +23 -0
- package/src/assets/css/tailwind.css +3 -0
- package/src/assets/css/vars.css +58 -0
- package/src/assets/css/webkit.css +19 -0
- package/src/assets/images/taxonworks_full_logo.svg +22 -0
- package/src/assets/images/taxonworks_logo.svg +7 -0
- package/src/cli/commands/build.js +60 -0
- package/src/cli/commands/dev.js +48 -0
- package/src/cli/commands/init.js +65 -0
- package/src/cli/commands/preview.js +27 -0
- package/src/cli/commands/serve.js +26 -0
- package/src/cli/utils/resolveConfig.js +112 -0
- package/src/components/AddressMaker.global.vue +67 -0
- package/src/components/Animation/AnimationOpacity.global.vue +12 -0
- package/src/components/Autocomplete/Autocomplete.global.vue +223 -0
- package/src/components/Autocomplete/AutocompleteOtu.global.vue +33 -0
- package/src/components/Autocomplete/AutocompleteSpinner.vue +36 -0
- package/src/components/Button/ButtonExpand.global.vue +40 -0
- package/src/components/Button/VButton.global.vue +39 -0
- package/src/components/Card/VCard.global.vue +18 -0
- package/src/components/Card/VCardContent.global.vue +5 -0
- package/src/components/Card/VCardHeader.global.vue +7 -0
- package/src/components/Clipboard/VClipboard.global.vue +50 -0
- package/src/components/Dropdown/Dropdown.global.vue +108 -0
- package/src/components/Footer/FooterAnalytics.vue +26 -0
- package/src/components/Footer/FooterCitation.vue +45 -0
- package/src/components/Footer/FooterCopyright.vue +20 -0
- package/src/components/Gallery/GalleryCarousel/GalleryCarousel.global.vue +138 -0
- package/src/components/Gallery/GalleryImage.global.vue +65 -0
- package/src/components/Gallery/GalleryMainImage.vue +63 -0
- package/src/components/Gallery/GalleryMosaic/GalleryMosaic.global.vue +75 -0
- package/src/components/Gallery/GalleryThumbnail.vue +26 -0
- package/src/components/Gallery/GalleryThumbnailList.vue +34 -0
- package/src/components/Gallery/useGallery.js +50 -0
- package/src/components/Icon/IconArrowDown.global.vue +19 -0
- package/src/components/Icon/IconArrowLeft.global.vue +20 -0
- package/src/components/Icon/IconArrowRight.global.vue +20 -0
- package/src/components/Icon/IconArrowUp.global.vue +16 -0
- package/src/components/Icon/IconCalendar.global.vue +25 -0
- package/src/components/Icon/IconCheck.global.vue +16 -0
- package/src/components/Icon/IconClipboard.global.vue +16 -0
- package/src/components/Icon/IconClose.global.vue +20 -0
- package/src/components/Icon/IconDocument.global.vue +20 -0
- package/src/components/Icon/IconDownload.global.vue +16 -0
- package/src/components/Icon/IconFiles.global.vue +23 -0
- package/src/components/Icon/IconGithub.global.vue +11 -0
- package/src/components/Icon/IconHamburger.global.vue +18 -0
- package/src/components/Icon/IconInformation.global.vue +16 -0
- package/src/components/Icon/IconJson.global.vue +14 -0
- package/src/components/Icon/IconMinusCircle.global.vue +19 -0
- package/src/components/Icon/IconPause.global.vue +16 -0
- package/src/components/Icon/IconPlay.global.vue +16 -0
- package/src/components/Icon/IconPlusCircle.global.vue +19 -0
- package/src/components/Icon/IconSearch.global.vue +19 -0
- package/src/components/Icon/IconSpeakerWave.global.vue +16 -0
- package/src/components/Icon/IconSpeakerX.global.vue +16 -0
- package/src/components/Icon/IconTrash.global.vue +16 -0
- package/src/components/Icon/IconWarning.global.vue +16 -0
- package/src/components/ImageViewer/ControlImageNext.vue +11 -0
- package/src/components/ImageViewer/ControlImagePrevious.vue +10 -0
- package/src/components/ImageViewer/ImageAttribution.vue +15 -0
- package/src/components/ImageViewer/ImageDepictions.vue +21 -0
- package/src/components/ImageViewer/ImageSource.vue +15 -0
- package/src/components/ImageViewer/ImageToolbar.vue +14 -0
- package/src/components/ImageViewer/ImageViewer.global.vue +197 -0
- package/src/components/ImageViewer/ImageViewerClose.vue +12 -0
- package/src/components/ImageViewer/ImageViewerCounter.vue +16 -0
- package/src/components/Input/InputText.global.vue +30 -0
- package/src/components/Input/SelectInput.global.vue +31 -0
- package/src/components/Layout/LayoutFooter.vue +67 -0
- package/src/components/Layout/LayoutHeader.vue +62 -0
- package/src/components/Map/VMap.client.vue +365 -0
- package/src/components/Map/constants/disableLayerOptions.js +7 -0
- package/src/components/Map/constants/index.js +1 -0
- package/src/components/Map/icons/AssertedDistribution.js +5 -0
- package/src/components/Map/icons/CollectionObject.js +5 -0
- package/src/components/Map/icons/FieldOccurrence.js +5 -0
- package/src/components/Map/icons/Georeference.js +5 -0
- package/src/components/Map/icons/TypeMaterial.js +5 -0
- package/src/components/Map/icons/index.js +5 -0
- package/src/components/Map/shapes/Absent.js +8 -0
- package/src/components/Map/shapes/Aggregate.js +7 -0
- package/src/components/Map/shapes/AssertedDistribution.js +7 -0
- package/src/components/Map/shapes/CollectionObject.js +5 -0
- package/src/components/Map/shapes/FieldOccurrence.js +5 -0
- package/src/components/Map/shapes/TypeMaterial.js +5 -0
- package/src/components/Map/shapes/index.js +6 -0
- package/src/components/Map/utils/addPatternToMap.js +45 -0
- package/src/components/Map/utils/geojsonOptions.js +62 -0
- package/src/components/Map/utils/makeTileFromConfiguration.js +31 -0
- package/src/components/Markdown/MarkdownLayout.global.vue +36 -0
- package/src/components/Modal/VModal.global.vue +107 -0
- package/src/components/Navbar/NavbarMenu.vue +36 -0
- package/src/components/Navbar/NavbarMobile.vue +93 -0
- package/src/components/Navbar/NavbarSubmenu.vue +112 -0
- package/src/components/Pagination/VPagination.global.vue +139 -0
- package/src/components/Pagination/VPaginationInfo.global.vue +36 -0
- package/src/components/ProjectStats.global.vue +69 -0
- package/src/components/Ssr/ClientOnly.global.vue +14 -0
- package/src/components/SwitchTheme.vue +86 -0
- package/src/components/Tab/TabItem.global.vue +20 -0
- package/src/components/Tab/TabMenu.global.vue +7 -0
- package/src/components/Table/VTable.global.vue +7 -0
- package/src/components/Table/VTableBody.global.vue +7 -0
- package/src/components/Table/VTableBodyCell.global.vue +7 -0
- package/src/components/Table/VTableBodyRow.global.vue +5 -0
- package/src/components/Table/VTableHeader.global.vue +7 -0
- package/src/components/Table/VTableHeaderCell.global.vue +7 -0
- package/src/components/Table/VTableHeaderRow.global.vue +5 -0
- package/src/components/TrackerReport.global.vue +92 -0
- package/src/components/VSkeleton.global.vue +48 -0
- package/src/components/VSpinner.global.vue +219 -0
- package/src/components/clientComponents.js +28 -0
- package/src/components/globalComponents.js +29 -0
- package/src/constants/configPaths.cjs +4 -0
- package/src/constants/defaultConfig.js +7 -0
- package/src/constants/objectTypes.js +8 -0
- package/src/entry-client.js +39 -0
- package/src/entry-server.js +114 -0
- package/src/layout/Application.vue +21 -0
- package/src/main.js +20 -0
- package/src/modules/DwCFilter/components/DropdownMenu.vue +79 -0
- package/src/modules/DwCFilter/components/Facet/FacetDistribution.vue +47 -0
- package/src/modules/DwCFilter/components/Facet/FacetInstitutionCode.vue +17 -0
- package/src/modules/DwCFilter/components/Facet/FacetOrder.vue +38 -0
- package/src/modules/DwCFilter/components/Facet/FacetTypeStatus.vue +35 -0
- package/src/modules/DwCFilter/components/FilterBar.vue +123 -0
- package/src/modules/DwCFilter/components/OtuModal/OtuModal.vue +177 -0
- package/src/modules/DwCFilter/components/OtuModal/RecordItems.vue +89 -0
- package/src/modules/DwCFilter/components/OtuModal/TabList.vue +32 -0
- package/src/modules/DwCFilter/router/index.js +7 -0
- package/src/modules/DwCFilter/utils/flattenParameters.js +20 -0
- package/src/modules/DwCFilter/views/index.vue +183 -0
- package/src/modules/ImageMatrix/components/ListImages.vue +54 -0
- package/src/modules/ImageMatrix/router/index.js +7 -0
- package/src/modules/ImageMatrix/services/Keys.js +9 -0
- package/src/modules/ImageMatrix/utils/makeImageObject.js +15 -0
- package/src/modules/ImageMatrix/views/id.vue +133 -0
- package/src/modules/bibliography/components/DropdownMenu.vue +53 -0
- package/src/modules/bibliography/components/Facet/FacetFullCitation.vue +0 -0
- package/src/modules/bibliography/components/OtuModal.vue +129 -0
- package/src/modules/bibliography/components/VSlider.vue +154 -0
- package/src/modules/bibliography/components/YearPicker.vue +40 -0
- package/src/modules/bibliography/router/index.js +7 -0
- package/src/modules/bibliography/utils/getPagination.js +7 -0
- package/src/modules/bibliography/views/index.vue +225 -0
- package/src/modules/home/router/index.js +8 -0
- package/src/modules/home/views/index.vue +11 -0
- package/src/modules/httpErrorPages/router/index.js +18 -0
- package/src/modules/httpErrorPages/view/404.vue +10 -0
- package/src/modules/httpErrorPages/view/500.vue +11 -0
- package/src/modules/interactiveKeys/router/index.js +7 -0
- package/src/modules/interactiveKeys/views/InteractiveKey.vue +108 -0
- package/src/modules/keys/components/MetadataModal.vue +53 -0
- package/src/modules/keys/router/index.js +7 -0
- package/src/modules/keys/views/keyId.vue +161 -0
- package/src/modules/news/adapters/makeNews.js +21 -0
- package/src/modules/news/components/NewsCard.vue +35 -0
- package/src/modules/news/components/NewsCategories.vue +31 -0
- package/src/modules/news/components/PinnedNews.vue +70 -0
- package/src/modules/news/components/WidgetNews.global.vue +53 -0
- package/src/modules/news/router/index.js +12 -0
- package/src/modules/news/services/News.js +11 -0
- package/src/modules/news/store/news.js +50 -0
- package/src/modules/news/utils/getPagination.js +7 -0
- package/src/modules/news/views/id.vue +77 -0
- package/src/modules/news/views/index.vue +69 -0
- package/src/modules/otus/components/Breadcrumb/Breadcrumb.vue +40 -0
- package/src/modules/otus/components/Breadcrumb/BreadcrumbDropdown.vue +57 -0
- package/src/modules/otus/components/CommonNames.vue +14 -0
- package/src/modules/otus/components/DWCDownload.vue +33 -0
- package/src/modules/otus/components/DataMap.vue +57 -0
- package/src/modules/otus/components/Export.vue +1 -0
- package/src/modules/otus/components/ExternalResources.vue +11 -0
- package/src/modules/otus/components/Panel/PanelBiologicalAssociations/PanelBiologicalAssociations.vue +184 -0
- package/src/modules/otus/components/Panel/PanelBiologicalAssociations/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelBiologicalAssociations/utils/makeBiologicalAssociation.js +30 -0
- package/src/modules/otus/components/Panel/PanelContent/PanelContent.vue +58 -0
- package/src/modules/otus/components/Panel/PanelContent/PanelContentTopic.vue +42 -0
- package/src/modules/otus/components/Panel/PanelContent/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelDescendants/DescendantsSynonymList.vue +21 -0
- package/src/modules/otus/components/Panel/PanelDescendants/DescendantsTree.vue +122 -0
- package/src/modules/otus/components/Panel/PanelDescendants/PanelDescendants.vue +82 -0
- package/src/modules/otus/components/Panel/PanelDescendants/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelDropdown.vue +63 -0
- package/src/modules/otus/components/Panel/PanelGallery/PanelGallery.vue +42 -0
- package/src/modules/otus/components/Panel/PanelGallery/main.js +7 -0
- package/src/modules/otus/components/Panel/PanelKeys/PanelKeys.vue +103 -0
- package/src/modules/otus/components/Panel/PanelKeys/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelMap/PanelMap.vue +124 -0
- package/src/modules/otus/components/Panel/PanelMap/clusters/Mixed.js +50 -0
- package/src/modules/otus/components/Panel/PanelMap/clusters/index.js +2 -0
- package/src/modules/otus/components/Panel/PanelMap/clusters/makeClusterIconFor.js +10 -0
- package/src/modules/otus/components/Panel/PanelMap/components/CachedMap.vue +118 -0
- package/src/modules/otus/components/Panel/PanelMap/components/DwcTable.vue +64 -0
- package/src/modules/otus/components/Panel/PanelMap/components/MapPopup.vue +34 -0
- package/src/modules/otus/components/Panel/PanelMap/components/Search/ListResults.vue +51 -0
- package/src/modules/otus/components/Panel/PanelMap/components/Search/OtuSearch.vue +167 -0
- package/src/modules/otus/components/Panel/PanelMap/components/Search/SearchBar.vue +27 -0
- package/src/modules/otus/components/Panel/PanelMap/composables/useGeojsonOptions.js +36 -0
- package/src/modules/otus/components/Panel/PanelMap/constants/index.js +1 -0
- package/src/modules/otus/components/Panel/PanelMap/constants/legend.js +30 -0
- package/src/modules/otus/components/Panel/PanelMap/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelMap/store/useDistributionStore.js +130 -0
- package/src/modules/otus/components/Panel/PanelMap/utils/index.js +4 -0
- package/src/modules/otus/components/Panel/PanelMap/utils/isRankGroup.js +5 -0
- package/src/modules/otus/components/Panel/PanelMap/utils/makeGeoJSONFeature.js +13 -0
- package/src/modules/otus/components/Panel/PanelMap/utils/makeSegmentedCircle.js +37 -0
- package/src/modules/otus/components/Panel/PanelMap/utils/removeDuplicateShapes.js +40 -0
- package/src/modules/otus/components/Panel/PanelNomenclature/PanelCitationRow.vue +25 -0
- package/src/modules/otus/components/Panel/PanelNomenclature/PanelNomenclature.vue +97 -0
- package/src/modules/otus/components/Panel/PanelNomenclature/PanelNomenclatureShowMore.vue +22 -0
- package/src/modules/otus/components/Panel/PanelNomenclature/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelNomenclature/splitList.js +14 -0
- package/src/modules/otus/components/Panel/PanelNomenclatureReferences/PanelNomenclatureReferences.vue +72 -0
- package/src/modules/otus/components/Panel/PanelNomenclatureReferences/PanelReferenceRow.vue +20 -0
- package/src/modules/otus/components/Panel/PanelNomenclatureReferences/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelSounds/PanelSounds.vue +42 -0
- package/src/modules/otus/components/Panel/PanelSounds/components/AudioPlayer.vue +275 -0
- package/src/modules/otus/components/Panel/PanelSounds/components/PanelSoundRow.vue +21 -0
- package/src/modules/otus/components/Panel/PanelSounds/components/SoundObservations.vue +73 -0
- package/src/modules/otus/components/Panel/PanelSounds/components/TableObservations.vue +31 -0
- package/src/modules/otus/components/Panel/PanelSounds/constants/observationTypes.js +15 -0
- package/src/modules/otus/components/Panel/PanelSounds/main.js +7 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/index.js +5 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeContinuousObservation.js +5 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeMediaObservation.js +5 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeObservation.js +40 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makePresenceAbsenceObservation.js +5 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeQualitativeObservation.js +5 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeSampleObservation.js +29 -0
- package/src/modules/otus/components/Panel/PanelSounds/utils/makeWorkingObservation.js +5 -0
- package/src/modules/otus/components/Panel/PanelStats/PanelStats.vue +160 -0
- package/src/modules/otus/components/Panel/PanelStats/main.js +6 -0
- package/src/modules/otus/components/Panel/PanelTypeDesignation/PanelTypeDesignation.vue +37 -0
- package/src/modules/otus/components/Panel/PanelTypeDesignation/main.js +8 -0
- package/src/modules/otus/components/Panel/PanelTypeSpecimen/PanelTypeSpecimen.vue +52 -0
- package/src/modules/otus/components/Panel/PanelTypeSpecimen/main.js +8 -0
- package/src/modules/otus/components/TaxaInfo.vue +38 -0
- package/src/modules/otus/composables/index.js +2 -0
- package/src/modules/otus/composables/useChildrenRoutes.js +32 -0
- package/src/modules/otus/composables/useUserLifeCycleHooks.js +24 -0
- package/src/modules/otus/constants/index.js +3 -0
- package/src/modules/otus/constants/layouts/index.js +1 -0
- package/src/modules/otus/constants/layouts/overview.js +23 -0
- package/src/modules/otus/constants/layouts.js +43 -0
- package/src/modules/otus/constants/rankGroups.js +5 -0
- package/src/modules/otus/constants/responseError.js +3 -0
- package/src/modules/otus/constants/typeOrder.js +11 -0
- package/src/modules/otus/helpers/useOtuPageRequest.js +19 -0
- package/src/modules/otus/router/index.js +28 -0
- package/src/modules/otus/services/TaxonWorks.js +77 -0
- package/src/modules/otus/store/request.js +34 -0
- package/src/modules/otus/store/store.js +92 -0
- package/src/modules/otus/store/useImageStore.js +57 -0
- package/src/modules/otus/utils/index.js +2 -0
- package/src/modules/otus/utils/isAvailableForRank.js +6 -0
- package/src/modules/otus/utils/stripHtml.js +5 -0
- package/src/modules/otus/views/Index.vue +218 -0
- package/src/modules/otus/views/PageLayout.vue +78 -0
- package/src/modules/setup/views/Index.vue +66 -0
- package/src/plugins/markdown/index.js +2 -0
- package/src/plugins/markdown/relativeToRouter.js +51 -0
- package/src/plugins/markdown/variableReplacement.js +14 -0
- package/src/plugins/schemaOrg/composables/index.js +28 -0
- package/src/plugins/schemaOrg/index.js +31 -0
- package/src/plugins/schemaOrg/loadResolver.js +10 -0
- package/src/plugins/schemaOrg/nodes/Taxon.js +82 -0
- package/src/plugins/schemaOrg/nodes/index.js +1 -0
- package/src/plugins/vite/index.js +2 -0
- package/src/plugins/vite/projectStyle.js +29 -0
- package/src/plugins/vite/restart.js +30 -0
- package/src/router/index.js +46 -0
- package/src/ssr/utils/generateConsoleMessage.js +16 -0
- package/src/ssr/utils/registerFakeClientComponents.js +20 -0
- package/src/ssr/utils/taxonPagesMark.txt +9 -0
- package/src/store/index.js +1 -0
- package/src/store/useFooterStore.js +13 -0
- package/src/utils/color.js +9 -0
- package/src/utils/files.js +21 -0
- package/src/utils/globalVars.js +7 -0
- package/src/utils/index.js +5 -0
- package/src/utils/loadConfiguration.js +34 -0
- package/src/utils/loadLayouts.js +21 -0
- package/src/utils/parseEnvConfig.js +0 -0
- package/src/utils/request.js +18 -0
- package/src/utils/strings.js +12 -0
- package/src/utils/url.js +8 -0
- package/tailwind.config.cjs +92 -0
- package/templates/config/analytics.yml.example +22 -0
- package/templates/config/api.yml +5 -0
- package/templates/config/copyright.yml +5 -0
- package/templates/config/header.yml +17 -0
- package/templates/config/maps.yml +16 -0
- package/templates/config/metadata.yml +10 -0
- package/templates/config/news.yml.example +15 -0
- package/templates/config/project.yml +6 -0
- package/templates/config/router.yml.example +4 -0
- package/templates/config/style/theme.css +48 -0
- package/templates/config/taxa_page.yml.example +22 -0
- package/templates/config/tracker.yml.example +8 -0
- package/templates/pages/about.md +44 -0
- package/templates/pages/home.md +26 -0
- package/vite.config.js +92 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="year-slider-container text-base-content">
|
|
3
|
+
<div class="slider-wrapper">
|
|
4
|
+
<div class="slider-track bg-base-muted">
|
|
5
|
+
<div
|
|
6
|
+
class="slider-range"
|
|
7
|
+
:style="rangeStyle"
|
|
8
|
+
></div>
|
|
9
|
+
|
|
10
|
+
<input
|
|
11
|
+
class="slider-input slider-input-start"
|
|
12
|
+
type="range"
|
|
13
|
+
:min="props.min"
|
|
14
|
+
:max="props.max"
|
|
15
|
+
v-model.number="startYear"
|
|
16
|
+
@input="updateRange"
|
|
17
|
+
/>
|
|
18
|
+
|
|
19
|
+
<input
|
|
20
|
+
class="slider-input slider-input-end"
|
|
21
|
+
type="range"
|
|
22
|
+
:min="props.min"
|
|
23
|
+
:max="props.max"
|
|
24
|
+
v-model.number="endYear"
|
|
25
|
+
@input="updateRange"
|
|
26
|
+
/>
|
|
27
|
+
</div>
|
|
28
|
+
</div>
|
|
29
|
+
</div>
|
|
30
|
+
</template>
|
|
31
|
+
|
|
32
|
+
<script setup>
|
|
33
|
+
import { computed, onMounted } from 'vue'
|
|
34
|
+
|
|
35
|
+
const props = defineProps({
|
|
36
|
+
min: {
|
|
37
|
+
type: Number,
|
|
38
|
+
required: true
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
max: {
|
|
42
|
+
type: Number,
|
|
43
|
+
required: true
|
|
44
|
+
}
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
const startYear = defineModel('start', {
|
|
48
|
+
type: Number,
|
|
49
|
+
required: true
|
|
50
|
+
})
|
|
51
|
+
const endYear = defineModel('end', {
|
|
52
|
+
type: Number,
|
|
53
|
+
required: true
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const rangeStyle = computed(() => {
|
|
57
|
+
const start = ((startYear.value - props.min) / (props.max - props.min)) * 100
|
|
58
|
+
const end = ((endYear.value - props.min) / (props.max - props.min)) * 100
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
left: `${Math.min(start, end)}%`,
|
|
62
|
+
width: `${Math.abs(end - start)}%`
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const updateRange = () => {
|
|
67
|
+
if (startYear.value > endYear.value) {
|
|
68
|
+
;[startYear.value, endYear.value] = [endYear.value, startYear.value]
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
onMounted(() => {
|
|
73
|
+
updateRange()
|
|
74
|
+
})
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<style scoped>
|
|
78
|
+
.slider-wrapper {
|
|
79
|
+
position: relative;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.slider-track {
|
|
83
|
+
position: relative;
|
|
84
|
+
height: 6px;
|
|
85
|
+
border-radius: 3px;
|
|
86
|
+
margin: 0.8rem 0;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.slider-range {
|
|
90
|
+
position: absolute;
|
|
91
|
+
height: 100%;
|
|
92
|
+
background: rgb(var(--color-primary));
|
|
93
|
+
border-radius: 3px;
|
|
94
|
+
transition: all 0.2s ease;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.slider-input {
|
|
98
|
+
position: absolute;
|
|
99
|
+
width: 100%;
|
|
100
|
+
height: 6px;
|
|
101
|
+
background: transparent;
|
|
102
|
+
outline: none;
|
|
103
|
+
-webkit-appearance: none;
|
|
104
|
+
appearance: none;
|
|
105
|
+
cursor: pointer;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.slider-input::-webkit-slider-thumb {
|
|
109
|
+
-webkit-appearance: none;
|
|
110
|
+
touch-action: none;
|
|
111
|
+
appearance: none;
|
|
112
|
+
width: 20px;
|
|
113
|
+
height: 20px;
|
|
114
|
+
background: rgb(var(--color-primary));
|
|
115
|
+
border-radius: 50%;
|
|
116
|
+
cursor: pointer;
|
|
117
|
+
border: 3px solid #ffffff;
|
|
118
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
119
|
+
transition: all 0.2s ease;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.slider-input::-webkit-slider-thumb:hover {
|
|
123
|
+
background: rgb(var(--color-primary));
|
|
124
|
+
transform: scale(1.1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.slider-input::-moz-range-thumb {
|
|
128
|
+
width: 20px;
|
|
129
|
+
height: 20px;
|
|
130
|
+
background: rgb(var(--color-primary));
|
|
131
|
+
border-radius: 50%;
|
|
132
|
+
cursor: pointer;
|
|
133
|
+
border: 3px solid rgb(var(--color-primary-content));
|
|
134
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
|
135
|
+
transition: all 0.2s ease;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.slider-input::-moz-range-thumb:hover {
|
|
139
|
+
background: rgb(var(--color-primary));
|
|
140
|
+
transform: scale(1.1);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.slider-input-end {
|
|
144
|
+
pointer-events: none;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.slider-input-end::-webkit-slider-thumb {
|
|
148
|
+
pointer-events: all;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.slider-input-end::-moz-range-thumb {
|
|
152
|
+
pointer-events: all;
|
|
153
|
+
}
|
|
154
|
+
</style>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div>
|
|
3
|
+
<InputText
|
|
4
|
+
class="w-14 max-w-14 text-sm"
|
|
5
|
+
:value="inputValue"
|
|
6
|
+
@change="setValue"
|
|
7
|
+
/>
|
|
8
|
+
</div>
|
|
9
|
+
</template>
|
|
10
|
+
|
|
11
|
+
<script setup>
|
|
12
|
+
const props = defineProps({
|
|
13
|
+
min: {
|
|
14
|
+
type: Number,
|
|
15
|
+
required: true
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
max: {
|
|
19
|
+
type: Number,
|
|
20
|
+
required: true
|
|
21
|
+
}
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
const inputValue = defineModel({
|
|
25
|
+
type: Number,
|
|
26
|
+
required: true
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
function setValue(e) {
|
|
30
|
+
const n = Number(e.target.value)
|
|
31
|
+
|
|
32
|
+
if (n < props.min) {
|
|
33
|
+
inputValue.value = props.min
|
|
34
|
+
} else if (n > props.max) {
|
|
35
|
+
inputValue.value = props.max
|
|
36
|
+
} else {
|
|
37
|
+
inputValue.value = n
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
</script>
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container mx-auto box-border">
|
|
3
|
+
<h1 class="text-4xl px-4 md:px-0 mt-4 mb-6 font-bold">Bibliography</h1>
|
|
4
|
+
<ClientOnly>
|
|
5
|
+
<VSpinner
|
|
6
|
+
v-if="isLoading"
|
|
7
|
+
full-screen
|
|
8
|
+
/>
|
|
9
|
+
</ClientOnly>
|
|
10
|
+
<VCard class="mb-4">
|
|
11
|
+
<VCardContent>
|
|
12
|
+
<div
|
|
13
|
+
class="flex flex-col md:flex-row justify-center items-center gap-4 md:gap-2 text-sm"
|
|
14
|
+
>
|
|
15
|
+
<div class="flex flex-col w-full">
|
|
16
|
+
<label>In citation</label>
|
|
17
|
+
<InputText
|
|
18
|
+
class="w-full"
|
|
19
|
+
type="text"
|
|
20
|
+
placeholder='Search anywhere in the citation... for example: "Charles Darwin Archives"'
|
|
21
|
+
v-model="parameters.query_term"
|
|
22
|
+
@keypress.enter="() => loadList()"
|
|
23
|
+
/>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="flex flex-col w-full md:w-96">
|
|
26
|
+
<label>Author(s)</label>
|
|
27
|
+
<InputText
|
|
28
|
+
class="w-full"
|
|
29
|
+
type="text"
|
|
30
|
+
placeholder="Type..."
|
|
31
|
+
v-model="parameters.author"
|
|
32
|
+
@keypress.enter="() => loadList()"
|
|
33
|
+
/>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="w-full md:w-auto">
|
|
36
|
+
<span>Published between:</span>
|
|
37
|
+
<div class="flex flex-row gap-2">
|
|
38
|
+
<YearPicker
|
|
39
|
+
v-model="parameters.year_start"
|
|
40
|
+
:min="MIN_YEAR"
|
|
41
|
+
:max="MAX_YEAR"
|
|
42
|
+
/>
|
|
43
|
+
<VSlider
|
|
44
|
+
class="w-full md:w-64"
|
|
45
|
+
:min="MIN_YEAR"
|
|
46
|
+
:max="MAX_YEAR"
|
|
47
|
+
v-model:start="parameters.year_start"
|
|
48
|
+
v-model:end="parameters.year_end"
|
|
49
|
+
/>
|
|
50
|
+
<YearPicker
|
|
51
|
+
v-model="parameters.year_end"
|
|
52
|
+
:min="MIN_YEAR"
|
|
53
|
+
:max="MAX_YEAR"
|
|
54
|
+
/>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
<div class="flex flex-row gap-2 md:self-end">
|
|
58
|
+
<VButton
|
|
59
|
+
class="text-sm py-1.5 border border-primary-color"
|
|
60
|
+
primary
|
|
61
|
+
@click="() => loadList()"
|
|
62
|
+
>Search</VButton
|
|
63
|
+
>
|
|
64
|
+
<VButton
|
|
65
|
+
class="text-sm py-1.5 border border-primary-color"
|
|
66
|
+
primary
|
|
67
|
+
@click="() => reset()"
|
|
68
|
+
>
|
|
69
|
+
Reset
|
|
70
|
+
</VButton>
|
|
71
|
+
</div>
|
|
72
|
+
</div>
|
|
73
|
+
</VCardContent>
|
|
74
|
+
</VCard>
|
|
75
|
+
|
|
76
|
+
<VCard>
|
|
77
|
+
<VCardContent>
|
|
78
|
+
<div class="flex flex-row justify-between items-center mb-4">
|
|
79
|
+
<div class="flex flex-col md:flex-row gap-3 md:items-center">
|
|
80
|
+
<VPagination
|
|
81
|
+
v-model="pagination.page"
|
|
82
|
+
:total="pagination.total"
|
|
83
|
+
:per="pagination.per"
|
|
84
|
+
@update:modelValue="
|
|
85
|
+
(page) => {
|
|
86
|
+
loadList(page)
|
|
87
|
+
}
|
|
88
|
+
"
|
|
89
|
+
/>
|
|
90
|
+
<VPaginationInfo :pagination="pagination" />
|
|
91
|
+
</div>
|
|
92
|
+
<DropdownMenu :request="requestData" />
|
|
93
|
+
</div>
|
|
94
|
+
<VTable>
|
|
95
|
+
<VTableHeader>
|
|
96
|
+
<VTableHeaderRow>
|
|
97
|
+
<VTableHeaderCell class="w-2" />
|
|
98
|
+
<VTableHeaderCell> Sources </VTableHeaderCell>
|
|
99
|
+
</VTableHeaderRow>
|
|
100
|
+
</VTableHeader>
|
|
101
|
+
<VTableBody>
|
|
102
|
+
<VTableBodyRow
|
|
103
|
+
v-for="item in list"
|
|
104
|
+
:key="item.id"
|
|
105
|
+
>
|
|
106
|
+
<VTableBodyCell
|
|
107
|
+
class="pr-1"
|
|
108
|
+
title="Show OTUs"
|
|
109
|
+
>
|
|
110
|
+
<OtuModal
|
|
111
|
+
:source-id="item.id"
|
|
112
|
+
:label="item.cached"
|
|
113
|
+
/>
|
|
114
|
+
</VTableBodyCell>
|
|
115
|
+
<VTableBodyCell
|
|
116
|
+
class="break-all"
|
|
117
|
+
v-html="item.cached"
|
|
118
|
+
/>
|
|
119
|
+
</VTableBodyRow>
|
|
120
|
+
</VTableBody>
|
|
121
|
+
</VTable>
|
|
122
|
+
<div class="flex flex-col md:flex-row gap-3 md:items-center mt-4">
|
|
123
|
+
<VPagination
|
|
124
|
+
v-model="pagination.page"
|
|
125
|
+
:total="pagination.total"
|
|
126
|
+
:per="pagination.per"
|
|
127
|
+
@update:modelValue="
|
|
128
|
+
(page) => {
|
|
129
|
+
loadList(page)
|
|
130
|
+
}
|
|
131
|
+
"
|
|
132
|
+
/>
|
|
133
|
+
<VPaginationInfo :pagination="pagination" />
|
|
134
|
+
</div>
|
|
135
|
+
</VCardContent>
|
|
136
|
+
</VCard>
|
|
137
|
+
</div>
|
|
138
|
+
</template>
|
|
139
|
+
|
|
140
|
+
<script setup>
|
|
141
|
+
import { ref, onBeforeMount } from 'vue'
|
|
142
|
+
import { useRoute, useRouter } from 'vue-router'
|
|
143
|
+
import { makeAPIRequest } from '@/utils'
|
|
144
|
+
import { getPagination } from '../utils/getPagination'
|
|
145
|
+
import DropdownMenu from '../components/DropdownMenu.vue'
|
|
146
|
+
import YearPicker from '../components/YearPicker.vue'
|
|
147
|
+
import VSlider from '../components/VSlider.vue'
|
|
148
|
+
import OtuModal from '../components/OtuModal.vue'
|
|
149
|
+
|
|
150
|
+
const PER = 50
|
|
151
|
+
const MIN_YEAR = 1650
|
|
152
|
+
const MAX_YEAR = new Date().getFullYear()
|
|
153
|
+
|
|
154
|
+
const route = useRoute()
|
|
155
|
+
const router = useRouter()
|
|
156
|
+
|
|
157
|
+
const parameters = ref({})
|
|
158
|
+
const list = ref([])
|
|
159
|
+
const isLoading = ref(false)
|
|
160
|
+
const pagination = ref({ page: 1, total: 0, per: PER })
|
|
161
|
+
const requestData = ref()
|
|
162
|
+
|
|
163
|
+
async function loadList(page = 1) {
|
|
164
|
+
isLoading.value = true
|
|
165
|
+
|
|
166
|
+
makeAPIRequest
|
|
167
|
+
.get('/sources', {
|
|
168
|
+
params: {
|
|
169
|
+
in_project: true,
|
|
170
|
+
page,
|
|
171
|
+
per: pagination.value.per,
|
|
172
|
+
...parameters.value
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
.then(({ data, headers, request }) => {
|
|
176
|
+
pagination.value = getPagination(headers)
|
|
177
|
+
list.value = data
|
|
178
|
+
|
|
179
|
+
requestData.value = {
|
|
180
|
+
data,
|
|
181
|
+
url: request.responseURL
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
setQuery()
|
|
185
|
+
})
|
|
186
|
+
.finally(() => {
|
|
187
|
+
isLoading.value = false
|
|
188
|
+
})
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function setParameters(data = {}) {
|
|
192
|
+
parameters.value = {
|
|
193
|
+
year_start: Number(data.year_start || 1650),
|
|
194
|
+
year_end: Number(data.year_end || 2025),
|
|
195
|
+
author: data.author,
|
|
196
|
+
query_term: data.query_term
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function setPagination(data = {}) {
|
|
201
|
+
pagination.value = {
|
|
202
|
+
page: Number(data.page) || 1,
|
|
203
|
+
total: 0,
|
|
204
|
+
per: PER
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function reset() {
|
|
209
|
+
setParameters()
|
|
210
|
+
setPagination()
|
|
211
|
+
loadList()
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function setQuery() {
|
|
215
|
+
router.push({
|
|
216
|
+
query: { ...parameters.value, page: pagination.value.page }
|
|
217
|
+
})
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
onBeforeMount(() => {
|
|
221
|
+
setParameters(route.query)
|
|
222
|
+
setPagination(route.query)
|
|
223
|
+
loadList(pagination.value.page)
|
|
224
|
+
})
|
|
225
|
+
</script>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container mx-auto text-center relative top-1/4">
|
|
3
|
+
<h1 class="text-4xl sm:text-5xl text-base-lighter">
|
|
4
|
+
Welcome to TaxonPages
|
|
5
|
+
</h1>
|
|
6
|
+
<p class="m-4 my-8 text-xl">
|
|
7
|
+
It seems you don't have a index or home file in your /pages folder, create
|
|
8
|
+
one to replace this page.
|
|
9
|
+
</p>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export default [
|
|
2
|
+
{
|
|
3
|
+
path: '/500',
|
|
4
|
+
name: 'httpError500',
|
|
5
|
+
component: () => import('../view/500.vue'),
|
|
6
|
+
meta: {
|
|
7
|
+
statusCode: 500
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
path: '/:pathMatch(.*)*',
|
|
12
|
+
name: 'httpError404',
|
|
13
|
+
component: () => import('../view/404.vue'),
|
|
14
|
+
meta: {
|
|
15
|
+
statusCode: 404
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
]
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container mx-auto text-center relative top-1/4">
|
|
3
|
+
<h1 class="text-7xl text-base-lighter">404</h1>
|
|
4
|
+
<p>Page not found.</p>
|
|
5
|
+
<p class="m-4 my-10 text-xl">
|
|
6
|
+
Uh oh, we can't seem to find the page you're looking for. Try going back
|
|
7
|
+
to the previous page.
|
|
8
|
+
</p>
|
|
9
|
+
</div>
|
|
10
|
+
</template>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container mx-auto text-center relative top-1/4">
|
|
3
|
+
<h1 class="text-7xl text-base-lighter">500</h1>
|
|
4
|
+
<p>Internal Server Error.</p>
|
|
5
|
+
<p class="m-4 my-10 text-xl">
|
|
6
|
+
Uh oh, looks like something went wrong!<br />
|
|
7
|
+
We track these errors automatically, but if the problem persists feel free
|
|
8
|
+
to contact us.
|
|
9
|
+
</p>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div
|
|
3
|
+
class="flex flex-col h-full overflow-y-hidden container mx-auto interactive-key-container"
|
|
4
|
+
>
|
|
5
|
+
<ClientOnly>
|
|
6
|
+
<VueInteractiveKey v-bind="options">
|
|
7
|
+
<template #remaining-item="{ item }">
|
|
8
|
+
<RouterLink
|
|
9
|
+
v-if="item.observationObjectType === OTU"
|
|
10
|
+
:to="{ name: 'otus-id', params: { id: item.observationObjectId } }"
|
|
11
|
+
v-html="item.objectTag"
|
|
12
|
+
/>
|
|
13
|
+
<span
|
|
14
|
+
v-else
|
|
15
|
+
v-html="item.objectTag"
|
|
16
|
+
/>
|
|
17
|
+
</template>
|
|
18
|
+
<template #eliminated-item="{ item }">
|
|
19
|
+
<RouterLink
|
|
20
|
+
v-if="item.observationObjectType === OTU"
|
|
21
|
+
:to="{ name: 'otus-id', params: { id: item.observationObjectId } }"
|
|
22
|
+
v-html="item.objectTag"
|
|
23
|
+
/>
|
|
24
|
+
<span
|
|
25
|
+
v-else
|
|
26
|
+
v-html="item.objectTag"
|
|
27
|
+
/>
|
|
28
|
+
</template>
|
|
29
|
+
</VueInteractiveKey>
|
|
30
|
+
</ClientOnly>
|
|
31
|
+
</div>
|
|
32
|
+
</template>
|
|
33
|
+
|
|
34
|
+
<script setup>
|
|
35
|
+
import { useRoute } from 'vue-router'
|
|
36
|
+
import { ref } from 'vue'
|
|
37
|
+
import { OTU } from '@/constants/objectTypes.js'
|
|
38
|
+
import { VueInteractiveKey } from '@sfgrp/distinguish'
|
|
39
|
+
import '@sfgrp/distinguish/dist/distinguish.css'
|
|
40
|
+
|
|
41
|
+
const route = useRoute()
|
|
42
|
+
|
|
43
|
+
const options = ref({
|
|
44
|
+
observationMatrixId: route.params.id,
|
|
45
|
+
apiConfig: {
|
|
46
|
+
baseURL: __APP_ENV__.url,
|
|
47
|
+
projectToken: __APP_ENV__.project_token
|
|
48
|
+
}
|
|
49
|
+
})
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<style>
|
|
53
|
+
:root {
|
|
54
|
+
--distinguish-primary-content-color: rgb(var(--color-primary-content));
|
|
55
|
+
--distinguish-bg-color: rgb(var(--color-base-foreground));
|
|
56
|
+
--distinguish-bg-panel-color: rgb(var(--color-base-foreground));
|
|
57
|
+
--distinguish-bg-modal-color: rgb(var(--color-base-foreground));
|
|
58
|
+
--distinguish-bg-disabled-color: #e5e5e5;
|
|
59
|
+
--distinguish-disabled-color: #999;
|
|
60
|
+
--distinguish-error-color: rgb(var(--color-danger));
|
|
61
|
+
--distinguish-primary-color: rgb(var(--color-primary));
|
|
62
|
+
--distinguish-border-color: #cccccc;
|
|
63
|
+
--distinguish-link-color: rgb(var(--color-secondary));
|
|
64
|
+
--distinguish-btn-medium-size: 20px;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
.interactive-key-container {
|
|
68
|
+
max-height: calc(100vh - 12rem);
|
|
69
|
+
|
|
70
|
+
hr {
|
|
71
|
+
@apply my-4;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.distinguish-grid {
|
|
76
|
+
@apply shadow-md rounded border-base-muted;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.distinguish-header-bar {
|
|
80
|
+
@apply rounded-t-md;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.distinguish-app-container {
|
|
84
|
+
h2 {
|
|
85
|
+
@apply text-lg my-2;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.distinguish-app-container {
|
|
90
|
+
color: rgb(var(--color-base-content));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.distinguish-modal-header h3 {
|
|
94
|
+
@apply text-lg;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.distinguish-btn {
|
|
98
|
+
@apply px-4 py-1 rounded-none text-sm;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.distinguish-title {
|
|
102
|
+
@apply text-xl my-4;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.distinguish-row-filter-buttons {
|
|
106
|
+
@apply my-4;
|
|
107
|
+
}
|
|
108
|
+
</style>
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<VButton
|
|
3
|
+
primary
|
|
4
|
+
class="!px-1 py-1"
|
|
5
|
+
circle
|
|
6
|
+
title="Metadata"
|
|
7
|
+
@click="isModalVisible = true"
|
|
8
|
+
>
|
|
9
|
+
<IconInformation class="w-4 h-4" />
|
|
10
|
+
</VButton>
|
|
11
|
+
<VModal
|
|
12
|
+
v-if="isModalVisible"
|
|
13
|
+
@close="() => (isModalVisible = false)"
|
|
14
|
+
>
|
|
15
|
+
<template #header>
|
|
16
|
+
<h3 class="font-medium">Metadata</h3>
|
|
17
|
+
</template>
|
|
18
|
+
<div class="p-4 pt-0">
|
|
19
|
+
<VTable>
|
|
20
|
+
<VTableHeader>
|
|
21
|
+
<VTableHeaderRow>
|
|
22
|
+
<VTableHeaderCell>Data</VTableHeaderCell>
|
|
23
|
+
<VTableHeaderCell></VTableHeaderCell>
|
|
24
|
+
</VTableHeaderRow>
|
|
25
|
+
</VTableHeader>
|
|
26
|
+
<VTableBody>
|
|
27
|
+
<VTableBodyRow
|
|
28
|
+
v-for="[key, value] in Object.entries(metadata)"
|
|
29
|
+
:key="key"
|
|
30
|
+
>
|
|
31
|
+
<VTableBodyCell class="capitalize">
|
|
32
|
+
{{ key.replaceAll('_', ' ') }}
|
|
33
|
+
</VTableBodyCell>
|
|
34
|
+
<VTableBodyCell>{{ value }}</VTableBodyCell>
|
|
35
|
+
</VTableBodyRow>
|
|
36
|
+
</VTableBody>
|
|
37
|
+
</VTable>
|
|
38
|
+
</div>
|
|
39
|
+
</VModal>
|
|
40
|
+
</template>
|
|
41
|
+
|
|
42
|
+
<script setup>
|
|
43
|
+
import { ref } from 'vue'
|
|
44
|
+
|
|
45
|
+
defineProps({
|
|
46
|
+
metadata: {
|
|
47
|
+
type: Object,
|
|
48
|
+
required: true
|
|
49
|
+
}
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
const isModalVisible = ref(false)
|
|
53
|
+
</script>
|