๐ AG GRID
๐ Smart Html Elements์ Grid์์ AG GRID๋ก ์ ๋ฐ์ดํธํ ํ ์ฅ์
๋ฐฐํฌํ๊ธฐ ์ ๊น์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ํ์คํ ๋ ๋ฌด๊ฑฐ์์ง ๊ฒ ๊ฐ๋ค. ์คํํ์ ๋ ๋ก๋ฉ ์๊ฐ์ด ๋์ ๋ ์ ๋๋ก ๋นจ๋ผ์ก๊ณ ๊ตฌํ์ ์์ด์๋ smart html elements๋ณด๋ค ๋ณต์กํ ๋ถ๋ถ์ ์ ํ ์์๋ค.
โ๏ธ ๊ตฌํ ๊ณผ์
์ด์ ์ ๊ตฌํํด ๋์ ๋ฐ์ดํฐ ํ ์ด๋ธ ์ค์ ํ๋๋ฅผ ๋จผ์ ์ ๋ฐ์ดํธ ํด๋ณด์๋๋ฐ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ๋์๋ค. (Vue3์ ์ด์ฉํด ๊ฐ๋ฐ, function ๊ด๋ จ ์ฝ๋๋ง ์ฌ๋ ค๋์ ์์ )
๐พ ์ฝ๋
// processColumns.ts
const columnType = (data: any) => {
if (
typeof data === 'string' ||
typeof data === 'boolean' ||
typeof data === 'number' ||
data === null
)
return 'column';
else if (typeof data === 'object' && Object.keys(data)[0] === '0') return 'array';
else if (Array.isArray(data)) return 'array';
else return 'group';
};
export const gridMethods = {
makeSources: async (datas: any) => {
if (Array.isArray(datas.value)) {
return await Promise.all(
datas.value.map((item: any) => {
const keys = Object.keys(item);
const source = {} as { [column: string]: string };
keys.forEach((key) => {
const type = columnType(item[key]);
if (type === 'column') source[key] = item[key];
if (type === 'group') {
const fields = Object.keys(item[key]);
fields.forEach((field) => {
source[field] = item[key][field];
});
}
});
return { ...source };
})
);
}
},
setColumns: async (datas: any, columnList: any) => {
const processedDatas = await gridMethods.makeSources(datas);
if (processedDatas) {
processedDatas.forEach((data) => {
const columns = data;
columnList.value = [];
const fields = Object.keys(columns);
fields.forEach((field: any) => {
if (columns[field]) {
columnList.value.push({
headerName: field,
});
}
});
});
}
},
};
<AgGrid
v-model:datas="propDatas"
:column-list="fieldList"
:settings="gridSettings"
:style="`width: 1000px; height: 100%`"
@row-selected="onRowSelected"
/>
// vue ํ์ผ์ script ๋ด๋ถ ์ฝ๋ ์ค ์ผ๋ถ๋ถ
import { AgGrid } from '[AgGrid Component ์์ฑํ ํ์ผ]'
const getData = async () => {
const query = JSON.stringify({});
const res = await getTenants({ query });
if (res.data.value.statusCode === 200) datas.value = res.data.value.data;
columns.value = [
'companyName',
'tenantName',
'companyContactEmail',
'companyContactName',
'companyContactPhone',
'companyBusinessNumber',
'startDate',
'dueDate',
];
columns.value.forEach((column: any) => {
if (column) fieldList.value.push({ field: column });
});
};
const setTableDatas = async () => {
await getData();
await gridMethods.setColumns(datas, columnList);
propDatas.value = await gridMethods.makeSources(datas);
};
onMounted(async () => {
await setTableDatas();
});
๐ก ์์ธ ์ค๋ช
์ฐ์ , processColumns.ts์์ columnType์ DB์์ ๋ฐ์์ค๋ ๋ฐ์ดํฐ๋ค์ ๋ฐ์ดํฐ ํ์ ์ด ๊ฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ (์ด๋ค ๋ฐ์ดํฐ๋ ๋ฌธ์์ด, ์ด๋ค ๋ฌธ์์ด์ ๊ฐ์ฒดโฆ ๋ฑ๋ฑ) ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๊ฐ๊ณตํ๊ธฐ ์ํด ํ์ ์ ๊ตฌ๋ถํ๊ธฐ ์ํ ๋ฉ์๋์ด๋ค.
๊ทธ๋ฆฌ๊ณ gridMethods์ makeSources๋ ์์์ ๋ง๋ columnType์ ํ์ฉํ์ฌ ํ์ ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋๋ ๋์ ๋ฉ์๋์ด๋ค.
gridMethods์ setColumns๋ makeSources๋ฅผ ํตํด ํ์ ๋ณ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ ๋ค, Ag Grid์์ ์ฌ์ฉ๋๋ ํ์ ์ธ ColDefํ์ ์ ColumnList์ ์ต์ข ํ๋๋ช ๋ค์ ์ฝ์ ํ๋ ๋ฉ์๋์ด๋ค.
Container.vue์์ getData๋ฅผ ํตํด ๋ฐฑ์๋์ ๊ตฌํํด๋์ API๋ฅผ ํธ์ถํ์ฌ DB์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค. ์ฌ๊ธฐ์ columns๋ผ๋ ref ๊ฐ์ ๋ฏธ๋ฆฌ ์ปฌ๋ผ์ ์ค์ ํด์ฃผ์ด์ผ ์ปฌ๋ผ ์์๋ฅผ ์ง์ ํด์ค ์ ์๋ค.
setTableDatas์๋ processColumns์์ ๋ง๋ค์ด๋์ ๋ฉ์๋๋ค์ ํธ์ถํ์ฌ ์ต์ข ๋ฐ์ดํฐ์ธ propDatas์ ์ต์ข ๋ฐ์ดํฐ๋ฅผ ํ ๋นํ์ฌ AgGrid์ props ๋ฐ์ดํฐ์ ์ด๋ฅผ ๋ณด๋ด๋ฉด ๋๋ค.