summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/VTable.vue55
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>