dragonroll/plugins/dnd-5e/client/views/Database.vue

199 lines
6.6 KiB
Vue
Raw Normal View History

2024-10-11 17:33:28 +00:00
<script setup>
2024-10-18 13:11:08 +00:00
import { marked } from "marked";
2024-10-11 17:33:28 +00:00
import WindowHandle from '@/views/partials/WindowHandle.vue';
import { onMounted, ref, shallowRef, watch } from 'vue';
2024-10-16 11:32:28 +00:00
import { ResetPosition, SetMinSize, SetResizable, SetSize, SetupHandle } from '@/services/Windows';
2024-10-11 17:33:28 +00:00
import ConceptList from '@/views/partials/ConceptList.vue';
import Tabs from '@/views/partials/Tabs.vue';
import FixedBottomButtons from '@/views/partials/FixedBottomButtons.vue';
2024-10-16 11:32:28 +00:00
import { Global } from '@/services/PluginGlobals';
2024-10-18 13:11:08 +00:00
import { GetKey } from '@/services/Utils.js';
2024-10-11 17:33:28 +00:00
2024-10-11 22:35:06 +00:00
import { FetchConcepts, GetConcepts } from './../data.js'
2024-10-11 17:33:28 +00:00
const handle = ref(null);
const props = defineProps(['data']);
const data = props.data;
2024-10-16 11:32:28 +00:00
const Api = Global('dnd-5e').Api;
const PluginData = Global('dnd-5e').Data;
2024-10-11 17:33:28 +00:00
let id = data.id;
2024-10-18 13:11:08 +00:00
const weapons = shallowRef([]);
const equipment = shallowRef([]);
const consumables = shallowRef([]);
const containers = shallowRef([]);
const tools = shallowRef([]);
const spells = shallowRef([]);
const features = shallowRef([]);
2024-10-11 17:33:28 +00:00
onMounted(() => {
SetupHandle(id, handle);
2024-10-18 13:11:08 +00:00
SetSize(id, {width: 800, height: 800});
2024-10-11 17:33:28 +00:00
ResetPosition(id, "center");
SetResizable(id, true);
2024-10-18 13:11:08 +00:00
SetMinSize(id, {width: 800, height: 300});
2024-10-11 17:33:28 +00:00
watch(GetConcepts, () => {
2024-10-18 13:11:08 +00:00
let elements = GetConcepts();
weapons.value = elements.filter((e) => e.type == "Weapon");
equipment.value = elements.filter((e) => e.type == "Equipment");
consumables.value = elements.filter((e) => e.type == "Consumable");
containers.value = elements.filter((e) => e.type == "Container");
tools.value = elements.filter((e) => e.type == "Tool");
spells.value = elements.filter((e) => e.type == "Spell");
features.value = elements.filter((e) => e.type == "Feature");
console.log(elements);
console.log(elements);
2024-10-11 17:33:28 +00:00
});
2024-10-11 17:33:28 +00:00
FetchConcepts();
});
function OpenCreateItemPrompt(){
2024-10-16 11:32:28 +00:00
Api.createWindow(PluginData.windows.create_item_prompt, {id: 'create_item_prompt', title: 'Create Item', close: () => Api.clearWindow('create_item_prompt')})
2024-10-11 17:33:28 +00:00
}
function OpenConcept(element){
2024-10-16 11:32:28 +00:00
Api.createWindow(PluginData.windows.item_sheet, {
2024-10-11 17:33:28 +00:00
id: 'item_sheet_' + element._id,
title: 'Edit Item',
item_id: element._id,
2024-10-16 11:32:28 +00:00
close: () => Api.clearWindow('item_sheet_' + element._id)
2024-10-11 17:33:28 +00:00
});
}
function ElementContext(element){
return [
{name: "Open"},
{name: "Delete"}
];
}
function ElementTooltip(element){
2024-10-21 17:36:34 +00:00
let descHtml = GetKey(element, 'description');
2024-10-18 13:11:08 +00:00
if(descHtml) descHtml = marked.parse(descHtml);
else descHtml = '';
2024-10-11 17:33:28 +00:00
return `<div class='document item'>
<h2>${element.name}</h2>
2024-10-21 17:36:34 +00:00
<img src='${GetKey(element, "icon")}'></img>
2024-10-18 13:11:08 +00:00
<div class='document'>${descHtml}</div>
2024-10-11 17:33:28 +00:00
</div>`;
}
function ElementIcon(element){
2024-10-21 17:36:34 +00:00
return GetKey(element, "icon") ? GetKey(element, "icon") : 'icons/game-icons/ffffff/lorc/crossed-swords.svg'
2024-10-11 17:33:28 +00:00
}
</script>
<template>
<div class="window-wrapper" :id="'window-wrapper-' + id">
<WindowHandle :window="id" ref="handle"></WindowHandle>
<div class="main-container">
<Tabs :rows="[
2024-10-18 13:11:08 +00:00
{id: 'weapons', value: 'plugins.dnd-5e.database.tabs.weapons'},
{id: 'equipment', value: 'plugins.dnd-5e.database.tabs.equipment'},
{id: 'consumables', value: 'plugins.dnd-5e.database.tabs.consumables'},
{id: 'containers', value: 'plugins.dnd-5e.database.tabs.containers'},
{id: 'tools', value: 'plugins.dnd-5e.database.tabs.tools'},
{id: 'spells', value: 'plugins.dnd-5e.database.tabs.spells'},
{id: 'features', value: 'plugins.dnd-5e.database.tabs.features'},
2024-10-11 17:33:28 +00:00
]">
2024-10-18 13:11:08 +00:00
<template #weapons>
<ConceptList
:elements="weapons"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #equipment>
<ConceptList
:elements="equipment"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #consumables>
<ConceptList
:elements="consumables"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #containers>
<ConceptList
:elements="containers"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #tools>
<ConceptList
:elements="tools"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #spells>
<ConceptList
:elements="spells"
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
<template #features>
2024-10-11 17:33:28 +00:00
<ConceptList
2024-10-18 13:11:08 +00:00
:elements="features"
2024-10-11 17:33:28 +00:00
:open="OpenConcept"
:context="ElementContext"
:tooltip="ElementTooltip"
:icon="ElementIcon"
></ConceptList>
</template>
</Tabs>
</div>
<FixedBottomButtons :plus="OpenCreateItemPrompt"></FixedBottomButtons>
</div>
</template>
<style scoped>
.main-container {
height: calc(100% - 24px);
}
.fixed-bottom-buttons {
position: absolute;
bottom: 10px;
right: 10px;
z-index: 2;
display: flex;
}
.window-wrapper {
display: flex;
align-items: center;
user-select: none;
}
</style>