Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Convert OverviewTab component to <script setup> #1453

Merged
merged 2 commits into from
Feb 16, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
157 changes: 69 additions & 88 deletions web/src/components/DLP/OverviewTab.vue
Original file line number Diff line number Diff line change
Expand Up @@ -223,17 +223,14 @@
</div>
</template>

<script lang="ts">
import { AssociatedProjects, DandisetMetadata, RelatedResource } from '@/types';
import {
computed,
ComputedRef,
defineComponent, getCurrentInstance, onMounted, PropType,
} from 'vue';

<script setup lang="ts">
import { computed, getCurrentInstance, onMounted } from 'vue';
import MetadataCard from '@/components/DLP/MetadataCard.vue';
import { useDandisetStore } from '@/stores/dandiset';

import type { ComputedRef, PropType } from 'vue';
import type { AssociatedProjects, DandisetMetadata, RelatedResource } from '@/types';

// Asset summary fields to hide
const ASSET_SUMMARY_BLACKLIST = new Set([
'numberOfBytes',
Expand All @@ -255,97 +252,81 @@ function isURL(str: string): boolean {
return url.protocol === 'http:' || url.protocol === 'https:';
}

export default defineComponent({
name: 'OverviewTab',
components: { MetadataCard },
props: {
schema: {
type: Object,
required: true,
},
meta: {
type: Object as PropType<DandisetMetadata>,
required: true,
},
const props = defineProps({
schema: {
type: Object,
required: true,
},
setup(props) {
const $vuetify = computed(() => getCurrentInstance()?.proxy.$vuetify);
meta: {
type: Object as PropType<DandisetMetadata>,
required: true,
},
});

const store = useDandisetStore();
const currentDandiset = computed(() => store.dandiset);
const $vuetify = computed(() => getCurrentInstance()?.proxy.$vuetify);

const contributors = computed(
() => props.meta.contributor?.filter(
(contributor) => !!(contributor.includeInCitation) && !!(contributor.schemaKey === 'Person'),
),
);
const fundingInformation = computed(
() => props.meta.contributor?.filter(
(contributor) => !!(contributor.schemaKey === 'Organization')
const store = useDandisetStore();
const currentDandiset = computed(() => store.dandiset);

const contributors = computed(
() => props.meta.contributor?.filter(
(contributor) => !!(contributor.includeInCitation) && !!(contributor.schemaKey === 'Person'),
),
);
const fundingInformation = computed(
() => props.meta.contributor?.filter(
(contributor) => !!(contributor.schemaKey === 'Organization')
// Only include organizations with "Sponsor" or "Funder" roles in Funding Information
&& (contributor.roleName?.includes('dcite:Funder') || contributor.roleName?.includes('dcite:Sponsor')),
) || [],
);

const relatedResources: ComputedRef<RelatedResource|undefined> = computed(
() => props.meta.relatedResource,
);
) || [],
);

const associatedProjects: ComputedRef<AssociatedProjects|undefined> = computed(
() => props.meta.wasGeneratedBy,
);
const relatedResources: ComputedRef<RelatedResource|undefined> = computed(
() => props.meta.relatedResource,
);

const assetSummary = computed<Record<string, any>>(
() => Object.fromEntries(Object.entries(props.meta.assetsSummary).filter(
// filter out assetSummary fields we don't want to display
([key, value]) => !!value && !ASSET_SUMMARY_BLACKLIST.has(key),
).map(
// convert from camelCase to space-delimited string (i.e. "dataStandard" to "data Standard")
([key, value]) => [key.replace(/[A-Z]/g, (letter) => ` ${letter.toUpperCase()}`), value],
).map(
// capitalize the first letter in the string
([key, value]: any) => [key.charAt(0).toUpperCase() + key.slice(1), value],
)
// convert primitive types to single-element arrays so they can be more easily rendered
.map(([key, value]: any) => (typeof value === 'object' ? [key, value] : [key, [value]]))),
);
const associatedProjects: ComputedRef<AssociatedProjects|undefined> = computed(
() => props.meta.wasGeneratedBy,
);

// Approximate a good column count for asset summary card
const assetSummaryColumnCount = computed(
() => ($vuetify.value?.breakpoint.mdAndDown ? 1
: Math.min(Object.keys(assetSummary.value).length, 3)),
);
const assetSummary = computed<Record<string, any>>(
() => Object.fromEntries(Object.entries(props.meta.assetsSummary).filter(
// filter out assetSummary fields we don't want to display
([key, value]) => !!value && !ASSET_SUMMARY_BLACKLIST.has(key),
).map(
// convert from camelCase to space-delimited string (i.e. "dataStandard" to "data Standard")
([key, value]) => [key.replace(/[A-Z]/g, (letter) => ` ${letter.toUpperCase()}`), value],
).map(
// capitalize the first letter in the string
([key, value]: any) => [key.charAt(0).toUpperCase() + key.slice(1), value],
)
// convert primitive types to single-element arrays so they can be more easily rendered
.map(([key, value]: any) => (typeof value === 'object' ? [key, value] : [key, [value]]))),
);

const assetSummaryBeingComputed = computed<boolean>(() => currentDandiset.value?.status === 'Pending');
// Approximate a good column count for asset summary card
const assetSummaryColumnCount = computed(
() => ($vuetify.value?.breakpoint.mdAndDown ? 1
: Math.min(Object.keys(assetSummary.value).length, 3)),
);

const contactPeople = computed(
() => new Set(contributors.value
.filter((contributor) => contributor.roleName?.includes('dcite:ContactPerson'))
.map((contributor) => contributor.name)),
);
const assetSummaryBeingComputed = computed<boolean>(() => currentDandiset.value?.status === 'Pending');

onMounted(() => {
setInterval(async () => {
if (!currentDandiset.value || !assetSummaryBeingComputed.value) {
return;
}
const { identifier } = currentDandiset.value.dandiset;
const { version } = currentDandiset.value;
await store.fetchDandiset({ identifier, version });
}, 5000);
});
const contactPeople = computed(
() => new Set(contributors.value
.filter((contributor) => contributor.roleName?.includes('dcite:ContactPerson'))
.map((contributor) => contributor.name)),
);

return {
contributors,
fundingInformation,
relatedResources,
associatedProjects,
assetSummary,
assetSummaryColumnCount,
assetSummaryBeingComputed,
contactPeople,
isURL,
};
},
onMounted(() => {
setInterval(async () => {
if (!currentDandiset.value || !assetSummaryBeingComputed.value) {
return;
}
const { identifier } = currentDandiset.value.dandiset;
const { version } = currentDandiset.value;
await store.fetchDandiset({ identifier, version });
}, 5000);
});

</script>