fix: 정규 표현식 수정 및 조건부 렌더링 개선; 코드 가독성 향상
This commit is contained in:
@@ -102,7 +102,7 @@ const parsePhpArray = (input: string): unknown => {
|
||||
|
||||
const parseNumber = () => {
|
||||
let raw = '';
|
||||
while (index < input.length && /[0-9.+\-]/.test(input[index] ?? '')) {
|
||||
while (index < input.length && /[0-9.+-]/.test(input[index] ?? '')) {
|
||||
raw += input[index];
|
||||
index += 1;
|
||||
}
|
||||
@@ -121,7 +121,7 @@ const parsePhpArray = (input: string): unknown => {
|
||||
if (char === '"' || char === "'") {
|
||||
return parseString();
|
||||
}
|
||||
if (/[0-9.+\-]/.test(char)) {
|
||||
if (/[0-9.+-]/.test(char)) {
|
||||
return parseNumber();
|
||||
}
|
||||
if (input.startsWith('true', index)) {
|
||||
|
||||
@@ -123,7 +123,7 @@ watch(
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="mobile-panel" v-if="mobileTab === 'map'">
|
||||
<div v-if="mobileTab === 'map'" class="mobile-panel">
|
||||
<PanelCard title="지도">
|
||||
<MapViewer :map-data="worldMap" :map-layout="mapLayout" :loading="loading" />
|
||||
</PanelCard>
|
||||
@@ -132,7 +132,7 @@ watch(
|
||||
</PanelCard>
|
||||
</div>
|
||||
|
||||
<div class="mobile-panel" v-if="mobileTab === 'commands'">
|
||||
<div v-if="mobileTab === 'commands'" class="mobile-panel">
|
||||
<PanelCard title="명령 목록" subtitle="예턴/명령 배치 영역">
|
||||
<CommandListPanel
|
||||
:command-table="commandTable"
|
||||
@@ -149,7 +149,7 @@ watch(
|
||||
</PanelCard>
|
||||
</div>
|
||||
|
||||
<div class="mobile-panel" v-if="mobileTab === 'status'">
|
||||
<div v-if="mobileTab === 'status'" class="mobile-panel">
|
||||
<PanelCard title="장수 스탯">
|
||||
<GeneralBasicCard :general="general" :loading="loading" />
|
||||
</PanelCard>
|
||||
@@ -161,7 +161,7 @@ watch(
|
||||
</PanelCard>
|
||||
</div>
|
||||
|
||||
<div class="mobile-panel" v-if="mobileTab === 'world'">
|
||||
<div v-if="mobileTab === 'world'" class="mobile-panel">
|
||||
<PanelCard title="장수 동향">
|
||||
<SkeletonLines v-if="loading" :lines="4" />
|
||||
<div v-else class="placeholder">장수 동향은 실시간 스트림으로 연결 예정</div>
|
||||
@@ -180,7 +180,7 @@ watch(
|
||||
</PanelCard>
|
||||
</div>
|
||||
|
||||
<div class="mobile-panel" v-if="mobileTab === 'messages'">
|
||||
<div v-if="mobileTab === 'messages'" class="mobile-panel">
|
||||
<PanelCard title="메시지함">
|
||||
<MessagePanel
|
||||
:messages="messages"
|
||||
|
||||
@@ -280,10 +280,10 @@ onMounted(() => {
|
||||
</select>
|
||||
<input v-model="filterText" class="filter-input" placeholder="도시 검색" />
|
||||
<button
|
||||
v-if="canAppoint"
|
||||
class="ghost"
|
||||
:class="{ active: showAppointment }"
|
||||
@click="showAppointment = !showAppointment"
|
||||
v-if="canAppoint"
|
||||
>
|
||||
관직 임명 모드
|
||||
</button>
|
||||
@@ -345,7 +345,7 @@ onMounted(() => {
|
||||
</div>
|
||||
|
||||
<div v-if="showAppointment && canAppoint" class="city-appoint">
|
||||
<div class="appoint-row" v-for="level in officerLevels" :key="level">
|
||||
<div v-for="level in officerLevels" :key="level" class="appoint-row">
|
||||
<span class="officer-label">{{ officerLabels[level] }}</span>
|
||||
<select
|
||||
v-model.number="appointmentDraft[city.id][level]"
|
||||
|
||||
@@ -314,14 +314,14 @@ onMounted(() => {
|
||||
<div class="chief-name">
|
||||
{{ chiefAssignments[level]?.name ?? '-' }}
|
||||
</div>
|
||||
<div class="chief-meta" v-if="chiefAssignments[level]">
|
||||
<div v-if="chiefAssignments[level]" class="chief-meta">
|
||||
{{ chiefAssignments[level]?.officerCityName ?? chiefAssignments[level]?.cityName ?? '-' }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</PanelCard>
|
||||
|
||||
<PanelCard title="수뇌부 임명" subtitle="수뇌 관직 임명 및 해임" v-if="canAssign">
|
||||
<PanelCard v-if="canAssign" title="수뇌부 임명" subtitle="수뇌 관직 임명 및 해임">
|
||||
<div class="chief-appoint">
|
||||
<div v-for="level in chiefLevels" :key="level" class="appoint-row">
|
||||
<div class="appoint-label">{{ formatOfficerLevelText(level, nationLevel) }}</div>
|
||||
@@ -336,7 +336,7 @@ onMounted(() => {
|
||||
</div>
|
||||
</PanelCard>
|
||||
|
||||
<PanelCard title="도시 관직 빠른 임명" subtitle="도시별 관직을 신속하게 배치합니다" v-if="canAssign">
|
||||
<PanelCard v-if="canAssign" title="도시 관직 빠른 임명" subtitle="도시별 관직을 신속하게 배치합니다">
|
||||
<div class="fast-appoint">
|
||||
<div class="appoint-row">
|
||||
<div class="appoint-label">도시</div>
|
||||
@@ -397,7 +397,7 @@ onMounted(() => {
|
||||
</div>
|
||||
</PanelCard>
|
||||
|
||||
<PanelCard title="외교 권한" subtitle="외교권자/조언자 임명" v-if="isLeader">
|
||||
<PanelCard v-if="isLeader" title="외교 권한" subtitle="외교권자/조언자 임명">
|
||||
<div class="permission-grid">
|
||||
<div>
|
||||
<div class="permission-title">외교권자 (최대 2명)</div>
|
||||
@@ -408,9 +408,9 @@ onMounted(() => {
|
||||
class="permission-item"
|
||||
>
|
||||
<input
|
||||
v-model="ambassadorSelection"
|
||||
type="checkbox"
|
||||
:value="candidate.id"
|
||||
v-model="ambassadorSelection"
|
||||
@change="enforceAmbassadorLimit(candidate.id)"
|
||||
/>
|
||||
{{ candidate.name }}
|
||||
@@ -427,9 +427,9 @@ onMounted(() => {
|
||||
class="permission-item"
|
||||
>
|
||||
<input
|
||||
v-model="auditorSelection"
|
||||
type="checkbox"
|
||||
:value="candidate.id"
|
||||
v-model="auditorSelection"
|
||||
@change="enforceAuditorLimit(candidate.id)"
|
||||
/>
|
||||
{{ candidate.name }}
|
||||
@@ -440,7 +440,7 @@ onMounted(() => {
|
||||
</div>
|
||||
</PanelCard>
|
||||
|
||||
<PanelCard title="추방" subtitle="국가에서 장수를 추방합니다" v-if="canAssign">
|
||||
<PanelCard v-if="canAssign" title="추방" subtitle="국가에서 장수를 추방합니다">
|
||||
<div class="kick-panel">
|
||||
<select v-model.number="kickTargetId" class="select-input">
|
||||
<option :value="0">장수 선택</option>
|
||||
@@ -448,7 +448,7 @@ onMounted(() => {
|
||||
{{ general.name }}
|
||||
</option>
|
||||
</select>
|
||||
<button class="ghost" @click="kickGeneral" :disabled="kickTargetId === 0">추방</button>
|
||||
<button class="ghost" :disabled="kickTargetId === 0" @click="kickGeneral">추방</button>
|
||||
</div>
|
||||
</PanelCard>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user