mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2025-12-21 21:33:02 +01:00
* feat: migrate tools page and label generator to shadcn * chore: lint issues * feat: also do profile page * feat: shadcn 404 page * feat: login page shadcn * fix: daisyui ironically breaks the z height for the login page * feat: componentise the language selector and add it to the login page * feat: use nuxtlink * feat: card and table made more shadcn * feat: shadcn statscard * chore: lint * feat: shadcn labelchip and locationcard * feat: shadcn locations page * refactor: remove unused new item page * chore: lint * feat: shadcn item card * fix: wrapping of location and lint * feat: ctrl enter in text area in form submits form * feat: begin shadcn locations page and remove pageqrcode comp in favour of integrating it into labelmaker * chore: lint + remove unused code * fix: remove uneeded margin * feat: shadcn labels page and fix some issues with location * feat: shadcn scanner * chore: lint * feat: begin shadcning item pages * feat: shadcn maintenance page * feat: begin shadcn search page * fix: quick switch blurry text and crashing page when switching + incorrect z height for create menu * feat: finish shadcn search page * chore: lint * feat: shadcn edit item page * fix: quickmenumodal bug * feat: shadcn item details page * feat: remove all non-color related daisyui classes * fix: type error * fix: quick menu modal again :(
66 lines
2.0 KiB
Vue
66 lines
2.0 KiB
Vue
<script setup lang="ts">
|
|
import type { ViewType } from "~~/composables/use-preferences";
|
|
import type { ItemSummary } from "~~/lib/api/types/data-contracts";
|
|
import MdiCardTextOutline from "~icons/mdi/card-text-outline";
|
|
import MdiTable from "~icons/mdi/table";
|
|
import { Button, ButtonGroup } from "@/components/ui/button";
|
|
|
|
type Props = {
|
|
view?: ViewType;
|
|
items: ItemSummary[];
|
|
};
|
|
|
|
const preferences = useViewPreferences();
|
|
|
|
const props = defineProps<Props>();
|
|
const viewSet = computed(() => {
|
|
return !!props.view;
|
|
});
|
|
|
|
const itemView = computed(() => {
|
|
return props.view ?? preferences.value.itemDisplayView;
|
|
});
|
|
|
|
function setViewPreference(view: ViewType) {
|
|
preferences.value.itemDisplayView = view;
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<section>
|
|
<BaseSectionHeader class="mb-2 mt-4 flex items-center justify-between">
|
|
{{ $t("components.item.view.selectable.items") }}
|
|
<template #description>
|
|
<div v-if="!viewSet">
|
|
<ButtonGroup>
|
|
<Button size="sm" :variant="itemView === 'card' ? 'default' : 'outline'" @click="setViewPreference('card')">
|
|
<MdiCardTextOutline class="size-5" />
|
|
{{ $t("components.item.view.selectable.card") }}
|
|
</Button>
|
|
<Button
|
|
size="sm"
|
|
:variant="itemView === 'table' ? 'default' : 'outline'"
|
|
@click="setViewPreference('table')"
|
|
>
|
|
<MdiTable class="size-5" />
|
|
{{ $t("components.item.view.selectable.table") }}
|
|
</Button>
|
|
</ButtonGroup>
|
|
</div>
|
|
</template>
|
|
</BaseSectionHeader>
|
|
|
|
<template v-if="itemView === 'table'">
|
|
<ItemViewTable :items="items" />
|
|
</template>
|
|
<template v-else>
|
|
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2 md:grid-cols-3">
|
|
<ItemCard v-for="item in items" :key="item.id" :item="item" />
|
|
<div class="hidden first:block">{{ $t("components.item.view.selectable.no_items") }}</div>
|
|
</div>
|
|
</template>
|
|
</section>
|
|
</template>
|
|
|
|
<style scoped></style>
|