rule book dup/delete
This commit is contained in:
+21
-3
@@ -58,6 +58,24 @@ paths:
|
|||||||
$ref: "#/components/schemas/RuleBookResponse"
|
$ref: "#/components/schemas/RuleBookResponse"
|
||||||
"400":
|
"400":
|
||||||
description: Invalid request (e.g. blank name)
|
description: Invalid request (e.g. blank name)
|
||||||
|
delete:
|
||||||
|
tags:
|
||||||
|
- rule-book
|
||||||
|
summary: Delete a rule book
|
||||||
|
operationId: deleteRuleBook
|
||||||
|
parameters:
|
||||||
|
- name: ruleBookId
|
||||||
|
in: path
|
||||||
|
description: Id of the rule book
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
format: uuid
|
||||||
|
responses:
|
||||||
|
"204":
|
||||||
|
description: The rule book was deleted
|
||||||
|
"400":
|
||||||
|
description: The rule book is associated to a character
|
||||||
/ledgers/main/{ledgerId}:
|
/ledgers/main/{ledgerId}:
|
||||||
put:
|
put:
|
||||||
tags:
|
tags:
|
||||||
@@ -439,7 +457,7 @@ components:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
pattern: "[a-z]+(-[a-z]+)*"
|
pattern: "[a-z][a-zA-Z0-9]*"
|
||||||
script:
|
script:
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
@@ -461,7 +479,7 @@ components:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
pattern: "[a-z]+(-[a-z]+)*"
|
pattern: "[a-z][a-zA-Z0-9]*"
|
||||||
script:
|
script:
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
@@ -571,7 +589,7 @@ components:
|
|||||||
type: array
|
type: array
|
||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
pattern: "[a-z]+(-[a-z]+)*"
|
pattern: "[a-z][a-zA-Z0-9]*"
|
||||||
script:
|
script:
|
||||||
type: string
|
type: string
|
||||||
required:
|
required:
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import {computed} from 'vue';
|
import {computed} from 'vue';
|
||||||
import {RouterView, useRoute} from 'vue-router';
|
import {RouterView, useRoute} from 'vue-router';
|
||||||
import {Sidebar} from './sidebar';
|
import {Sidebar} from './sidebar';
|
||||||
|
import {ConfirmModal} from '@/confirm';
|
||||||
import {routeNames} from '@/routes';
|
import {routeNames} from '@/routes';
|
||||||
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
@@ -21,6 +22,7 @@ const hideSidebar = computed(() => {
|
|||||||
<RouterView />
|
<RouterView />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
<ConfirmModal />
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import {computed} from "vue";
|
||||||
|
import {storeToRefs} from "pinia";
|
||||||
|
import {Modal} from "@/components";
|
||||||
|
import {useConfirmStore} from "./useConfirm";
|
||||||
|
|
||||||
|
const confirmStore = useConfirmStore();
|
||||||
|
const {open, options} = storeToRefs(confirmStore);
|
||||||
|
const {accept, cancel} = confirmStore;
|
||||||
|
|
||||||
|
const modalOpen = computed({
|
||||||
|
get: () => open.value,
|
||||||
|
set: value => {
|
||||||
|
if (!value) {
|
||||||
|
cancel();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Modal v-model:open="modalOpen">
|
||||||
|
<div class="bg-slate-800 rounded pb-4 w-96">
|
||||||
|
<span class="m-2">{{ options.title ?? "Confirm" }}</span>
|
||||||
|
<hr />
|
||||||
|
<div class="m-4">{{ options.message }}</div>
|
||||||
|
<div class="flex justify-end">
|
||||||
|
<button class="me-2" @click="cancel">{{ options.cancelLabel ?? "Cancel" }}</button>
|
||||||
|
<button class="confirm me-4" :class="options.danger ? 'danger' : ''" @click="accept">{{ options.confirmLabel ?? "Confirm" }}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
@reference "@/style.css";
|
||||||
|
|
||||||
|
button.confirm {
|
||||||
|
@apply border-emerald-500 bg-emerald-500 hover:bg-emerald-600;
|
||||||
|
|
||||||
|
&.danger {
|
||||||
|
@apply border-amber-900 bg-amber-900 hover:bg-amber-800;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export { default as ConfirmModal } from './ConfirmModal.vue';
|
||||||
|
export { confirm, useConfirmStore } from './useConfirm';
|
||||||
|
export type { ConfirmOptions } from './useConfirm';
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
import {defineStore} from "pinia";
|
||||||
|
import {ref} from "vue";
|
||||||
|
|
||||||
|
export interface ConfirmOptions {
|
||||||
|
title?: string;
|
||||||
|
message: string;
|
||||||
|
confirmLabel?: string;
|
||||||
|
cancelLabel?: string;
|
||||||
|
danger?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useConfirmStore = defineStore('confirm', () => {
|
||||||
|
const open = ref(false);
|
||||||
|
const options = ref<ConfirmOptions>({message: ""});
|
||||||
|
let resolver: ((value: boolean) => void) | undefined;
|
||||||
|
|
||||||
|
const settle = (value: boolean) => {
|
||||||
|
open.value = false;
|
||||||
|
resolver?.(value);
|
||||||
|
resolver = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
const confirm = (opts: ConfirmOptions | string): Promise<boolean> => {
|
||||||
|
options.value = typeof opts === "string" ? {message: opts} : opts;
|
||||||
|
open.value = true;
|
||||||
|
return new Promise<boolean>(resolve => {
|
||||||
|
resolver = resolve;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const accept = () => settle(true);
|
||||||
|
const cancel = () => settle(false);
|
||||||
|
|
||||||
|
return {open, options, confirm, accept, cancel};
|
||||||
|
});
|
||||||
|
|
||||||
|
export const confirm = (opts: ConfirmOptions | string): Promise<boolean> => useConfirmStore().confirm(opts);
|
||||||
@@ -1313,6 +1313,39 @@ export const RuleBookApiAxiosParamCreator = function (configuration?: Configurat
|
|||||||
options: localVarRequestOptions,
|
options: localVarRequestOptions,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @summary Delete a rule book
|
||||||
|
* @param {string} ruleBookId Id of the rule book
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
deleteRuleBook: async (ruleBookId: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
|
||||||
|
// verify required parameter 'ruleBookId' is not null or undefined
|
||||||
|
assertParamExists('deleteRuleBook', 'ruleBookId', ruleBookId)
|
||||||
|
const localVarPath = `/rule-books/{ruleBookId}`
|
||||||
|
.replace('{ruleBookId}', encodeURIComponent(String(ruleBookId)));
|
||||||
|
// use dummy base URL string because the URL constructor only accepts absolute URLs.
|
||||||
|
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
|
||||||
|
let baseOptions;
|
||||||
|
if (configuration) {
|
||||||
|
baseOptions = configuration.baseOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
const localVarRequestOptions = { method: 'DELETE', ...baseOptions, ...options};
|
||||||
|
const localVarHeaderParameter = {} as any;
|
||||||
|
const localVarQueryParameter = {} as any;
|
||||||
|
|
||||||
|
|
||||||
|
setSearchParams(localVarUrlObj, localVarQueryParameter);
|
||||||
|
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
|
||||||
|
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
|
||||||
|
|
||||||
|
return {
|
||||||
|
url: toPathString(localVarUrlObj),
|
||||||
|
options: localVarRequestOptions,
|
||||||
|
};
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary Find all rule books
|
* @summary Find all rule books
|
||||||
@@ -1468,6 +1501,19 @@ export const RuleBookApiFp = function(configuration?: Configuration) {
|
|||||||
const localVarOperationServerBasePath = operationServerMap['RuleBookApi.createRuleBook']?.[localVarOperationServerIndex]?.url;
|
const localVarOperationServerBasePath = operationServerMap['RuleBookApi.createRuleBook']?.[localVarOperationServerIndex]?.url;
|
||||||
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @summary Delete a rule book
|
||||||
|
* @param {string} ruleBookId Id of the rule book
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
async deleteRuleBook(ruleBookId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<void>> {
|
||||||
|
const localVarAxiosArgs = await localVarAxiosParamCreator.deleteRuleBook(ruleBookId, options);
|
||||||
|
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
|
||||||
|
const localVarOperationServerBasePath = operationServerMap['RuleBookApi.deleteRuleBook']?.[localVarOperationServerIndex]?.url;
|
||||||
|
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary Find all rule books
|
* @summary Find all rule books
|
||||||
@@ -1538,6 +1584,16 @@ export const RuleBookApiFactory = function (configuration?: Configuration, baseP
|
|||||||
createRuleBook(createRuleBookRequest: CreateRuleBookRequest, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> {
|
createRuleBook(createRuleBookRequest: CreateRuleBookRequest, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> {
|
||||||
return localVarFp.createRuleBook(createRuleBookRequest, options).then((request) => request(axios, basePath));
|
return localVarFp.createRuleBook(createRuleBookRequest, options).then((request) => request(axios, basePath));
|
||||||
},
|
},
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @summary Delete a rule book
|
||||||
|
* @param {string} ruleBookId Id of the rule book
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
deleteRuleBook(ruleBookId: string, options?: RawAxiosRequestConfig): AxiosPromise<void> {
|
||||||
|
return localVarFp.deleteRuleBook(ruleBookId, options).then((request) => request(axios, basePath));
|
||||||
|
},
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary Find all rule books
|
* @summary Find all rule books
|
||||||
@@ -1595,6 +1651,17 @@ export class RuleBookApi extends BaseAPI {
|
|||||||
return RuleBookApiFp(this.configuration).createRuleBook(createRuleBookRequest, options).then((request) => request(this.axios, this.basePath));
|
return RuleBookApiFp(this.configuration).createRuleBook(createRuleBookRequest, options).then((request) => request(this.axios, this.basePath));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @summary Delete a rule book
|
||||||
|
* @param {string} ruleBookId Id of the rule book
|
||||||
|
* @param {*} [options] Override http request option.
|
||||||
|
* @throws {RequiredError}
|
||||||
|
*/
|
||||||
|
public deleteRuleBook(ruleBookId: string, options?: RawAxiosRequestConfig) {
|
||||||
|
return RuleBookApiFp(this.configuration).deleteRuleBook(ruleBookId, options).then((request) => request(this.axios, this.basePath));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @summary Find all rule books
|
* @summary Find all rule books
|
||||||
|
|||||||
@@ -1,10 +1,24 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import {storeToRefs} from "pinia";
|
import {storeToRefs} from "pinia";
|
||||||
import {PencilSquareIcon, TrashIcon} from "@heroicons/vue/24/outline";
|
import {DocumentDuplicateIcon, PencilSquareIcon, TrashIcon} from "@heroicons/vue/24/outline";
|
||||||
import {useRuleBooksStore} from "@/rules";
|
import {confirm} from "@/confirm";
|
||||||
|
import {RuleBook, useRuleBooksStore} from "@/rules";
|
||||||
import {routeNames} from "@/routes";
|
import {routeNames} from "@/routes";
|
||||||
|
|
||||||
const {ruleBooks} = storeToRefs(useRuleBooksStore());
|
const ruleBooksStore = useRuleBooksStore();
|
||||||
|
const {ruleBooks} = storeToRefs(ruleBooksStore);
|
||||||
|
|
||||||
|
const duplicate = async (ruleBook: RuleBook) => {
|
||||||
|
if (await confirm({title: "Duplicate Rule Book", message: `Duplicate ${ruleBook.name}?`, confirmLabel: "Duplicate"})) {
|
||||||
|
await ruleBooksStore.duplicate(ruleBook);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const remove = async (ruleBook: RuleBook) => {
|
||||||
|
if (await confirm({title: "Delete Rule Book", message: `Delete ${ruleBook.name}?`, confirmLabel: "Delete", danger: true})) {
|
||||||
|
await ruleBooksStore.remove(ruleBook.ruleBookId);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -16,7 +30,8 @@ const {ruleBooks} = storeToRefs(useRuleBooksStore());
|
|||||||
<div v-for="ruleBook in ruleBooks" :key="ruleBook.ruleBookId" class="flex items-center mt-2">
|
<div v-for="ruleBook in ruleBooks" :key="ruleBook.ruleBookId" class="flex items-center mt-2">
|
||||||
<span class="flex grow me-2">{{ruleBook.name}}</span>
|
<span class="flex grow me-2">{{ruleBook.name}}</span>
|
||||||
<RouterLink class="btn-icon me-1" :to="{ name: routeNames.editRuleBook, params: { ruleBookId: ruleBook.ruleBookId } }"><PencilSquareIcon /></RouterLink>
|
<RouterLink class="btn-icon me-1" :to="{ name: routeNames.editRuleBook, params: { ruleBookId: ruleBook.ruleBookId } }"><PencilSquareIcon /></RouterLink>
|
||||||
<button class="btn-icon"><TrashIcon /></button>
|
<button class="btn-icon me-1" @click="duplicate(ruleBook)"><DocumentDuplicateIcon /></button>
|
||||||
|
<button class="btn-icon text-amber-700 hover:text-amber-600" @click="remove(ruleBook)"><TrashIcon /></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
+11
-1
@@ -32,12 +32,22 @@ export const useRuleBooksStore = defineStore('rule-books', () => {
|
|||||||
const findById = (ruleBookId: string): RuleBook | undefined => ruleBooks.value.find(rb => rb.ruleBookId === ruleBookId);
|
const findById = (ruleBookId: string): RuleBook | undefined => ruleBooks.value.find(rb => rb.ruleBookId === ruleBookId);
|
||||||
const create = (ruleBook: CreateRuleBookRequest) => ruleBookApi.createRuleBook(ruleBook).then(response => addRuleBook(response.data));
|
const create = (ruleBook: CreateRuleBookRequest) => ruleBookApi.createRuleBook(ruleBook).then(response => addRuleBook(response.data));
|
||||||
const update = (ruleBookId: string, ruleBook: CreateRuleBookRequest) => ruleBookApi.updateRuleBook(ruleBookId, ruleBook).then(response => replaceRuleBook(response.data));
|
const update = (ruleBookId: string, ruleBook: CreateRuleBookRequest) => ruleBookApi.updateRuleBook(ruleBookId, ruleBook).then(response => replaceRuleBook(response.data));
|
||||||
|
const duplicate = (ruleBook: RuleBook) => create({
|
||||||
|
name: `${ruleBook.name} (copy)`,
|
||||||
|
usedForAcquisitions: ruleBook.usedForAcquisitions,
|
||||||
|
ledgerRefs: [...ruleBook.ledgerRefs],
|
||||||
|
script: ruleBook.script,
|
||||||
|
});
|
||||||
|
|
||||||
|
const remove = (ruleBookId: string) => ruleBookApi.deleteRuleBook(ruleBookId).then(() => {
|
||||||
|
ruleBooks.value = ruleBooks.value.filter(rb => rb.ruleBookId !== ruleBookId);
|
||||||
|
});
|
||||||
|
|
||||||
const refresh = () => ruleBookApi.findAllRuleBooks().then(response => ruleBooks.value = response.data);
|
const refresh = () => ruleBookApi.findAllRuleBooks().then(response => ruleBooks.value = response.data);
|
||||||
|
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
return {ruleBooks, findById, create, update, refresh};
|
return {ruleBooks, findById, create, update, duplicate, remove, refresh};
|
||||||
})
|
})
|
||||||
|
|
||||||
export const findCharacterRuleBookByCharacterId = (characterId: number): Promise<CharacterRuleBookResponse> => characterRuleBookApi.findCharacterRuleBookByCharacterId(characterId)
|
export const findCharacterRuleBookByCharacterId = (characterId: number): Promise<CharacterRuleBookResponse> => characterRuleBookApi.findCharacterRuleBookByCharacterId(characterId)
|
||||||
|
|||||||
Reference in New Issue
Block a user