๐Ÿ“‘ 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 ๋ฐ์ดํ„ฐ์— ์ด๋ฅผ ๋ณด๋‚ด๋ฉด ๋œ๋‹ค.

๐Ÿ“บ ์ตœ์ข… ํ™”๋ฉด

image