upend/ui/src/views/Browse.vue

132 lines
2.6 KiB
Vue

<template>
<div class="browser" ref="root">
<div
class="view"
v-for="(address, idx) in addresses"
:key="address"
:data-address="address"
>
<header>
<sl-icon-button
class="edit-button"
name="pencil"
@click="editable[idx] = !editable[idx]"
/>
<sl-icon-button
class="this-button"
name="bookmark"
@click="visit(idx)"
:disabled="addresses.length === 1"
/>
<sl-icon-button
class="close-button"
name="x-circle"
@click="close(idx)"
:disabled="addresses.length === 1"
/>
</header>
<Inspect :address="address" :editable="editable[idx] || false" />
</div>
</div>
</template>
<script lang="ts">
import router from "@/router";
import Inspect from "@/views/Inspect.vue";
import { defineComponent, nextTick, PropType, reactive, ref, watch } from "vue";
import { useRoute } from "vue-router";
export default defineComponent({
name: "Browse",
components: {
Inspect,
},
props: {
addresses: {
type: Array as PropType<string[]>,
required: true,
},
},
setup(props) {
const route = useRoute();
const root = ref<HTMLDivElement>();
const editable = reactive<boolean[]>([]);
function visit(idx: number) {
router.push({
params: { addresses: [route.params.addresses[idx]] },
});
}
function close(idx: number) {
const addresses = [...route.params.addresses];
addresses.splice(idx, 1);
router.push({
params: { addresses },
});
}
watch(
() => props.addresses,
(addresses: string[], prevAddresses: string[]) => {
if (addresses.length > prevAddresses.length) {
nextTick().then(() => {
root.value?.scrollTo({
left: root.value.scrollWidth,
behavior: "smooth",
});
});
}
}
);
return {
root,
visit,
close,
editable,
};
},
});
</script>
<style scoped lang="scss">
.browser {
display: flex;
margin-left: -2rem;
margin-right: -2rem;
padding: 0 2rem;
overflow-x: auto;
}
.view {
min-width: 30em;
max-width: 30em;
border-left: 1px solid var(--foreground);
border-right: 1px solid var(--foreground);
margin: 1rem 0;
padding: 0 1rem;
header {
position: relative;
margin: 0;
min-height: 1em;
.this-button {
position: absolute;
left: 50%;
translate: transformX(-50%);
}
.close-button {
position: absolute;
right: 0;
}
}
}
</style>