fchat-rising/site/character_page/duplicate_dialog.vue

79 lines
3.1 KiB
Vue

<template>
<modal id="duplicateDialog" :action="'Duplicate character' + name" :disabled="duplicating || checking" @submit.prevent="duplicate()">
<p>This will duplicate the character, kinks, infotags, customs, subkinks and images. Guestbook
entries, friends, groups, and bookmarks are not duplicated.</p>
<div class="form-row mb-2">
<form-group-inputgroup class="col-12" :errors="errors" field="name" id="characterName" label="Name">
<input class="form-control" type="text" id="characterName" slot-scope="props" :class="props.cls"/>
<div slot="button" class="input-group-append">
<button type="button" class="btn btn-secondary" @click="checkName" :disabled="newName.length < 2 || checking">
Check Name
</button>
</div>
<div slot="valid" class="valid-feedback">Name valid and unused.</div>
</form-group-inputgroup>
</div>
</modal>
</template>
<script lang="ts">
import {Component, Prop} from '@f-list/vue-ts';
import CustomDialog from '../../components/custom_dialog';
import FormGroupInputgroup from '../../components/form_group_inputgroup.vue';
import Modal from '../../components/Modal.vue';
import * as Utils from '../utils';
import {methods} from './data_store';
import {Character} from './interfaces';
@Component({
components: {'form-group-inputgroup': FormGroupInputgroup, modal: Modal}
})
export default class DuplicateDialog extends CustomDialog {
@Prop({required: true})
readonly character!: Character;
errors: {[key: string]: string} = {};
newName = '';
valid = false;
checking = false;
duplicating = false;
get name(): string {
return this.character.character.name;
}
async checkName(): Promise<boolean> {
try {
this.checking = true;
const result = await methods.characterNameCheck(this.newName);
this.valid = result.valid;
this.errors = {};
return true;
} catch(e) {
this.valid = false;
this.errors = {};
if(Utils.isJSONError(e))
this.errors['name]'] = <string>e.response.data.error;
return false;
} finally {
this.checking = false;
}
}
async duplicate(): Promise<void> {
try {
this.duplicating = true;
const result = await methods.characterDuplicate(this.character.character.id, this.newName);
this.hide();
window.location.assign(result.next);
} catch(e) {
Utils.ajaxError(e, 'Unable to duplicate character');
this.valid = false;
if(Utils.isJSONError(e))
this.errors['name'] = <string>e.response.data.error;
}
this.duplicating = false;
}
}
</script>