74 lines
2.5 KiB
JavaScript
74 lines
2.5 KiB
JavaScript
|
|
export default {
|
|
props: [ 'kind', 'name', 'token', 'state' ],
|
|
data() {
|
|
return { createDisabled: false, selectedAssets: {} }
|
|
},
|
|
computed: {
|
|
availableAssets() {
|
|
return {
|
|
cluster: ['addons'],
|
|
host: [
|
|
"kernel",
|
|
"initrd",
|
|
"bootstrap.tar",
|
|
"boot.img.lz4",
|
|
"boot.img.gz",
|
|
"boot.qcow2",
|
|
"boot.vmdk",
|
|
"boot.img",
|
|
"boot.iso",
|
|
"boot.tar",
|
|
"boot-efi.tar",
|
|
"config",
|
|
"bootstrap-config",
|
|
"ipxe",
|
|
],
|
|
}[this.kind]
|
|
},
|
|
downloads() {
|
|
let ret = []
|
|
Object.entries(this.state.Downloads)
|
|
.filter(e => { let d=e[1]; return d.Kind == this.kind && d.Name == this.name })
|
|
.forEach(e => {
|
|
let token= e[0], d = e[1]
|
|
d.Assets.forEach(asset => {
|
|
ret.push({name: asset, url: '/public/downloads/'+token+'/'+asset})
|
|
})
|
|
})
|
|
return ret
|
|
},
|
|
assets() {
|
|
return this.availableAssets.filter(a => this.selectedAssets[a])
|
|
},
|
|
},
|
|
methods: {
|
|
createToken() {
|
|
event.preventDefault()
|
|
this.createDisabled = true
|
|
|
|
fetch('/authorize-download', {
|
|
method: 'POST',
|
|
body: JSON.stringify({Kind: this.kind, Name: this.name, Assets: this.assets}),
|
|
headers: { 'Authorization': 'Bearer ' + this.token, 'Content-Type': 'application/json' },
|
|
}).then((resp) => resp.json())
|
|
.then((token) => { this.selectedAssets = {}; this.createDisabled = false })
|
|
.catch((e) => { alert('failed to create link'); this.createDisabled = false })
|
|
},
|
|
},
|
|
template: `
|
|
<h4>Available assets</h4>
|
|
<p class="downloads">
|
|
<template v-for="asset in availableAssets">
|
|
<label :class="{selected: selectedAssets[asset]}"><input type="checkbox" v-model="selectedAssets[asset]" /> {{ asset }}</label>
|
|
{{" "}}
|
|
</template>
|
|
</p>
|
|
<button :disabled="createDisabled || assets.length==0" @click="createToken">Create links</button>
|
|
<template v-if="downloads.length">
|
|
<h4>Active links</h4>
|
|
<p class="download-links"><template v-for="d in downloads"><a :href="d.url" download>{{ d.name }}</a>{{" "}}</template></p>
|
|
</template>
|
|
</div>`
|
|
}
|