diff --git a/hwe/b_myCityInfo.php b/hwe/b_myCityInfo.php
index c6f67f91..b3e4fd7b 100644
--- a/hwe/b_myCityInfo.php
+++ b/hwe/b_myCityInfo.php
@@ -37,13 +37,10 @@ $sel = [$type => "selected"];
=UniqueConst::$serverName?>: 세력도시
=WebUtil::printCSS('../e_lib/bootstrap.min.css')?>
=WebUtil::printCSS('../d_shared/common.css')?>
-=WebUtil::printCSS('../e_lib/jquery-ui.min.css')?>
=WebUtil::printCSS('css/common.css')?>
=WebUtil::printJS('../d_shared/common_path.js')?>
=WebUtil::printJS('dist_js/vendors.js')?>
-=WebUtil::printJS('dist_js/common.js')?>
-=WebUtil::printJS('../e_lib/jquery-ui.min.js')?>
-=WebUtil::printJS('js/ext.expand_city.js')?>
+=WebUtil::printJS('dist_js/extExpandCity.js')?>
diff --git a/hwe/js/ext.expand_city.js b/hwe/js/ext.expand_city.js
deleted file mode 100644
index dc946be3..00000000
--- a/hwe/js/ext.expand_city.js
+++ /dev/null
@@ -1,899 +0,0 @@
-
-$(function() {
-
- var cityList = {};
- var userList = {};
-
- var cityGroupOrder = ['하북','중원','서북','서촉','남중','초','오월','동이'];
- var city규모 = {특:1,대:2,중:3,소:4,이:5,진:6,관:7,수:8};
- window.cityList = cityList;
- window.userList = userList;
-
- var basicPath = document.location.pathname;
- basicPath = basicPath.substring(0, basicPath.lastIndexOf('/'))+'/';
-
-
-
- var mergeSort = function(arr,cmpFunc){
-
- if(typeof cmpFunc == "undefined"){
- cmpFunc = function(a,b){
- if(ab) return 1;
- return 0;
- }
- }
-
- var merge = function(left,right){
- var retVal=[];
-
- var leftIdx=0;
- var rightIdx=0;
-
- while(leftIdx'+
- '');
- $win.hide();
-
- $win.css('font-size','9pt');
-
-
-
- $('#fake_form').css('display','inline');
- $('body').append($win);
-
- $('#inner_table').attr('border','1').attr('cellspacing',"0").attr('cellpadding',"0")
- .attr('bordercolordark',"gray").attr('bordercolorlight',"black").attr('align','center')
- .css('font-size','13px').css('width','290px');
-
- $('#inner_table thead tr');
-
- $('#fake_form').submit(function(){
- return false;
- });
-
- $('#in_frame').load(function(){
- $('#in_frame').contents().find('div').click(function(){$('#city_select').change();});
- });
-
- $("#duty_radio").buttonset();
-
- var $city_select = $('#city_select');
- $city_select.css('color','white').css('background-color','black');
-
-
- $city_select.change(function(event){
- if($city_select.val()==null){
- $city_select.val(tmpOldVal);
- return false;
- }
-
- if($city_select.val() == tmpOldVal){
- return false;
- }
-
- tmpOldVal = $city_select.val();
- //console.log(tmpOldVal);
- var newInfo = subCityList[tmpOldVal];
- var cityInfo = newInfo.city;
-
- var p태수 = cityInfo.p태수 && currUser.p태수;
- var p군사 = cityInfo.p군사 && currUser.p군사;
- var p종사 = cityInfo.p종사 && currUser.p종사;
-
- //console.log(p태수,p군사,p종사);
-
- $('#duty_type1').button({disabled:!p태수});
- $('#duty_type2').button({disabled:!p군사});
- $('#duty_type3').button({disabled:!p종사});
-
- var $태수 = cityInfo.$태수;
- var $군사 = cityInfo.$군사;
- var $종사 = cityInfo.$종사;
-
-
-
- return true;
- });
-
-
- $win.dialog({
- autoOpen:false,
- width:1005,
- height:680,
- buttons:{
- "임명":function(){
- //console.log("임명!");
-
- var $checked = $('#duty_radio :radio:checked');
-
- if($checked.length==0 || $checked.attr('disabled')=='disabled'){
- alert('직책을 선택해주세요!');
- return false;
- }
- var type = $checked.attr('value');
- var text = $checked.next().text();
- var userVal = currUser.val;
- var userName = currUser.name;
- var cityVal = $city_select.val();
-
- var cityInfo = subCityList[cityVal].city;
-
- $.post(basicPath+'j_myBossInfo.php',{
- destCityID:cityVal,
- destGeneralID:userVal,
- officerLevel:type,
- action:'임명'
- },function(rawData){
-
- cityInfo['p'+text]=false;
- var $target = cityInfo.users.find('.mode_'+type);
- $target.prop('disabled',true);
- $target.css('background','transparent');
- $target.css('border','0');
- $target.css('color','');
-
- cityInfo['$'+text].html(userName);
-
- $win.dialog("close");
- });
-
-
- },
- "닫기":function(){
- $win.dialog("close");
- }
-
- }
- });
-
-
-
- //console.log($win.parent());
- $win.parent().css('font-size','10pt');
- }
-
- $('#ext_win').dialog("close").dialog( "option", "position", { my: "center top", at: "center bottom", of: userInfo.$user} );
-
- var $innerContent = $('#inner_table .content');
- $innerContent.html('');
- $("#user_name").html(userInfo.name+'['+userInfo.city+']');
-
- $('#city_select').html('');
-
- $.each(cityList,function(idx,cityInfo){
- var 지역 = cityInfo.지역;
-
- var p태수 = cityInfo.p태수 && currUser.p태수;
- var p군사 = cityInfo.p군사 && currUser.p군사;
- var p종사 = cityInfo.p종사 && currUser.p종사;
-
- var newInfo = {
- 지역 : 지역,
- 규모 : cityInfo.규모,
- 이름 : cityInfo.이름,
- val : cityInfo.val,
- city : cityInfo,
- p태수 : p태수,
- p군사 : p군사,
- p종사 : p종사
- };
-
- //console.log(newInfo);
-
- if(p태수 || p군사 || p종사){
- if(typeof subCityGroupList[지역] == 'undefined'){
- subCityGroupList[지역] = [];
- }
- subCityGroupList[지역].push(newInfo);
- subCityList[cityInfo.val] = newInfo;
- }
-
- });
-
- $.each(cityGroupOrder,function(idx,groupName){
- if(typeof subCityGroupList[groupName] == 'undefined'){
-
- return true;
- }
-
- var subList = subCityGroupList[groupName];
-
- var $group = $('| 【 '+groupName+' 】 |
');
- $innerContent.append($group);
-
- subList.sort(function(a,b){
-
- var cmp규모 = city규모[a.규모] - city규모[b.규모];
- if(cmp규모 != 0) return cmp규모;
-
- return a.이름.localeCompare(b.이름);
- });
- var $optgroup = $('');
-
- $.each(subList,function(idx,newInfo){
- $optgroup.append('');
-
- var cityInfo = newInfo.city;
- var $city = $('| '+newInfo.이름+' |
');
-
- var $태수 = cityInfo.$태수.clone();
- $city.append($태수);
- if(!newInfo.p태수){
- $태수.css('color','red');
- }
- else{
- $태수.click(function(){
- $('#duty_radio :radio:eq(0)').attr('checked','checked');
- $('#duty_radio :radio').button('refresh');
- }).css('cursor','pointer');
- }
-
-
- var $군사 = cityInfo.$군사.clone();
- $city.append($군사);
- if(!newInfo.p군사)$군사.css('color','red');
- else{
- $군사.click(function(){
- $('#duty_radio :radio:eq(1)').attr('checked','checked');
- $('#duty_radio :radio').button('refresh');
- }).css('cursor','pointer');
- }
-
- var $종사 = cityInfo.$종사.clone();
- $city.append($종사);
- if(!newInfo.p종사)$종사.css('color','red');
- else{
- $종사.click(function(){
- $('#duty_radio :radio:eq(2)').attr('checked','checked');
- $('#duty_radio :radio').button('refresh');
- }).css('cursor','pointer');
- }
-
- $innerContent.append($city);
- $city.click(function(){
- $('#city_select').val(newInfo.val).change();
- });
-
- });
-
- $('#city_select').append($optgroup);
- });
-
- tmpOldVal = $('#city_select').val();
- $('#city_select').change();
- $('#ext_win').dialog("open");
- };
-
- var loadDuty = function(){
-
- try{
- $('.for_duty').remove();
- $.get(basicPath+'b_myBossInfo.php',function(rawData){
- $html = $(rawData);
- //window.$html = $html;
-
- var cnt =0;
- var $tmpTable = $html.filter('#officer_list').eq(0);
-
- $selects = $tmpTable.find("select");
- if($selects.length == 0){
- alert("수뇌가 아닙니다!");
- return false;
- }
-
- var setUserAvailable = function($userList,typeName){
- $userList.each(function(idx){
- var $this = $(this);
-
- var val = $this.val();
- var name = $.trim($this.text());
-
- for(var i=name.length-1;i>0;i--){
- if(name[i]=='【'){
- name = $.trim(name.substr(0,i));
- break;
- }
- }
-
- if(val == '0'){
- return true;
- }
-
- if(typeof userList[name] != 'undefined'){
- userList[name].val = val;
- userList[name][typeName] = true;
- }
-
- });
- };
-
- var setCityAvailiable = function($cityList,typeName){
- $cityList.each(function(idx){
-
- var $this = $(this);
-
- var val = $.trim($this.val());
- var name = $.trim($this.text());
-
- cityList[name].val = val;
- cityList[name][typeName] = true;
- });
- }
-
- $.each(cityList,function(idx,cityInfo){
- cityInfo.p태수=false;
- cityInfo.p군사=false;
- cityInfo.p종사=false;
- });
-
- $.each(userList,function(idx,userInfo){
- userInfo.p태수=false;
- userInfo.p군사=false;
- userInfo.p종사=false;
- });
-
- setUserAvailable($selects.eq(1).find("option"),"p태수");
- setUserAvailable($selects.eq(3).find("option"),"p군사");
- setUserAvailable($selects.eq(5).find("option"),"p종사");
-
- setCityAvailiable($selects.eq(0).find("option"),"p태수");
- setCityAvailiable($selects.eq(2).find("option"),"p군사");
- setCityAvailiable($selects.eq(4).find("option"),"p종사");
-
-
- $.each(cityList,function(idx,cityInfo){
-
- //console.log(cityInfo.users.children());
-
- cityInfo.users.children().each(function(idx){
- //console.log(this);
- var $this = $(this);
-
- var username = $this.data('username');
-
- var userInfo = userList[username];
- if(!userInfo){
- return true;
- }
-
- if(userInfo.val == '-1'){
- return true;
- }
-
- $name = $this.find('.nameplate');
-
- $name.append('
');
-
-
- var addBtn=function($name,cityInfo,userInfo,type,text,warn){
-
- var enabled = cityInfo['p'+text]&&userInfo['p'+text];
- var cityVal = cityInfo.val;
- var $btn = $('');
- $btn.addClass('mode_'+type);
- $btn.addClass('for_duty');
-
- if(!enabled){
- $btn.prop('disabled',true);
- $btn.css('background','transparent');
- $btn.css('border','0');
- }
- else{
- if(userInfo.is수뇌){
- $btn.css('color','red');
- }
- }
-
- $btn.css('padding','1px 4px');
- $btn.css('margin','0');
-
- $btn.click(function(){
- if(userInfo.is수뇌){
- if(!confirm('수뇌입니다. 임명할까요?')){
- return false;
- }
- }
-
- $.post(basicPath+'j_myBossInfo.php',{
- destCityID:cityVal,
- destGeneralID:userInfo.val,
- officerLevel:type,
- action:'임명'
- },function(rawData){
-
- cityInfo['p'+text]=false;
- var $target = cityInfo.users.find('.mode_'+type);
- $target.prop('disabled',true);
- $target.css('background','transparent');
- $target.css('border','0');
- $target.css('color','');
-
- cityInfo['$'+text].html(userInfo.name);
- });
- });
-
- //console.log($btn);
- $name.append($btn);
- };
-
- addBtn($name,cityInfo,userInfo,4,'태수');
- addBtn($name,cityInfo,userInfo,3,'군사');
- addBtn($name,cityInfo,userInfo,2,'종사');
-
- //특수 버튼!
- if(userInfo.p태수||userInfo.p군사||userInfo.p종사){
- var $btn = $('');
- $btn.addClass('for_duty');
- if(userInfo.is수뇌){
- $btn.css('color','red');
- }
- $btn.css('padding','1px 4px');
- $btn.css('margin','0');
-
- $btn.click(function(){
- if(userInfo.is수뇌){
- if(!confirm('수뇌입니다. 임명할까요?')){
- return false;
- }
- }
-
- extDutyWindow(userInfo);
- });
-
- $btn.css('border','solid 1px Chocolate').css('background-color','#400000').css('margin-left','4px');
- $btn.css('line-hight','20px').css('color','GhostWhite').css('padding','2px 2px').css('height','18px').css('line-height','8px');
-
- //$name.append($btn);
-
- }
- });
- });
-
- });
-
-
- }
- catch(a){
- console.log(a);
- }
-
- return false;
- };
-
- var loadUser = function(){
- $.each(cityList,function(idx,val){
- if(typeof val.users == "undefined"){
- val.obj.append(''+
- ''+
- '| 이 름 | 통무지 | 부 대 | 자 금 | '+
- '군 량 | 守 | 병 종 | '+
- '병 사 | 훈련 | 사기 | 명 령 | '+
- '삭턴 | 턴 | '+
- ' '+
- ' |
');
-
- val.users = val.obj.find(".cityUserBody");
- }
- else{
- val.users.html("");
- }
- });
-
-
- $.get(basicPath+'b_genList.php',function(rawData){
- var cnt =0;
-
- var $helper = $('#helper_genlist');
- $helper.html('').append($.parseHTML(rawData));
-
- var tmpUsers = $('#general_list tbody tr');
-
- tmpUsers.each(function(idx){
- var $this = $(this);
-
- var $city = $this.children('.i_city');
- $city.remove();
- var cityName = $.trim($city.text());
-
- var $name = $this.children('.i_name');
- $name.addClass('nameplate');
-
- var name = $name.find('.t_name').text();
-
- var $work = $this.children('.i_action');
-
- var cityInfo = cityList[cityName];
- if(typeof cityInfo == 'undefined'){
- return true;
- }
- if(cityInfo.warn주민)$work.html($work.html().split('정착 장려').join('정착 장려'));
- if(cityInfo.warn농업)$work.html($work.html().split('농지 개간').join('농지 개간'));
- if(cityInfo.warn상업)$work.html($work.html().split('상업 투자').join('상업 투자'));
- if(cityInfo.warn치안)$work.html($work.html().split('치안 강화').join('치안 강화'));
- if(cityInfo.warn수비)$work.html($work.html().split('수비 강화').join('수비 강화'));
- if(cityInfo.warn성벽)$work.html($work.html().split('성벽 보수').join('성벽 보수'));
-
-
-
- var $stat = $this.children('.i_stat');
- var stat = $stat.text();
-
- var is수뇌 = stat.indexOf('+')>=0;
-
- $this.data('username',name);
-
- if(cityList[cityName].$태수.text() == name){
- cityList[cityName].$태수.html('{0}'.format(name));
- }
- if(cityList[cityName].$군사.text() == name){
- cityList[cityName].$군사.html('{0}'.format(name));
- }
- if(cityList[cityName].$종사.text() == name){
- cityList[cityName].$종사.html('{0}'.format(name));
- }
-
- userList[name]={
- $city:cityInfo,
- city:cityName,
- $user:$this,
- name:name,
- val:'-1',
- p태수:false,
- p군사:false,
- p종사:false,
- is수뇌:is수뇌
- };
-
- if(cityList[cityName]){
- cityList[cityName].users.append($this);
- }
-
- });
- });
-
- if($("#loadDutyBtn").length == 0){
-
- var $onBossList = $('');
- $onBossList.click(function(){
- loadDuty();
- return false;
- });
-
- $('form').append($onBossList);
- }
-
- $('#by_users').show();
- };
-
- var mainFunc = function(){
- //대상 추출
- window.cityList = {};
- window.userList = {};
-
- $("form").each(function(){
- var $this = $(this);
- $this.attr('name','p'+$this.attr('name'));
- });
-
- $("table").each(function(idx,val){
- $this = $(this);
-
-
- if($this.attr('class')=='tb_layout bg2'){
- $this.addClass('cityInfo');
- }
- else{
- return true;
- }
-
- window.$tmpTable = $this;
- var cityInfo = {};
-
- //이름 추출
- {
-
- var titleText = $this.find('tr:eq(0)>td:eq(0)').text();
- var loc0 = titleText.indexOf("【");
- var loc1 = titleText.indexOf("|");
- var loc2 = titleText.indexOf("】");
-
- var cityLoc = $.trim(titleText.substring(loc0+1,loc1));
- var citySize = $.trim(titleText.substring(loc1+1,loc2));
- var cityName = $.trim(titleText.substring(loc2+1));
-
- cityName = cityName.replace("[","");
- cityName = cityName.replace("]","");
-
- $this.data('cityname',cityName);
-
- cityInfo.지역 = cityLoc;
- cityInfo.규모 = citySize;
- cityInfo.이름 = cityName;
-
- cityInfo.val = '-1';
-
- cityInfo.p태수 = false;
- cityInfo.p군사 = false;
- cityInfo.p종사 = false;
-
- }
-
- //주민, 농상치성수
-
-
- {
- var $baseTr = $this.find('tr:eq(1)');
- cityInfo.$주민 = $baseTr.find('td:eq(1)');
- cityInfo.$농업 = $baseTr.find('td:eq(3)');
- cityInfo.$상업 = $baseTr.find('td:eq(5)');
- cityInfo.$치안 = $baseTr.find('td:eq(7)');
- cityInfo.$수비 = $baseTr.find('td:eq(9)');
- cityInfo.$성벽 = $baseTr.find('td:eq(11)');
-
- var tmpVal;
-
- tmpVal = cityInfo.$주민.text().split('/');
- cityInfo.주민 = parseInt(tmpVal[0]);
- cityInfo.max주민 = parseInt(tmpVal[1]);
-
- tmpVal = cityInfo.$농업.text().split('/');
- cityInfo.농업 = parseInt(tmpVal[0]);
- cityInfo.max농업 = parseInt(tmpVal[1]);
-
- tmpVal = cityInfo.$상업.text().split('/');
- cityInfo.상업 = parseInt(tmpVal[0]);
- cityInfo.max상업 = parseInt(tmpVal[1]);
-
- tmpVal = cityInfo.$치안.text().split('/');
- cityInfo.치안 = parseInt(tmpVal[0]);
- cityInfo.max치안 = parseInt(tmpVal[1]);
-
- tmpVal = cityInfo.$수비.text().split('/');
- cityInfo.수비 = parseInt(tmpVal[0]);
- cityInfo.max수비 = parseInt(tmpVal[1]);
-
- tmpVal = cityInfo.$성벽.text().split('/');
- cityInfo.성벽 = parseInt(tmpVal[0]);
- cityInfo.max성벽 = parseInt(tmpVal[1]);
-
- if (cityInfo.주민>cityInfo.max주민*0.9){ cityInfo.$주민.css('color','lightgreen');}
- else if (cityInfo.주민>cityInfo.max주민*0.7){ cityInfo.$주민.css('color','yellow');}
- else { cityInfo.$주민.css('color','orangered');}
-
- if (cityInfo.농업>cityInfo.max농업*0.8){ cityInfo.$농업.css('color','lightgreen');}
- else if (cityInfo.농업>cityInfo.max농업*0.4){ cityInfo.$농업.css('color','yellow');}
- else { cityInfo.$농업.css('color','orangered');}
-
- if (cityInfo.상업>cityInfo.max상업*0.8){ cityInfo.$상업.css('color','lightgreen');}
- else if (cityInfo.상업>cityInfo.max상업*0.4){ cityInfo.$상업.css('color','yellow');}
- else { cityInfo.$상업.css('color','orangered');}
-
- if (cityInfo.치안>cityInfo.max치안*0.8){ cityInfo.$치안.css('color','lightgreen');}
- else if (cityInfo.치안>cityInfo.max치안*0.4){ cityInfo.$치안.css('color','yellow');}
- else { cityInfo.$치안.css('color','orangered');}
-
- if (cityInfo.수비>cityInfo.max수비*0.6){ cityInfo.$수비.css('color','lightgreen');}
- else if (cityInfo.수비>cityInfo.max수비*0.3){ cityInfo.$수비.css('color','yellow');}
- else { cityInfo.$수비.css('color','orangered');}
-
- if (cityInfo.성벽>cityInfo.max성벽*0.6){ cityInfo.$성벽.css('color','lightgreen');}
- else if (cityInfo.성벽>cityInfo.max성벽*0.3){ cityInfo.$성벽.css('color','yellow');}
- else { cityInfo.$성벽.css('color','orangered');}
-
-
- cityInfo.remain주민 = cityInfo.주민-cityInfo.max주민;
- cityInfo.remain농업 = cityInfo.농업-cityInfo.max농업;
- cityInfo.remain상업 = cityInfo.상업-cityInfo.max상업;
- cityInfo.remain치안 = cityInfo.치안-cityInfo.max치안;
- cityInfo.remain수비 = cityInfo.수비-cityInfo.max수비;
- cityInfo.remain성벽 = cityInfo.성벽-cityInfo.max성벽;
-
- cityInfo.warn주민 = false;
- cityInfo.warn농업 = false;
- cityInfo.warn상업 = false;
- cityInfo.warn치안 = false;
- cityInfo.warn수비 = false;
- cityInfo.warn성벽 = false;
-
- if(cityInfo.remain주민 > -10*2000) cityInfo.warn주민 = true;
- if(cityInfo.주민 > 0.92*cityInfo.max주민) cityInfo.warn주민 = true;
- if(cityInfo.remain농업 > -10*100) cityInfo.warn농업 = true;
- if(cityInfo.remain상업 > -10*100) cityInfo.warn상업 = true;
- if(cityInfo.remain치안 > -10*100) cityInfo.warn치안 = true;
- if(cityInfo.remain수비 > -10*70) cityInfo.warn수비 = true;
- if(cityInfo.remain성벽 > -10*70) cityInfo.warn성벽 = true;
-
- if(cityInfo.warn농업) cityInfo.$농업.append('['+cityInfo.remain농업+']');
- if(cityInfo.warn상업) cityInfo.$상업.append('['+cityInfo.remain상업+']');
- if(cityInfo.warn치안) cityInfo.$치안.append('['+cityInfo.remain치안+']');
- if(cityInfo.warn수비) cityInfo.$수비.append('['+cityInfo.remain수비+']');
- if(cityInfo.warn성벽) cityInfo.$성벽.append('['+cityInfo.remain성벽+']');
-
- }
-
- //태수,군사,종사
- {
- var $baseTr = $this.find('tr:eq(2)');
- cityInfo.$태수 = $baseTr.find('td:eq(7)');
- cityInfo.$군사 = $baseTr.find('td:eq(9)');
- cityInfo.$종사 = $baseTr.find('td:eq(11)');
- }
-
- //기타
- {
-
- cityInfo.userCnt = $this.find('tr:eq(3) td:eq(1)').text().split(',').length -1;
- }
-
- cityInfo.obj = $this;
- cityList[cityInfo.이름] = cityInfo;
- });
-
-
- var $onGenList = $('');
- $onGenList.click(function(){
- loadUser();
- return false;
- });
- $('form').append($onGenList);
-
-
- $('table:eq(0) tr:last').after(' |
');
-
-
- $sort_more = $('#sort_more');
- $sort_more.html('재 정렬 순서 :');
-
- var sortIt = function(callback){
- var arCity = [];
- $('.cityInfo').each(function(){
- var $this = $(this);
- var cityName = $this.data('cityname');
-
- var cityInfo = cityList[cityName];
- arCity.push(cityInfo);
- });
-
- arCity = mergeSort(arCity,callback);
- //console.log(arCity);
-
- var $anchor = $('.anchor');
- //console.log($anchor);
-
- $('body > br').remove();
-
- $('.cityInfo').detach();
-
- $.each(arCity,function(idx,val){
- $anchor.before('
');
- $anchor.before(val.obj);
- });
- $anchor.before('
');
-
- };
-
- var $btn;
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.이름.localeCompare(b.이름);
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return 1.0*a.주민/a.max주민 - 1.0*b.주민/b.max주민;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain주민 - b.remain주민;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain농업 - b.remain농업;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain상업 - b.remain상업;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain치안 - b.remain치안;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain수비 - b.remain수비;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return a.remain성벽 - b.remain성벽;
- });
- });
- $sort_more.append($btn);
-
- $btn = $('').click(function(){
- sortIt(function(a,b){
- return b.userCnt - a.userCnt;
- });
- });
- $sort_more.append($btn);
- };
-
- mainFunc();
-});
\ No newline at end of file
diff --git a/hwe/ts/extExpandCity.ts b/hwe/ts/extExpandCity.ts
new file mode 100644
index 00000000..aff0751f
--- /dev/null
+++ b/hwe/ts/extExpandCity.ts
@@ -0,0 +1,670 @@
+
+import $ from 'jquery';
+import { unwrap_any } from './util/unwrap_any';
+
+type UserItem = {
+ val: string,
+ name: string,
+ city: string,
+
+
+ 태수: boolean,
+ 군사: boolean,
+ 종사: boolean,
+ is수뇌: boolean,
+ $city: CityItem,
+ $user: JQuery,
+}
+
+type CityLevel = '특' | '대' | '중' | '소' | '이' | '진' | '관' | '수'
+
+type OfficerItem = {
+ preserved: boolean,
+ $obj: JQuery
+}
+
+type CityItem = {
+ 지역: string,
+ 규모: CityLevel,
+ 이름: string,
+
+ val: string,
+ users: JQuery,
+ userCnt: number,
+ obj: JQuery,
+
+ 태수: OfficerItem,
+ 군사: OfficerItem,
+ 종사: OfficerItem,
+
+ warn주민: boolean,
+ warn농업: boolean,
+ warn상업: boolean,
+ warn치안: boolean,
+ warn수비: boolean,
+ warn성벽: boolean,
+
+ $주민: JQuery,
+ $농업: JQuery,
+ $상업: JQuery,
+ $치안: JQuery,
+ $수비: JQuery,
+ $성벽: JQuery,
+
+ 주민: number,
+ 농업: number,
+ 상업: number,
+ 치안: number,
+ 수비: number,
+ 성벽: number,
+
+ max주민: number,
+ max농업: number,
+ max상업: number,
+ max치안: number,
+ max수비: number,
+ max성벽: number,
+
+ remain주민: number,
+ remain농업: number,
+ remain상업: number,
+ remain치안: number,
+ remain수비: number,
+ remain성벽: number,
+};
+
+type OfficerSelector = '태수' | '군사' | '종사';
+
+
+const cityList: Record = {};
+const userList: Record = {};
+
+$(function () {
+ let basicPath = document.location.pathname;
+ basicPath = basicPath.substring(0, basicPath.lastIndexOf('/')) + '/';
+
+ const mergeSort = function (arr: T[], cmpFunc: (lhs: T, rhs: T) => number) {
+ const merge = function (left: T[], right: T[]): T[] {
+ const retVal = [];
+
+ let leftIdx = 0;
+ let rightIdx = 0;
+
+
+
+ while (leftIdx < left.length && rightIdx < right.length) {
+ const cmpVal = cmpFunc(left[leftIdx], right[rightIdx]);
+
+ if (cmpVal <= 0) {
+ retVal.push(left[leftIdx]);
+ leftIdx++;
+ }
+ else {
+ retVal.push(right[rightIdx]);
+ rightIdx++;
+ }
+ }
+
+ return retVal.concat(left.slice(leftIdx)).concat(right.slice(rightIdx));
+ };
+
+ const _mergeSort = function (arr: T[]): T[] {
+ if (arr.length < 2) {
+ return arr;
+ }
+
+ const middle = Math.floor(arr.length / 2);
+
+ const left = arr.slice(0, middle);
+ const right = arr.slice(middle);
+
+ return merge(_mergeSort(left), _mergeSort(right));
+ };
+
+ return _mergeSort(arr);
+
+ };
+
+ const loadDuty = function () {
+
+ try {
+ $('.for_duty').remove();
+ void $.get(basicPath + 'b_myBossInfo.php', function (rawData) {
+ const $html = $(rawData);
+
+ const $tmpTable = $html.filter('#officer_list').eq(0);
+
+ const $selects = $tmpTable.find("select");
+ if ($selects.length == 0) {
+ alert("수뇌가 아닙니다!");
+ return false;
+ }
+
+ const setUserAvailable = function ($userList: JQuery, typeName: OfficerSelector) {
+ $userList.each(function () {
+ const $this = $(this);
+
+ const val = unwrap_any($this.val());
+ let name = $.trim($this.text());
+
+ for (let i = name.length - 1; i > 0; i--) {
+ if (name[i] == '【') {
+ name = $.trim(name.substr(0, i));
+ break;
+ }
+ }
+
+ if (val == '0') {
+ return;
+ }
+
+ if (userList[name] !== undefined) {
+ userList[name].val = val;
+ userList[name][typeName] = true;
+ }
+
+ });
+ };
+
+ const setCityAvailiable = function ($cityList: JQuery, typeName: OfficerSelector) {
+ $cityList.each(function () {
+
+ const $this = $(this);
+
+ const val = $.trim(unwrap_any($this.val()));
+ const name = $.trim($this.text());
+
+ cityList[name].val = val;
+ cityList[name][typeName].preserved = true;
+ });
+ }
+
+ for (const cityInfo of Object.values(cityList)) {
+ cityInfo.태수.preserved = false;
+ cityInfo.군사.preserved = false;
+ cityInfo.종사.preserved = false;
+ }
+
+ $.each(userList, function (idx, userInfo) {
+ userInfo.태수 = false;
+ userInfo.군사 = false;
+ userInfo.종사 = false;
+ });
+
+ setUserAvailable($selects.eq(1).find("option"), "태수");
+ setUserAvailable($selects.eq(3).find("option"), "군사");
+ setUserAvailable($selects.eq(5).find("option"), "종사");
+
+ setCityAvailiable($selects.eq(0).find("option"), "태수");
+ setCityAvailiable($selects.eq(2).find("option"), "군사");
+ setCityAvailiable($selects.eq(4).find("option"), "종사");
+
+
+ $.each(cityList, function (idx, cityInfo) {
+
+ //console.log(cityInfo.users.children());
+
+ cityInfo.users.children().each(function () {
+ //console.log(this);
+ const $this = $(this);
+
+ const username = $this.data('username');
+
+ const userInfo = userList[username];
+ if (!userInfo) {
+ return;
+ }
+
+ if (userInfo.val == '-1') {
+ return;
+ }
+
+ const $name = $this.find('.nameplate');
+
+ $name.append('
');
+
+
+ const addBtn = function ($name: JQuery, cityInfo: CityItem, userInfo: UserItem, level: number, typeName: OfficerSelector) {
+
+ const enabled = cityInfo[typeName] && userInfo[typeName];
+ const cityVal = cityInfo.val;
+ const $btn = $('');
+ $btn.addClass(`mode_${level}`);
+ $btn.addClass('for_duty');
+
+ if (!enabled) {
+ $btn.prop('disabled', true);
+ $btn.css('background', 'transparent');
+ $btn.css('border', '0');
+ }
+ else {
+ if (userInfo.is수뇌) {
+ $btn.css('color', 'red');
+ }
+ }
+
+ $btn.css('padding', '1px 4px');
+ $btn.css('margin', '0');
+
+ $btn.click(function () {
+ if (userInfo.is수뇌) {
+ if (!confirm('수뇌입니다. 임명할까요?')) {
+ return false;
+ }
+ }
+
+ void $.post(basicPath + 'j_myBossInfo.php', {
+ destCityID: cityVal,
+ destGeneralID: userInfo.val,
+ officerLevel: level,
+ action: '임명'
+ }, function () {
+ cityInfo[typeName].preserved = false;
+ const $target = cityInfo.users.find(`.mode_${level}`);
+ $target.prop('disabled', true);
+ $target.css('background', 'transparent');
+ $target.css('border', '0');
+ $target.css('color', '');
+
+ cityInfo[typeName].$obj.html(userInfo.name);
+ });
+ });
+
+ //console.log($btn);
+ $name.append($btn);
+ };
+
+ addBtn($name, cityInfo, userInfo, 4, '태수');
+ addBtn($name, cityInfo, userInfo, 3, '군사');
+ addBtn($name, cityInfo, userInfo, 2, '종사');
+ });
+ });
+
+ });
+
+
+ }
+ catch (a) {
+ console.log(a);
+ }
+
+ return false;
+ };
+
+ const loadUser = function () {
+ $.each(cityList, function (idx, val) {
+ if (typeof val.users == "undefined") {
+ val.obj.append('' +
+ '' +
+ '| 이 름 | 통무지 | 부 대 | 자 금 | ' +
+ '군 량 | 守 | 병 종 | ' +
+ '병 사 | 훈련 | 사기 | 명 령 | ' +
+ '삭턴 | 턴 | ' +
+ ' ' +
+ ' |
');
+
+ val.users = val.obj.find(".cityUserBody");
+ }
+ else {
+ val.users.html("");
+ }
+ });
+
+
+ void $.get(basicPath + 'b_genList.php', function (rawData) {
+ const $helper = $('#helper_genlist');
+ $helper.html('').append($.parseHTML(rawData));
+
+ const tmpUsers = $('#general_list tbody tr');
+
+ tmpUsers.each(function () {
+ const $this = $(this);
+
+ const $city = $this.children('.i_city');
+ $city.remove();
+ const cityName = $.trim($city.text());
+
+ const $name = $this.children('.i_name');
+ $name.addClass('nameplate');
+
+ const name = $name.find('.t_name').text();
+
+ const $work = $this.children('.i_action');
+
+ const cityInfo = cityList[cityName];
+ if (typeof cityInfo == 'undefined') {
+ return;
+ }
+ if (cityInfo.warn주민) $work.html($work.html().split('정착 장려').join('정착 장려'));
+ if (cityInfo.warn농업) $work.html($work.html().split('농지 개간').join('농지 개간'));
+ if (cityInfo.warn상업) $work.html($work.html().split('상업 투자').join('상업 투자'));
+ if (cityInfo.warn치안) $work.html($work.html().split('치안 강화').join('치안 강화'));
+ if (cityInfo.warn수비) $work.html($work.html().split('수비 강화').join('수비 강화'));
+ if (cityInfo.warn성벽) $work.html($work.html().split('성벽 보수').join('성벽 보수'));
+
+
+
+ const $stat = $this.children('.i_stat');
+ const stat = $stat.text();
+
+ const is수뇌 = stat.indexOf('+') >= 0;
+
+ $this.data('username', name);
+
+ if (cityList[cityName].태수.$obj.text() == name) {
+ cityList[cityName].태수.$obj.html('{0}'.format(name));
+ }
+ if (cityList[cityName].군사.$obj.text() == name) {
+ cityList[cityName].군사.$obj.html('{0}'.format(name));
+ }
+ if (cityList[cityName].종사.$obj.text() == name) {
+ cityList[cityName].종사.$obj.html('{0}'.format(name));
+ }
+
+ userList[name] = {
+ $city: cityInfo,
+ city: cityName,
+ $user: $this,
+ name: name,
+ val: '-1',
+ 태수: false,
+ 군사: false,
+ 종사: false,
+ is수뇌: is수뇌
+ };
+
+ if (cityList[cityName]) {
+ cityList[cityName].users.append($this);
+ }
+
+ });
+ });
+
+ if ($("#loadDutyBtn").length == 0) {
+
+ const $onBossList = $('');
+ $onBossList.click(function () {
+ loadDuty();
+ return false;
+ });
+
+ $('form').append($onBossList);
+ }
+
+ $('#by_users').show();
+ };
+
+ const mainFunc = function () {
+ //대상 추출
+
+ $("form").each(function () {
+ const $this = $(this);
+ $this.attr('name', 'p' + $this.attr('name'));
+ });
+
+ $("table").each(function () {
+ const $this = $(this);
+
+
+ if ($this.attr('class') == 'tb_layout bg2') {
+ $this.addClass('cityInfo');
+ }
+ else {
+ return;
+ }
+
+ const cityInfo: CityItem = {
+ 태수:{},
+ 군사:{},
+ 종사:{},
+ } as CityItem;
+
+ //이름 추출
+ {
+ const titleText = $this.find('tr:eq(0)>td:eq(0)').text();
+ const loc0 = titleText.indexOf("【");
+ const loc1 = titleText.indexOf("|");
+ const loc2 = titleText.indexOf("】");
+
+ const cityLoc = $.trim(titleText.substring(loc0 + 1, loc1));
+ const citySize = $.trim(titleText.substring(loc1 + 1, loc2));
+ let cityName = $.trim(titleText.substring(loc2 + 1));
+
+ cityName = cityName.replace("[", "");
+ cityName = cityName.replace("]", "");
+
+ $this.data('cityname', cityName);
+
+ cityInfo.지역 = cityLoc;
+ cityInfo.규모 = citySize as CityLevel;
+ cityInfo.이름 = cityName;
+
+ cityInfo.val = '-1';
+
+ cityInfo.태수.preserved = false;
+ cityInfo.군사.preserved = false;
+ cityInfo.종사.preserved = false;
+ }
+
+ //주민, 농상치성수
+
+
+ {
+ const $baseTr = $this.find('tr:eq(1)');
+ cityInfo.$주민 = $baseTr.find('td:eq(1)');
+ cityInfo.$농업 = $baseTr.find('td:eq(3)');
+ cityInfo.$상업 = $baseTr.find('td:eq(5)');
+ cityInfo.$치안 = $baseTr.find('td:eq(7)');
+ cityInfo.$수비 = $baseTr.find('td:eq(9)');
+ cityInfo.$성벽 = $baseTr.find('td:eq(11)');
+
+ let tmpVal;
+
+ tmpVal = cityInfo.$주민.text().split('/');
+ cityInfo.주민 = parseInt(tmpVal[0]);
+ cityInfo.max주민 = parseInt(tmpVal[1]);
+
+ tmpVal = cityInfo.$농업.text().split('/');
+ cityInfo.농업 = parseInt(tmpVal[0]);
+ cityInfo.max농업 = parseInt(tmpVal[1]);
+
+ tmpVal = cityInfo.$상업.text().split('/');
+ cityInfo.상업 = parseInt(tmpVal[0]);
+ cityInfo.max상업 = parseInt(tmpVal[1]);
+
+ tmpVal = cityInfo.$치안.text().split('/');
+ cityInfo.치안 = parseInt(tmpVal[0]);
+ cityInfo.max치안 = parseInt(tmpVal[1]);
+
+ tmpVal = cityInfo.$수비.text().split('/');
+ cityInfo.수비 = parseInt(tmpVal[0]);
+ cityInfo.max수비 = parseInt(tmpVal[1]);
+
+ tmpVal = cityInfo.$성벽.text().split('/');
+ cityInfo.성벽 = parseInt(tmpVal[0]);
+ cityInfo.max성벽 = parseInt(tmpVal[1]);
+
+ if (cityInfo.주민 > cityInfo.max주민 * 0.9) { cityInfo.$주민.css('color', 'lightgreen'); }
+ else if (cityInfo.주민 > cityInfo.max주민 * 0.7) { cityInfo.$주민.css('color', 'yellow'); }
+ else { cityInfo.$주민.css('color', 'orangered'); }
+
+ if (cityInfo.농업 > cityInfo.max농업 * 0.8) { cityInfo.$농업.css('color', 'lightgreen'); }
+ else if (cityInfo.농업 > cityInfo.max농업 * 0.4) { cityInfo.$농업.css('color', 'yellow'); }
+ else { cityInfo.$농업.css('color', 'orangered'); }
+
+ if (cityInfo.상업 > cityInfo.max상업 * 0.8) { cityInfo.$상업.css('color', 'lightgreen'); }
+ else if (cityInfo.상업 > cityInfo.max상업 * 0.4) { cityInfo.$상업.css('color', 'yellow'); }
+ else { cityInfo.$상업.css('color', 'orangered'); }
+
+ if (cityInfo.치안 > cityInfo.max치안 * 0.8) { cityInfo.$치안.css('color', 'lightgreen'); }
+ else if (cityInfo.치안 > cityInfo.max치안 * 0.4) { cityInfo.$치안.css('color', 'yellow'); }
+ else { cityInfo.$치안.css('color', 'orangered'); }
+
+ if (cityInfo.수비 > cityInfo.max수비 * 0.6) { cityInfo.$수비.css('color', 'lightgreen'); }
+ else if (cityInfo.수비 > cityInfo.max수비 * 0.3) { cityInfo.$수비.css('color', 'yellow'); }
+ else { cityInfo.$수비.css('color', 'orangered'); }
+
+ if (cityInfo.성벽 > cityInfo.max성벽 * 0.6) { cityInfo.$성벽.css('color', 'lightgreen'); }
+ else if (cityInfo.성벽 > cityInfo.max성벽 * 0.3) { cityInfo.$성벽.css('color', 'yellow'); }
+ else { cityInfo.$성벽.css('color', 'orangered'); }
+
+
+ cityInfo.remain주민 = cityInfo.주민 - cityInfo.max주민;
+ cityInfo.remain농업 = cityInfo.농업 - cityInfo.max농업;
+ cityInfo.remain상업 = cityInfo.상업 - cityInfo.max상업;
+ cityInfo.remain치안 = cityInfo.치안 - cityInfo.max치안;
+ cityInfo.remain수비 = cityInfo.수비 - cityInfo.max수비;
+ cityInfo.remain성벽 = cityInfo.성벽 - cityInfo.max성벽;
+
+ cityInfo.warn주민 = false;
+ cityInfo.warn농업 = false;
+ cityInfo.warn상업 = false;
+ cityInfo.warn치안 = false;
+ cityInfo.warn수비 = false;
+ cityInfo.warn성벽 = false;
+
+ if (cityInfo.remain주민 > -10 * 2000) cityInfo.warn주민 = true;
+ if (cityInfo.주민 > 0.92 * cityInfo.max주민) cityInfo.warn주민 = true;
+ if (cityInfo.remain농업 > -10 * 100) cityInfo.warn농업 = true;
+ if (cityInfo.remain상업 > -10 * 100) cityInfo.warn상업 = true;
+ if (cityInfo.remain치안 > -10 * 100) cityInfo.warn치안 = true;
+ if (cityInfo.remain수비 > -10 * 70) cityInfo.warn수비 = true;
+ if (cityInfo.remain성벽 > -10 * 70) cityInfo.warn성벽 = true;
+
+ if (cityInfo.warn농업) cityInfo.$농업.append('[' + cityInfo.remain농업 + ']');
+ if (cityInfo.warn상업) cityInfo.$상업.append('[' + cityInfo.remain상업 + ']');
+ if (cityInfo.warn치안) cityInfo.$치안.append('[' + cityInfo.remain치안 + ']');
+ if (cityInfo.warn수비) cityInfo.$수비.append('[' + cityInfo.remain수비 + ']');
+ if (cityInfo.warn성벽) cityInfo.$성벽.append('[' + cityInfo.remain성벽 + ']');
+
+ }
+
+ //태수,군사,종사
+ {
+ const $baseTr = $this.find('tr:eq(2)');
+ cityInfo.태수.$obj = $baseTr.find('td:eq(7)');
+ cityInfo.군사.$obj = $baseTr.find('td:eq(9)');
+ cityInfo.종사.$obj = $baseTr.find('td:eq(11)');
+ }
+
+ //기타
+ {
+
+ cityInfo.userCnt = $this.find('tr:eq(3) td:eq(1)').text().split(',').length - 1;
+ }
+
+ cityInfo.obj = $this;
+ cityList[cityInfo.이름] = cityInfo as CityItem;
+ });
+
+
+ const $onGenList = $('');
+ $onGenList.click(function () {
+ loadUser();
+ return false;
+ });
+ $('form').append($onGenList);
+
+
+ $('table:eq(0) tr:last').after(' |
');
+
+
+ const $sort_more = $('#sort_more');
+ $sort_more.html('재 정렬 순서 :');
+
+ const sortIt = function(callback: (lhs:CityItem, rhs:CityItem)=>number) {
+ let arCity: CityItem[] = [];
+ $('.cityInfo').each(function () {
+ const $this = $(this);
+ const cityName = $this.data('cityname');
+
+ const cityInfo = cityList[cityName];
+ arCity.push(cityInfo);
+ });
+
+ arCity = mergeSort(arCity, callback);
+ //console.log(arCity);
+
+ const $anchor = $('.anchor');
+ //console.log($anchor);
+
+ $('body > br').remove();
+
+ $('.cityInfo').detach();
+
+ $.each(arCity, function (idx, val) {
+ $anchor.before('
');
+ $anchor.before(val.obj);
+ });
+ $anchor.before('
');
+
+ };
+
+ let $btn: JQuery;
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.이름.localeCompare(b.이름);
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return 1.0 * a.주민 / a.max주민 - 1.0 * b.주민 / b.max주민;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain주민 - b.remain주민;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain농업 - b.remain농업;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain상업 - b.remain상업;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain치안 - b.remain치안;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain수비 - b.remain수비;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return a.remain성벽 - b.remain성벽;
+ });
+ });
+ $sort_more.append($btn);
+
+ $btn = $('').click(function () {
+ sortIt(function (a, b) {
+ return b.userCnt - a.userCnt;
+ });
+ });
+ $sort_more.append($btn);
+ };
+
+ mainFunc();
+});
\ No newline at end of file
diff --git a/hwe/ts/ext.plugin_troop.ts b/hwe/ts/extPluginTroop.ts
similarity index 100%
rename from hwe/ts/ext.plugin_troop.ts
rename to hwe/ts/extPluginTroop.ts
diff --git a/hwe/ts/troop.ts b/hwe/ts/troop.ts
index 9c96b652..80e1ac15 100644
--- a/hwe/ts/troop.ts
+++ b/hwe/ts/troop.ts
@@ -1,5 +1,5 @@
import { errUnknown } from "./common_legacy";
-import { launchTroopPlugin } from "./ext.plugin_troop";
+import { launchTroopPlugin } from "./extPluginTroop";
import jQuery from "jquery";
import "../scss/troop.scss";
@@ -22,9 +22,9 @@ jQuery(function($){
alert(data.reason);
location.reload();
}
-
+
location.reload();
-
+
}, errUnknown);
return false;
});
@@ -43,9 +43,9 @@ jQuery(function($){
alert(data.reason);
location.reload();
}
-
+
location.reload();
-
+
}, errUnknown);
return false;
});
@@ -64,9 +64,9 @@ jQuery(function($){
alert(data.reason);
location.reload();
}
-
+
location.reload();
-
+
}, errUnknown);
return false;
});
@@ -85,9 +85,9 @@ jQuery(function($){
alert(data.reason);
location.reload();
}
-
+
location.reload();
-
+
}, errUnknown);
return false;
});
@@ -106,13 +106,13 @@ jQuery(function($){
alert(data.reason);
location.reload();
}
-
+
location.reload();
-
+
}, errUnknown);
return false;
});
-
+
launchTroopPlugin($);
});
\ No newline at end of file
diff --git a/webpack.config.cjs b/webpack.config.cjs
index c6b18ea9..7666444f 100644
--- a/webpack.config.cjs
+++ b/webpack.config.cjs
@@ -30,6 +30,7 @@ module.exports = (env) => {
board: '@/board.ts',
bossInfo: '@/bossInfo.ts',
myPage: '@/myPage.ts',
+ extExpandCity: '@/extExpandCity.ts',
//FORM 입력용, frontend 변경후 제거