Files
speckle-server/packages/frontend-2/components/connectors/VersionsDownloadDialog.vue
T
andrewwallacespeckle c2a95b484f refactor(ui-components): define and use new font styles (#2524)
* New Text Styles. Initial FE2 changes

* More fe2 styling classes

* Minor update

* Minor update

* Fix build

* More updates for discussion

* More styling updates

* Minor updates to inputs

* More text updates

* More font class swapping

* Revert dui3 changes

* Confirmed Lineheights

* Add story files for new text styles

* Minor copy changes

* Minor typo

* andrew/web-1371-misalignment-in-account-dropdown

* andrew/web-1374-settings-text-styles-are-not-right

* andrew/web-1375-nav-texts-should-be-14px

* andrew/web-1376-decrease-size-of-versions-header

* andrew/web-1377-version-card-title

* semibold>medium

* Measure mode

* Changes from PR

* Tweaked nav menu

* Revert prose change. Add prose-sm

---------

Co-authored-by: Mike Tasset <mike.tasset@gmail.com>
2024-07-30 15:06:48 +01:00

131 lines
4.0 KiB
Vue

<template>
<LayoutDialog v-model:open="isOpen" max-width="md">
<template #header>
<div class="flex items-center space-x-2 leading-tight">
<img :src="tag.feature_image" alt="featured image" class="w-12" />
<span class="truncate w-full">{{ tag.name }}</span>
</div>
</template>
<div class="flex flex-col space-y-2">
<div class="text-foreground text-sm mb-4">
{{ tag.description }}
</div>
<div class="flex flex-col space-y-2 pb-1">
<FormButton
v-if="latestStableVersions.win"
full-width
@click="downloadVersion(latestStableVersions.win as ConnectorVersion)"
>
Download latest stable ({{ latestStableVersions.win.Number }}) Windows
</FormButton>
<FormButton
v-if="latestStableVersions.mac"
full-width
text
@click="downloadVersion(latestStableVersions.mac as ConnectorVersion)"
>
Download latest stable ({{ latestStableVersions.mac.Number }}) Mac OS
</FormButton>
</div>
<div class="flex items-center justify-between pt-5 gap-6 border-t">
<div class="h6 font-medium">All releases</div>
<div class="w-full max-w-[50%]">
<FormTextInput
v-model="searchString"
name="search"
:custom-icon="MagnifyingGlassIcon"
full-width
search
:show-clear="!!searchString"
placeholder="Search for a version"
class="text-sm"
/>
</div>
</div>
<div class="h-40 simple-scrollbar overflow-y-scroll space-y-2">
<template v-if="searchedVersions.length">
<div
v-for="version in searchedVersions"
:key="version.Number"
class="flex justify-between text-sm"
>
<div class="space-x-2">
<span>{{ version.Number }}</span>
<span class="text-foreground-2">
{{ dayjs(version.Date).from(dayjs()) }}
</span>
</div>
<div class="px-4">
<FormButton size="sm" text @click="downloadVersion(version)">
<span class="text-xs font-medium">
{{ version.Os === 0 ? 'Windows' : 'MacOS' }}
</span>
<CloudArrowDownIcon class="w-4 h-4" />
</FormButton>
</div>
</div>
</template>
<div v-if="searchedVersions.length === 0" class="text-foreground-2">
No versions found.
</div>
</div>
</div>
</LayoutDialog>
</template>
<script setup lang="ts">
import dayjs from 'dayjs'
import { CloudArrowDownIcon, MagnifyingGlassIcon } from '@heroicons/vue/24/solid'
import type { ConnectorTag, ConnectorVersion } from '~~/lib/connectors'
const emit = defineEmits<{
(e: 'update:open', v: boolean): void
}>()
const props = defineProps<{
open: boolean
tag: ConnectorTag
}>()
const searchString = ref<string>()
const versions = computed(() => props.tag.versions)
const searchedVersions = computed(() =>
searchString.value
? versions.value.filter((v) =>
v.Number.toLowerCase().includes((searchString.value as string).toLowerCase())
)
: versions.value
)
const latestStableVersions = computed(() => {
const latest = versions.value.find((v) => !v.Prerelease)
const allLatest = versions.value.filter((v) => v.Number === latest?.Number)
return {
win: allLatest.find((v) => v.Os === 0),
mac: allLatest.find((v) => v.Os === 1)
}
})
const isOpen = computed({
get: () => props.open,
set: (newVal) => emit('update:open', newVal)
})
const downloadVersion = (version: ConnectorVersion) => {
// TODO
const splittedName = version.Url.split('/')
const a = document.createElement('a')
document.body.appendChild(a)
a.style.display = 'none'
a.href = version.Url
a.download = splittedName[splittedName.length - 1]
a.click()
document.body.removeChild(a)
// TODO: mixpanel
}
</script>