rule book front

This commit is contained in:
Sirttas
2026-05-31 17:00:49 +02:00
parent 676ff961ed
commit ba81d7b6a8
14 changed files with 605 additions and 263 deletions
+176 -104
View File
@@ -6,6 +6,57 @@ servers:
- url: http://localhost:8080 - url: http://localhost:8080
description: Generated server url description: Generated server url
paths: paths:
/rule-books/{ruleBookId}:
get:
tags:
- rule-book-controller
operationId: findRuleBookById
parameters:
- name: ruleBookId
in: path
required: true
schema:
type: string
format: uuid
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
$ref: "#/components/schemas/RuleBookResponse"
put:
tags:
- rule-book-controller
operationId: updateRuleBook
parameters:
- name: ruleBookId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/UpdateRuleBookRequest"
required: true
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
$ref: "#/components/schemas/RuleBookResponse"
/ledgers/main/{ledgerId}: /ledgers/main/{ledgerId}:
put: put:
tags: tags:
@@ -64,6 +115,45 @@ paths:
'*/*': '*/*':
schema: schema:
$ref: "#/components/schemas/CombinedLedgerResponse" $ref: "#/components/schemas/CombinedLedgerResponse"
/rule-books:
get:
tags:
- rule-book-controller
operationId: findAllRuleBooks
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
type: array
items:
$ref: "#/components/schemas/RuleBookResponse"
post:
tags:
- rule-book-controller
operationId: createRuleBook
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/CreateRuleBookRequest"
required: true
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
$ref: "#/components/schemas/RuleBookResponse"
/process-activities: /process-activities:
post: post:
tags: tags:
@@ -120,57 +210,6 @@ paths:
'*/*': '*/*':
schema: schema:
$ref: "#/components/schemas/CombinedLedgerResponse" $ref: "#/components/schemas/CombinedLedgerResponse"
/characters/{characterId}/rule-book:
get:
tags:
- rule-book-controller
operationId: findByCharacterId
parameters:
- name: characterId
in: path
required: true
schema:
type: integer
format: int64
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
$ref: "#/components/schemas/RuleBookResponse"
post:
tags:
- rule-book-controller
operationId: setCharacterRuleBook
parameters:
- name: characterId
in: path
required: true
schema:
type: integer
format: int64
requestBody:
content:
application/json:
schema:
$ref: "#/components/schemas/SetCharacterRuleBookRequest"
required: true
responses:
"404":
description: Not Found
"400":
description: Bad Request
"200":
description: OK
content:
'*/*':
schema:
$ref: "#/components/schemas/RuleBookResponse"
/activity/fetch/{characterId}: /activity/fetch/{characterId}:
post: post:
tags: tags:
@@ -194,7 +233,7 @@ paths:
get: get:
tags: tags:
- ledger-controller - ledger-controller
operationId: findAll operationId: findAllLedgers
responses: responses:
"404": "404":
description: Not Found description: Not Found
@@ -214,7 +253,7 @@ paths:
get: get:
tags: tags:
- ledger-controller - ledger-controller
operationId: findById operationId: findLedgerById
parameters: parameters:
- name: ledgerId - name: ledgerId
in: path in: path
@@ -239,7 +278,7 @@ paths:
get: get:
tags: tags:
- character-controller - character-controller
operationId: getCharacters operationId: findAllCharacters
responses: responses:
"404": "404":
description: Not Found description: Not Found
@@ -255,6 +294,72 @@ paths:
$ref: "#/components/schemas/CharacterResponse" $ref: "#/components/schemas/CharacterResponse"
components: components:
schemas: schemas:
RuleClauseResponse:
type: object
properties:
rate:
type: string
enum:
- NONE
- VALUE
- JITA_BUY
- JITA_SELL
- EVE_ESTIMATE
fromLedgerRef:
type: string
toLedgerRef:
type: string
required:
- fromLedgerRef
- rate
- toLedgerRef
RuleResponse:
type: object
properties:
rules:
type: array
items:
$ref: "#/components/schemas/RuleClauseResponse"
required:
- rules
UpdateRuleBookRequest:
type: object
properties:
name:
type: string
ledgerRefs:
type: array
items:
type: string
rules:
type: object
additionalProperties:
$ref: "#/components/schemas/RuleResponse"
required:
- ledgerRefs
- name
- rules
RuleBookResponse:
type: object
properties:
ruleBookId:
type: string
format: uuid
name:
type: string
ledgerRefs:
type: array
items:
type: string
rules:
type: object
additionalProperties:
$ref: "#/components/schemas/RuleResponse"
required:
- ledgerRefs
- name
- ruleBookId
- rules
UpdateMainLedgerRequest: UpdateMainLedgerRequest:
type: object type: object
properties: properties:
@@ -321,6 +426,23 @@ components:
- ledgerId - ledgerId
- memberLedgerIds - memberLedgerIds
- name - name
CreateRuleBookRequest:
type: object
properties:
name:
type: string
ledgerRefs:
type: array
items:
type: string
rules:
type: object
additionalProperties:
$ref: "#/components/schemas/RuleResponse"
required:
- ledgerRefs
- name
- rules
CreateMainLedgerRequest: CreateMainLedgerRequest:
type: object type: object
properties: properties:
@@ -341,56 +463,6 @@ components:
required: required:
- memberLedgerIds - memberLedgerIds
- name - name
RuleResponse:
type: object
properties:
rate:
type: string
enum:
- NONE
- VALUE
- JITA_BUY
- JITA_SELL
- EVE_ESTIMATE
fromLedgerId:
type: string
format: uuid
toLedgerId:
type: string
format: uuid
required:
- rate
RuleSetResponse:
type: object
properties:
rules:
type: array
items:
$ref: "#/components/schemas/RuleResponse"
required:
- rules
SetCharacterRuleBookRequest:
type: object
properties:
ruleSets:
type: object
additionalProperties:
$ref: "#/components/schemas/RuleSetResponse"
required:
- ruleSets
RuleBookResponse:
type: object
properties:
characterId:
type: integer
format: int64
ruleSets:
type: object
additionalProperties:
$ref: "#/components/schemas/RuleSetResponse"
required:
- characterId
- ruleSets
LedgerResponse: LedgerResponse:
type: object type: object
discriminator: discriminator:
+1 -1
View File
@@ -20,7 +20,7 @@ export const useCharactersStore = defineStore('characters', () => {
const reloadActivities = (characterId: number): Promise<void> => activityControllerApi.fetchNewActivitiesForCharacter(characterId) as Promise<void>; const reloadActivities = (characterId: number): Promise<void> => activityControllerApi.fetchNewActivitiesForCharacter(characterId) as Promise<void>;
const refresh = () => characterControllerApi.getCharacters().then(response => characters.value = response.data); const refresh = () => characterControllerApi.findAllCharacters().then(response => characters.value = response.data);
refresh(); refresh();
+204 -73
View File
@@ -48,10 +48,15 @@ export interface CreateCombinedLedgerRequest {
export interface CreateMainLedgerRequest { export interface CreateMainLedgerRequest {
'name': string; 'name': string;
} }
export interface CreateRuleBookRequest {
'name': string;
'ledgerRefs': Array<string>;
'rules': { [key: string]: RuleResponse; };
}
/** /**
* @type FindAll200ResponseInner * @type FindAllLedgers200ResponseInner
*/ */
export type FindAll200ResponseInner = CombinedLedgerResponse | MainLedgerResponse; export type FindAllLedgers200ResponseInner = CombinedLedgerResponse | MainLedgerResponse;
export interface LedgerResponse { export interface LedgerResponse {
'type'?: LedgerResponseTypeEnum; 'type'?: LedgerResponseTypeEnum;
@@ -78,13 +83,15 @@ export const MainLedgerResponseTypeEnum = {
export type MainLedgerResponseTypeEnum = typeof MainLedgerResponseTypeEnum[keyof typeof MainLedgerResponseTypeEnum]; export type MainLedgerResponseTypeEnum = typeof MainLedgerResponseTypeEnum[keyof typeof MainLedgerResponseTypeEnum];
export interface RuleBookResponse { export interface RuleBookResponse {
'characterId': number; 'ruleBookId': string;
'name': string;
'ledgerRefs': Array<string>;
'rules': { [key: string]: RuleResponse; }; 'rules': { [key: string]: RuleResponse; };
} }
export interface RuleClauseResponse { export interface RuleClauseResponse {
'rate': RuleClauseResponseRateEnum; 'rate': RuleClauseResponseRateEnum;
'fromLedgerId'?: string; 'fromLedgerRef': string;
'toLedgerId'?: string; 'toLedgerRef': string;
} }
export const RuleClauseResponseRateEnum = { export const RuleClauseResponseRateEnum = {
@@ -100,9 +107,6 @@ export type RuleClauseResponseRateEnum = typeof RuleClauseResponseRateEnum[keyof
export interface RuleResponse { export interface RuleResponse {
'rules': Array<RuleClauseResponse>; 'rules': Array<RuleClauseResponse>;
} }
export interface SetCharacterRuleBookRequest {
'rules': { [key: string]: RuleResponse; };
}
export interface UpdateCombinedLedgerRequest { export interface UpdateCombinedLedgerRequest {
'name': string; 'name': string;
'memberLedgerIds': Array<string>; 'memberLedgerIds': Array<string>;
@@ -110,6 +114,11 @@ export interface UpdateCombinedLedgerRequest {
export interface UpdateMainLedgerRequest { export interface UpdateMainLedgerRequest {
'name': string; 'name': string;
} }
export interface UpdateRuleBookRequest {
'name': string;
'ledgerRefs': Array<string>;
'rules': { [key: string]: RuleResponse; };
}
/** /**
* ActivityControllerApi - axios parameter creator * ActivityControllerApi - axios parameter creator
@@ -217,7 +226,7 @@ export const CharacterControllerApiAxiosParamCreator = function (configuration?:
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
getCharacters: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => { findAllCharacters: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/characters`; const localVarPath = `/characters`;
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -255,10 +264,10 @@ export const CharacterControllerApiFp = function(configuration?: Configuration)
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async getCharacters(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<CharacterResponse>>> { async findAllCharacters(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<CharacterResponse>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.getCharacters(options); const localVarAxiosArgs = await localVarAxiosParamCreator.findAllCharacters(options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['CharacterControllerApi.getCharacters']?.[localVarOperationServerIndex]?.url; const localVarOperationServerBasePath = operationServerMap['CharacterControllerApi.findAllCharacters']?.[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);
}, },
} }
@@ -275,8 +284,8 @@ export const CharacterControllerApiFactory = function (configuration?: Configura
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
getCharacters(options?: RawAxiosRequestConfig): AxiosPromise<Array<CharacterResponse>> { findAllCharacters(options?: RawAxiosRequestConfig): AxiosPromise<Array<CharacterResponse>> {
return localVarFp.getCharacters(options).then((request) => request(axios, basePath)); return localVarFp.findAllCharacters(options).then((request) => request(axios, basePath));
}, },
}; };
}; };
@@ -290,8 +299,8 @@ export class CharacterControllerApi extends BaseAPI {
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
public getCharacters(options?: RawAxiosRequestConfig) { public findAllCharacters(options?: RawAxiosRequestConfig) {
return CharacterControllerApiFp(this.configuration).getCharacters(options).then((request) => request(this.axios, this.basePath)); return CharacterControllerApiFp(this.configuration).findAllCharacters(options).then((request) => request(this.axios, this.basePath));
} }
} }
@@ -375,7 +384,7 @@ export const LedgerControllerApiAxiosParamCreator = function (configuration?: Co
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findAll: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => { findAllLedgers: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/ledgers`; const localVarPath = `/ledgers`;
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
@@ -405,9 +414,9 @@ export const LedgerControllerApiAxiosParamCreator = function (configuration?: Co
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findById: async (ledgerId: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => { findLedgerById: async (ledgerId: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'ledgerId' is not null or undefined // verify required parameter 'ledgerId' is not null or undefined
assertParamExists('findById', 'ledgerId', ledgerId) assertParamExists('findLedgerById', 'ledgerId', ledgerId)
const localVarPath = `/ledgers/{ledgerId}` const localVarPath = `/ledgers/{ledgerId}`
.replace('{ledgerId}', encodeURIComponent(String(ledgerId))); .replace('{ledgerId}', encodeURIComponent(String(ledgerId)));
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
@@ -546,10 +555,10 @@ export const LedgerControllerApiFp = function(configuration?: Configuration) {
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async findAll(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<FindAll200ResponseInner>>> { async findAllLedgers(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<FindAllLedgers200ResponseInner>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.findAll(options); const localVarAxiosArgs = await localVarAxiosParamCreator.findAllLedgers(options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['LedgerControllerApi.findAll']?.[localVarOperationServerIndex]?.url; const localVarOperationServerBasePath = operationServerMap['LedgerControllerApi.findAllLedgers']?.[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);
}, },
/** /**
@@ -558,10 +567,10 @@ export const LedgerControllerApiFp = function(configuration?: Configuration) {
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async findById(ledgerId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<FindAll200ResponseInner>> { async findLedgerById(ledgerId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<FindAllLedgers200ResponseInner>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.findById(ledgerId, options); const localVarAxiosArgs = await localVarAxiosParamCreator.findLedgerById(ledgerId, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['LedgerControllerApi.findById']?.[localVarOperationServerIndex]?.url; const localVarOperationServerBasePath = operationServerMap['LedgerControllerApi.findLedgerById']?.[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);
}, },
/** /**
@@ -622,8 +631,8 @@ export const LedgerControllerApiFactory = function (configuration?: Configuratio
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findAll(options?: RawAxiosRequestConfig): AxiosPromise<Array<FindAll200ResponseInner>> { findAllLedgers(options?: RawAxiosRequestConfig): AxiosPromise<Array<FindAllLedgers200ResponseInner>> {
return localVarFp.findAll(options).then((request) => request(axios, basePath)); return localVarFp.findAllLedgers(options).then((request) => request(axios, basePath));
}, },
/** /**
* *
@@ -631,8 +640,8 @@ export const LedgerControllerApiFactory = function (configuration?: Configuratio
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findById(ledgerId: string, options?: RawAxiosRequestConfig): AxiosPromise<FindAll200ResponseInner> { findLedgerById(ledgerId: string, options?: RawAxiosRequestConfig): AxiosPromise<FindAllLedgers200ResponseInner> {
return localVarFp.findById(ledgerId, options).then((request) => request(axios, basePath)); return localVarFp.findLedgerById(ledgerId, options).then((request) => request(axios, basePath));
}, },
/** /**
* *
@@ -686,8 +695,8 @@ export class LedgerControllerApi extends BaseAPI {
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
public findAll(options?: RawAxiosRequestConfig) { public findAllLedgers(options?: RawAxiosRequestConfig) {
return LedgerControllerApiFp(this.configuration).findAll(options).then((request) => request(this.axios, this.basePath)); return LedgerControllerApiFp(this.configuration).findAllLedgers(options).then((request) => request(this.axios, this.basePath));
} }
/** /**
@@ -696,8 +705,8 @@ export class LedgerControllerApi extends BaseAPI {
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
public findById(ledgerId: string, options?: RawAxiosRequestConfig) { public findLedgerById(ledgerId: string, options?: RawAxiosRequestConfig) {
return LedgerControllerApiFp(this.configuration).findById(ledgerId, options).then((request) => request(this.axios, this.basePath)); return LedgerControllerApiFp(this.configuration).findLedgerById(ledgerId, options).then((request) => request(this.axios, this.basePath));
} }
/** /**
@@ -821,15 +830,45 @@ export const RuleBookControllerApiAxiosParamCreator = function (configuration?:
return { return {
/** /**
* *
* @param {number} characterId * @param {CreateRuleBookRequest} createRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findByCharacterId: async (characterId: number, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => { createRuleBook: async (createRuleBookRequest: CreateRuleBookRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'characterId' is not null or undefined // verify required parameter 'createRuleBookRequest' is not null or undefined
assertParamExists('findByCharacterId', 'characterId', characterId) assertParamExists('createRuleBook', 'createRuleBookRequest', createRuleBookRequest)
const localVarPath = `/characters/{characterId}/rule-book` const localVarPath = `/rule-books`;
.replace('{characterId}', encodeURIComponent(String(characterId))); // 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: 'POST', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
localVarHeaderParameter['Content-Type'] = 'application/json';
localVarHeaderParameter['Accept'] = '*/*';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(createRuleBookRequest, localVarRequestOptions, configuration)
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
findAllRuleBooks: async (options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
const localVarPath = `/rule-books`;
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions; let baseOptions;
@@ -854,18 +893,15 @@ export const RuleBookControllerApiAxiosParamCreator = function (configuration?:
}, },
/** /**
* *
* @param {number} characterId * @param {string} ruleBookId
* @param {SetCharacterRuleBookRequest} setCharacterRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
setCharacterRuleBook: async (characterId: number, setCharacterRuleBookRequest: SetCharacterRuleBookRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => { findRuleBookById: async (ruleBookId: string, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'characterId' is not null or undefined // verify required parameter 'ruleBookId' is not null or undefined
assertParamExists('setCharacterRuleBook', 'characterId', characterId) assertParamExists('findRuleBookById', 'ruleBookId', ruleBookId)
// verify required parameter 'setCharacterRuleBookRequest' is not null or undefined const localVarPath = `/rule-books/{ruleBookId}`
assertParamExists('setCharacterRuleBook', 'setCharacterRuleBookRequest', setCharacterRuleBookRequest) .replace('{ruleBookId}', encodeURIComponent(String(ruleBookId)));
const localVarPath = `/characters/{characterId}/rule-book`
.replace('{characterId}', encodeURIComponent(String(characterId)));
// use dummy base URL string because the URL constructor only accepts absolute URLs. // use dummy base URL string because the URL constructor only accepts absolute URLs.
const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL); const localVarUrlObj = new URL(localVarPath, DUMMY_BASE_URL);
let baseOptions; let baseOptions;
@@ -873,7 +909,43 @@ export const RuleBookControllerApiAxiosParamCreator = function (configuration?:
baseOptions = configuration.baseOptions; baseOptions = configuration.baseOptions;
} }
const localVarRequestOptions = { method: 'POST', ...baseOptions, ...options}; const localVarRequestOptions = { method: 'GET', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any;
localVarHeaderParameter['Accept'] = '*/*';
setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
return {
url: toPathString(localVarUrlObj),
options: localVarRequestOptions,
};
},
/**
*
* @param {string} ruleBookId
* @param {UpdateRuleBookRequest} updateRuleBookRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
updateRuleBook: async (ruleBookId: string, updateRuleBookRequest: UpdateRuleBookRequest, options: RawAxiosRequestConfig = {}): Promise<RequestArgs> => {
// verify required parameter 'ruleBookId' is not null or undefined
assertParamExists('updateRuleBook', 'ruleBookId', ruleBookId)
// verify required parameter 'updateRuleBookRequest' is not null or undefined
assertParamExists('updateRuleBook', 'updateRuleBookRequest', updateRuleBookRequest)
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: 'PUT', ...baseOptions, ...options};
const localVarHeaderParameter = {} as any; const localVarHeaderParameter = {} as any;
const localVarQueryParameter = {} as any; const localVarQueryParameter = {} as any;
@@ -883,7 +955,7 @@ export const RuleBookControllerApiAxiosParamCreator = function (configuration?:
setSearchParams(localVarUrlObj, localVarQueryParameter); setSearchParams(localVarUrlObj, localVarQueryParameter);
let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {};
localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers}; localVarRequestOptions.headers = {...localVarHeaderParameter, ...headersFromBaseOptions, ...options.headers};
localVarRequestOptions.data = serializeDataIfNeeded(setCharacterRuleBookRequest, localVarRequestOptions, configuration) localVarRequestOptions.data = serializeDataIfNeeded(updateRuleBookRequest, localVarRequestOptions, configuration)
return { return {
url: toPathString(localVarUrlObj), url: toPathString(localVarUrlObj),
@@ -901,27 +973,50 @@ export const RuleBookControllerApiFp = function(configuration?: Configuration) {
return { return {
/** /**
* *
* @param {number} characterId * @param {CreateRuleBookRequest} createRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async findByCharacterId(characterId: number, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RuleBookResponse>> { async createRuleBook(createRuleBookRequest: CreateRuleBookRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RuleBookResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.findByCharacterId(characterId, options); const localVarAxiosArgs = await localVarAxiosParamCreator.createRuleBook(createRuleBookRequest, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.findByCharacterId']?.[localVarOperationServerIndex]?.url; const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.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);
}, },
/** /**
* *
* @param {number} characterId
* @param {SetCharacterRuleBookRequest} setCharacterRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
async setCharacterRuleBook(characterId: number, setCharacterRuleBookRequest: SetCharacterRuleBookRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RuleBookResponse>> { async findAllRuleBooks(options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<Array<RuleBookResponse>>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.setCharacterRuleBook(characterId, setCharacterRuleBookRequest, options); const localVarAxiosArgs = await localVarAxiosParamCreator.findAllRuleBooks(options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0; const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.setCharacterRuleBook']?.[localVarOperationServerIndex]?.url; const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.findAllRuleBooks']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
*
* @param {string} ruleBookId
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async findRuleBookById(ruleBookId: string, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RuleBookResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.findRuleBookById(ruleBookId, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.findRuleBookById']?.[localVarOperationServerIndex]?.url;
return (axios, basePath) => createRequestFunction(localVarAxiosArgs, globalAxios, BASE_PATH, configuration)(axios, localVarOperationServerBasePath || basePath);
},
/**
*
* @param {string} ruleBookId
* @param {UpdateRuleBookRequest} updateRuleBookRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
async updateRuleBook(ruleBookId: string, updateRuleBookRequest: UpdateRuleBookRequest, options?: RawAxiosRequestConfig): Promise<(axios?: AxiosInstance, basePath?: string) => AxiosPromise<RuleBookResponse>> {
const localVarAxiosArgs = await localVarAxiosParamCreator.updateRuleBook(ruleBookId, updateRuleBookRequest, options);
const localVarOperationServerIndex = configuration?.serverIndex ?? 0;
const localVarOperationServerBasePath = operationServerMap['RuleBookControllerApi.updateRuleBook']?.[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);
}, },
} }
@@ -935,22 +1030,39 @@ export const RuleBookControllerApiFactory = function (configuration?: Configurat
return { return {
/** /**
* *
* @param {number} characterId * @param {CreateRuleBookRequest} createRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
findByCharacterId(characterId: number, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> { createRuleBook(createRuleBookRequest: CreateRuleBookRequest, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> {
return localVarFp.findByCharacterId(characterId, options).then((request) => request(axios, basePath)); return localVarFp.createRuleBook(createRuleBookRequest, options).then((request) => request(axios, basePath));
}, },
/** /**
* *
* @param {number} characterId
* @param {SetCharacterRuleBookRequest} setCharacterRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
setCharacterRuleBook(characterId: number, setCharacterRuleBookRequest: SetCharacterRuleBookRequest, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> { findAllRuleBooks(options?: RawAxiosRequestConfig): AxiosPromise<Array<RuleBookResponse>> {
return localVarFp.setCharacterRuleBook(characterId, setCharacterRuleBookRequest, options).then((request) => request(axios, basePath)); return localVarFp.findAllRuleBooks(options).then((request) => request(axios, basePath));
},
/**
*
* @param {string} ruleBookId
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
findRuleBookById(ruleBookId: string, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> {
return localVarFp.findRuleBookById(ruleBookId, options).then((request) => request(axios, basePath));
},
/**
*
* @param {string} ruleBookId
* @param {UpdateRuleBookRequest} updateRuleBookRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
updateRuleBook(ruleBookId: string, updateRuleBookRequest: UpdateRuleBookRequest, options?: RawAxiosRequestConfig): AxiosPromise<RuleBookResponse> {
return localVarFp.updateRuleBook(ruleBookId, updateRuleBookRequest, options).then((request) => request(axios, basePath));
}, },
}; };
}; };
@@ -961,23 +1073,42 @@ export const RuleBookControllerApiFactory = function (configuration?: Configurat
export class RuleBookControllerApi extends BaseAPI { export class RuleBookControllerApi extends BaseAPI {
/** /**
* *
* @param {number} characterId * @param {CreateRuleBookRequest} createRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
public findByCharacterId(characterId: number, options?: RawAxiosRequestConfig) { public createRuleBook(createRuleBookRequest: CreateRuleBookRequest, options?: RawAxiosRequestConfig) {
return RuleBookControllerApiFp(this.configuration).findByCharacterId(characterId, options).then((request) => request(this.axios, this.basePath)); return RuleBookControllerApiFp(this.configuration).createRuleBook(createRuleBookRequest, options).then((request) => request(this.axios, this.basePath));
} }
/** /**
* *
* @param {number} characterId
* @param {SetCharacterRuleBookRequest} setCharacterRuleBookRequest
* @param {*} [options] Override http request option. * @param {*} [options] Override http request option.
* @throws {RequiredError} * @throws {RequiredError}
*/ */
public setCharacterRuleBook(characterId: number, setCharacterRuleBookRequest: SetCharacterRuleBookRequest, options?: RawAxiosRequestConfig) { public findAllRuleBooks(options?: RawAxiosRequestConfig) {
return RuleBookControllerApiFp(this.configuration).setCharacterRuleBook(characterId, setCharacterRuleBookRequest, options).then((request) => request(this.axios, this.basePath)); return RuleBookControllerApiFp(this.configuration).findAllRuleBooks(options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {string} ruleBookId
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public findRuleBookById(ruleBookId: string, options?: RawAxiosRequestConfig) {
return RuleBookControllerApiFp(this.configuration).findRuleBookById(ruleBookId, options).then((request) => request(this.axios, this.basePath));
}
/**
*
* @param {string} ruleBookId
* @param {UpdateRuleBookRequest} updateRuleBookRequest
* @param {*} [options] Override http request option.
* @throws {RequiredError}
*/
public updateRuleBook(ruleBookId: string, updateRuleBookRequest: UpdateRuleBookRequest, options?: RawAxiosRequestConfig) {
return RuleBookControllerApiFp(this.configuration).updateRuleBook(ruleBookId, updateRuleBookRequest, options).then((request) => request(this.axios, this.basePath));
} }
} }
+3 -1
View File
@@ -20,6 +20,8 @@ export type MainLedger = MainLedgerResponse & {type: MainLedgerResponseTypeEnum}
export type CombinedLedger = CombinedLedgerResponse & {type: CombinedLedgerResponseTypeEnum} export type CombinedLedger = CombinedLedgerResponse & {type: CombinedLedgerResponseTypeEnum}
export type Ledger = MainLedger | CombinedLedger; export type Ledger = MainLedger | CombinedLedger;
export const systemLedgerRef = 'system';
export const systemLedger = { export const systemLedger = {
type: LedgerTypes.Main, type: LedgerTypes.Main,
ledgerId: "", ledgerId: "",
@@ -62,7 +64,7 @@ export const useLedgersStore = defineStore('ledgers', () => {
const updateMain = (ledgerId: string, ledger: UpdateMainLedgerRequest) => ledgerControllerApi.updateMainLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger)); const updateMain = (ledgerId: string, ledger: UpdateMainLedgerRequest) => ledgerControllerApi.updateMainLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger));
const updateCombined = (ledgerId: string, ledger: UpdateCombinedLedgerRequest) => ledgerControllerApi.updateCombinedLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger)); const updateCombined = (ledgerId: string, ledger: UpdateCombinedLedgerRequest) => ledgerControllerApi.updateCombinedLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger));
const refresh = () => ledgerControllerApi.findAll().then(response => ledgers.value = response.data as Ledger[]); const refresh = () => ledgerControllerApi.findAllLedgers().then(response => ledgers.value = response.data as Ledger[]);
refresh(); refresh();
+1 -13
View File
@@ -1,6 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { RouterLink, RouterView } from 'vue-router'; import {RouterLink, RouterView} from 'vue-router';
</script> </script>
<template> <template>
@@ -19,14 +18,3 @@ import { RouterLink, RouterView } from 'vue-router';
<RouterView /> <RouterView />
</div> </div>
</template> </template>
<style scoped>
@reference "tailwindcss";
a.tab {
@apply flex items-center px-4 me-2 rounded-t-md bg-slate-600 hover:bg-slate-700;
&.router-link-active {
@apply bg-emerald-500 hover:bg-emerald-700;
}
}
</style>
+12 -1
View File
@@ -1,7 +1,18 @@
<script setup lang="ts"> <script setup lang="ts">
import {RouterLink, RouterView} from "vue-router";
</script> </script>
<template> <template>
<RouterView /> <div class="mt-4">
<div class="flex border-b-2 border-emerald-500">
<RouterLink :to="{ name: 'list-rule-books' }" class="tab">
<span>Rule Books</span>
</RouterLink>
<RouterLink to="/characters/rules" class="tab">
<span>Characters Rules</span>
</RouterLink>
</div>
<RouterView />
</div>
</template> </template>
+79 -35
View File
@@ -1,57 +1,101 @@
<script setup lang="ts"> <script setup lang="ts">
import {Character, CharacterLabel, useCharactersStore} from "@/characters"; import {useRoute, useRouter} from "vue-router";
import {useRoute} from "vue-router"; import {ref, watch} from "vue";
import {ref, watch, watchEffect} from "vue"; import {useDebounceFn} from "@vueuse/core";
import log from "loglevel"; import log from "loglevel";
import {activityTypes, findByCharacterId, RuleBook, RuleInput, setCharacterRuleBook} from "@/rules"; import {activityTypes, RuleInput, Rules, useRuleBooksStore} from "@/rules";
import {PlusIcon, TrashIcon} from "@heroicons/vue/24/outline";
const {findById: findCharacterById} = useCharactersStore(); const ruleBookId = ref<string>();
const character = ref<Character>(); const name = ref<string>('');
const ledgerRefs = ref<string[]>([]);
const rules = ref<Rules>({});
const ruleBook = ref<RuleBook>(); const {findById, create, update, refresh} = useRuleBooksStore();
const router = useRouter();
watchEffect(async () => { const save = async () => {
const characterId = character.value?.characterId; if (!ruleBookId.value) {
const created = await create({
name: name.value,
ledgerRefs: ledgerRefs.value,
rules: rules.value
})
await router.push({ name: 'edit-rule-book', params: {ruleBookId: created.ruleBookId}})
if (characterId) { } else {
ruleBook.value = await findByCharacterId(characterId); await update(ruleBookId.value, {
} name: name.value,
}); ledgerRefs: ledgerRefs.value,
rules: rules.value
const save = () => { })
const characterId = character.value?.characterId;
if (characterId && ruleBook.value) {
setCharacterRuleBook(characterId, ruleBook.value);
} }
} }
watch(useRoute(), async route => { const addLedgerRef = () => {
if (route.params.characterId) { ledgerRefs.value = [...ledgerRefs.value, '']
const id = parseInt(typeof route.params.characterId === 'string' ? route.params.characterId : route.params.characterId[0]); }
const updateLedgerRef = useDebounceFn((index: number, value: string) => {
ledgerRefs.value[index] = value;
}, 500);
character.value = await findCharacterById(id); const removeLedgerRef = (index: number) => {
log.info('Loaded character:', character.value); ledgerRefs.value = ledgerRefs.value.toSpliced(index, 1)
}
watch(useRoute(), async route => {
if (route.params.ruleBookId) {
const promise = refresh(); // FIXME don't call refresh
const id = typeof route.params.ruleBookId === 'string' ? route.params.ruleBookId : route.params.ruleBookId[0];
await promise;
const ruleBook = findById(id);
ruleBookId.value = id;
name.value = ruleBook?.name ?? '';
ledgerRefs.value = [...ruleBook?.ledgerRefs];
rules.value = {...ruleBook?.rules}; // todo fully clone rules
log.info('Loaded rule book:', ruleBook);
} else { } else {
character.value = undefined; ruleBookId.value = undefined;
log.info('No character to load'); name.value = '';
ledgerRefs.value = [];
rules.value = {};
log.info('No rule book to load');
} }
}, { immediate: true }) }, { immediate: true })
</script> </script>
<template> <template>
<div v-if="character" class="grid mb-2 mt-4"> <div class="grid mb-2 mt-4">
<div class="mb-2 border-b-1 flex"> <div class="flex flex-col">
<CharacterLabel class="flex grow mb-2" :character="character" :size="64" /> <div class="flex grow border-b-1">
Name:
<input class="mb-2 ms-2" type="text" v-model="name" />
</div>
<div class="border-b-1">
Ledgers References:
<div class="flex flex-wrap items-center">
<div class="flex items-center mb-2" v-for="(ledgerRef, index) in ledgerRefs" :key="index">
<input class="me-1" type="text" :value="ledgerRefs[index]" @input="updateLedgerRef(index, ($event.target as HTMLInputElement).value)" />
<button class="btn-icon me-2" @click="addLedgerRef"><TrashIcon /></button>
</div>
<div class="flex items-center mb-2">
<button class="btn-icon" @click="removeLedgerRef(index)"><PlusIcon /></button>
</div>
</div>
</div>
<div class="flex flex-col grow border-b-1" v-for="activityType in activityTypes" :key="activityType.key">
<span>{{ activityType.name }}</span>
<RuleInput :ledgerRefs="ledgerRefs" v-model="rules[activityType.key]" />
</div>
</div>
<div class="mt-2 justify-end flex">
<div> <div>
<button @click="save">Save</button> <button @click="save">Save</button>
</div> </div>
</div> </div>
<div v-if="ruleBook" class="flex-col">
<div class="flex-col grow border-b-1" v-for="activityType in activityTypes" :key="activityType.key">
<span>{{ activityType.name }}</span>
<RuleInput v-model="ruleBook.rules[activityType.key]" />
</div>
</div>
</div> </div>
</template> </template>
@@ -0,0 +1,17 @@
<script setup lang="ts">
import {storeToRefs} from "pinia";
import {CharacterLabel, useCharactersStore} from "@/characters";
import {PencilSquareIcon} from "@heroicons/vue/24/outline";
const {characters} = storeToRefs(useCharactersStore());
</script>
<template>
<div class="grid mb-2 mt-4">
<div v-for="character in characters" :key="character.characterId" class="flex items-center mb-2">
<CharacterLabel class="flex grow" :character="character" />
<RouterLink class="btn-icon ms-2" :to="{ name: 'character-rulebook', params: { characterId: character.characterId } }"><PencilSquareIcon /></RouterLink>
</div>
</div>
</template>
+10 -6
View File
@@ -1,17 +1,21 @@
<script setup lang="ts"> <script setup lang="ts">
import {storeToRefs} from "pinia"; import {storeToRefs} from "pinia";
import {CharacterLabel, useCharactersStore} from "@/characters"; import {PencilSquareIcon, TrashIcon} from "@heroicons/vue/24/outline";
import {PencilSquareIcon} from "@heroicons/vue/24/outline"; import {useRuleBooksStore} from "@/rules";
const {characters} = storeToRefs(useCharactersStore()); const {ruleBooks} = storeToRefs(useRuleBooksStore());
</script> </script>
<template> <template>
<div class="grid mb-2 mt-4"> <div class="grid mb-2 mt-4">
<div v-for="character in characters" :key="character.characterId" class="flex items-center mb-2"> <div class="flex justify-end border-b-1">
<CharacterLabel class="flex grow" :character="character" /> <RouterLink class="button mb-2 ms-2" :to="{ name: 'new-rule-book'}">New Rule Book</RouterLink>
<RouterLink class="btn-icon ms-2" :to="{ name: 'character-rulebook', params: { characterId: character.characterId } }"><PencilSquareIcon /></RouterLink> </div>
<div v-for="ruleBook in ruleBooks" :key="ruleBook.ruleBookId" class="flex items-center mt-2">
<span class="flex grow me-2">{{ruleBook.name}}</span>
<RouterLink class="btn-icon me-1" :to="{ name: 'edit-rule-book', params: { ruleBookId: ruleBook.ruleBookId } }"><PencilSquareIcon /></RouterLink>
<button class="btn-icon"><TrashIcon /></button>
</div> </div>
</div> </div>
</template> </template>
+8 -2
View File
@@ -9,8 +9,14 @@ export const routes: RouteRecordRaw[] = [
]}, ]},
{path: '/rules', component: () => import('@/pages/Rules.vue'), children: [ {path: '/rules', component: () => import('@/pages/Rules.vue'), children: [
{path: '', component: () => import('./pages/rules/ListRuleBooks.vue')}, {path: '', redirect: '/rule-books'},
{path: '/characters/:characterId/rule-book', name: 'character-rulebook', component: () => import('@/pages/rules/EditRuleBook.vue')}, {path: '/rule-books', children: [
{path: '', name: 'list-rule-books', component: () => import('./pages/rules/ListRuleBooks.vue')},
{path: 'new', name: 'new-rule-book', component: () => import('@/pages/rules/EditRuleBook.vue')},
{path: ':ruleBookId', name: 'edit-rule-book', component: () => import('@/pages/rules/EditRuleBook.vue')},
]},
{path: '/characters/rules', component: () => import('./pages/rules/ListCharacterRuleBooks.vue')},
{path: '/characters/:characterId/rules', name: 'character-rulebook', component: () => import('@/pages/rules/EditRuleBook.vue')},
]}, ]},
{path: '/market', component: () => import('@/pages/Market.vue'), children: [ {path: '/market', component: () => import('@/pages/Market.vue'), children: [
+37 -17
View File
@@ -1,37 +1,57 @@
<script setup lang="ts"> <script setup lang="ts">
import {RuleClauseResponse} from "@/generated/mammon"; import {RuleClauseResponse} from "@/generated/mammon";
import {computed} from "vue"; import {computed, watch} from "vue";
import {isMain, Ledger, LedgerSelect, systemLedger, useLedgersStore} from "@/ledger"; import {systemLedgerRef} from "@/ledger";
import {ratesTypes} from "@/rules/rules.ts"; import {ratesTypes} from "@/rules/rules.ts";
const rule = defineModel<RuleClauseResponse>(); interface Props {
ledgerRefs: string[];
}
const ledgersStore = useLedgersStore(); const props = defineProps<Props>()
const {findById} = ledgersStore;
const ledgers = computed<Ledger[]>(() => [systemLedger, ...ledgersStore.ledgers.filter(isMain)]);
const ledgerComputed = (key: 'fromLedgerId' | 'toLedgerId') => computed<Ledger>({ const rule = defineModel<RuleClauseResponse>({ default: {
get: () => rule.value && rule.value[key] ? findById(rule.value[key]) ?? systemLedger : systemLedger, rate: ratesTypes.None,
set: value => { fromLedgerRef: systemLedgerRef,
if (value) { toLedgerRef: systemLedgerRef,
rule.value = {...rule.value, [key]: value.ledgerId.length ? value.ledgerId : undefined} }});
const ledgerRefsWithSystem = computed<string[]>(() => [systemLedgerRef, ...props.ledgerRefs])
watch(ledgerRefsWithSystem, (newVal, oldVal) => {
if (newVal.length !== oldVal.length) {
return;
} }
if (rule.value.fromLedgerRef && rule.value.fromLedgerRef !== systemLedgerRef) {
rule.value.fromLedgerRef = newVal[oldVal.findIndex(v => v === rule.value.fromLedgerRef)]
}
if (rule.value.toLedgerRef && rule.value.toLedgerRef !== systemLedgerRef) {
rule.value.toLedgerRef = newVal[oldVal.findIndex(v => v === rule.value.toLedgerRef)]
} }
}) })
const fromLedger = ledgerComputed('fromLedgerId')
const toLedger = ledgerComputed('toLedgerId')
</script> </script>
<template> <template>
From: From:
<LedgerSelect class="me-2 grow" v-model="fromLedger" :ledgers="ledgers" /> <select class="me-2 grow" v-model="rule.fromLedgerRef" :class="{'system-ledger': rule.fromLedgerRef === systemLedgerRef}">
<option v-for="l in ledgerRefsWithSystem" :key="l" :value="l" :class="{'system-ledger': l === systemLedgerRef}">{{ l }}</option>
</select>
To: To:
<LedgerSelect class="me-2 grow" v-model="toLedger" :ledgers="ledgers" /> <select class="me-2 grow" v-model="rule.toLedgerRef" :class="{'system-ledger': rule.toLedgerRef === systemLedgerRef}">
<option v-for="l in ledgerRefsWithSystem" :key="l" :value="l" :class="{'system-ledger': l === systemLedgerRef}">{{ l }}</option>
</select>
At: At:
<select class="me-2 grow" v-model="rule.rate"> <select class="me-2 grow" v-model="rule.rate">
<option v-for="rateType in ratesTypes" :key="rateType.key" :value="rateType.key">{{ rateType.name }}</option> <option v-for="rateType in ratesTypes" :key="rateType.key" :value="rateType.key">{{ rateType.name }}</option>
</select> </select>
</template> </template>
<style scoped>
@reference "tailwindcss";
.system-ledger {
@apply text-emerald-400;
}
</style>
+8 -2
View File
@@ -6,7 +6,13 @@ import {computed, useTemplateRef} from "vue";
import {Bars4Icon, PlusIcon, TrashIcon} from '@heroicons/vue/24/outline'; import {Bars4Icon, PlusIcon, TrashIcon} from '@heroicons/vue/24/outline';
import {useSortable} from "@vueuse/integrations/useSortable"; import {useSortable} from "@vueuse/integrations/useSortable";
const rule = defineModel<RuleResponse>(); interface Props {
ledgerRefs: string[];
}
const props = defineProps<Props>()
const rule = defineModel<RuleResponse>({default: {rules:{}}});
const rules = computed<RuleClauseResponse[]>({ const rules = computed<RuleClauseResponse[]>({
get: () => rule.value && rule.value.rules ? rule.value.rules : [], get: () => rule.value && rule.value.rules ? rule.value.rules : [],
set: value => rule.value = {rules: value} set: value => rule.value = {rules: value}
@@ -38,7 +44,7 @@ useSortable(sortableContainer, rules, { handle: '.sortable-handle'});
<span class="sortable-handle flex"> <span class="sortable-handle flex">
<Bars4Icon class="w-6"/> <Bars4Icon class="w-6"/>
</span> </span>
<RuleClauseInput :modelValue="rule" @update:modelValue="v => setRule(index, v)" /> <RuleClauseInput :ledgerRefs="ledgerRefs" :modelValue="rule" @update:modelValue="v => setRule(index, v)" />
<button class="btn-icon" @click="removeRule(index)"><TrashIcon /></button> <button class="btn-icon" @click="removeRule(index)"><TrashIcon /></button>
</div> </div>
</div> </div>
+37 -4
View File
@@ -1,5 +1,7 @@
import {ruleBookControllerApi} from "@/mammon"; import {ledgerControllerApi, ruleBookControllerApi} from "@/mammon";
import {RuleBookResponse, RuleClauseResponseRateEnum, RuleResponse} from "@/generated/mammon"; import {CreateRuleBookRequest, RuleBookResponse, RuleClauseResponseRateEnum, RuleResponse} from "@/generated/mammon";
import {defineStore} from "pinia";
import {ref, triggerRef} from "vue";
export const activityTypes = { export const activityTypes = {
itemBought: {key: "ITEM_BOUGHT", name: "Item Bought"}, itemBought: {key: "ITEM_BOUGHT", name: "Item Bought"},
@@ -10,7 +12,8 @@ export const activityTypes = {
export type Activity = { key: ActivityType, name: string } export type Activity = { key: ActivityType, name: string }
export type ActivityType = typeof activityTypes[keyof typeof activityTypes]['key']; export type ActivityType = typeof activityTypes[keyof typeof activityTypes]['key'];
export type RuleBook = RuleBookResponse & { rules: { [key: ActivityType]: RuleResponse; } } export type Rules = { [key: ActivityType]: RuleResponse; };
export type RuleBook = RuleBookResponse & { rules: Rules }
export const ratesTypes = { export const ratesTypes = {
None: {key: "NONE", name: "0 ISK"}, None: {key: "NONE", name: "0 ISK"},
@@ -22,7 +25,37 @@ export const ratesTypes = {
export type Rate = { key: RuleClauseResponseRateEnum, name: string } export type Rate = { key: RuleClauseResponseRateEnum, name: string }
export const findByCharacterId = (characterId: number): Promise<RuleBook> => ruleBookControllerApi.findByCharacterId(characterId) export const useRuleBooksStore = defineStore('rule-books', () => {
const ruleBooks = ref<RuleBook[]>([]);
const addRuleBook = (ruleBook: RuleBook) => {
ruleBooks.value.push(ruleBook);
triggerRef(ruleBooks);
return ruleBook;
};
const replaceRuleBook = (ruleBook: RuleBook) => {
const index = ruleBooks.value.findIndex(rb => rb.ruleBookId === ruleBook.ruleBookId);
if (index !== -1) {
ruleBooks.value[index] = ruleBook;
}
triggerRef(ruleBooks);
return ruleBook;
};
const findById = (ruleBookId: string): RuleBook | undefined => ruleBooks.value.find(rb => rb.ruleBookId === ruleBookId);
const create = (ruleBook: CreateRuleBookRequest) => ruleBookControllerApi.createRuleBook(ruleBook).then(response => addRuleBook(response.data));
const update = (ruleBookId: string, ruleBook: CreateRuleBookRequest) => ledgerControllerApi.updateMainLedger(ruleBookId, ruleBook).then(response => replaceRuleBook(response.data));
const refresh = () => ruleBookControllerApi.findAllRuleBooks().then(response => ruleBooks.value = response.data as RuleBook[]);
refresh();
return {ruleBooks, findById, create, update, refresh};
})
export const findByCharacterId = (characterId: number): Promise<RuleBook> => ruleBookControllerApi.findById(characterId)
.then(response => response.data) .then(response => response.data)
.catch(() => ({characterId, rules: {}})); .catch(() => ({characterId, rules: {}}));
+9 -1
View File
@@ -72,9 +72,17 @@
} }
.btn-icon { .btn-icon {
@apply p-0 border-none bg-transparent hover:text-slate-400 hover:bg-transparent; @apply p-0 border-none bg-transparent hover:text-slate-400 hover:bg-transparent cursor-pointer;
> svg { > svg {
@apply w-6 h-6; @apply w-6 h-6;
} }
} }
a.tab {
@apply flex items-center px-4 me-2 rounded-t-md bg-slate-600 hover:bg-slate-700;
&.router-link-active {
@apply bg-emerald-500 hover:bg-emerald-700;
}
}
} }