refac: defineComponent => vue3 setup

This commit is contained in:
2022-07-12 00:28:08 +09:00
parent 87e063e03e
commit b31ee022af
7 changed files with 565 additions and 643 deletions
+16 -15
View File
@@ -1,9 +1,5 @@
<template> <template>
<div <div :class="[`chiefBox${chiefLevel}`, 'subRows']" :style="style" @click="onClick">
:class="[`chiefBox${chiefLevel}`, 'subRows']"
:style="style"
@click="$emit('click', this)"
>
<div <div
class="bg1 nameHeader" class="bg1 nameHeader"
:style="{ :style="{
@@ -33,15 +29,14 @@
</div> </div>
</div> </div>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { getNpcColor } from "@/common_legacy"; import { getNpcColor } from "@/common_legacy";
import type { ChiefResponse } from "@/defs/API/NationCommand"; import type { ChiefResponse } from "@/defs/API/NationCommand";
import { mb_strwidth } from "@/util/mb_strwidth"; import { mb_strwidth } from "@/util/mb_strwidth";
import { defineComponent, type PropType } from "vue"; import type { PropType } from "vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
export default defineComponent({ defineProps({
props: {
chiefLevel: VueTypes.integer.isRequired, chiefLevel: VueTypes.integer.isRequired,
style: VueTypes.object.isRequired, style: VueTypes.object.isRequired,
officer: { officer: {
@@ -49,11 +44,17 @@ export default defineComponent({
default: undefined, default: undefined,
}, },
isMe: VueTypes.bool.isRequired, isMe: VueTypes.bool.isRequired,
},
emits: ["click"],
methods: {
mb_strwidth,
getNpcColor,
},
}); });
const emit = defineEmits<{
(event: "click", value: HTMLElement): void,
}>();
function onClick(event: MouseEvent){
if(!event.target){
return;
}
const elem = event.target as HTMLElement;
emit("click", elem);
}
</script> </script>
+30 -59
View File
@@ -234,19 +234,8 @@
<BottomBar title="내무부" /> <BottomBar title="내무부" />
</BContainer> </BContainer>
</template> </template>
<script lang="ts">
import TipTap from "./components/TipTap.vue";
import TopBackBar from "@/components/TopBackBar.vue";
import BottomBar from "@/components/BottomBar.vue";
import { computed, defineComponent, reactive, ref, toRefs } from "vue";
import { isString } from "lodash";
import { type diplomacyState, diplomacyStateInfo, type NationStaticItem } from "./defs";
import { SammoAPI } from "./SammoAPI";
import { joinYearMonth } from "@/util/joinYearMonth";
import { parseYearMonth } from "@/util/parseYearMonth";
import { useToast, BContainer } from "bootstrap-vue-3";
import { unwrap } from "./util/unwrap";
<script lang="ts">
type NationItem = NationStaticItem & { type NationItem = NationStaticItem & {
cityCnt: number; cityCnt: number;
diplomacy: { diplomacy: {
@@ -292,17 +281,36 @@ declare const staticValues: {
max: number; max: number;
}; };
}; };
</script>
<script setup lang="ts">
import TipTap from "./components/TipTap.vue";
import TopBackBar from "@/components/TopBackBar.vue";
import BottomBar from "@/components/BottomBar.vue";
import { computed, reactive, ref, toRefs } from "vue";
import { isString } from "lodash";
import { type diplomacyState, diplomacyStateInfo, type NationStaticItem } from "./defs";
import { SammoAPI } from "./SammoAPI";
import { joinYearMonth } from "@/util/joinYearMonth";
import { parseYearMonth } from "@/util/parseYearMonth";
import { useToast, BContainer } from "bootstrap-vue-3";
import { unwrap } from "./util/unwrap";
export default defineComponent({
components: {
TopBackBar,
BottomBar,
TipTap,
BContainer,
},
setup() {
const toasts = unwrap(useToast()); const toasts = unwrap(useToast());
const self = reactive(staticValues); const self = reactive(staticValues);
const {
editable,
nationMsg,
scoutMsg,
nationID,
year,
month,
nationsList,
gold,
rice,
income,
policy,
warSettingCnt,
} = toRefs(self);
let oldNationMsg = staticValues.nationMsg; let oldNationMsg = staticValues.nationMsg;
const inEditNationMsg = ref(false); const inEditNationMsg = ref(false);
@@ -397,6 +405,8 @@ export default defineComponent({
return handler; return handler;
}; };
const trackNationMsgHeight = trackTiptapFormHeight("#noticeForm");
const trackScoutMsgHeight = trackTiptapFormHeight("#scoutMsgForm");
const incomeGoldCity = computed(() => { const incomeGoldCity = computed(() => {
return (self.income.gold.city * self.policy.rate) / 100; return (self.income.gold.city * self.policy.rate) / 100;
@@ -534,43 +544,4 @@ export default defineComponent({
} }
} }
return {
toasts,
...toRefs(self),
inEditNationMsg,
inEditScoutMsg,
enableEditNationMsg,
rollbackNationMsg,
saveNationMsg,
enableEditScoutMsg,
rollbackScoutMsg,
saveScoutMsg,
diplomacyStateInfo,
joinYearMonth,
parseYearMonth,
trackNationMsgHeight: trackTiptapFormHeight("#noticeForm"),
trackScoutMsgHeight: trackTiptapFormHeight("#scoutMsgForm"),
incomeGoldCity,
incomeGold,
incomeRiceCity,
incomeRiceWall,
incomeRice,
outcomeByBill,
setRate,
rollbackRate,
setBill,
rollbackBill,
setSecretLimit,
rollbackSecretLimit,
setBlockWar,
setBlockScout,
};
},
methods: {},
});
</script> </script>
+11 -14
View File
@@ -13,9 +13,9 @@
</div> </div>
</template> </template>
<script lang="ts"> <script setup lang="ts">
/// https://github.com/andi23rosca/drag-select-vue/blob/master/src/DragSelect.vue /// https://github.com/andi23rosca/drag-select-vue/blob/master/src/DragSelect.vue
import { defineComponent, ref, watch, onMounted, onBeforeUnmount, type PropType } from "vue"; import { ref, watch, onMounted, onBeforeUnmount, type PropType } from "vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
function getDimensions(p1: coord, p2: coord): rect { function getDimensions(p1: coord, p2: coord): rect {
@@ -36,8 +36,7 @@ function collisionCheck(node1: DOMRect, node2: DOMRect): boolean {
type coord = { x: number; y: number }; type coord = { x: number; y: number };
type rect = { width: number; height: number }; type rect = { width: number; height: number };
export default defineComponent({ const props = defineProps({
props: {
attribute: VueTypes.string.isRequired, attribute: VueTypes.string.isRequired,
color: VueTypes.string.def("#4299E1"), color: VueTypes.string.def("#4299E1"),
opacity: VueTypes.number.def(0.7), opacity: VueTypes.number.def(0.7),
@@ -51,9 +50,14 @@ export default defineComponent({
required: false, required: false,
default: false, default: false,
}, },
}, });
emits: ["update:modelValue", "dragDone", "dragStart"],
setup(props, { emit }) { const emit = defineEmits<{
(event: "update:modelValue", value: Set<string>): void;
(event: "dragDone", value: Set<string>): void;
(event: "dragStart"): void;
}>();
const intersected = ref<Set<string>>(props.modelValue); const intersected = ref<Set<string>>(props.modelValue);
const container = ref<HTMLElement>(); const container = ref<HTMLElement>();
@@ -211,11 +215,4 @@ export default defineComponent({
document.removeEventListener("touchend", endDrag); document.removeEventListener("touchend", endDrag);
}); });
}); });
return {
intersected,
container,
};
},
});
</script> </script>
+11 -13
View File
@@ -5,17 +5,16 @@
<template v-if="key !== 0"> , </template> <template v-if="key !== 0"> , </template>
<a <a
:style="{ color: colorMap[distance as keyof typeof colorMap] ?? undefined, textDecoration:'underline' }" :style="{ color: colorMap[distance as keyof typeof colorMap] ?? undefined, textDecoration:'underline' }"
@click="$emit('selected', cityID)" @click="emit('selected', cityID)"
>{{ citiesMap.get(cityID)?.name }}</a >{{ citiesMap.get(cityID)?.name }}</a
> >
</template> </template>
</div> </div>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { defineComponent, type PropType } from "vue"; import type { PropType } from "vue";
export default defineComponent({ defineProps({
props: {
distanceList: { distanceList: {
type: Object as PropType<Record<number, number[]>>, type: Object as PropType<Record<number, number[]>>,
required: true, required: true,
@@ -24,16 +23,15 @@ export default defineComponent({
type: Object as PropType<Map<number, { name: string }>>, type: Object as PropType<Map<number, { name: string }>>,
required: true, required: true,
}, },
}, });
emits: ["selected"],
data() { const emit = defineEmits<{
return { (event: "selected", value: number): void;
colorMap: { }>();
const colorMap = {
1: "magenta", 1: "magenta",
2: "orange", 2: "orange",
3: "yellow", 3: "yellow",
},
}; };
},
});
</script> </script>
+17 -21
View File
@@ -56,21 +56,24 @@
<div class="crewTypeInfo text-start" v-html="crewType.info.join('<br>')" /> <div class="crewTypeInfo text-start" v-html="crewType.info.join('<br>')" />
</div> </div>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { defineComponent, ref } from "vue"; import { onMounted, ref, watch } from "vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
export default defineComponent({ const props = defineProps({
props: {
crewType: VueTypes.object.isRequired, crewType: VueTypes.object.isRequired,
leadership: VueTypes.number.isRequired, leadership: VueTypes.number.isRequired,
commandName: VueTypes.string.isRequired, commandName: VueTypes.string.isRequired,
currentCrewType: VueTypes.number.def(-1), currentCrewType: VueTypes.number.def(-1),
crew: VueTypes.number.def(0), crew: VueTypes.number.def(0),
goldCoeff: VueTypes.number.isRequired, goldCoeff: VueTypes.number.isRequired,
}, });
emits: ["submitOutput", "update:amount"],
setup(props, { emit }) { const emit = defineEmits<{
(event: "submitOutput", e: Event, amount: number, crewtypeID: number): void;
(event: "update:amount", value: number): void;
}>();
const amount = ref(0); const amount = ref(0);
function beHalf() { function beHalf() {
@@ -93,20 +96,13 @@ export default defineComponent({
emit("submitOutput", e, amount.value, props.crewType.id); emit("submitOutput", e, amount.value, props.crewType.id);
} }
onMounted(() => {
beFilled(); beFilled();
return {
amount,
beHalf,
beFilled,
beFull,
doSubmit,
};
},
watch: {
amount(val: number) {
this.$emit("update:amount", val);
},
},
}); });
watch(amount, (value) => {
emit("update:amount", value);
});
</script> </script>
+46 -91
View File
@@ -1,20 +1,12 @@
<template> <template>
<TopBackBar <TopBackBar v-model:searchable="searchable" :title="commandName" :type="procEntryMode" />
v-model:searchable="searchable"
:title="commandName"
:type="procEntryMode"
/>
<div class="bg0"> <div class="bg0">
<div v-if="commandName == '몰수'"> <div v-if="commandName == '몰수'">
장수의 자금이나 군량을 몰수합니다.<br> 장수의 자금이나 군량을 몰수합니다.<br />
몰수한것은 국가재산으로 귀속됩니다.<br> 몰수한것은 국가재산으로 귀속됩니다.<br />
</div>
<div v-else-if="commandName == '포상'">
국고로 장수에게 자금이나 군량을 지급합니다.<br>
</div>
<div v-else-if="commandName == '증여'">
자신의 자금이나 군량을 다른 장수에게 증여합니다.<br>
</div> </div>
<div v-else-if="commandName == '포상'">국고로 장수에게 자금이나 군량을 지급합니다.<br /></div>
<div v-else-if="commandName == '증여'">자신의 자금이나 군량을 다른 장수에게 증여합니다.<br /></div>
<div class="row"> <div class="row">
<div class="col-12 col-md-5"> <div class="col-12 col-md-5">
장수 : 장수 :
@@ -29,49 +21,44 @@
<div class="col-2 col-md-1"> <div class="col-2 col-md-1">
자원 : 자원 :
<b-button-group> <b-button-group>
<b-button <b-button :pressed="isGold" @click="isGold = true"> </b-button>
:pressed="isGold" <b-button :pressed="!isGold" @click="isGold = false"> </b-button>
@click="isGold=true"
>
</b-button>
<b-button
:pressed="!isGold"
@click="isGold=false"
>
</b-button>
</b-button-group> </b-button-group>
</div> </div>
<div class="col-7 col-md-4"> <div class="col-7 col-md-4">
금액 : 금액 :
<SelectAmount <SelectAmount v-model="amount" :amountGuide="amountGuide" :maxAmount="maxAmount" :minAmount="minAmount" />
v-model="amount"
:amountGuide="amountGuide"
:maxAmount="maxAmount"
:minAmount="minAmount"
/>
</div> </div>
<div class="col-3 col-md-2 d-grid"> <div class="col-3 col-md-2 d-grid">
<b-button <b-button variant="primary" @click="submit">
variant="primary"
@click="submit"
>
{{ commandName }} {{ commandName }}
</b-button> </b-button>
</div> </div>
</div> </div>
</div> </div>
<BottomBar <BottomBar :title="commandName" :type="procEntryMode" />
:title="commandName"
:type="procEntryMode"
/>
</template> </template>
<script lang="ts"> <script lang="ts">
declare const procRes: {
distanceList: Record<number, number[]>;
cities: [number, string][];
generals: procGeneralRawItemList;
generalsKey: procGeneralKey[];
minAmount: number;
maxAmount: number;
amountGuide: number[];
};
declare const staticValues: {
commandName: string;
entryInfo: ["General" | "Nation", unknown];
};
</script>
<script setup lang="ts">
import SelectGeneral from "@/processing/SelectGeneral.vue"; import SelectGeneral from "@/processing/SelectGeneral.vue";
import SelectAmount from "@/processing/SelectAmount.vue"; import SelectAmount from "@/processing/SelectAmount.vue";
import { defineComponent, ref } from "vue"; import { ref } from "vue";
import { unwrap } from "@/util/unwrap"; import { unwrap } from "@/util/unwrap";
import type { Args } from "@/processing/args"; import type { Args } from "@/processing/args";
import TopBackBar from "@/components/TopBackBar.vue"; import TopBackBar from "@/components/TopBackBar.vue";
@@ -84,42 +71,19 @@ import {
type procGeneralRawItemList, type procGeneralRawItemList,
} from "./processingRes"; } from "./processingRes";
import { getNpcColor } from "@/common_legacy"; import { getNpcColor } from "@/common_legacy";
declare const commandName: string;
declare const entryInfo: ['General'|'Nation', unknown];
declare const procRes: { const citiesMap = ref(new Map<
distanceList: Record<number, number[]>;
cities: [number, string][];
generals: procGeneralRawItemList;
generalsKey: procGeneralKey[];
minAmount: number;
maxAmount: number;
amountGuide: number[];
};
export default defineComponent({
components: {
SelectGeneral,
SelectAmount,
TopBackBar,
BottomBar,
},
setup() {
const citiesMap = new Map<
number, number,
{ {
name: string; name: string;
info?: string; info?: string;
} }
>(); >());
for (const [id, name] of procRes.cities) { for (const [id, name] of procRes.cities) {
citiesMap.set(id, { name }); citiesMap.value.set(id, { name });
} }
const generalList = convertGeneralList( const generalList = convertGeneralList(procRes.generalsKey, procRes.generals);
procRes.generalsKey,
procRes.generals
);
const amount = ref(1000); const amount = ref(1000);
const isGold = ref(true); const isGold = ref(true);
@@ -127,12 +91,10 @@ export default defineComponent({
function textHelpGeneral(gen: procGeneralItem): string { function textHelpGeneral(gen: procGeneralItem): string {
const nameColor = getNpcColor(gen.npc); const nameColor = getNpcColor(gen.npc);
const name = nameColor const name = nameColor ? `<span style="color:${nameColor}">${gen.name}</span>` : gen.name;
? `<span style="color:${nameColor}">${gen.name}</span>` return `${name} (금${unwrap(gen.gold).toLocaleString()}/쌀${unwrap(gen.rice).toLocaleString()}) (${gen.leadership}/${
: gen.name; gen.strength
return `${name} (금${unwrap(gen.gold).toLocaleString()}/${unwrap(gen.rice).toLocaleString()}) (${ }/${gen.intel})`;
gen.leadership
}/${gen.strength}/${gen.intel})`;
} }
async function submit(e: Event) { async function submit(e: Event) {
@@ -146,22 +108,15 @@ export default defineComponent({
unwrap(e.target).dispatchEvent(event); unwrap(e.target).dispatchEvent(event);
} }
return { const { commandName,entryInfo } = staticValues;
procEntryMode: <'chief'|'normal'>(entryInfo[0] == 'Nation'?'chief':'normal'), const searchable = getProcSearchable();
searchable: getProcSearchable(),
amount, const procEntryMode: "chief" | "normal" = entryInfo[0] == "Nation" ? "chief" : "normal";
isGold,
selectedGeneralID, const {
citiesMap: ref(citiesMap), minAmount,
distanceList: procRes.distanceList, maxAmount,
minAmount: ref(procRes.minAmount), amountGuide
maxAmount: ref(procRes.maxAmount), } = procRes;
amountGuide: procRes.amountGuide,
generalList,
commandName,
textHelpGeneral,
submit,
};
},
});
</script> </script>
+20 -16
View File
@@ -32,29 +32,33 @@
</b-button> </b-button>
</div> </div>
</template> </template>
<script lang="ts"> <script setup lang="ts">
import { defineComponent } from "vue"; import { ref, watch } from "vue";
import VueTypes from "vue-types"; import VueTypes from "vue-types";
export default defineComponent({ const props = defineProps({
props: {
modelValue: VueTypes.number.isRequired, modelValue: VueTypes.number.isRequired,
minAmount: VueTypes.number.isRequired, minAmount: VueTypes.number.isRequired,
maxAmount: VueTypes.number.isRequired, maxAmount: VueTypes.number.isRequired,
amountGuide: VueTypes.arrayOf(Number).def([1000, 2000, 5000, 10000]), amountGuide: VueTypes.arrayOf(Number).def([1000, 2000, 5000, 10000]),
step: VueTypes.number.def(1), step: VueTypes.number.def(1),
}, });
emits: ["update:modelValue"],
data() { const emit = defineEmits<{
return { (event: "update:modelValue", value: number): void;
amount: this.modelValue, }>();
};
}, const amount = ref(props.modelValue);
watch: {
amount(val: number) { watch(
this.$emit("update:modelValue", val); () => props.modelValue,
}, (value) => {
}, amount.value = value;
}
);
watch(amount, (value) => {
emit("update:modelValue", value);
}); });
</script> </script>