2023-07-19 18:42:05 +02:00
|
|
|
<script setup lang="ts">
|
2023-09-07 18:13:09 +02:00
|
|
|
definePageMeta({
|
|
|
|
public: true,
|
|
|
|
})
|
|
|
|
|
2023-07-25 23:11:32 +02:00
|
|
|
const { t } = useI18n()
|
2023-09-04 16:45:16 +02:00
|
|
|
const appsData = await useApps()
|
2023-07-19 18:42:05 +02:00
|
|
|
|
2023-09-07 18:13:09 +02:00
|
|
|
useHead({
|
2023-11-11 15:07:40 +01:00
|
|
|
title: t('app_list'),
|
2023-09-04 16:49:13 +02:00
|
|
|
})
|
|
|
|
|
2023-09-04 16:45:16 +02:00
|
|
|
const apps = computed(() => {
|
2023-11-14 18:33:23 +01:00
|
|
|
const appTileVariant = [
|
|
|
|
'btn-primary',
|
|
|
|
'btn-secondary',
|
|
|
|
'btn-accent',
|
|
|
|
'btn-neutral',
|
|
|
|
'btn-info',
|
|
|
|
'btn-success',
|
|
|
|
'btn-warning',
|
|
|
|
'btn-error',
|
|
|
|
// FIXME currently using daisyui btn colors to get focus/hover styles,
|
|
|
|
// if we want more colors we need to add btn variants based on daisyui colors.
|
|
|
|
// 'bg-red-500'
|
|
|
|
// 'bg-orange-500'
|
|
|
|
// 'bg-yellow-500'
|
|
|
|
// 'bg-lime-500'
|
|
|
|
// 'bg-green-500'
|
|
|
|
// 'bg-teal-500'
|
|
|
|
// 'bg-indigo-500'
|
|
|
|
// 'bg-primary',
|
|
|
|
// 'bg-purple-500'
|
|
|
|
// 'bg-rose-500'
|
2023-07-20 17:36:08 +02:00
|
|
|
]
|
2023-08-06 16:27:24 +02:00
|
|
|
|
2023-09-04 16:45:16 +02:00
|
|
|
return Object.entries(appsData.value).map(([id, app]) => {
|
|
|
|
return {
|
|
|
|
...app,
|
|
|
|
id,
|
|
|
|
url: '//' + app.url,
|
2023-11-14 18:33:23 +01:00
|
|
|
variant: appTileVariant[parseInt(app.label, 36) % appTileVariant.length],
|
2023-09-04 16:45:16 +02:00
|
|
|
}
|
|
|
|
})
|
2023-07-20 17:36:08 +02:00
|
|
|
})
|
2023-07-19 18:42:05 +02:00
|
|
|
</script>
|
2023-07-12 04:52:58 +02:00
|
|
|
|
2023-07-19 18:42:05 +02:00
|
|
|
<template>
|
2023-08-06 16:27:24 +02:00
|
|
|
<div>
|
2023-11-14 18:33:23 +01:00
|
|
|
<PageTitle :text="$t('app_list')" sr-only />
|
2023-08-06 16:27:24 +02:00
|
|
|
|
|
|
|
<div id="apps" class="my-10">
|
2023-09-04 16:45:16 +02:00
|
|
|
<div v-if="!apps.length" class="w-2/3">
|
2023-07-26 01:25:42 +02:00
|
|
|
<em>{{ t('no_apps') }}</em>
|
2023-07-19 18:42:05 +02:00
|
|
|
</div>
|
|
|
|
|
2023-07-26 01:25:42 +02:00
|
|
|
<ul v-else class="tile-container">
|
2023-11-14 18:33:23 +01:00
|
|
|
<li v-for="app in apps" :key="app.id" class="tile relative">
|
|
|
|
<a :href="app.url" class="btn p-5" :class="app.variant">
|
2023-07-26 01:25:42 +02:00
|
|
|
<div class="text-6xl font-extrabold mb-1" aria-hidden="true">
|
2023-07-19 18:42:05 +02:00
|
|
|
{{ app.label.substring(0, 2) }}
|
2023-07-12 04:52:58 +02:00
|
|
|
</div>
|
2023-07-26 01:25:42 +02:00
|
|
|
<span class="leading-tight mt-2">{{ app.label }}</span>
|
2023-07-19 18:42:05 +02:00
|
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
2023-07-12 04:52:58 +02:00
|
|
|
</div>
|
2023-07-19 18:42:05 +02:00
|
|
|
</div>
|
2023-07-12 04:52:58 +02:00
|
|
|
</template>
|
2023-07-26 01:25:42 +02:00
|
|
|
|
|
|
|
<style>
|
|
|
|
.tile-container {
|
|
|
|
display: grid;
|
|
|
|
grid-template-columns: repeat(auto-fit, 10rem);
|
|
|
|
grid-auto-rows: 10rem;
|
|
|
|
grid-gap: 1.5rem;
|
|
|
|
}
|
|
|
|
|
2023-11-14 18:33:23 +01:00
|
|
|
.tile a {
|
|
|
|
display: inline-block;
|
|
|
|
height: 100%;
|
|
|
|
width: 100%;
|
|
|
|
text-align: start;
|
|
|
|
border-radius: 0;
|
2023-07-26 01:25:42 +02:00
|
|
|
}
|
|
|
|
|
2023-11-14 18:33:23 +01:00
|
|
|
.tile:hover a,
|
|
|
|
.tile a:focus {
|
|
|
|
transform: scale(1.05);
|
2023-07-26 01:25:42 +02:00
|
|
|
}
|
|
|
|
</style>
|