feat(wip): 1차 기능 완성

This commit is contained in:
2022-04-07 03:03:38 +09:00
parent c07c481a6c
commit 7645ae7ee8
2 changed files with 674 additions and 132 deletions
+107 -132
View File
@@ -1,16 +1,25 @@
<template> <template>
<Teleport v-if="toolbarID" :to="`#${toolbarID}`"> <Teleport v-if="toolbarID" :to="`#${toolbarID}`">
<BButtonGroup class="d-flex general-list-toolbar"> <BButtonGroup class="d-flex general-list-toolbar">
<BDropdown class="w-50" variant="primary" text="보기 모드"> <BDropdown class="w-50" menuClass="view-mode-list" variant="primary" text="보기 모드">
<BDropdownItem></BDropdownItem> <BDropdownItem @click="setDisplaySetting(defaultDisplaySetting.normal)">기본</BDropdownItem>
<BDropdownItem></BDropdownItem> <BDropdownItem @click="setDisplaySetting(defaultDisplaySetting.war)">전투</BDropdownItem>
<BDropdownDivider /> <BDropdownDivider />
<BDropdownItem></BDropdownItem> <BDropdownItem @click="storeDisplaySetting"><i class="bi bi-bookmark-plus-fill" />&nbsp;보관하기</BDropdownItem>
<BDropdownItem></BDropdownItem> <BDropdownDivider />
<BDropdownItem
v-for="[key, setting] of displaySettings.entries()"
:key="key"
@click="setDisplaySetting(setting)"
><div class="row gx-0">
<div class="col-9 text-wrap"><span class="align-middle">{{ key }}</span></div>
<div class="col-3"><div class="d-grid"><BButton size="sm" @click="deleteDisplaySetting(key)">삭제</BButton></div></div>
</div></BDropdownItem
>
</BDropdown> </BDropdown>
<BDropdown class="w-50" variant="info" text="열 선택" menuClass="column-menu" right> <BDropdown class="w-50" variant="info" text="열 선택" menuClass="column-menu" right>
<template v-for="[colID, col, depth] of getColumnList()" :key="[colID, depth]"> <template v-for="[colID, col, depth] of getColumnList()" :key="[colID, depth]">
<BDropdownItem v-if="col instanceof ColumnGroup" disabled> <BDropdownItem v-if="col instanceof ProvidedColumnGroup" disabled>
<span :style="{ marginLeft: depth ? `${12 * depth}px` : undefined }"> <span :style="{ marginLeft: depth ? `${12 * depth}px` : undefined }">
{{ col.getColGroupDef()?.headerName }}</span {{ col.getColGroupDef()?.headerName }}</span
></BDropdownItem ></BDropdownItem
@@ -48,6 +57,7 @@
:columnDefs="columnDefs" :columnDefs="columnDefs"
:rowData="list" :rowData="list"
:defaultColDef="defaultColDef" :defaultColDef="defaultColDef"
:suppressColumnMoveAnimation="suppressColumnMoveAnimation"
@grid-ready="onGridReady" @grid-ready="onGridReady"
/> />
</div> </div>
@@ -70,7 +80,7 @@ import type {
GridReadyEvent, GridReadyEvent,
RowNode, RowNode,
} from "ag-grid-community"; } from "ag-grid-community";
import { ColumnGroup } from "ag-grid-community"; import { ProvidedColumnGroup } from "ag-grid-community";
import { getNpcColor } from "@/common_legacy"; import { getNpcColor } from "@/common_legacy";
import type { BaseWithValueColDefParams, ValueGetterParams } from "ag-grid-community/dist/lib/entities/colDef"; import type { BaseWithValueColDefParams, ValueGetterParams } from "ag-grid-community/dist/lib/entities/colDef";
import type { GameConstStore } from "@/GameConstStore"; import type { GameConstStore } from "@/GameConstStore";
@@ -81,21 +91,19 @@ import { formatConnectScore } from "@/utilGame/formatConnectScore";
import { convertSearch초성 } from "@/util/convertSearch초성"; import { convertSearch초성 } from "@/util/convertSearch초성";
import { isString } from "lodash"; import { isString } from "lodash";
import { formatDefenceTrain } from "@/utilGame/formatDefenceTrain"; import { formatDefenceTrain } from "@/utilGame/formatDefenceTrain";
import { BDropdownItem, BDropdownDivider, BButtonGroup, BDropdown } from "bootstrap-vue-3"; import { BDropdownItem, BDropdownDivider, BButtonGroup, BDropdown, BButton } from "bootstrap-vue-3";
import { unwrap_err } from "@/util/unwrap_err"; import { unwrap_err } from "@/util/unwrap_err";
import { RuntimeError } from "@/util/RuntimeError"; import { RuntimeError } from "@/util/RuntimeError";
import { defaultDisplaySetting, type GridDisplaySetting } from "@/defs/gridDefs";
const props = defineProps({ const props = defineProps({
list: { list: {
type: Array as PropType<GeneralListItem[]>, type: Array as PropType<GeneralListItem[]>,
required: true, required: true,
}, },
troops: { troops: {
type: Object as PropType<Record<number, string>>, type: Object as PropType<Record<number, string>>,
required: true, required: true,
}, },
height: { height: {
type: String as PropType<"static" | "fill" | number | `${number}px` | `${number}%`>, type: String as PropType<"static" | "fill" | number | `${number}px` | `${number}%`>,
required: false, required: false,
@@ -105,7 +113,6 @@ const props = defineProps({
type: Object as PropType<GeneralListResponse["env"]>, type: Object as PropType<GeneralListResponse["env"]>,
required: true, required: true,
}, },
toolbarID: { toolbarID: {
type: String, type: String,
required: false, required: false,
@@ -113,19 +120,17 @@ const props = defineProps({
}, },
}); });
const suppressColumnMoveAnimation = ref(true);
const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore")); const gameConstStore = unwrap(inject<Ref<GameConstStore>>("gameConstStore"));
//debug
watch( watch(
() => props.list, () => props.list,
() => { () => {
setTimeout(() => { setTimeout(() => {
//debug
gridApi.value?.redrawRows(); gridApi.value?.redrawRows();
}, 0); }, 0);
} }
); );
watch( watch(
() => props.height, () => props.height,
(val) => { (val) => {
@@ -136,9 +141,7 @@ watch(
} }
} }
); );
const generalByID = ref(new Map<number, GeneralListItem>()); const generalByID = ref(new Map<number, GeneralListItem>());
function refineGeneralList(list: GeneralListItem[]) { function refineGeneralList(list: GeneralListItem[]) {
const map = new Map<number, GeneralListItem>(); const map = new Map<number, GeneralListItem>();
for (const general of list) { for (const general of list) {
@@ -148,55 +151,107 @@ function refineGeneralList(list: GeneralListItem[]) {
} }
refineGeneralList(props.list); refineGeneralList(props.list);
watch(() => props.list, refineGeneralList); watch(() => props.list, refineGeneralList);
const gridApi = ref<GridApi>(); const gridApi = ref<GridApi>();
const columnApi = ref<ColumnApi>(); const columnApi = ref<ColumnApi>();
const rowHeight = ref(68); const rowHeight = ref(68);
function getRowId(params: GetRowIdParams): string { function getRowId(params: GetRowIdParams): string {
const genID = (params.data as GeneralListItem).no; const genID = (params.data as GeneralListItem).no;
return `${genID}`; return `${genID}`;
} }
function setDisplaySetting(setting: GridDisplaySetting) {
if (!columnApi.value) {
console.error("nyc?");
return;
}
columnApi.value.applyColumnState({ state: setting.column, applyOrder: true });
columnApi.value.setColumnGroupState(setting.columnGroup);
}
const displaySettings = ref(new Map<string, GridDisplaySetting>());
const displaySettingVersion = 1; //추가되는 걸로 버전 올리지 말고, 사용할 수 없게 될때만 올리기
const displaySettingsKey = "GeneralListDisplaySetting";
function loadDisplaySetting() {
const rawSettings = localStorage.getItem(displaySettingsKey);
if (!rawSettings) {
return;
}
const settings: { version: number; settings: [string, GridDisplaySetting][] } = JSON.parse(rawSettings);
if (settings.version != displaySettingVersion) {
localStorage.removeItem(displaySettingsKey);
return;
}
displaySettings.value = new Map(settings.settings);
}
loadDisplaySetting();
watch(
displaySettings,
(newSettings) => {
const settings = Array.from(newSettings.entries());
localStorage.setItem(
displaySettingsKey,
JSON.stringify({
version: displaySettingVersion,
settings,
})
);
console.log("저장!", Array.from(newSettings.keys()));
},
{ deep: true }
);
function deleteDisplaySetting(key: string){
if (!confirm(`${key} 설정을 지울까요?`)) {
return;
}
displaySettings.value.delete(key);
}
function storeDisplaySetting() {
if (!columnApi.value) {
console.error("nyc?");
return;
}
const nickName = prompt("선택한 설정의 별명을 지어주세요");
if (!nickName) {
return;
}
if (displaySettings.value.has(nickName)) {
if (!confirm("이미 있는 이름입니다. 덮어쓸까요?")) {
return;
}
}
const setting: GridDisplaySetting = {
column: columnApi.value.getColumnState(),
columnGroup: columnApi.value.getColumnGroupState(),
};
displaySettings.value.set(nickName, setting);
}
function onGridReady(params: GridReadyEvent) { function onGridReady(params: GridReadyEvent) {
gridApi.value = params.api; gridApi.value = params.api;
columnApi.value = params.columnApi; columnApi.value = params.columnApi;
setRowHeight();
if (props.height === "static") { if (props.height === "static") {
params.api.setDomLayout("autoHeight"); params.api.setDomLayout("autoHeight");
} else { } else {
params.api.setDomLayout("normal"); params.api.setDomLayout("normal");
} }
} setDisplaySetting(defaultDisplaySetting.normal);
setTimeout(() => {
function setRowHeight() { suppressColumnMoveAnimation.value = false;
if (columnApi.value === undefined) { }, 1);
console.error("아직 준비 안됨?");
return;
}
/*
let height = gridApi.value?.getSizesForCurrentTheme().rowHeight ?? 28;
if (columnApi.value.getColumn("icon")?.isVisible()) {
height = Math.max(height, 64 + 4);
}
if (columnApi.value.getColumn("reservedCommand")?.isVisible()) {
height = Math.max(height, 64 + 4);
}
if(rowHeight.value != height){
rowHeight.value = height;
gridApi.value?.redrawRows();
}
*/
} }
function getRowHeight(): number { function getRowHeight(): number {
return rowHeight.value; return rowHeight.value;
} }
type headerType = type headerType =
| keyof Omit<GeneralListItemP2, "no" | "imgsvr" | "picture" | "lbonus"> | keyof Omit<GeneralListItemP2, "no" | "imgsvr" | "picture" | "lbonus">
| "stat" | "stat"
@@ -209,19 +264,15 @@ type headerType =
| "reservedCommandShort" | "reservedCommandShort"
| "killturnAndConnect" | "killturnAndConnect"
| "years"; | "years";
interface GenValueParams extends BaseWithValueColDefParams { interface GenValueParams extends BaseWithValueColDefParams {
data: GeneralListItem; data: GeneralListItem;
} }
interface GenValueGetterParams extends ValueGetterParams { interface GenValueGetterParams extends ValueGetterParams {
data: GeneralListItem; data: GeneralListItem;
} }
interface GenRowNode extends RowNode { interface GenRowNode extends RowNode {
data: GeneralListItem; data: GeneralListItem;
} }
interface GenColDef extends ColDef { interface GenColDef extends ColDef {
colId: headerType; colId: headerType;
field?: headerType; field?: headerType;
@@ -230,19 +281,16 @@ interface GenColDef extends ColDef {
filterValueGetter?: string | ((params: GenValueGetterParams) => unknown); filterValueGetter?: string | ((params: GenValueGetterParams) => unknown);
valueGetter?: string | ((params: GenValueGetterParams) => unknown); valueGetter?: string | ((params: GenValueGetterParams) => unknown);
} }
interface GenColGroupDef extends ColGroupDef { interface GenColGroupDef extends ColGroupDef {
headerName: string; headerName: string;
children: GenColDef[]; //1단만 할꺼다! children: GenColDef[]; //1단만 할꺼다!
groupId: headerType; groupId: headerType;
} }
interface GenCellClassParams extends CellClassParams { interface GenCellClassParams extends CellClassParams {
data: GeneralListItem; data: GeneralListItem;
} }
function getColumnList(): [headerType, ProvidedColumnGroup | Column, number?][] {
function getColumnList(): [headerType, ColumnGroup | Column, number?][] { const result: [headerType, ProvidedColumnGroup | Column, number?][] = [];
const result: [headerType, ColumnGroup | Column, number?][] = [];
if (!columnApi.value) { if (!columnApi.value) {
return result; return result;
} }
@@ -255,9 +303,8 @@ function getColumnList(): [headerType, ColumnGroup | Column, number?][] {
result.push([rawColDef.colId, col]); result.push([rawColDef.colId, col]);
continue; continue;
} }
const colGroup = unwrap_err( const colGroup = unwrap_err(
columnApi.value.getColumnGroup(rawColDef.groupId), columnApi.value.getProvidedColumnGroup(rawColDef.groupId),
RuntimeError, RuntimeError,
`no colGroup: ${rawColDef.groupId}` `no colGroup: ${rawColDef.groupId}`
); );
@@ -273,7 +320,6 @@ function getColumnList(): [headerType, ColumnGroup | Column, number?][] {
} }
return result; return result;
} }
function naiveCheClassNameFilter(value: string): string { function naiveCheClassNameFilter(value: string): string {
const text = value.split("_").pop() ?? "None"; const text = value.split("_").pop() ?? "None";
if (text === "None") { if (text === "None") {
@@ -281,7 +327,6 @@ function naiveCheClassNameFilter(value: string): string {
} }
return text; return text;
} }
function numberFormatter(unit?: string) { function numberFormatter(unit?: string) {
if (unit) { if (unit) {
return (value: GenValueParams): string => { return (value: GenValueParams): string => {
@@ -293,7 +338,6 @@ function numberFormatter(unit?: string) {
return (value.value as number).toLocaleString(); return (value.value as number).toLocaleString();
}; };
} }
function extractTroopInfo(value: GeneralListItem): [string, GeneralListItemP2] | undefined { function extractTroopInfo(value: GeneralListItem): [string, GeneralListItemP2] | undefined {
if (value.permission == 0 || value.permission == 1) { if (value.permission == 0 || value.permission == 1) {
return undefined; return undefined;
@@ -309,11 +353,9 @@ function extractTroopInfo(value: GeneralListItem): [string, GeneralListItemP2] |
} }
return [troopName, troopLeader]; return [troopName, troopLeader];
} }
function toggleColumn(colID: headerType, col: Column) { function toggleColumn(colID: headerType, col: Column) {
const newState = !col.isVisible(); const newState = !col.isVisible();
const target: string[] = [colID]; const target: string[] = [colID];
const parent = col.getParent(); const parent = col.getParent();
if (newState) { if (newState) {
for (const child of (parent.getChildren() ?? []) as Column[]) { for (const child of (parent.getChildren() ?? []) as Column[]) {
@@ -336,15 +378,12 @@ function toggleColumn(colID: headerType, col: Column) {
stillVisible = true; stillVisible = true;
break; break;
} }
if (!stillVisible && header) { if (!stillVisible && header) {
target.push(header); target.push(header);
} }
} }
columnApi.value?.setColumnsVisible(target, newState); columnApi.value?.setColumnsVisible(target, newState);
setRowHeight();
} }
const defaultCellClass = ["cell-middle"]; const defaultCellClass = ["cell-middle"];
const centerCellClass = [...defaultCellClass, "cell-center"]; const centerCellClass = [...defaultCellClass, "cell-center"];
const rightAlignClass = [...defaultCellClass, "cell-right"]; const rightAlignClass = [...defaultCellClass, "cell-right"];
@@ -361,9 +400,7 @@ const defaultColDef = ref<ColDef>({
cellClass: centerCellClass, cellClass: centerCellClass,
floatingFilter: true, floatingFilter: true,
width: 80, width: 80,
//initialHide: true,
}); });
const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>>>({ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>>>({
icon: { icon: {
colId: "icon", colId: "icon",
@@ -410,7 +447,6 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
colId: "stat", colId: "stat",
headerName: "통|무|지", headerName: "통|무|지",
width: 88, width: 88,
cellRenderer: (obj: GenValueParams) => { cellRenderer: (obj: GenValueParams) => {
const gen = obj.data; const gen = obj.data;
return `${gen.leadership}|${gen.strength}|${gen.intel}`; return `${gen.leadership}|${gen.strength}|${gen.intel}`;
@@ -555,7 +591,6 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
}, },
], ],
}, },
city: { city: {
colId: "city", colId: "city",
headerName: "도시", headerName: "도시",
@@ -576,7 +611,6 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
return convertSearch초성(gameConstStore.value.cityConst[data.city].name); return convertSearch초성(gameConstStore.value.cityConst[data.city].name);
}, },
}, },
troop: { troop: {
colId: "troop", colId: "troop",
headerName: "부대", headerName: "부대",
@@ -586,7 +620,6 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
if (troopInfo === undefined) { if (troopInfo === undefined) {
return "-"; return "-";
} }
const [troopName, troopLeader] = troopInfo; const [troopName, troopLeader] = troopInfo;
const cityName = gameConstStore.value.cityConst[troopLeader.city].name; const cityName = gameConstStore.value.cityConst[troopLeader.city].name;
return [troopName, cityName]; return [troopName, cityName];
@@ -613,7 +646,6 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
if (troopInfoRhs === undefined) { if (troopInfoRhs === undefined) {
return -1; return -1;
} }
return troopInfoLhs[0].localeCompare(troopInfoRhs[0]); return troopInfoLhs[0].localeCompare(troopInfoRhs[0]);
}, },
filter: true, filter: true,
@@ -624,11 +656,9 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
} }
const [troopName, troopLeader] = troopInfo; const [troopName, troopLeader] = troopInfo;
const cityName = gameConstStore.value.cityConst[troopLeader.city].name; const cityName = gameConstStore.value.cityConst[troopLeader.city].name;
return convertSearch초성(`${troopName}$${cityName}`); return convertSearch초성(`${troopName}$${cityName}`);
}, },
}, },
crewtypeAndCrew: { crewtypeAndCrew: {
groupId: "crewtypeAndCrew", groupId: "crewtypeAndCrew",
headerName: "보유 병력", headerName: "보유 병력",
@@ -933,128 +963,73 @@ const columnRawDefs = ref<Partial<Record<headerType, GenColDef | GenColGroupDef>
], ],
}, },
}); });
type DisplaySetting = {
showColumnOrder?: headerType[];
openedGroup?: headerType[];
explicitHide?: headerType[];
sort?: [headerType, "asc" | "desc" | null][];
};
const defaultSettings: Record<"war" | "light", DisplaySetting> = {
war: {
showColumnOrder: [
"stat",
"troop",
"goldRice",
"city",
"defence_train",
"crew",
"reservedCommand",
"killturn",
"turntime",
],
openedGroup: ["goldRice", "crew"],
sort: [["turntime", "asc"]],
},
light: {
showColumnOrder: [
"icon",
"officerLevel",
"expDedLv",
"stat",
"goldRice",
"specials",
"years",
"killturnAndConnect",
],
openedGroup: ["expDedLv", "stat", "goldRice", "specials", "years", "killturnAndConnect"],
explicitHide: ["killturn"],
sort: [["connect", "desc"]],
},
};
const defaultSettingID: keyof typeof defaultSettings = "war";
const columnDefs = ref([...Object.values(columnRawDefs.value)]); const columnDefs = ref([...Object.values(columnRawDefs.value)]);
watch(columnRawDefs, (val) => { watch(columnRawDefs, (val) => {
setRowHeight();
columnDefs.value = [...Object.values(val)]; columnDefs.value = [...Object.values(val)];
gridApi.value?.refreshCells(); gridApi.value?.refreshCells();
}); });
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.g-tr { .g-tr {
border-bottom: solid gray 1px; border-bottom: solid gray 1px;
} }
.g-thead-tr { .g-thead-tr {
position: sticky; position: sticky;
top: 0px; top: 0px;
z-index: 5; z-index: 5;
} }
</style>
:deep(.view-mode-list){
width:180px;
}
</style>
<style lang="scss"> <style lang="scss">
.component-general-list { .component-general-list {
.ag-root-wrapper .cell-middle { .ag-root-wrapper .cell-middle {
display: flex; display: flex;
align-items: center; align-items: center;
} }
.ag-root-wrapper { .ag-root-wrapper {
font-family: "Pretendard", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic"; font-family: "Pretendard", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic";
font-size: 14px; font-size: 14px;
overflow: auto; overflow: auto;
} }
.ag-root { .ag-root {
overflow: auto; overflow: auto;
} }
.ag-header { .ag-header {
position: sticky; position: sticky;
top: 0; top: 0;
z-index: 10; z-index: 10;
} }
.cell-center { .cell-center {
justify-content: space-around; justify-content: space-around;
text-align: center; text-align: center;
} }
.cell-right { .cell-right {
justify-content: flex-end; justify-content: flex-end;
text-align: right; text-align: right;
} }
.cell-sp .col { .cell-sp .col {
min-width: 30px; min-width: 30px;
} }
.ag-header-cell, .ag-header-cell,
.ag-header-group-cell, .ag-header-group-cell,
.ag-cell { .ag-cell {
padding-left: 4px; padding-left: 4px;
padding-right: 4px; padding-right: 4px;
} }
.ag-header-cell-label, .ag-header-cell-label,
.ag-header-group-cell-label { .ag-header-group-cell-label {
justify-content: center; justify-content: center;
} }
.ag-ltr .ag-floating-filter-button { .ag-ltr .ag-floating-filter-button {
margin-left: 2px; margin-left: 2px;
} }
.ag-rtl .ag-floating-filter-button { .ag-rtl .ag-floating-filter-button {
margin-right: 2px; margin-right: 2px;
} }
} }
.general-list-toolbar { .general-list-toolbar {
.column-menu { .column-menu {
column-count: 3; column-count: 3;
+567
View File
@@ -0,0 +1,567 @@
import type { ColumnState } from "ag-grid-community";
export type GridDisplaySetting = {
column: ColumnState[];
columnGroup: {
groupId: string;
open: boolean;
}[];
};
export const defaultDisplaySetting: Record<"war" | "normal", GridDisplaySetting> = {
war: {
column: [
{
colId: "icon",
width: 80,
hide: true,
sort: null,
},
{
colId: "name",
width: 126,
hide: false,
sort: null,
},
{
colId: "stat_1",
width: 88,
hide: false,
sort: null,
},
{
colId: "troop",
width: 90,
hide: false,
sort: null,
},
{
colId: "leadership",
width: 60,
hide: false,
sort: null,
},
{
colId: "strength",
width: 60,
hide: false,
sort: null,
},
{
colId: "intel",
width: 60,
hide: false,
sort: null,
},
{
colId: "officerLevel",
width: 70,
hide: true,
sort: null,
},
{
colId: "expDedLv_1",
width: 60,
hide: true,
sort: null,
},
{
colId: "explevel",
width: 60,
hide: true,
sort: null,
},
{
colId: "dedlevel",
width: 70,
hide: true,
sort: null,
},
{
colId: "goldRice_1",
width: 80,
hide: false,
sort: null,
},
{
colId: "gold",
width: 70,
hide: false,
sort: null,
},
{
colId: "rice",
width: 70,
hide: false,
sort: null,
},
{
colId: "city",
width: 60,
hide: false,
sort: null,
},
{
colId: "crewtypeAndCrew_1",
width: 80,
hide: false,
sort: null,
},
{
colId: "crewtype",
width: 80,
hide: false,
sort: null,
},
{
colId: "crew",
width: 70,
hide: false,
sort: null,
},
{
colId: "trainAtmos_1",
width: 60,
hide: false,
sort: null,
},
{
colId: "train",
width: 70,
hide: false,
sort: null,
},
{
colId: "atmos",
width: 70,
hide: false,
sort: null,
},
{
colId: "defence_train",
width: 50,
hide: false,
sort: null,
},
{
colId: "specials_1",
width: 80,
hide: true,
sort: null,
},
{
colId: "personal",
width: 60,
hide: true,
sort: null,
},
{
colId: "specialDomestic",
width: 60,
hide: true,
sort: null,
},
{
colId: "specialWar",
width: 60,
hide: true,
sort: null,
},
{
colId: "reservedCommandShort_1",
width: 70,
hide: false,
sort: null,
},
{
colId: "reservedCommand",
width: 120,
hide: false,
sort: null,
},
{
colId: "turntime",
width: 60,
hide: false,
sort: "asc",
sortIndex: 0,
},
{
colId: "years_1",
width: 60,
hide: true,
sort: null,
},
{
colId: "age",
width: 60,
hide: true,
sort: null,
},
{
colId: "belong",
width: 60,
hide: true,
sort: null,
},
{
colId: "killturnAndConnect_1",
width: 70,
hide: false,
sort: null,
},
{
colId: "killturn",
width: 70,
hide: false,
sort: null,
},
{
colId: "connect",
width: 70,
hide: true,
sort: null,
},
],
columnGroup: [
{
groupId: "0",
open: false,
},
{
groupId: "1",
open: false,
},
{
groupId: "stat",
open: false,
},
{
groupId: "2",
open: false,
},
{
groupId: "expDedLv",
open: false,
},
{
groupId: "goldRice",
open: true,
},
{
groupId: "3",
open: false,
},
{
groupId: "4",
open: false,
},
{
groupId: "crewtypeAndCrew",
open: false,
},
{
groupId: "trainAtmos",
open: false,
},
{
groupId: "specials",
open: false,
},
{
groupId: "reservedCommandShort",
open: true,
},
{
groupId: "5",
open: false,
},
{
groupId: "years",
open: false,
},
{
groupId: "killturnAndConnect",
open: true,
},
],
},
normal: {
column: [
{
colId: "icon",
width: 80,
hide: false,
pinned: "left",
sort: null,
},
{
colId: "name",
width: 126,
hide: false,
pinned: "left",
sort: null,
},
{
colId: "officerLevel",
width: 70,
hide: false,
sort: null,
},
{
colId: "expDedLv_1",
width: 60,
hide: false,
sort: null,
},
{
colId: "dedlevel",
width: 70,
hide: false,
sort: null,
},
{
colId: "explevel",
width: 60,
hide: false,
sort: null,
},
{
colId: "stat_1",
width: 88,
hide: false,
sort: null,
},
{
colId: "leadership",
width: 60,
hide: false,
sort: null,
},
{
colId: "strength",
width: 60,
hide: false,
sort: null,
},
{
colId: "intel",
width: 60,
hide: false,
sort: null,
},
{
colId: "troop",
width: 90,
hide: true,
sort: null,
},
{
colId: "goldRice_1",
width: 80,
hide: false,
sort: null,
},
{
colId: "gold",
width: 70,
hide: false,
sort: null,
},
{
colId: "rice",
width: 70,
hide: false,
sort: null,
},
{
colId: "city",
width: 60,
hide: true,
sort: null,
},
{
colId: "crewtypeAndCrew_1",
width: 80,
hide: true,
sort: null,
},
{
colId: "crewtype",
width: 80,
hide: true,
sort: null,
},
{
colId: "crew",
width: 70,
hide: true,
sort: null,
},
{
colId: "trainAtmos_1",
width: 60,
hide: true,
sort: null,
},
{
colId: "train",
width: 70,
hide: true,
sort: null,
},
{
colId: "atmos",
width: 70,
hide: true,
sort: null,
},
{
colId: "defence_train",
width: 50,
hide: true,
sort: null,
},
{
colId: "specials_1",
width: 80,
hide: false,
sort: null,
},
{
colId: "personal",
width: 60,
hide: false,
sort: null,
},
{
colId: "specialDomestic",
width: 60,
hide: false,
sort: null,
},
{
colId: "specialWar",
width: 60,
hide: false,
sort: null,
},
{
colId: "reservedCommandShort_1",
width: 70,
hide: true,
sort: null,
},
{
colId: "reservedCommand",
width: 120,
hide: true,
sort: null,
},
{
colId: "turntime",
width: 60,
hide: true,
sort: null,
},
{
colId: "years_1",
width: 60,
hide: false,
sort: null,
},
{
colId: "age",
width: 60,
hide: false,
sort: null,
},
{
colId: "belong",
width: 60,
hide: false,
sort: null,
},
{
colId: "killturnAndConnect_1",
width: 70,
hide: false,
sort: null,
},
{
colId: "killturn",
width: 70,
hide: true,
sort: null,
},
{
colId: "connect",
width: 70,
hide: false,
sort: "desc",
sortIndex: 0,
}
],
columnGroup: [
{
groupId: "0",
open: false
},
{
groupId: "1",
open: false
},
{
groupId: "stat",
open: true
},
{
groupId: "2",
open: false
},
{
groupId: "expDedLv",
open: true
},
{
groupId: "goldRice",
open: true
},
{
groupId: "3",
open: false
},
{
groupId: "4",
open: false
},
{
groupId: "crewtypeAndCrew",
open: false
},
{
groupId: "trainAtmos",
open: false
},
{
groupId: "specials",
open: false
},
{
groupId: "reservedCommandShort",
open: true
},
{
groupId: "5",
open: false
},
{
groupId: "years",
open: false
},
{
groupId: "killturnAndConnect",
open: true
}
],
},
};