diff options
author | Santo Cariotti <santo@dcariotti.me> | 2022-10-13 21:59:53 +0200 |
---|---|---|
committer | Santo Cariotti <santo@dcariotti.me> | 2022-10-13 21:59:53 +0200 |
commit | 9189cbd7a65ef6b7c8e0c346caa7ad83b966b0c2 (patch) | |
tree | eb3549dd021dfa903989d4300a4e487c533efd8c /components/VTable.vue | |
parent | e9f062e9138e677f77804f4be7882fe7abfd37ee (diff) |
Table for admin data
Diffstat (limited to 'components/VTable.vue')
-rw-r--r-- | components/VTable.vue | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/components/VTable.vue b/components/VTable.vue new file mode 100644 index 0000000..723ba7b --- /dev/null +++ b/components/VTable.vue @@ -0,0 +1,55 @@ +<template lang="pug"> + .flex.flex-col + .overflow-x-auto + .py-2.inline-block.min-w-full(class="sm:px-6 lg:px-8") + .overflow-hidden + table.min-w-full + thead.bg-white.border-b + tr + th.text-sm.text-gray-900.px-6.py-4.text-left(scope="col" v-for="name in keys") + span(v-if="name == 'id'") ID + span.capitalize(v-else) {{ replaceUnderscores(name) }} + th.text-sm.text-gray-900.px-6.py-4.text-left(scope="col") + tbody + tr.bg-white.border-b.transition.duration-300.ease-in-out( + class="hover:bg-gray-100" v-for="field in fields" + ) + td.px-6.py-4.whitespace-nowrap.text-sm.text-gray-900.truncate(v-for="name in keys") + div.max-w-100.block.truncate + span(v-if="isBool(field[name])") + svg(v-if="field[name]" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 text-green-500") + path(stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5") + svg(v-else xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 text-red-500") + path(stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12") + span(v-else-if="name == 'avatar'") + user-avatar(:data="field") + span(v-else :title="field[name]") {{ field[name] }} + td.px-6.py-4.whitespace-nowrap.text-sm.text-gray-900 + .flex + .mr-1 + svg(xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 cursor-pointer") + path(stroke-linecap="round" stroke-linejoin="round" d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125") + div + svg(xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6 text-red-500 cursor-pointer") + path(stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0") + +</template> + +<script> +import UserAvatar from "@/components/UserAvatar.vue"; + +export default { + props: ["keys", "fields"], + components: { + "user-avatar": UserAvatar, + }, + methods: { + replaceUnderscores(text) { + return text.replaceAll("_", " "); + }, + isBool(variable) { + return typeof variable == "boolean"; + }, + }, +}; +</script> |