Skip to content

Commit

Permalink
Merge pull request #224 from HarmlessKey/feature/clone_encounter
Browse files Browse the repository at this point in the history
Clone Encounters
  • Loading branch information
HarmlessHarm authored Apr 30, 2024
2 parents d74ded9 + 275becb commit f286382
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 17 deletions.
34 changes: 20 additions & 14 deletions src/components/campaign/Players.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,13 @@
<q-tooltip anchor="top middle" self="center middle">Manage Players</q-tooltip>
</button>
<button
v-if="tier.name !== 'Free' && Object.keys(sync_characters).length && Object.values(players).some(item => item.sync_character)"
v-if="
tier.name !== 'Free' &&
sync_characters &&
players &&
Object.keys(sync_characters).length &&
Object.values(players).some((item) => item.sync_character)
"
class="btn btn-sm bg-neutral-5 mr-1"
@click="syncAll"
>
Expand Down Expand Up @@ -337,7 +343,9 @@
<div class="col actions" :key="'actions-' + key" v-if="viewerIsUser">
<template v-if="tier.name !== 'Free' && extensionInstalled">
<button
v-if="players[key].sync_character && (players[key].sync_character in sync_characters)"
v-if="
players[key].sync_character && players[key].sync_character in sync_characters
"
class="btn btn-sm bg-neutral-5 mr-1"
@click="syncCharacter(key, players[key].sync_character)"
>
Expand All @@ -347,19 +355,15 @@
rotate: key in syncing,
green: syncing[key] === 'success',
red: syncing[key] === 'error',
orange: !playerEqualsLinkedCharacter(players[key])
orange: !playerEqualsLinkedCharacter(players[key]),
}"
aria-hidden="true"
/>
<q-tooltip anchor="top middle" self="center middle">
Update with Character Sync
</q-tooltip>
</button>
<button
v-else
class="btn btn-sm bg-neutral-5 mr-1"
@click="linkDialog(key)"
>
<button v-else class="btn btn-sm bg-neutral-5 mr-1" @click="linkDialog(key)">
<i class="fas fa-link" aria-hidden="true" />
<q-tooltip anchor="top middle" self="center middle">
Link Character to Sync with
Expand Down Expand Up @@ -416,7 +420,6 @@
<hk-link-character @link="linkCharacter" />
</q-dialog>


<q-dialog v-if="viewerIsUser && page !== 'user'" v-model="rest_dialog">
<hk-card :min-width="300">
<div slot="header" class="card-header">
Expand Down Expand Up @@ -460,7 +463,7 @@
import { mapGetters, mapActions } from "vuex";
import { experience } from "src/mixins/experience.js";
import { currencyMixin } from "src/mixins/currency.js";
import { extensionInstalled, comparePlayerToCharacter, getCharacterSyncCharacter } from "src/utils/generalFunctions";
import { extensionInstalled, comparePlayerToCharacter } from "src/utils/generalFunctions";
export default {
name: "Players",
Expand All @@ -484,8 +487,8 @@ export default {
},
syncCharacters: {
type: Object,
default: () => {}
}
default: () => {},
},
},
mixins: [experience, currencyMixin],
data() {
Expand Down Expand Up @@ -534,7 +537,7 @@ export default {
sync_characters: this.syncCharacters,
link_character: undefined,
link_dialog: false,
extensionInstalled: undefined
extensionInstalled: undefined,
};
},
computed: {
Expand Down Expand Up @@ -700,7 +703,10 @@ export default {
},
async syncAll() {
for (const [key, player] of Object.entries(this.players)) {
if (player.sync_character && Object.keys(this.sync_characters).includes(player.sync_character)) {
if (
player.sync_character &&
Object.keys(this.sync_characters).includes(player.sync_character)
) {
await this.syncCharacter(key, player.sync_character);
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/combat/TargetItem.vue
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@ export default {
"display_maxHp",
]),
showCondition(key) {
this.setSlide({
this.setDrawer({
show: true,
type: "drawers/encounter/Condition",
data: {
Expand Down
1 change: 1 addition & 0 deletions src/store/modules/userContent/encounters.js
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,7 @@ const encounter_actions = {
delete entity.meters;
delete entity.hidden;
delete entity.reminders;
delete entity.conditions;

if (entity.entityType === "npc") {
entity.curHp = entity.maxHp;
Expand Down
90 changes: 88 additions & 2 deletions src/views/UserContent/Encounters/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,14 @@
<i aria-hidden="true" class="fas fa-pencil-alt"></i>
<q-tooltip anchor="top middle" self="center middle"> Edit </q-tooltip>
</router-link>
<a
class="mr-1 btn btn-sm bg-neutral-5"
v-if="!overencumbered"
@click="dialogCloneEncounter(props.key)"
>
<i aria-hidden="true" class="fas fa-copy"></i>
<q-tooltip anchor="top middle" self="center middle"> Clone </q-tooltip>
</a>
<a
class="btn btn-sm bg-neutral-5"
@click="deleteEncounter($event, props.key, props.row.name)"
Expand All @@ -150,7 +158,7 @@
</a>
</div>
</q-td>
</q-tr>
</q-tr>
</template>
<div slot="no-data" />
</q-table>
Expand Down Expand Up @@ -206,7 +214,10 @@
<i aria-hidden="true" class="fas fa-eye"></i>
<q-tooltip anchor="top middle" self="center middle"> View </q-tooltip>
</router-link>
<a class="btn btn-sm bg-neutral-5 ml-1" @click="reset(props.key, (hard = false))">
<a
class="btn btn-sm bg-neutral-5 ml-1"
@click="reset(props.key, (hard = false))"
>
<i aria-hidden="true" class="fas fa-trash-restore-alt"></i>
<q-tooltip anchor="top middle" self="center middle"> Unfinish </q-tooltip>
</a>
Expand All @@ -218,6 +229,14 @@
<i aria-hidden="true" class="fas fa-undo"></i>
<q-tooltip anchor="top middle" self="center middle"> Reset </q-tooltip>
</a>
<a
class="mr-1 btn btn-sm bg-neutral-5"
v-if="!overencumbered"
@click="dialogCloneEncounter(props.key)"
>
<i aria-hidden="true" class="fas fa-copy"></i>
<q-tooltip anchor="top middle" self="center middle"> Clone </q-tooltip>
</a>
<a
class="btn btn-sm bg-neutral-5"
@click="deleteEncounter($event, props.key, props.row.name)"
Expand Down Expand Up @@ -307,6 +326,39 @@
</q-form>
</div>
</q-dialog>

<!-- Clone encounter dialog -->
<q-dialog
v-if="
clone &&
(encounter_count < tier.benefits.encounters || tier.benefits.encounters == 'infinite')
"
v-model="clone"
square
>
<div>
<q-form @submit="cloneEncounter">
<hk-card header="Clone encounter" class="mb-0">
<div class="card-body">
<q-input
:dark="$store.getters.theme === 'dark'"
filled
square
label="Encounter title"
type="text"
autocomplete="off"
v-model="cloneEncounterData.name"
:rules="[(val) => (val && val.length > 0) || 'Enter a title']"
/>
</div>
<div slot="footer" class="card-footer d-flex justify-content-end">
<q-btn v-close-popup class="mr-1" no-caps type="cancel">Cancel</q-btn>
<q-btn color="primary" type="submit" no-caps label="Add encounter" />
</div>
</hk-card>
</q-form>
</div>
</q-dialog>
</div>
<hk-loader v-else name="encounters" />
</template>
Expand All @@ -326,6 +378,12 @@ export default {
finished_fetched: false,
newEncounter: "",
add: false,
clone: false,
cloneEncounterData: {
name: undefined,
key: undefined,
ogEncounter: undefined,
},
currentPage: 1,
search: undefined,
columns: [
Expand Down Expand Up @@ -395,6 +453,7 @@ export default {
methods: {
...mapActions("encounters", [
"get_campaign_encounters",
"get_encounter",
"add_encounter",
"delete_encounter",
"delete_finished_encounters",
Expand Down Expand Up @@ -464,6 +523,33 @@ export default {
);
}
},
async dialogCloneEncounter(key) {
this.clone = true;
this.cloneEncounterData.key = key;
this.cloneEncounterData.ogEncounter = structuredClone(
await this.get_encounter({
uid: this.user.uid,
campaignId: this.campaignId,
id: key,
})
);
this.cloneEncounterData.name = structuredClone(this.cloneEncounterData.ogEncounter.name);
},
async cloneEncounter() {
const encounter = structuredClone(this.cloneEncounterData.ogEncounter);
encounter.name = this.cloneEncounterData.name;
const new_id = await this.add_encounter({
campaignId: this.campaignId,
encounter,
});
await this.reset_encounter({ campaignId: this.campaignId, id: new_id });
this.clone = false;
this.cloneEncounterData = {
name: undefined,
key: undefined,
ogEncounter: undefined,
};
},
async deleteFinishedEncounters() {
this.$snotify.error(
"Are you sure you want to delete all finished encounters?",
Expand Down

0 comments on commit f286382

Please sign in to comment.