diff --git a/packages/backend/src/core/entities/ReversiGameEntityService.ts b/packages/backend/src/core/entities/ReversiGameEntityService.ts index df042e75c1..21099bad3e 100644 --- a/packages/backend/src/core/entities/ReversiGameEntityService.ts +++ b/packages/backend/src/core/entities/ReversiGameEntityService.ts @@ -14,6 +14,10 @@ import { bindThis } from '@/decorators.js'; import { IdService } from '@/core/IdService.js'; import { UserEntityService } from './UserEntityService.js'; +function assertBw(bw: string): bw is Packed<'ReversiGameDetailed'>['bw'] { + return ['random', '1', '2'].includes(bw); +} + @Injectable() export class ReversiGameEntityService { constructor( @@ -58,7 +62,7 @@ export class ReversiGameEntityService { surrenderedUserId: game.surrenderedUserId, timeoutUserId: game.timeoutUserId, black: game.black, - bw: game.bw, + bw: assertBw(game.bw) ? game.bw : 'random', isLlotheo: game.isLlotheo, canPutEverywhere: game.canPutEverywhere, loopedBoard: game.loopedBoard, @@ -116,7 +120,7 @@ export class ReversiGameEntityService { surrenderedUserId: game.surrenderedUserId, timeoutUserId: game.timeoutUserId, black: game.black, - bw: game.bw, + bw: assertBw(game.bw) ? game.bw : 'random', isLlotheo: game.isLlotheo, canPutEverywhere: game.canPutEverywhere, loopedBoard: game.loopedBoard, diff --git a/packages/backend/src/models/json-schema/reversi-game.ts b/packages/backend/src/models/json-schema/reversi-game.ts index cb37200384..378ae41cb5 100644 --- a/packages/backend/src/models/json-schema/reversi-game.ts +++ b/packages/backend/src/models/json-schema/reversi-game.ts @@ -81,6 +81,7 @@ export const packedReversiGameLiteSchema = { bw: { type: 'string', optional: false, nullable: false, + enum: ['random', '1', '2'], }, noIrregularRules: { type: 'boolean', @@ -199,6 +200,7 @@ export const packedReversiGameDetailedSchema = { bw: { type: 'string', optional: false, nullable: false, + enum: ['random', '1', '2'], }, noIrregularRules: { type: 'boolean', diff --git a/packages/frontend/src/components/MkRadios.vue b/packages/frontend/src/components/MkRadios.vue index 304fd0cc8e..a8b860a8f8 100644 --- a/packages/frontend/src/components/MkRadios.vue +++ b/packages/frontend/src/components/MkRadios.vue @@ -19,8 +19,11 @@ SPDX-License-Identifier: AGPL-3.0-only
-
{{ option.label ?? option.value }}
-
{{ option.caption }}
+ +
@@ -35,8 +38,9 @@ SPDX-License-Identifier: AGPL-3.0-only import type { StyleValue } from 'vue'; import type { OptionValue } from '@/types/option-value.js'; -export type RadioOption = { +export type RadioOption = { value: T; + slotId?: S; label?: string; labelStyle?: StyleValue; icon?: string; @@ -54,6 +58,13 @@ defineProps<{ vertical?: boolean; }>(); +defineSlots<{ + label?: () => any; + caption?: () => any +} & { + [K in `option-${NonNullable}`]: () => any; +}>(); + const model = defineModel({ required: true }); function getKey(value: OptionValue): PropertyKey { diff --git a/packages/frontend/src/components/MkRadios2.vue b/packages/frontend/src/components/MkRadios2.vue deleted file mode 100644 index 03f83d46da..0000000000 --- a/packages/frontend/src/components/MkRadios2.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - diff --git a/packages/frontend/src/pages/reversi/game.setting.vue b/packages/frontend/src/pages/reversi/game.setting.vue index 46c41ecaa5..9069114067 100644 --- a/packages/frontend/src/pages/reversi/game.setting.vue +++ b/packages/frontend/src/pages/reversi/game.setting.vue @@ -36,23 +36,29 @@ SPDX-License-Identifier: AGPL-3.0-only - - -