aboutsummaryrefslogtreecommitdiffstats
path: root/components
diff options
context:
space:
mode:
authorLeonardo Bishop <me@leonardobishop.com>2024-03-15 00:13:40 +0000
committerLeonardo Bishop <me@leonardobishop.com>2024-03-15 00:13:40 +0000
commitc9aefa81ca1950121d2357fc66afe15eb400f537 (patch)
treefd6196b55626cea8101cd5a4a00cb2a00d8a495b /components
parent1dd5d0fa8bb2ae794b263d1629a662166a9b9d08 (diff)
Fix eslint errors
Diffstat (limited to 'components')
-rw-r--r--components/base/Button.vue13
-rw-r--r--components/base/Checkbox.vue4
-rw-r--r--components/base/ItemStack/ItemStackForm.vue262
-rw-r--r--components/base/ItemStack/ItemStackFormOptionLabel.vue18
-rw-r--r--components/base/ItemStack/ItemStackModal.vue60
-rw-r--r--components/base/ItemStack/ItemStackPicker.vue44
-rw-r--r--components/base/Modal.vue3
-rw-r--r--components/base/Pulser.vue6
-rw-r--r--components/base/TrueFalseSwitch.vue2
-rw-r--r--components/editor/EditorOptionsPanel.vue5
-rw-r--r--components/editor/EditorSidebar.vue41
-rw-r--r--components/editor/EditorSidebarCategory.vue16
-rw-r--r--components/editor/EditorSidebarItem.vue2
-rw-r--r--components/editor/EditorSidebarMainConfiguration.vue6
-rw-r--r--components/editor/EditorSidebarQuest.vue2
-rw-r--r--components/editor/category/EditorCategoryChildrenOptionsPanel.vue3
-rw-r--r--components/editor/category/EditorCategoryOptionsPanel.vue7
-rw-r--r--components/editor/quest/EditorQuestOptionsPanel.vue108
-rw-r--r--components/editor/quest/EditorQuestTasksOptionsPanel.vue32
-rw-r--r--components/editor/quest/modal/EditorQuestModalDelete.vue14
-rw-r--r--components/editor/quest/modal/EditorQuestModalDuplicate.vue12
-rw-r--r--components/editor/quest/modal/EditorQuestModalRename.vue12
-rw-r--r--components/editor/quest/modal/EditorQuestModalYaml.vue23
-rw-r--r--components/editor/task/EditorTaskConfiguration.vue93
-rw-r--r--components/editor/task/EditorTaskConfigurationRow.vue77
-rw-r--r--components/editor/task/modal/EditorTaskModalChange.vue24
-rw-r--r--components/editor/task/modal/EditorTaskModalCreate.vue25
-rw-r--r--components/export/ExportButton.vue11
-rw-r--r--components/export/ExportModal.vue12
-rw-r--r--components/export/ExportZipButton.vue4
-rw-r--r--components/export/ExportZipModal.vue18
-rw-r--r--components/footer/SiteFooter.vue14
-rw-r--r--components/header/PageHeader.vue2
-rw-r--r--components/header/SiteHeader.vue5
-rw-r--r--components/loader/LoaderDiscardSessionModal.vue24
-rw-r--r--components/loader/LoaderFileSystemButton.vue13
-rw-r--r--components/loader/LoaderFileSystemModal.vue29
-rw-r--r--components/loader/LoaderImportButton.vue16
-rw-r--r--components/loader/LoaderNetworkButton.vue5
-rw-r--r--components/loader/LoaderTestDataButton.vue4
-rw-r--r--components/loader/LoaderTestDataModal.vue16
41 files changed, 732 insertions, 355 deletions
diff --git a/components/base/Button.vue b/components/base/Button.vue
index a53e329..663ac47 100644
--- a/components/base/Button.vue
+++ b/components/base/Button.vue
@@ -13,7 +13,7 @@ const props = defineProps({
label: String,
icon: {
type: Array<String>,
- required: false
+ required: false,
},
disabled: Boolean,
});
@@ -28,8 +28,11 @@ const onClick = (event: MouseEvent) => {
</script>
<template>
- <a id="button" :class="{ text: type === 'text', solid: type === 'solid', disabled: disabled, [accent]: true }"
- @click.stop="onClick">
+ <a
+ id="button"
+ :class="{ text: type === 'text', solid: type === 'solid', disabled: disabled, [accent]: true }"
+ @click.stop="onClick"
+ >
<font-awesome-icon :icon="icon" v-if="icon" />
{{ label }}
</a>
@@ -68,7 +71,7 @@ const onClick = (event: MouseEvent) => {
color: var(--color-false);
&:hover {
- color: var(--color-false-hover)
+ color: var(--color-false-hover);
}
}
@@ -103,4 +106,4 @@ const onClick = (event: MouseEvent) => {
background-color: var(--color-border);
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/Checkbox.vue b/components/base/Checkbox.vue
index e0325e7..b262b8e 100644
--- a/components/base/Checkbox.vue
+++ b/components/base/Checkbox.vue
@@ -6,7 +6,6 @@ defineProps({
label: String,
description: String,
});
-
</script>
<template>
@@ -38,5 +37,4 @@ input {
.checkbox {
padding: 0 0 0 20px;
}
-
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/ItemStack/ItemStackForm.vue b/components/base/ItemStack/ItemStackForm.vue
index ef13abd..ddf8144 100644
--- a/components/base/ItemStack/ItemStackForm.vue
+++ b/components/base/ItemStack/ItemStackForm.vue
@@ -16,25 +16,27 @@ const yamlCode = ref('');
const switchToYamlEditor = () => {
yamlCode.value = stringify({
- type: model.value.type || model.value.material || model.value.item || "",
- ...("name" in model.value && { name: model.value.name }),
- ...("lore" in model.value && { lore: model.value.lore }),
- ...("enchantments" in model.value && { enchantments: model.value.enchantments }),
- ...("itemflags" in model.value && { itemflags: model.value.itemflags }),
- ...("custommodeldata" in model.value && { custommodeldata: model.value.custommodeldata }),
- ...("unbreakable" in model.value && { unbreakable: model.value.unbreakable }),
- ...("attributemodifiers" in model.value && { attributemodifiers: model.value.attributemodifiers }),
- ...("owner-base64" in model.value && { ["owner-base64"]: model.value["owner-base64"] }),
- ...("owner-username" in model.value && { ["owner-username"]: model.value["owner-username"] }),
- ...("owner-uuid" in model.value && { ["owner-uuid"]: model.value["owner-uuid"] })
- })
+ type: model.value.type || model.value.material || model.value.item || '',
+ ...('name' in model.value && { name: model.value.name }),
+ ...('lore' in model.value && { lore: model.value.lore }),
+ ...('enchantments' in model.value && { enchantments: model.value.enchantments }),
+ ...('itemflags' in model.value && { itemflags: model.value.itemflags }),
+ ...('custommodeldata' in model.value && { custommodeldata: model.value.custommodeldata }),
+ ...('unbreakable' in model.value && { unbreakable: model.value.unbreakable }),
+ ...('attributemodifiers' in model.value && {
+ attributemodifiers: model.value.attributemodifiers,
+ }),
+ ...('owner-base64' in model.value && { ['owner-base64']: model.value['owner-base64'] }),
+ ...('owner-username' in model.value && { ['owner-username']: model.value['owner-username'] }),
+ ...('owner-uuid' in model.value && { ['owner-uuid']: model.value['owner-uuid'] }),
+ });
editAsYaml.value = true;
-}
+};
const switchToGuiEditor = () => {
parseAndSetYamlValues();
editAsYaml.value = false;
-}
+};
const parseAndSetYamlValues = (): boolean => {
let newValues;
@@ -45,19 +47,31 @@ const parseAndSetYamlValues = (): boolean => {
}
model.value.type = newValues.type;
- if ("name" in newValues) model.value.name = String(newValues.name);
- if ("lore" in newValues) model.value.lore = Array.isArray(newValues.lore) ? newValues.lore : [newValues.lore];
- if ("enchantments" in newValues) model.value.enchantments = Array.isArray(newValues.enchantments) ? newValues.enchantments : [newValues.enchantments];
- if ("itemflags" in newValues) model.value.itemflags = Array.isArray(newValues.itemflags) ? newValues.itemflags : [newValues.itemflags];
- if ("custommodeldata" in newValues) model.value.custommodeldata = Number(newValues.custommodeldata) || 0;
- if ("unbreakable" in newValues) model.value.unbreakable = !!newValues.unbreakable;
- if ("attributemodifiers" in newValues) model.value.attributemodifiers = Array.isArray(newValues.attributemodifiers) ? newValues.attributemodifiers : [newValues.attributemodifiers];
- if ("owner-base64" in newValues) model.value["owner-base64"] = String(newValues["owner-base64"]);
- if ("owner-username" in newValues) model.value["owner-username"] = String(newValues["owner-username"]);
- if ("owner-uuid" in newValues) model.value["owner-uuid"] = String(newValues["owner-uuid"]);
+ if ('name' in newValues) model.value.name = String(newValues.name);
+ if ('lore' in newValues)
+ model.value.lore = Array.isArray(newValues.lore) ? newValues.lore : [newValues.lore];
+ if ('enchantments' in newValues)
+ model.value.enchantments = Array.isArray(newValues.enchantments)
+ ? newValues.enchantments
+ : [newValues.enchantments];
+ if ('itemflags' in newValues)
+ model.value.itemflags = Array.isArray(newValues.itemflags)
+ ? newValues.itemflags
+ : [newValues.itemflags];
+ if ('custommodeldata' in newValues)
+ model.value.custommodeldata = Number(newValues.custommodeldata) || 0;
+ if ('unbreakable' in newValues) model.value.unbreakable = !!newValues.unbreakable;
+ if ('attributemodifiers' in newValues)
+ model.value.attributemodifiers = Array.isArray(newValues.attributemodifiers)
+ ? newValues.attributemodifiers
+ : [newValues.attributemodifiers];
+ if ('owner-base64' in newValues) model.value['owner-base64'] = String(newValues['owner-base64']);
+ if ('owner-username' in newValues)
+ model.value['owner-username'] = String(newValues['owner-username']);
+ if ('owner-uuid' in newValues) model.value['owner-uuid'] = String(newValues['owner-uuid']);
return true;
-}
+};
const itemName = computed({
get() {
@@ -70,7 +84,7 @@ const itemName = computed({
const isOptionSet = (option: string) => {
return option in model.value;
-}
+};
const setOption = (option: string, type: 'string' | 'string-list' | 'number' | 'boolean') => {
switch (type) {
@@ -87,11 +101,11 @@ const setOption = (option: string, type: 'string' | 'string-list' | 'number' | '
model.value[option] = [];
break;
}
-}
+};
const removeOption = (option: string) => {
delete model.value[option];
-}
+};
const itemType = computed({
get() {
@@ -114,8 +128,8 @@ const itemLore = computed({
},
set(newValue: string) {
model.value.lore = newValue.split('\n');
- }
-})
+ },
+});
const itemEnchantments = computed({
get() {
@@ -123,8 +137,8 @@ const itemEnchantments = computed({
},
set(newValue: any) {
model.value.enchantments = newValue;
- }
-})
+ },
+});
const itemCustomModelData = computed({
get() {
@@ -132,8 +146,8 @@ const itemCustomModelData = computed({
},
set(newValue: any) {
model.value.custommodeldata = newValue;
- }
-})
+ },
+});
const itemItemflags = computed({
get() {
@@ -141,8 +155,8 @@ const itemItemflags = computed({
},
set(newValue: any) {
model.value.itemflags = newValue;
- }
-})
+ },
+});
</script>
<template>
@@ -151,69 +165,163 @@ const itemItemflags = computed({
<div class="label-with-button">
<label for="itemstack-type">Type</label>
- <Button label="Edit as YAML" :icon="['fas', 'pencil']" @click="switchToYamlEditor()"></Button>
+ <Button
+ label="Edit as YAML"
+ :icon="['fas', 'pencil']"
+ @click="switchToYamlEditor()"
+ ></Button>
</div>
- <multiselect v-model="itemType" :options="materials" :searchable="true" placeholder="Choose a material" />
+ <multiselect
+ v-model="itemType"
+ :options="materials"
+ :searchable="true"
+ placeholder="Choose a material"
+ />
</div>
<div class="option-group" v-if="isOptionSet('name')">
- <ItemStackFormOptionLabel option="name" type="string" label="Name" :is-option-set-fn="isOptionSet"
- :set-option-fn="setOption" :remove-option-fn="removeOption" />
+ <ItemStackFormOptionLabel
+ option="name"
+ type="string"
+ label="Name"
+ :is-option-set-fn="isOptionSet"
+ :set-option-fn="setOption"
+ :remove-option-fn="removeOption"
+ />
- <input id="itemstack-name" name="itemstack-name" v-model="itemName" placeholder="Enter display name" />
+ <input
+ id="itemstack-name"
+ name="itemstack-name"
+ v-model="itemName"
+ placeholder="Enter display name"
+ />
</div>
<div class="option-group" v-if="isOptionSet('lore')">
- <ItemStackFormOptionLabel option="lore" type="string-list" label="Lore" :is-option-set-fn="isOptionSet"
- :set-option-fn="setOption" :remove-option-fn="removeOption" />
+ <ItemStackFormOptionLabel
+ option="lore"
+ type="string-list"
+ label="Lore"
+ :is-option-set-fn="isOptionSet"
+ :set-option-fn="setOption"
+ :remove-option-fn="removeOption"
+ />
- <textarea rows="5" id="itemstack-lore" name="itemstack-lore" v-model="itemLore" placeholder="Enter item lore" />
+ <textarea
+ rows="5"
+ id="itemstack-lore"
+ name="itemstack-lore"
+ v-model="itemLore"
+ placeholder="Enter item lore"
+ />
</div>
<div class="option-group" v-if="isOptionSet('enchantments')">
- <ItemStackFormOptionLabel option="enchantments" type="string-list" label="Enchantments"
- :is-option-set-fn="isOptionSet" :set-option-fn="setOption" :remove-option-fn="removeOption" />
+ <ItemStackFormOptionLabel
+ option="enchantments"
+ type="string-list"
+ label="Enchantments"
+ :is-option-set-fn="isOptionSet"
+ :set-option-fn="setOption"
+ :remove-option-fn="removeOption"
+ />
- <multiselect v-model="itemEnchantments" :options="enchantments" :searchable="true" :multiple="true"
- placeholder="Enter enchantment names" />
+ <multiselect
+ v-model="itemEnchantments"
+ :options="enchantments"
+ :searchable="true"
+ :multiple="true"
+ placeholder="Enter enchantment names"
+ />
</div>
<div class="option-group" v-if="isOptionSet('itemflags')">
- <ItemStackFormOptionLabel option="itemflags" type="string-list" label="Item flags" :is-option-set-fn="isOptionSet"
- :set-option-fn="setOption" :remove-option-fn="removeOption" />
+ <ItemStackFormOptionLabel
+ option="itemflags"
+ type="string-list"
+ label="Item flags"
+ :is-option-set-fn="isOptionSet"
+ :set-option-fn="setOption"
+ :remove-option-fn="removeOption"
+ />
- <multiselect v-model="itemItemflags" :options="itemflags" :searchable="true" :multiple="true"
- placeholder="Enter item flags" />
+ <multiselect
+ v-model="itemItemflags"
+ :options="itemflags"
+ :searchable="true"
+ :multiple="true"
+ placeholder="Enter item flags"
+ />
</div>
<div class="option-group" v-if="isOptionSet('custommodeldata')">
- <ItemStackFormOptionLabel option="custommodeldata" type="number" label="Custom model data"
- :is-option-set-fn="isOptionSet" :set-option-fn="setOption" :remove-option-fn="removeOption" />
+ <ItemStackFormOptionLabel
+ option="custommodeldata"
+ type="number"
+ label="Custom model data"
+ :is-option-set-fn="isOptionSet"
+ :set-option-fn="setOption"
+ :remove-option-fn="removeOption"
+ />
- <input id="itemstack-custommodeldata" name="itemstack-custommodeldata" v-model="itemCustomModelData" type="number"
- placeholder="Enter custom model data" />
+ <input
+ id="itemstack-custommodeldata"
+ name="itemstack-custommodeldata"
+ v-model="itemCustomModelData"
+ type="number"
+ placeholder="Enter custom model data"
+ />
</div>
<div>
- <Button v-if="!isOptionSet('name')" @click="setOption('name', 'string')" label="Add specific name"
- :icon="['fas', 'plus']"></Button>
- <Button v-if="!isOptionSet('lore')" @click="setOption('lore', 'string-list')" label="Add specific lore"
- :icon="['fas', 'plus']"></Button>
- <Button v-if="!isOptionSet('enchantments')" @click="setOption('enchantments', 'string-list')"
- label="Add specific enchantments" :icon="['fas', 'plus']"></Button>
- <Button v-if="!isOptionSet('itemflags')" @click="setOption('itemflags', 'string-list')"
- label="Add specific item flags" :icon="['fas', 'plus']"></Button>
- <Button v-if="!isOptionSet('custommodeldata')" @click="setOption('custommodeldata', 'string')"
- label="Add specific custom model data" :icon="['fas', 'plus']"></Button>
+ <Button
+ v-if="!isOptionSet('name')"
+ @click="setOption('name', 'string')"
+ label="Add specific name"
+ :icon="['fas', 'plus']"
+ ></Button>
+ <Button
+ v-if="!isOptionSet('lore')"
+ @click="setOption('lore', 'string-list')"
+ label="Add specific lore"
+ :icon="['fas', 'plus']"
+ ></Button>
+ <Button
+ v-if="!isOptionSet('enchantments')"
+ @click="setOption('enchantments', 'string-list')"
+ label="Add specific enchantments"
+ :icon="['fas', 'plus']"
+ ></Button>
+ <Button
+ v-if="!isOptionSet('itemflags')"
+ @click="setOption('itemflags', 'string-list')"
+ label="Add specific item flags"
+ :icon="['fas', 'plus']"
+ ></Button>
+ <Button
+ v-if="!isOptionSet('custommodeldata')"
+ @click="setOption('custommodeldata', 'string')"
+ label="Add specific custom model data"
+ :icon="['fas', 'plus']"
+ ></Button>
</div>
- <p>For
- <NuxtLink to="https://quests.leonardobishop.com/configuration/defining-items.html#unbreakable">
- unbreakable</NuxtLink>,
- <NuxtLink to="https://quests.leonardobishop.com/configuration/defining-items.html#attribute-modifiers">
- attribute-modifiers</NuxtLink>, and
- <NuxtLink to="https://quests.leonardobishop.com/configuration/defining-items.html#owner">owner</NuxtLink> please
- switch to YAML.
+ <p>
+ For
+ <NuxtLink
+ to="https://quests.leonardobishop.com/configuration/defining-items.html#unbreakable"
+ >
+ unbreakable</NuxtLink
+ >,
+ <NuxtLink
+ to="https://quests.leonardobishop.com/configuration/defining-items.html#attribute-modifiers"
+ >
+ attribute-modifiers</NuxtLink
+ >, and
+ <NuxtLink to="https://quests.leonardobishop.com/configuration/defining-items.html#owner"
+ >owner</NuxtLink
+ >
+ please switch to YAML.
</p>
</div>
@@ -222,7 +330,11 @@ const itemItemflags = computed({
<div class="label-with-button">
<label for="itemstack-name">YAML</label>
- <Button label="Use GUI editor" :icon="['fas', 'pencil']" @click="switchToGuiEditor"></Button>
+ <Button
+ label="Use GUI editor"
+ :icon="['fas', 'pencil']"
+ @click="switchToGuiEditor"
+ ></Button>
</div>
<textarea id="yaml-editor" rows="10" v-model="yamlCode"></textarea>
@@ -245,4 +357,4 @@ const itemItemflags = computed({
#yaml-editor {
font-family: monospace;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/ItemStack/ItemStackFormOptionLabel.vue b/components/base/ItemStack/ItemStackFormOptionLabel.vue
index ab067f8..e334950 100644
--- a/components/base/ItemStack/ItemStackFormOptionLabel.vue
+++ b/components/base/ItemStack/ItemStackFormOptionLabel.vue
@@ -1,20 +1,24 @@
<script setup lang="ts">
defineProps<{
- option: string
- label: string
- type: string
+ option: string;
+ label: string;
+ type: string;
isOptionSetFn: (option: string) => boolean;
removeOptionFn: (option: string) => void;
setOptionFn: (option: string, type: any) => void;
-}>()
+}>();
</script>
<template>
<div class="label-with-button">
<label :for="'itemstack-' + option">{{ label }}</label>
- <Button v-if="isOptionSetFn(option)" label="Remove" :icon="['fas', 'minus']"
- @click="removeOptionFn(option)"></Button>
+ <Button
+ v-if="isOptionSetFn(option)"
+ label="Remove"
+ :icon="['fas', 'minus']"
+ @click="removeOptionFn(option)"
+ ></Button>
</div>
</template>
@@ -23,4 +27,4 @@ defineProps<{
display: flex;
justify-content: space-between;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/ItemStack/ItemStackModal.vue b/components/base/ItemStack/ItemStackModal.vue
index 2a53926..e4e39e5 100644
--- a/components/base/ItemStack/ItemStackModal.vue
+++ b/components/base/ItemStack/ItemStackModal.vue
@@ -5,7 +5,7 @@ import materials from '@/lib/materials';
const model = defineModel();
const emit = defineEmits(['confirm']);
const props = defineProps<{
- value: any
+ value: any;
}>();
const session = useSessionStore();
@@ -17,15 +17,14 @@ const isQuestItem = computed(() => {
});
const isItemStack = computed(() => {
return (
- typeof value.value === 'object'
- && (
- value.value?.item !== undefined
- || value.value?.type !== undefined
- || value.value?.material !== undefined
- ))
+ typeof value.value === 'object' &&
+ (value.value?.item !== undefined ||
+ value.value?.type !== undefined ||
+ value.value?.material !== undefined)
+ );
});
const isMaterial = computed(() => {
- return typeof value.value === 'string' && materials.includes(value.value)
+ return typeof value.value === 'string' && materials.includes(value.value);
});
const selectedType = ref(
@@ -46,13 +45,15 @@ const selectedQuestItem = computed({
return value.value?.['quest-item'];
},
set(newValue: string) {
- value.value = {}
+ value.value = {};
if (newValue) {
value.value['quest-item'] = newValue;
}
- }
-})
-const knownQuestItems = computed(() => { return session.session.items.map((item) => item.id) });
+ },
+});
+const knownQuestItems = computed(() => {
+ return session.session.items.map((item) => item.id);
+});
const setSelectedType = (type: string) => {
if (type === 'questitem') {
@@ -78,21 +79,33 @@ const confirm = () => {
<template v-slot:body>
<div id="type">
- <span class="option" @click="setSelectedType('questitem')" :class="{ selected: selectedType === 'questitem' }">
+ <span
+ class="option"
+ @click="setSelectedType('questitem')"
+ :class="{ selected: selectedType === 'questitem' }"
+ >
<span>
<font-awesome-icon :icon="['fas', 'tag']" />
Quest Item
</span>
<p v-if="noTypeSelected">Re-use a quest item.</p>
</span>
- <span class="option" @click="setSelectedType('itemstack')" :class="{ selected: selectedType === 'itemstack' }">
+ <span
+ class="option"
+ @click="setSelectedType('itemstack')"
+ :class="{ selected: selectedType === 'itemstack' }"
+ >
<span>
<font-awesome-icon :icon="['fas', 'cube']" />
ItemStack
</span>
<p v-if="noTypeSelected">Define a new item stack.</p>
</span>
- <span class="option" @click="setSelectedType('material')" :class="{ selected: selectedType === 'material' }">
+ <span
+ class="option"
+ @click="setSelectedType('material')"
+ :class="{ selected: selectedType === 'material' }"
+ >
<span>
<font-awesome-icon :icon="['fas', 'apple-whole']" />
Material
@@ -103,7 +116,12 @@ const confirm = () => {
<div id="material" class="option-group" v-if="selectedType === 'material'">
<label for="material">Material</label>
- <multiselect v-model="value" :options="materials" :searchable="true" placeholder="Enter material name" />
+ <multiselect
+ v-model="value"
+ :options="materials"
+ :searchable="true"
+ placeholder="Enter material name"
+ />
<p>Any items of this material will be matched.</p>
</div>
@@ -113,8 +131,12 @@ const confirm = () => {
<div id="quest-item" class="option-group" v-if="selectedType === 'questitem'">
<label for="quest-item">Quest Item</label>
- <multiselect v-model="selectedQuestItem" :options="knownQuestItems" :searchable="true"
- placeholder="Enter quest item" />
+ <multiselect
+ v-model="selectedQuestItem"
+ :options="knownQuestItems"
+ :searchable="true"
+ placeholder="Enter quest item"
+ />
</div>
<div id="confirm" class="control-group">
@@ -174,4 +196,4 @@ const confirm = () => {
}
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/ItemStack/ItemStackPicker.vue b/components/base/ItemStack/ItemStackPicker.vue
index 2dc35d3..09c0130 100644
--- a/components/base/ItemStack/ItemStackPicker.vue
+++ b/components/base/ItemStack/ItemStackPicker.vue
@@ -13,11 +13,13 @@ const showItemStackModal = ref(false);
//TODO unshitify
const empty = computed(() => {
- return value.value === undefined
- || value.value === null
- || value.value === ''
- || (Array.isArray(value.value) && value.value.length === 0)
- || (typeof value.value === 'object' && Object.keys(value.value).length === 0);
+ return (
+ value.value === undefined ||
+ value.value === null ||
+ value.value === '' ||
+ (Array.isArray(value.value) && value.value.length === 0) ||
+ (typeof value.value === 'object' && Object.keys(value.value).length === 0)
+ );
});
const isQuestItem = computed(() => {
return value.value?.['quest-item'] !== undefined;
@@ -27,16 +29,12 @@ const isItemStack = computed(() => {
return false;
}
- const key = 'item' in value.value
- ? 'item'
- : 'type' in value.value
- ? 'type'
- : 'material'
+ const key = 'item' in value.value ? 'item' : 'type' in value.value ? 'type' : 'material';
- return (!!value.value[key]);
+ return !!value.value[key];
});
const isMaterial = computed(() => {
- return typeof value.value === 'string' && materials.includes(value.value)
+ return typeof value.value === 'string' && materials.includes(value.value);
});
const update = (newValue: any) => {
@@ -49,13 +47,19 @@ const update = (newValue: any) => {
<template>
<div class="itemstack" @click="showItemStackModal = true">
<span v-if="empty" class="empty">ItemStack...</span>
- <span v-if="isQuestItem" class="item"><font-awesome-icon :icon="['fas', 'tag']" /> Quest Item: {{
- value['quest-item'] }}</span>
- <span v-if="isItemStack" class="item"><font-awesome-icon :icon="['fas', 'cube']" /> ItemStack: {{ value.type ||
- value.item || value.material }}</span>
- <span v-if="isMaterial" class="item"><font-awesome-icon :icon="['fas', 'apple-whole']" /> {{ value }}</span>
- <span v-if="!empty && !isQuestItem && !isItemStack && !isMaterial" class="invalid"><font-awesome-icon
- :icon="['fas', 'triangle-exclamation']" /> Invalid ItemStack</span>
+ <span v-if="isQuestItem" class="item"
+ ><font-awesome-icon :icon="['fas', 'tag']" /> Quest Item: {{ value['quest-item'] }}</span
+ >
+ <span v-if="isItemStack" class="item"
+ ><font-awesome-icon :icon="['fas', 'cube']" /> ItemStack:
+ {{ value.type || value.item || value.material }}</span
+ >
+ <span v-if="isMaterial" class="item"
+ ><font-awesome-icon :icon="['fas', 'apple-whole']" /> {{ value }}</span
+ >
+ <span v-if="!empty && !isQuestItem && !isItemStack && !isMaterial" class="invalid"
+ ><font-awesome-icon :icon="['fas', 'triangle-exclamation']" /> Invalid ItemStack</span
+ >
</div>
<ItemStackModal v-model="showItemStackModal" :value="value" @confirm="update" />
@@ -94,4 +98,4 @@ const update = (newValue: any) => {
background-color: var(--color-hover);
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/Modal.vue b/components/base/Modal.vue
index f3a32d0..0edc297 100644
--- a/components/base/Modal.vue
+++ b/components/base/Modal.vue
@@ -1,6 +1,5 @@
<script setup lang="ts">
const model = defineModel();
-
</script>
<template>
@@ -69,4 +68,4 @@ const model = defineModel();
font-weight: 600;
border-bottom: none;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/Pulser.vue b/components/base/Pulser.vue
index 796b3cc..c4151fb 100644
--- a/components/base/Pulser.vue
+++ b/components/base/Pulser.vue
@@ -12,7 +12,7 @@
height: 100px;
width: 100px;
- >div {
+ > div {
animation: growAndFade 3s infinite ease-out;
background-color: var(--color-primary);
border-radius: 50%;
@@ -37,7 +37,7 @@
@keyframes growAndFade {
0% {
- opacity: .25;
+ opacity: 0.25;
transform: scale(0);
}
@@ -53,4 +53,4 @@ body {
justify-content: center;
margin: 0;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/base/TrueFalseSwitch.vue b/components/base/TrueFalseSwitch.vue
index 152efa3..46a9d9a 100644
--- a/components/base/TrueFalseSwitch.vue
+++ b/components/base/TrueFalseSwitch.vue
@@ -50,4 +50,4 @@ const invert = () => {
background-color: var(--color-hover);
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorOptionsPanel.vue b/components/editor/EditorOptionsPanel.vue
index 7cf8982..05d1f34 100644
--- a/components/editor/EditorOptionsPanel.vue
+++ b/components/editor/EditorOptionsPanel.vue
@@ -1,5 +1,4 @@
-<script setup lang="ts">
-</script>
+<script setup lang="ts"></script>
<template>
<div id="options-panel">
@@ -16,4 +15,4 @@
padding: 1rem;
height: 100%;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorSidebar.vue b/components/editor/EditorSidebar.vue
index 7ac4996..9d5818d 100644
--- a/components/editor/EditorSidebar.vue
+++ b/components/editor/EditorSidebar.vue
@@ -10,19 +10,27 @@ const currentType = ref('quests' as 'quests' | 'items');
const setSelectedType = (type: 'quests' | 'items') => {
currentType.value = type;
-}
+};
</script>
<template>
<div id="sidebar-container">
<div id="selector">
- <span class="option" @click="setSelectedType('quests')" :class="{ selected: currentType === 'quests' }">
+ <span
+ class="option"
+ @click="setSelectedType('quests')"
+ :class="{ selected: currentType === 'quests' }"
+ >
<span>
<font-awesome-icon :icon="['far', 'compass']" />
Quests
</span>
</span>
- <span class="option" @click="setSelectedType('items')" :class="{ selected: currentType === 'items' }">
+ <span
+ class="option"
+ @click="setSelectedType('items')"
+ :class="{ selected: currentType === 'items' }"
+ >
<span>
<font-awesome-icon :icon="['fas', 'cubes']" />
Items
@@ -30,13 +38,22 @@ const setSelectedType = (type: 'quests' | 'items') => {
</span>
</div>
<div id="quests" v-if="currentType === 'quests'">
- <EditorSidebarCategory v-for="category in session.categories" :key="category.id" :category="category" />
+ <EditorSidebarCategory
+ v-for="category in session.categories"
+ :key="category.id"
+ :category="category"
+ />
<EditorSidebarQuest
- v-for="quest in session.quests.filter((q) => (!session.categories.some((c) => c.id === q.options.category)))"
- :key="quest.id" :quest="quest" />
- <p id="count">{{ session.quests.length }} quest{{ session.quests.length === 1 ? '' : 's' }}, {{
- session.categories.length }}
- categor{{ session.categories.length === 1 ? 'y' : 'ies' }}</p>
+ v-for="quest in session.quests.filter(
+ (q) => !session.categories.some((c) => c.id === q.options.category)
+ )"
+ :key="quest.id"
+ :quest="quest"
+ />
+ <p id="count">
+ {{ session.quests.length }} quest{{ session.quests.length === 1 ? '' : 's' }},
+ {{ session.categories.length }} categor{{ session.categories.length === 1 ? 'y' : 'ies' }}
+ </p>
</div>
<div id="items" v-if="currentType === 'items'">
<EditorSidebarItem v-for="item in session.items" :key="item.id" :item="item" />
@@ -88,7 +105,7 @@ const setSelectedType = (type: 'quests' | 'items') => {
transition: color 0.3s;
&:hover {
- color: var(--color-text)
+ color: var(--color-text);
}
}
}
@@ -105,7 +122,7 @@ const setSelectedType = (type: 'quests' | 'items') => {
border-top: 1px solid var(--color-border);
position: absolute;
bottom: 0;
- width: 100%
+ width: 100%;
}
#count {
@@ -115,4 +132,4 @@ const setSelectedType = (type: 'quests' | 'items') => {
color: var(--color-text-mute);
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorSidebarCategory.vue b/components/editor/EditorSidebarCategory.vue
index 27a5ce0..c5adbca 100644
--- a/components/editor/EditorSidebarCategory.vue
+++ b/components/editor/EditorSidebarCategory.vue
@@ -33,8 +33,11 @@ const selected = computed(() => {
<template>
<div id="category-container" :class="{ selected: selected }">
<span id="category-title" @click="setSelectedCategory">
- <font-awesome-icon @click.stop="expandCategory" class="category-icon"
- :icon="expanded ? ['fas', 'caret-down'] : ['fas', 'caret-up']" />
+ <font-awesome-icon
+ @click.stop="expandCategory"
+ class="category-icon"
+ :icon="expanded ? ['fas', 'caret-down'] : ['fas', 'caret-up']"
+ />
<span id="category-name">
<span id="category-display-name">{{ stripColorCodes(category.display.name) }}</span>
<code id="category-display-id">{{ category.id }}</code>
@@ -42,7 +45,12 @@ const selected = computed(() => {
</span>
</div>
<div v-if="expanded" id="quests">
- <EditorSidebarQuest class="quest" v-for="quest in questsInCategory" :key="quest.id" :quest="quest" />
+ <EditorSidebarQuest
+ class="quest"
+ v-for="quest in questsInCategory"
+ :key="quest.id"
+ :quest="quest"
+ />
</div>
</template>
@@ -91,4 +99,4 @@ const selected = computed(() => {
#category-container:hover {
background-color: var(--color-hover);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorSidebarItem.vue b/components/editor/EditorSidebarItem.vue
index 55f81d0..0e0040d 100644
--- a/components/editor/EditorSidebarItem.vue
+++ b/components/editor/EditorSidebarItem.vue
@@ -63,4 +63,4 @@ const selected = computed(() => {
#item-container:hover {
background-color: var(--color-hover);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorSidebarMainConfiguration.vue b/components/editor/EditorSidebarMainConfiguration.vue
index 9ebef0e..9bc9239 100644
--- a/components/editor/EditorSidebarMainConfiguration.vue
+++ b/components/editor/EditorSidebarMainConfiguration.vue
@@ -16,9 +16,7 @@ const selected = computed(() => {
<div id="container" :class="{ selected: selected }">
<span id="title" @click="setSelected">
<font-awesome-icon class="icon" :icon="['fas', 'wrench']" />
- <span id="name">
- Configuration
- </span>
+ <span id="name"> Configuration </span>
</span>
</div>
</template>
@@ -53,4 +51,4 @@ const selected = computed(() => {
#container:hover {
background-color: var(--color-hover);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/EditorSidebarQuest.vue b/components/editor/EditorSidebarQuest.vue
index fb21042..54814f0 100644
--- a/components/editor/EditorSidebarQuest.vue
+++ b/components/editor/EditorSidebarQuest.vue
@@ -64,4 +64,4 @@ const selected = computed(() => {
#quest-container:hover {
background-color: var(--color-hover);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/category/EditorCategoryChildrenOptionsPanel.vue b/components/editor/category/EditorCategoryChildrenOptionsPanel.vue
index 57dcef2..f4a73ff 100644
--- a/components/editor/category/EditorCategoryChildrenOptionsPanel.vue
+++ b/components/editor/category/EditorCategoryChildrenOptionsPanel.vue
@@ -18,8 +18,7 @@ const category = computed(() => {
<div id="options">
<h2>Quests in this category</h2>
<p>Drag to reorder.</p>
- <div class="option-group">
- </div>
+ <div class="option-group"></div>
</div>
</EditorOptionsPanel>
</template>
diff --git a/components/editor/category/EditorCategoryOptionsPanel.vue b/components/editor/category/EditorCategoryOptionsPanel.vue
index 112b063..c543f73 100644
--- a/components/editor/category/EditorCategoryOptionsPanel.vue
+++ b/components/editor/category/EditorCategoryOptionsPanel.vue
@@ -17,9 +17,12 @@ const category = computed(() => {
<EditorOptionsPanel v-if="category">
<div id="options">
<div class="option-group">
- <Checkbox id="category-permissionrequired" label="Require permission for category"
+ <Checkbox
+ id="category-permissionrequired"
+ label="Require permission for category"
description="Players must have permission to open and start quests in this category."
- v-model="category.permissionRequired" />
+ v-model="category.permissionRequired"
+ />
</div>
</div>
</EditorOptionsPanel>
diff --git a/components/editor/quest/EditorQuestOptionsPanel.vue b/components/editor/quest/EditorQuestOptionsPanel.vue
index 6c1c8b1..bc5f7ef 100644
--- a/components/editor/quest/EditorQuestOptionsPanel.vue
+++ b/components/editor/quest/EditorQuestOptionsPanel.vue
@@ -17,7 +17,6 @@ const knownCategories = computed(() => {
const knownQuests = computed(() => {
return sessionStore.session.quests.map((quest) => quest.id);
});
-
</script>
<template>
@@ -25,87 +24,126 @@ const knownQuests = computed(() => {
<div id="options">
<div class="option-group">
<label for="quest-category">Category</label>
- <multiselect id="quest-category" v-model="quest.options.category" :options="knownCategories" :searchable="true"
- placeholder="No category"></multiselect>
+ <multiselect
+ id="quest-category"
+ v-model="quest.options.category"
+ :options="knownCategories"
+ :searchable="true"
+ placeholder="No category"
+ ></multiselect>
</div>
<div class="option-group">
<label for="quest-requirements">Requirements</label>
- <multiselect id="quest-requirements" v-model="quest.options.requirements" :options="knownQuests"
- :searchable="true" :taggable="true" :multiple="true" placeholder="Add requirement"></multiselect>
+ <multiselect
+ id="quest-requirements"
+ v-model="quest.options.requirements"
+ :options="knownQuests"
+ :searchable="true"
+ :taggable="true"
+ :multiple="true"
+ placeholder="Add requirement"
+ ></multiselect>
<p class="description">
- This quest will only be available if the player has completed all of the quests listed above.
+ This quest will only be available if the player has completed all of the quests listed
+ above.
</p>
</div>
<h2>Quest options</h2>
<div class="option-group">
- <Checkbox id="quest-permissionrequired" label="Require permission to start quest"
- description="Players must have permission to start the quest." v-model="quest.options.permissionRequired" />
+ <Checkbox
+ id="quest-permissionrequired"
+ label="Require permission to start quest"
+ description="Players must have permission to start the quest."
+ v-model="quest.options.permissionRequired"
+ />
</div>
<div class="option-group">
- <Checkbox id="quest-cancellable" label="Allow players to cancel quest"
- description="Players can cancel the quest after they have started it." v-model="quest.options.cancellable" />
+ <Checkbox
+ id="quest-cancellable"
+ label="Allow players to cancel quest"
+ description="Players can cancel the quest after they have started it."
+ v-model="quest.options.cancellable"
+ />
</div>
<div class="option-group">
- <Checkbox id="quest-countstowardslimit" label="Count towards quest limit"
+ <Checkbox
+ id="quest-countstowardslimit"
+ label="Count towards quest limit"
description="Quest will count towards the player's quest started limit."
- v-model="quest.options.countsTowardsLimit" />
+ v-model="quest.options.countsTowardsLimit"
+ />
</div>
<div class="option-group">
- <Checkbox id="quest-repeatable" label="Allow players to repeat quest"
+ <Checkbox
+ id="quest-repeatable"
+ label="Allow players to repeat quest"
description="Quest can be completed again after it has been completed once."
- v-model="quest.options.repeatable" />
+ v-model="quest.options.repeatable"
+ />
</div>
<div class="option-group">
- <Checkbox id="quest-autostart" label="Automatically start quest"
+ <Checkbox
+ id="quest-autostart"
+ label="Automatically start quest"
description="Quest will start automatically when the player has unlocked it."
- v-model="quest.options.autostart" />
+ v-model="quest.options.autostart"
+ />
</div>
-
<h2>Cooldown</h2>
<div class="option-group">
- <Checkbox id="quest-cooldown" label="Enable cooldown"
+ <Checkbox
+ id="quest-cooldown"
+ label="Enable cooldown"
description="Players will have to wait a certain amount of time before they can start the quest again."
- v-model="quest.options.cooldown.enabled" />
+ v-model="quest.options.cooldown.enabled"
+ />
</div>
<div class="option-group">
- <label for="quest-cooldown-time">
- Cooldown (in seconds)
- </label>
- <input id="quest-cooldown-time" type="number" v-model="quest.options.cooldown.time"
- :disabled="!quest.options.cooldown.enabled" />
+ <label for="quest-cooldown-time"> Cooldown (in seconds) </label>
+ <input
+ id="quest-cooldown-time"
+ type="number"
+ v-model="quest.options.cooldown.time"
+ :disabled="!quest.options.cooldown.enabled"
+ />
<p class="description">
- Common values are: <code>3600</code> (1 hour), <code>86400</code> (24 hours), <code>604800</code> (7 days),
- <code>2592000</code> (30 days)
+ Common values are: <code>3600</code> (1 hour), <code>86400</code> (24 hours),
+ <code>604800</code> (7 days), <code>2592000</code> (30 days)
</p>
</div>
<h2>Time limit</h2>
<div class="option-group">
- <Checkbox id="quest-timelimit" label="Enable time limit"
+ <Checkbox
+ id="quest-timelimit"
+ label="Enable time limit"
description="Players will be required to complete the quest within a certain amount of time, otherwise it will be automatically cancelled."
- v-model="quest.options.timeLimit.enabled" />
+ v-model="quest.options.timeLimit.enabled"
+ />
</div>
<div class="option-group">
- <label for="quest-timelimit-time">
- Time limit (in seconds)
- </label>
- <input id="quest-timelimit-time" type="number" v-model="quest.options.timeLimit.time"
- :disabled="!quest.options.timeLimit.enabled" />
+ <label for="quest-timelimit-time"> Time limit (in seconds) </label>
+ <input
+ id="quest-timelimit-time"
+ type="number"
+ v-model="quest.options.timeLimit.time"
+ :disabled="!quest.options.timeLimit.enabled"
+ />
<p class="description">
- Common values are: <code>3600</code> (1 hour), <code>86400</code> (24 hours), <code>604800</code> (7 days),
- <code>2592000</code> (30 days)
+ Common values are: <code>3600</code> (1 hour), <code>86400</code> (24 hours),
+ <code>604800</code> (7 days), <code>2592000</code> (30 days)
</p>
</div>
</div>
diff --git a/components/editor/quest/EditorQuestTasksOptionsPanel.vue b/components/editor/quest/EditorQuestTasksOptionsPanel.vue
index cb4b109..a9e3ac3 100644
--- a/components/editor/quest/EditorQuestTasksOptionsPanel.vue
+++ b/components/editor/quest/EditorQuestTasksOptionsPanel.vue
@@ -29,22 +29,40 @@ const addTask = (newId: string, newType: string) => {
<template>
<EditorOptionsPanel v-if="quest">
<div id="options">
- <h2>Tasks <code>({{ Object.keys(quest.tasks).length }})</code></h2>
+ <h2>
+ Tasks <code>({{ Object.keys(quest.tasks).length }})</code>
+ </h2>
- <p v-if="Object.keys(quest.tasks).length === 0" class="error-text">This quest does not have any tasks.</p>
- <EditorTaskConfiguration v-for="(task, taskId) in quest.tasks" :key="taskId" :taskId="String(taskId)"
- :quest="quest" />
+ <p v-if="Object.keys(quest.tasks).length === 0" class="error-text">
+ This quest does not have any tasks.
+ </p>
+ <EditorTaskConfiguration
+ v-for="(task, taskId) in quest.tasks"
+ :key="taskId"
+ :taskId="String(taskId)"
+ :quest="quest"
+ />
<div id="controls">
- <Button id="add-task" :icon="['fas', 'plus']" type="solid" label="Add task" @click="showAddTaskModal = true" />
+ <Button
+ id="add-task"
+ :icon="['fas', 'plus']"
+ type="solid"
+ label="Add task"
+ @click="showAddTaskModal = true"
+ />
</div>
</div>
</EditorOptionsPanel>
- <EditorTaskModalCreate v-if="quest" v-model="showAddTaskModal" :questId="questId" @add="addTask" />
+ <EditorTaskModalCreate
+ v-if="quest"
+ v-model="showAddTaskModal"
+ :questId="questId"
+ @add="addTask"
+ />
</template>
-
<style scoped>
#options {
display: flex;
diff --git a/components/editor/quest/modal/EditorQuestModalDelete.vue b/components/editor/quest/modal/EditorQuestModalDelete.vue
index e81bcc7..c4e1682 100644
--- a/components/editor/quest/modal/EditorQuestModalDelete.vue
+++ b/components/editor/quest/modal/EditorQuestModalDelete.vue
@@ -13,10 +13,18 @@ defineProps({
<template v-slot:header>
<h2>Really delete quest '{{ questId }}'?</h2>
</template>
- <p>Are you sure you want to delete this quest? The quests editor does not have undo functionality (yet)! </p>
+ <p>
+ Are you sure you want to delete this quest? The quests editor does not have undo functionality
+ (yet)!
+ </p>
<div id="confirm" class="control-group">
<Button :icon="['fas', 'times']" :label="'Cancel'" @click="model = false"></Button>
- <Button type="solid" :icon="['fas', 'trash']" :label="'Delete'" @click="emit('delete')"></Button>
+ <Button
+ type="solid"
+ :icon="['fas', 'trash']"
+ :label="'Delete'"
+ @click="emit('delete')"
+ ></Button>
</div>
</Modal>
</template>
@@ -27,4 +35,4 @@ defineProps({
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/quest/modal/EditorQuestModalDuplicate.vue b/components/editor/quest/modal/EditorQuestModalDuplicate.vue
index 73a2fd0..6c333fb 100644
--- a/components/editor/quest/modal/EditorQuestModalDuplicate.vue
+++ b/components/editor/quest/modal/EditorQuestModalDuplicate.vue
@@ -17,7 +17,6 @@ const newQuestId = ref(props.questId);
const isDuplicate = computed(() => {
return session.getQuestById(newQuestId.value!) !== undefined;
});
-
</script>
<template>
@@ -36,8 +35,13 @@ const isDuplicate = computed(() => {
<p>A Quest ID must be unique, alphanumeric, and not contain any spaces.</p>
<div id="confirm" class="control-group">
<Button :icon="['fas', 'times']" :label="'Cancel'" @click="model = false"></Button>
- <Button type="solid" :icon="['fas', 'check']" :label="'Duplicate'" :disabled="isDuplicate"
- @click="emit('duplicate', newQuestId)"></Button>
+ <Button
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Duplicate'"
+ :disabled="isDuplicate"
+ @click="emit('duplicate', newQuestId)"
+ ></Button>
</div>
</div>
</template>
@@ -55,4 +59,4 @@ const isDuplicate = computed(() => {
flex-direction: column;
gap: 0.5rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/quest/modal/EditorQuestModalRename.vue b/components/editor/quest/modal/EditorQuestModalRename.vue
index 3d846aa..13c4810 100644
--- a/components/editor/quest/modal/EditorQuestModalRename.vue
+++ b/components/editor/quest/modal/EditorQuestModalRename.vue
@@ -17,7 +17,6 @@ const newQuestId = ref(props.questId);
const isDuplicate = computed(() => {
return session.getQuestById(newQuestId.value!) !== undefined;
});
-
</script>
<template>
@@ -36,8 +35,13 @@ const isDuplicate = computed(() => {
<p>A Quest ID must be unique, alphanumeric, and not contain any spaces.</p>
<div id="confirm" class="control-group">
<Button :icon="['fas', 'times']" :label="'Cancel'" @click="model = false"></Button>
- <Button type="solid" :icon="['fas', 'check']" :label="'Rename'" :disabled="isDuplicate"
- @click="emit('update', newQuestId)"></Button>
+ <Button
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Rename'"
+ :disabled="isDuplicate"
+ @click="emit('update', newQuestId)"
+ ></Button>
</div>
</div>
</template>
@@ -55,4 +59,4 @@ const isDuplicate = computed(() => {
flex-direction: column;
gap: 0.5rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/quest/modal/EditorQuestModalYaml.vue b/components/editor/quest/modal/EditorQuestModalYaml.vue
index 365055c..c7c4936 100644
--- a/components/editor/quest/modal/EditorQuestModalYaml.vue
+++ b/components/editor/quest/modal/EditorQuestModalYaml.vue
@@ -6,7 +6,7 @@ const emit = defineEmits(['delete']);
const props = defineProps({
questId: {
required: true,
- type: String
+ type: String,
},
});
@@ -18,16 +18,16 @@ const yamlString = ref('');
const open = () => {
const quest = session.getQuestById(props.questId);
if (!quest) {
- return
+ return;
}
const mappedObject = mapJsonQuestToYamlObject(quest);
yamlString.value = stringify(mappedObject);
showModal.value = true;
-}
+};
defineExpose({
- open
-})
+ open,
+});
</script>
<template>
@@ -36,12 +36,19 @@ defineExpose({
<h2>YAML</h2>
</template>
- <p>YAML file for <code>{{ props.questId }}</code></p>
+ <p>
+ YAML file for <code>{{ props.questId }}</code>
+ </p>
<textarea rows="20" :value="yamlString" readonly />
<div id="confirm" class="control-group">
- <Button type="solid" :icon="['fas', 'check']" :label="'Close'" @click="showModal = false"></Button>
+ <Button
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Close'"
+ @click="showModal = false"
+ ></Button>
</div>
</Modal>
</template>
@@ -56,4 +63,4 @@ defineExpose({
textarea {
width: 100%;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/task/EditorTaskConfiguration.vue b/components/editor/task/EditorTaskConfiguration.vue
index 5313767..dab5888 100644
--- a/components/editor/task/EditorTaskConfiguration.vue
+++ b/components/editor/task/EditorTaskConfiguration.vue
@@ -13,14 +13,21 @@ const taskType = computed(() => props.quest.tasks[props.taskId].config.type);
const taskDefintion = computed(() => sessionStore.getTaskDefinitionByTaskType(taskType.value));
const taskConfig = computed(() => {
- return Object.keys(props.quest.tasks[props.taskId].config).filter((fieldName) => fieldName !== 'type').reduce((acc, fieldName) => {
- acc[fieldName] = props.quest.tasks[props.taskId].config[fieldName];
- return acc;
- }, {} as { [key: string]: any });
+ return Object.keys(props.quest.tasks[props.taskId].config)
+ .filter((fieldName) => fieldName !== 'type')
+ .reduce(
+ (acc, fieldName) => {
+ acc[fieldName] = props.quest.tasks[props.taskId].config[fieldName];
+ return acc;
+ },
+ {} as { [key: string]: any }
+ );
});
const requiredFields = computed(() => {
- return Object.keys(taskDefintion.value.configuration).filter((fieldName) => taskDefintion.value.configuration[fieldName].required);
+ return Object.keys(taskDefintion.value.configuration).filter(
+ (fieldName) => taskDefintion.value.configuration[fieldName].required
+ );
});
// const givenRequiredFields = computed(() => {
@@ -32,13 +39,20 @@ const requiredFields = computed(() => {
// });
const remainingGivenFields = computed(() => {
- return Object.keys(taskConfig.value).filter((fieldName) => !requiredFields.value.includes(fieldName) && fieldName in taskDefintion.value.configuration);
+ return Object.keys(taskConfig.value).filter(
+ (fieldName) =>
+ !requiredFields.value.includes(fieldName) && fieldName in taskDefintion.value.configuration
+ );
});
-const configKeysOptions = computed(() => Object.keys(taskDefintion.value.configuration).filter((key) => !Object.keys(taskConfig.value).some((fieldName) => fieldName === key)));
+const configKeysOptions = computed(() =>
+ Object.keys(taskDefintion.value.configuration).filter(
+ (key) => !Object.keys(taskConfig.value).some((fieldName) => fieldName === key)
+ )
+);
// const configKeysOptions = computed(() => {
// const keys = Object.keys(taskDefintion.value.configuration).filter((key) => !Object.keys(taskConfig.value).some((fieldName) => fieldName === key));
-//
+//
// return keys.map((key) => {
// return {
// value: key,
@@ -49,7 +63,8 @@ const configKeysOptions = computed(() => Object.keys(taskDefintion.value.configu
// });
const onAddOption = (option: any) => {
- sessionStore.getQuestById(props.quest.id)!.tasks[props.taskId].config[option] = taskDefintion.value.configuration[option].default || null;
+ sessionStore.getQuestById(props.quest.id)!.tasks[props.taskId].config[option] =
+ taskDefintion.value.configuration[option].default || null;
};
const updateValue = (fieldName: string, value: any) => {
@@ -64,14 +79,14 @@ const showChangeModal = ref(false);
const updateTaskType = (newType: string) => {
sessionStore.getQuestById(props.quest.id)!.tasks[props.taskId].config = {
- type: newType
+ type: newType,
};
showChangeModal.value = false;
-}
+};
const deleteTaskType = (taskId: string) => {
delete sessionStore.getQuestById(props.quest.id)!.tasks[taskId];
-}
+};
</script>
<template>
@@ -82,43 +97,68 @@ const deleteTaskType = (taskId: string) => {
{{ props.taskId }}
</span>
<code>
- (<font-awesome-icon v-if="taskDefintion" id="task-icon" :icon="[taskDefintion.icon.style, taskDefintion.icon.name]" />{{ taskType }})
+ (<font-awesome-icon
+ v-if="taskDefintion"
+ id="task-icon"
+ :icon="[taskDefintion.icon.style, taskDefintion.icon.name]"
+ />{{ taskType }})
</code>
</p>
<div id="task-controls" class="control-group">
<Button :icon="['fas', 'pen']" :label="'Change'" @click="showChangeModal = true"></Button>
- <Button :icon="['fas', 'trash']" :label="'Delete'" @click="deleteTaskType(props.taskId)"></Button>
+ <Button
+ :icon="['fas', 'trash']"
+ :label="'Delete'"
+ @click="deleteTaskType(props.taskId)"
+ ></Button>
</div>
</div>
<div id="task-configuration">
<div v-if="!taskDefintion" class="error">
<font-awesome-icon id="error-icon" :icon="['fas', 'triangle-exclamation']" />
<p id="error-message">
- Unable to edit task <code>{{ props.taskId }}</code>.
+ Unable to edit task <code>{{ props.taskId }}</code
+ >.
</p>
<p id="error-description">
- The quests web editor does not know how to configure task
- type <code>{{ taskType }}</code> as it has no task definition.
+ The quests web editor does not know how to configure task type
+ <code>{{ taskType }}</code> as it has no task definition.
</p>
</div>
<div v-if="taskDefintion">
- <EditorTaskConfigurationRow v-for="fieldName in [...requiredFields, ...remainingGivenFields]"
- :key="`${quest.id}-${props.taskId}-${taskType}-${fieldName}`" :required="requiredFields.includes(fieldName)"
- :configKey="fieldName" :initialValue="taskConfig[fieldName]" :taskType="taskType"
- :type="(taskDefintion.configuration[fieldName].type as string)"
- @update="(newValue: any) => updateValue(fieldName, newValue)" @delete="() => deleteValue(fieldName)" />
+ <EditorTaskConfigurationRow
+ v-for="fieldName in [...requiredFields, ...remainingGivenFields]"
+ :key="`${quest.id}-${props.taskId}-${taskType}-${fieldName}`"
+ :required="requiredFields.includes(fieldName)"
+ :configKey="fieldName"
+ :initialValue="taskConfig[fieldName]"
+ :taskType="taskType"
+ :type="taskDefintion.configuration[fieldName].type as string"
+ @update="(newValue: any) => updateValue(fieldName, newValue)"
+ @delete="() => deleteValue(fieldName)"
+ />
<div id="add-option">
- <multiselect class="configuration-multiselect" :options="configKeysOptions" :searchable="true"
- @select="onAddOption" placeholder="Add option...">
+ <multiselect
+ class="configuration-multiselect"
+ :options="configKeysOptions"
+ :searchable="true"
+ @select="onAddOption"
+ placeholder="Add option..."
+ >
</multiselect>
</div>
</div>
</div>
</div>
- <EditorTaskModalChange v-model="showChangeModal" :taskId="props.taskId" :currentTaskType="taskType"
- :key="`change-task-${props.taskId}`" @update="updateTaskType" />
+ <EditorTaskModalChange
+ v-model="showChangeModal"
+ :taskId="props.taskId"
+ :currentTaskType="taskType"
+ :key="`change-task-${props.taskId}`"
+ @update="updateTaskType"
+ />
</template>
<style scoped>
@@ -133,7 +173,6 @@ const deleteTaskType = (taskId: string) => {
#error-message {
font-weight: 700;
}
-
}
#task-configuration-table {
diff --git a/components/editor/task/EditorTaskConfigurationRow.vue b/components/editor/task/EditorTaskConfigurationRow.vue
index c00896f..f400292 100644
--- a/components/editor/task/EditorTaskConfigurationRow.vue
+++ b/components/editor/task/EditorTaskConfigurationRow.vue
@@ -21,27 +21,37 @@ const emit = defineEmits(['update', 'delete']);
const sessionStore = useSessionStore();
const definition = computed(() => {
- const def = sessionStore.getTaskDefinitionByTaskType(props.taskType).configuration[props.configKey];
+ const def = sessionStore.getTaskDefinitionByTaskType(props.taskType).configuration[
+ props.configKey
+ ];
return { description: def.description, note: def.note };
});
const { description, note } = toRefs(definition.value);
const showDescription = ref(false);
-const currentValue = ref(props.initialValue ||
- (props.type === 'boolean'
- ? false
- : (props.type === 'material-list' || props.type === 'string-list'
- ? []
- : props.type === 'itemstack'
- ? null
- : ''
- )));
+const currentValue = ref(
+ props.initialValue ||
+ (props.type === 'boolean'
+ ? false
+ : props.type === 'material-list' || props.type === 'string-list'
+ ? []
+ : props.type === 'itemstack'
+ ? null
+ : '')
+);
if (props.initialValue !== currentValue.value) {
emit('update', currentValue.value);
}
-const error = computed(() => currentValue.value === undefined || currentValue.value === null || currentValue.value === '' || (Array.isArray(currentValue.value) && currentValue.value.length === 0) || (typeof currentValue.value === 'object' && Object.keys(currentValue.value).length === 0));
+const error = computed(
+ () =>
+ currentValue.value === undefined ||
+ currentValue.value === null ||
+ currentValue.value === '' ||
+ (Array.isArray(currentValue.value) && currentValue.value.length === 0) ||
+ (typeof currentValue.value === 'object' && Object.keys(currentValue.value).length === 0)
+);
const updateValue = (value: any) => {
currentValue.value = value;
};
@@ -53,7 +63,6 @@ watch(currentValue, () => {
const addValue = (searchQuery: any) => {
currentValue.value.push(searchQuery);
};
-
</script>
<template>
@@ -73,23 +82,49 @@ const addValue = (searchQuery: any) => {
<input v-else-if="props.type === 'number'" type="number" v-model="currentValue" />
<!-- Data type 'boolean' -->
- <TrueFalseSwitch v-else-if="props.type === 'boolean'" :value="!!currentValue" @update="updateValue" />
+ <TrueFalseSwitch
+ v-else-if="props.type === 'boolean'"
+ :value="!!currentValue"
+ @update="updateValue"
+ />
<!-- Data type 'material-list' -->
- <multiselect v-else-if="props.type === 'material-list'" v-model="currentValue" class="configuration-multiselect"
- :options="materials" :multiple="true" :taggable="true" :searchable="true" placeholder="Enter material name" />
+ <multiselect
+ v-else-if="props.type === 'material-list'"
+ v-model="currentValue"
+ class="configuration-multiselect"
+ :options="materials"
+ :multiple="true"
+ :taggable="true"
+ :searchable="true"
+ placeholder="Enter material name"
+ />
<!-- Data type 'string-list' -->
- <multiselect v-else-if="props.type === 'string-list'" v-model="currentValue" class="configuration-multiselect"
- :options="[]" @tag="addValue" :multiple="true" :taggable="true" :searchable="true"
- placeholder="Enter string" />
+ <multiselect
+ v-else-if="props.type === 'string-list'"
+ v-model="currentValue"
+ class="configuration-multiselect"
+ :options="[]"
+ @tag="addValue"
+ :multiple="true"
+ :taggable="true"
+ :searchable="true"
+ placeholder="Enter string"
+ />
<!-- Data type 'itemstack' -->
- <ItemStackPicker v-else-if="props.type === 'itemstack'" :value="currentValue" @update="updateValue" />
+ <ItemStackPicker
+ v-else-if="props.type === 'itemstack'"
+ :value="currentValue"
+ @update="updateValue"
+ />
<div v-if="showDescription || error" id="task-configuration-row-info">
<p v-if="error" class="error">A value is required.</p>
- <p>{{ description }} <i>{{ note }}</i></p>
+ <p>
+ {{ description }} <i>{{ note }}</i>
+ </p>
</div>
</div>
</div>
@@ -182,4 +217,4 @@ input {
.error {
color: var(--color-false);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/task/modal/EditorTaskModalChange.vue b/components/editor/task/modal/EditorTaskModalChange.vue
index 8ab5dbc..a6b05b8 100644
--- a/components/editor/task/modal/EditorTaskModalChange.vue
+++ b/components/editor/task/modal/EditorTaskModalChange.vue
@@ -18,7 +18,9 @@ const knownTaskTypes = computed(() => session.getKnownTaskTypes());
const newType = ref('');
const unknownTaskType = computed(() => !knownTaskTypes.value.includes(newType.value));
const noChange = computed(() => newType.value === props.currentTaskType);
-const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(newType.value)?.description);
+const newTypeDescription = computed(
+ () => session.getTaskDefinitionByTaskType(newType.value)?.description
+);
</script>
<template>
@@ -31,16 +33,26 @@ const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(ne
<div id="body">
<div class="option-group">
<label for="new-type">New type</label>
- <multiselect id="new-type" v-model="newType" :options="knownTaskTypes" :searchable="true"
- placeholder="Select a new type"></multiselect>
+ <multiselect
+ id="new-type"
+ v-model="newType"
+ :options="knownTaskTypes"
+ :searchable="true"
+ placeholder="Select a new type"
+ ></multiselect>
</div>
<p v-if="unknownTaskType" class="error-text">Invalid task type.</p>
<p v-if="newTypeDescription">{{ newTypeDescription }}</p>
<p>Any configured options for this task will be overwritten.</p>
<div id="confirm" class="control-group">
<Button :icon="['fas', 'times']" :label="'Cancel'" @click="model = false"></Button>
- <Button type="solid" :icon="['fas', 'check']" :label="'Change'" :disabled="unknownTaskType || noChange"
- @click="emit('update', newType)"></Button>
+ <Button
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Change'"
+ :disabled="unknownTaskType || noChange"
+ @click="emit('update', newType)"
+ ></Button>
</div>
</div>
</template>
@@ -58,4 +70,4 @@ const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(ne
flex-direction: column;
gap: 0.5rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/editor/task/modal/EditorTaskModalCreate.vue b/components/editor/task/modal/EditorTaskModalCreate.vue
index e5b2d7a..cdd955f 100644
--- a/components/editor/task/modal/EditorTaskModalCreate.vue
+++ b/components/editor/task/modal/EditorTaskModalCreate.vue
@@ -24,7 +24,9 @@ const unknownTaskType = computed(() => !knownTaskTypes.value.includes(newType.va
const invalidTaskId = computed(() => !validateTaskId(newId.value));
const duplicateTaskId = computed(() => knownTasks.value[newId.value] !== undefined);
-const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(newType.value)?.description);
+const newTypeDescription = computed(
+ () => session.getTaskDefinitionByTaskType(newType.value)?.description
+);
</script>
<template>
@@ -43,19 +45,26 @@ const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(ne
</div>
<div class="option-group">
<label for="new-type">Task type</label>
- <multiselect id="new-type" v-model="newType" :options="knownTaskTypes" :searchable="true"
- placeholder="Select a new type"></multiselect>
+ <multiselect
+ id="new-type"
+ v-model="newType"
+ :options="knownTaskTypes"
+ :searchable="true"
+ placeholder="Select a new type"
+ ></multiselect>
<p v-if="unknownTaskType" class="error-text">Invalid task type.</p>
</div>
<p v-if="newTypeDescription">{{ newTypeDescription }}</p>
<p>A task ID must be unique, alphanumeric, and not contain any spaces.</p>
<div id="confirm" class="control-group">
<Button :icon="['fas', 'times']" :label="'Cancel'" @click="model = false"></Button>
- <Button type="solid" :icon="['fas', 'check']" :label="'Confirm'"
+ <Button
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Confirm'"
:disabled="unknownTaskType || invalidTaskId || duplicateTaskId"
- @click="emit('add', newId, newType)"></Button>
-
-
+ @click="emit('add', newId, newType)"
+ ></Button>
</div>
</div>
</template>
@@ -73,4 +82,4 @@ const newTypeDescription = computed(() => session.getTaskDefinitionByTaskType(ne
flex-direction: column;
gap: 0.5rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/export/ExportButton.vue b/components/export/ExportButton.vue
index 51c4b0a..a3274c1 100644
--- a/components/export/ExportButton.vue
+++ b/components/export/ExportButton.vue
@@ -5,11 +5,16 @@ const exportModal = ref<InstanceType<typeof ExportModal> | null>(null);
const openExportModal = async () => {
exportModal.value?.open();
-}
+};
</script>
<template>
- <Button type="solid" :icon="['fas', 'file-export']" label="Save / Export" @click="openExportModal" />
+ <Button
+ type="solid"
+ :icon="['fas', 'file-export']"
+ label="Save / Export"
+ @click="openExportModal"
+ />
<ExportModal ref="exportModal" />
-</template> \ No newline at end of file
+</template>
diff --git a/components/export/ExportModal.vue b/components/export/ExportModal.vue
index 1d09914..7adb603 100644
--- a/components/export/ExportModal.vue
+++ b/components/export/ExportModal.vue
@@ -5,14 +5,14 @@ const showModal = ref(false);
const open = () => {
showModal.value = true;
-}
+};
const { canUseFsApi } = getBrowserCapabilities();
const isUsingFsMode = computed(() => session.getSessionType() === 'filesystem');
defineExpose({
- open
-})
+ open,
+});
</script>
<template>
@@ -58,7 +58,9 @@ defineExpose({
<div id="description">
<p id="subtitle">Send to Server</p>
- <p>Upload your quest configuration to the server, which can be downloaded and automatically applied in-game.
+ <p>
+ Upload your quest configuration to the server, which can be downloaded and
+ automatically applied in-game.
</p>
<p class="error">
<font-awesome-icon :icon="['fas', 'xmark']" />
@@ -178,4 +180,4 @@ hr {
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/export/ExportZipButton.vue b/components/export/ExportZipButton.vue
index 8fb6f60..65ab083 100644
--- a/components/export/ExportZipButton.vue
+++ b/components/export/ExportZipButton.vue
@@ -6,7 +6,7 @@ const exportZipModal = ref<InstanceType<typeof ExportZipModal> | null>(null);
const startZipExport = async () => {
exportZipModal.value?.open();
exportZipModal.value?.startExport();
-}
+};
</script>
<template>
@@ -15,4 +15,4 @@ const startZipExport = async () => {
<ExportZipModal ref="exportZipModal" />
</ClientOnly>
-</template> \ No newline at end of file
+</template>
diff --git a/components/export/ExportZipModal.vue b/components/export/ExportZipModal.vue
index b84690d..d7d7ab2 100644
--- a/components/export/ExportZipModal.vue
+++ b/components/export/ExportZipModal.vue
@@ -15,7 +15,11 @@ const startExport = async () => {
exportStore.setZipStatus('preparing');
- const { transformedQuests, transformedCategories, transformedItems } = await prepareZip(quests, categories, items);
+ const { transformedQuests, transformedCategories, transformedItems } = await prepareZip(
+ quests,
+ categories,
+ items
+ );
exportStore.setZipStatus('compressing');
@@ -25,20 +29,20 @@ const startExport = async () => {
exportStore.setZipContents(blob);
exportStore.setZipStatus('ready');
- saveAs(blob, "quests.zip");
+ saveAs(blob, 'quests.zip');
} catch {
exportStore.setZipStatus('failed');
}
-}
+};
const open = () => {
showModal.value = true;
-}
+};
defineExpose({
open,
- startExport
-})
+ startExport,
+});
</script>
<template>
@@ -64,4 +68,4 @@ defineExpose({
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/footer/SiteFooter.vue b/components/footer/SiteFooter.vue
index 2f31e4f..632131f 100644
--- a/components/footer/SiteFooter.vue
+++ b/components/footer/SiteFooter.vue
@@ -5,19 +5,17 @@ const runtimeConfig = useRuntimeConfig();
<template>
<footer id="footer">
- <p id="copyright-license">
- Released under the GPL-3.0 License.
- </p>
+ <p id="copyright-license">Released under the GPL-3.0 License.</p>
<p id="git-commit-hash">
<font-awesome-icon :icon="['fas', 'code-branch']" />
<NuxtLink to="https://github.com/LMBishop/quests-web-editor/">quests-web-editor</NuxtLink>
<span>@</span>
- <NuxtLink :to="`https://github.com/LMBishop/quests-web-editor/commit/${runtimeConfig.public.gitCommitHash}`">
+ <NuxtLink
+ :to="`https://github.com/LMBishop/quests-web-editor/commit/${runtimeConfig.public.gitCommitHash}`"
+ >
{{ runtimeConfig.public.gitCommitHashShort }}
</NuxtLink>
- <span>
- ({{ runtimeConfig.public.gitBranch }})
- </span>
+ <span> ({{ runtimeConfig.public.gitBranch }}) </span>
</p>
</footer>
</template>
@@ -49,4 +47,4 @@ const runtimeConfig = useRuntimeConfig();
text-decoration: none;
}
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/header/PageHeader.vue b/components/header/PageHeader.vue
index 3c616ca..7e024c6 100644
--- a/components/header/PageHeader.vue
+++ b/components/header/PageHeader.vue
@@ -53,4 +53,4 @@
font-size: 1.2rem;
color: var(--color-text-mute);
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/header/SiteHeader.vue b/components/header/SiteHeader.vue
index 22ee209..c1b2aa9 100644
--- a/components/header/SiteHeader.vue
+++ b/components/header/SiteHeader.vue
@@ -3,7 +3,7 @@ const session = useSessionStore();
const navigateHome = () => {
navigateTo('/');
-}
+};
const sessionType = computed(() => session.getSessionType());
</script>
@@ -53,7 +53,6 @@ const sessionType = computed(() => session.getSessionType());
font-size: 0.8rem;
color: var(--color-header-text-mute);
}
-
}
#logo {
@@ -82,4 +81,4 @@ header {
display: flex;
justify-content: space-between;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/loader/LoaderDiscardSessionModal.vue b/components/loader/LoaderDiscardSessionModal.vue
index 845b10a..6f5ed02 100644
--- a/components/loader/LoaderDiscardSessionModal.vue
+++ b/components/loader/LoaderDiscardSessionModal.vue
@@ -5,7 +5,7 @@ const showModal = ref(false);
const open = () => {
showModal.value = true;
-}
+};
const confirm = () => {
session.setQuests([]);
@@ -16,11 +16,11 @@ const confirm = () => {
navigateToEditorPane(null);
showModal.value = false;
-}
+};
defineExpose({
- open
-})
+ open,
+});
</script>
<template>
@@ -29,12 +29,20 @@ defineExpose({
<h2>Discard current session</h2>
</template>
- <p>You are about to discard your current session. All changes will be lost.
- Do you want to continue?</p>
+ <p>
+ You are about to discard your current session. All changes will be lost. Do you want to
+ continue?
+ </p>
<div id="controls" class="control-group">
<Button :icon="['fas', 'xmark']" :label="'Cancel'" @click="showModal = false"></Button>
- <Button type="solid" accent="danger" :icon="['fas', 'trash']" :label="'Confirm'" @click="confirm"></Button>
+ <Button
+ type="solid"
+ accent="danger"
+ :icon="['fas', 'trash']"
+ :label="'Confirm'"
+ @click="confirm"
+ ></Button>
</div>
</Modal>
</template>
@@ -45,4 +53,4 @@ defineExpose({
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/loader/LoaderFileSystemButton.vue b/components/loader/LoaderFileSystemButton.vue
index 3a70860..58c470c 100644
--- a/components/loader/LoaderFileSystemButton.vue
+++ b/components/loader/LoaderFileSystemButton.vue
@@ -27,14 +27,19 @@ const openFileSystemPrompt = async () => {
console.error(e);
loaderStore.setFileSystemLoaderStatus('invalid');
}
-}
+};
</script>
<template>
<ClientOnly>
- <Button type="solid" :icon="['fas', 'folder-open']" label="Load" @click="openFileSystemPrompt"
- :disabled="!canUseFsApi" />
+ <Button
+ type="solid"
+ :icon="['fas', 'folder-open']"
+ label="Load"
+ @click="openFileSystemPrompt"
+ :disabled="!canUseFsApi"
+ />
<LoaderFileSystemModal ref="fileSystemModal" />
</ClientOnly>
-</template> \ No newline at end of file
+</template>
diff --git a/components/loader/LoaderFileSystemModal.vue b/components/loader/LoaderFileSystemModal.vue
index 25fcfa2..a3f133b 100644
--- a/components/loader/LoaderFileSystemModal.vue
+++ b/components/loader/LoaderFileSystemModal.vue
@@ -6,7 +6,7 @@ const showModal = ref(false);
const open = () => {
showModal.value = true;
-}
+};
const confirm = () => {
const categories = loader.getCategories();
@@ -21,7 +21,7 @@ const confirm = () => {
navigateToEditorPane(null);
showModal.value = false;
-}
+};
const status = computed(() => loader.getFileSystemLoaderStatus());
const questsCount = computed(() => loader.getQuests().length);
@@ -30,8 +30,8 @@ const itemsCount = computed(() => loader.getItems().length);
const path = computed(() => loader.getPath());
defineExpose({
- open
-})
+ open,
+});
</script>
<template>
@@ -50,7 +50,10 @@ defineExpose({
</div>
<div v-if="status === 'loaded'">
- <p>Parsing files in directory <code>{{ path }}</code>...</p>
+ <p>
+ Parsing files in directory <code>{{ path }}</code
+ >...
+ </p>
</div>
<div v-if="status === 'invalid'">
@@ -58,7 +61,10 @@ defineExpose({
</div>
<div v-if="status === 'valid'">
- <p>Successfully parsed directory <code>{{ path }}</code>.</p>
+ <p>
+ Successfully parsed directory <code>{{ path }}</code
+ >.
+ </p>
<ul>
<li>{{ categoriesCount }} categories loaded</li>
<li>{{ questsCount }} quests loaded</li>
@@ -69,8 +75,13 @@ defineExpose({
<div id="controls" class="control-group">
<Button :icon="['fas', 'xmark']" :label="'Cancel'" @click="showModal = false"></Button>
- <Button v-if="status === 'valid'" type="solid" :icon="['fas', 'check']" :label="'Confirm'"
- @click="confirm"></Button>
+ <Button
+ v-if="status === 'valid'"
+ type="solid"
+ :icon="['fas', 'check']"
+ :label="'Confirm'"
+ @click="confirm"
+ ></Button>
</div>
</Modal>
</template>
@@ -81,4 +92,4 @@ defineExpose({
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>
diff --git a/components/loader/LoaderImportButton.vue b/components/loader/LoaderImportButton.vue
index ff6d0ad..d0c4107 100644
--- a/components/loader/LoaderImportButton.vue
+++ b/components/loader/LoaderImportButton.vue
@@ -1,14 +1,18 @@
<script setup lang="ts">
defineProps({
- isPrimaryAction: Boolean
-})
+ isPrimaryAction: Boolean,
+});
const navigateToImport = async () => {
navigateTo('/import');
-}
+};
</script>
<template>
- <Button :type="isPrimaryAction ? 'solid' : 'text'" :icon="['fas', 'file-import']" label="Import"
- @click="navigateToImport" />
-</template> \ No newline at end of file
+ <Button
+ :type="isPrimaryAction ? 'solid' : 'text'"
+ :icon="['fas', 'file-import']"
+ label="Import"
+ @click="navigateToImport"
+ />
+</template>
diff --git a/components/loader/LoaderNetworkButton.vue b/components/loader/LoaderNetworkButton.vue
index 3364597..8cce5dc 100644
--- a/components/loader/LoaderNetworkButton.vue
+++ b/components/loader/LoaderNetworkButton.vue
@@ -1,8 +1,7 @@
-<script setup lang="ts">
-</script>
+<script setup lang="ts"></script>
<template>
<ClientOnly>
<Button type="solid" :icon="['fas', 'download']" label="Download" :disabled="true" />
</ClientOnly>
-</template> \ No newline at end of file
+</template>
diff --git a/components/loader/LoaderTestDataButton.vue b/components/loader/LoaderTestDataButton.vue
index 1e648d6..8ef8b3c 100644
--- a/components/loader/LoaderTestDataButton.vue
+++ b/components/loader/LoaderTestDataButton.vue
@@ -5,7 +5,7 @@ const testDataModal = ref<InstanceType<typeof LoaderTestDataModal> | null>(null)
const openTestDataModal = async () => {
testDataModal.value?.open();
-}
+};
</script>
<template>
@@ -14,4 +14,4 @@ const openTestDataModal = async () => {
<LoaderTestDataModal ref="testDataModal" />
</ClientOnly>
-</template> \ No newline at end of file
+</template>
diff --git a/components/loader/LoaderTestDataModal.vue b/components/loader/LoaderTestDataModal.vue
index 8b0df21..582e224 100644
--- a/components/loader/LoaderTestDataModal.vue
+++ b/components/loader/LoaderTestDataModal.vue
@@ -8,7 +8,7 @@ const showModal = ref(false);
const open = () => {
showModal.value = true;
-}
+};
const confirm = () => {
const quests = loadQuestsFromJson(testData.quests);
@@ -23,11 +23,11 @@ const confirm = () => {
navigateToEditorPane(null);
showModal.value = false;
-}
+};
defineExpose({
- open
-})
+ open,
+});
</script>
<template>
@@ -36,8 +36,10 @@ defineExpose({
<h2>Import test data</h2>
</template>
- <p>You can view a demo of the Quests editor by loading test data. This will replace your current workspace.
- Do you want to continue?</p>
+ <p>
+ You can view a demo of the Quests editor by loading test data. This will replace your current
+ workspace. Do you want to continue?
+ </p>
<div id="controls" class="control-group">
<Button :icon="['fas', 'xmark']" :label="'Cancel'" @click="showModal = false"></Button>
@@ -52,4 +54,4 @@ defineExpose({
justify-content: flex-end;
margin-top: 1rem;
}
-</style> \ No newline at end of file
+</style>