From 343930f7661ef53e04f9a09c84e1bbad78bc695a Mon Sep 17 00:00:00 2001 From: Hide_D Date: Wed, 27 Jul 2022 17:59:36 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B6=94=EB=B0=A9=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .phan/config.php | 1 - hwe/b_troop.php | 251 -------------------------------- hwe/templates/commandButton.php | 2 +- hwe/ts/PageTroop.vue | 146 ++++++++++++++++--- 4 files changed, 123 insertions(+), 277 deletions(-) delete mode 100644 hwe/b_troop.php diff --git a/.phan/config.php b/.phan/config.php index 4624a3b4..1daf4128 100644 --- a/.phan/config.php +++ b/.phan/config.php @@ -57,7 +57,6 @@ return [ 'hwe/b_myPage.php', 'hwe/v_processing.php', 'hwe/b_tournament.php', - 'hwe/b_troop.php', 'hwe/c_tournament.php', 'hwe/func_auction.php', 'hwe/func_command.php', diff --git a/hwe/b_troop.php b/hwe/b_troop.php deleted file mode 100644 index 5260b3ac..00000000 --- a/hwe/b_troop.php +++ /dev/null @@ -1,251 +0,0 @@ -setReadOnly(); -$userID = Session::getUserID(); - -$db = DB::db(); - -increaseRefresh("부대편성", 1); - -$me = $db->queryFirstRow('SELECT no,nation,troop,`officer_level`,permission,penalty FROM general WHERE owner=%i', $userID); -$permission = checkSecretPermission($me, false); - -$troops = []; -foreach ($db->query('SELECT troop_leader,name FROM troop WHERE nation = %i', $me['nation']) as $rawTroop) { - $troops[$rawTroop['troop_leader']] = [ - 'name' => $rawTroop['name'], - 'users' => [] - ]; -} - -foreach ($db->query( - 'SELECT no,name,turntime,troop,city FROM general WHERE troop!=0 AND nation = %i ORDER BY turntime ASC', - $me['nation'] -) as $general) { - if (!key_exists($general['troop'], $troops)) { - trigger_error("올바르지 않은 부대 소속 {$general['no']}, {$general['name']} : {$general['troop']}"); - continue; - } - - $general['cityText'] = CityConst::byID($general['city'])->name; - - $troops[$general['troop']]['users'][] = $general; -} - -if ($troops) { - $troopLeaders = $db->query( - 'SELECT no,name,picture,imgsvr,turntime,city,troop FROM general WHERE no IN %li', - array_keys($troops) - ); - $generalTurnList = []; - - foreach ($db->queryAllLists( - 'SELECT general_id, turn_idx, brief FROM general_turn WHERE general_id IN %li AND turn_idx < 5 ORDER BY general_id ASC, turn_idx ASC', - array_column($troopLeaders, 'no') - ) as [$generalID, $turnIdx, $brief]) { - if (!key_exists($generalID, $generalTurnList)) { - $generalTurnList[$generalID] = []; - } - $generalTurnList[$generalID][$turnIdx] = $brief; - } - - foreach ($troopLeaders as $troopLeader) { - $imageTemp = GetImageURL($troopLeader['imgsvr']); - - $troopLeader['pictureFullPath'] = "$imageTemp/{$troopLeader['picture']}"; - $troopLeader['cityText'] = CityConst::byID($troopLeader['city'])->name; - - $turnText = []; - foreach ($generalTurnList[$troopLeader['no']] as $rawTurnIdx => $brief) { - if ($brief != '집합') { - $brief = '~'; - } - $turnIdx = $rawTurnIdx + 1; - $turnText[] = "{$turnIdx} : {$brief}"; - } - $troopLeader['turnText'] = join('
', $turnText); - $troops[$troopLeader['troop']]['leader'] = $troopLeader; - } -} - -uasort($troops, function ($lhs, $rhs) { - return $lhs['leader']['turntime'] <=> $rhs['leader']['turntime']; -}) - -?> - - - - - - - - <?= UniqueConst::$serverName ?>: 부대편성 - - - - - - - -
- - - - -
부 대 편 성
- - - - - - - - - - - - - - - - - $troop) { - $troopLeader = $troop['leader']; - $genlistText = []; - $cityText = $troopLeader['cityText']; - $cityID = $troopLeader['city']; - $leaderID = $troopLeader['no']; - - foreach ($troop['users'] as $troopUser) { - $spanClass = 'troopUser'; - if ($troopUser['city'] !== $cityID) { - $spanClass .= ' diffCity'; - } - if ($troopUser['no'] == $leaderID) { - $spanClass .= ' leader'; - } - $genlistText[] = "{$troopUser['name']}【{$troopUser['cityText']}】"; - } - - $genlistText = sprintf('%s (%d명)', join(', ', $genlistText), count($genlistText)); ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $troop) { - ?> - - - -
선 택부 대 정 보부 대 장장 수부대장행동
- - - - - - -

");background-size:64px;'> 
- 【턴】 - - -
- - -
 
");background-size:64px;'>  - -
- - - - -
- 【턴】 - - -
-
-
- -
-
-
부대명
-
-
-
-
- - -
-
-
부대명
-
-
-
-
-
-
- -
- - - - - - - - - -
-
- - - \ No newline at end of file diff --git a/hwe/templates/commandButton.php b/hwe/templates/commandButton.php index 29c513c7..059d6740 100644 --- a/hwe/templates/commandButton.php +++ b/hwe/templates/commandButton.php @@ -1,6 +1,6 @@ '>회 의 실 '>기 밀 실 - '>부대 편성 + '>부대 편성 '>외 교 부 '>인 사 부 '>내 무 부 diff --git a/hwe/ts/PageTroop.vue b/hwe/ts/PageTroop.vue index 57b97ff0..74ce3958 100644 --- a/hwe/ts/PageTroop.vue +++ b/hwe/ts/PageTroop.vue @@ -42,7 +42,10 @@
-
+
부대 탑승 {{ me.no == me.troop ? "부대 해산" : "부대 탈퇴" }} - 부대원 추방... + 부대원 추방... + 부대명 변경...
-
- -
- 부대명 변경 +
+
부대명 변경
+
+ +
+
+ 취소 +
+
+ 변경 +
+
+
+
부대명 추방
+
+ + + +
+
+ 취소 +
+
+ 추방
-
@@ -113,7 +138,7 @@ import TopBackBar from "@/components/TopBackBar.vue"; import BottomBar from "@/components/BottomBar.vue"; import { onMounted, provide, ref } from "vue"; import { SammoAPI } from "./SammoAPI"; -import { BContainer, BButton, useToast, BFormInput } from "bootstrap-vue-3"; +import { BContainer, BButton, useToast, BFormInput, BFormSelect, BFormSelectOption } from "bootstrap-vue-3"; import { unwrap } from "./util/unwrap"; import { isString } from "lodash"; import type { GeneralListItem, GeneralListItemP1 } from "./defs/API/Nation"; @@ -201,8 +226,18 @@ const troopList = ref(new Map()); const generalList = ref(new Map()); const nationInfo = ref(); -const tryChangeTroopTarget = ref(0); const newTroopName = ref(""); +const kickTroopMemberID = ref(0); + +type TroopAction = { + type: "kickMember" | "changeName" | undefined; + targetTroop: number; +}; + +const tryTroopActionTarget = ref({ + type: undefined, + targetTroop: 0, +}); async function refresh() { try { @@ -375,10 +410,18 @@ async function exitTroop() { await refresh(); } -async function changeTroopName() { - const troopID = tryChangeTroopTarget.value; +function openChangeTroopNameDialog(troop: TroopInfo){ + tryTroopActionTarget.value = { + type: 'changeName', + targetTroop: troop.troopID + } + newTroopName.value = troop.troopName; +} + +async function changeTroopName(troop: TroopInfo) { + const troopID = troop.troopID; const troopName = newTroopName.value; - const oldTroopName = troopList.value.get(troopID)?.troopName ?? "??"; + const oldTroopName = troop.troopName; const josaRo = pick(troopName, "로"); if (!confirm(`${oldTroopName} 부대의 이름을 ${troopName}${josaRo} 바꾸시겠습니까?`)) { return; @@ -404,6 +447,61 @@ async function changeTroopName() { } await refresh(); } + + +function openKickTroopMemberDialog(troop: TroopInfo){ + tryTroopActionTarget.value = { + type: 'kickMember', + targetTroop: troop.troopID + } + for(const member of troop.members){ + if(member.no == troop.troopID){ + continue; + } + kickTroopMemberID.value = member.no; + break; + } +} + +async function kickTroopMember(troop: TroopInfo) { + const kickMember = generalList.value.get(kickTroopMemberID.value); + if(kickMember === undefined){ + toasts.danger({ + title: "오류", + body: "잘못된 접근입니다.", + }); + return; + } + const troopID = troop.troopID; + const troopName = troop.troopName; + + const generalID = kickMember.no; + const generalName = kickMember.name; + const josaUl = pick(generalName, "을"); + if (!confirm(`${troopName} 부대에서 ${generalName}${josaUl} 추방하시겠습니까?`)) { + return; + } + try { + await SammoAPI.Troop.KickFromTroop({ + troopID, + generalID, + }); + + toasts.info({ + title: "완료", + body: `${generalName}${josaUl} 추방했습니다.`, + }); + } catch (e) { + if (isString(e)) { + toasts.danger({ + title: "오류", + body: e, + }); + } + console.error(e); + } + await refresh(); +}