트리형 팝업 구현

JungHanMa·2024년 1월 2일
0

React

목록 보기
2/2

정의

  • Grid 트리형 팝업

기능

  • RowList 구조에서 부모(Arrow Icon이 존재하는 것) / 자식 요소 나누어서 렌더링
  • 항목명 옆에 체크박스는 AllSelect
  • CheckBox Limit가 존재하고 없으면 Default 50
  • 부모의 체크박스를 클릭하면 해당 그룹에 묶인 자식들의 체크박스가 모두 Check
  • 자식을 누르면 해당 자식만 Check
  • 부모의 아이콘을 누르면 해당 그룹의 자식들이 모두 접힘.
  • 부모/ 자식 요소 중에서 자식의 자식이 20개까지 존재할 수 있음.

문제

  1. RowList가 1차원 배열로 내려오면 어떻게 부모와 자식을 구분할 것인가?
  2. 자식 요 소안에 자식이 계속 존재하면 어떻게 들여쓰기 스타일을 먹여줄 것인가?

해결

{
	prop_id: '',
	attr_type: EN_ATTR_TYPE.Renderer,
	attr_id: 'grid_tree',
	data: {
			group_prop_id: 'item_group', // 그룹을 식별하는 prop_id
			parent_group_prop_id: 'parent_item_group', // 부모 그룹 prop_id
	},
},



=========================================================================

protected getRowindent(
		data_model: any,
		data_models: any[],
		grid_tree?: {
			group_prop_id: string; // 그룹을 식별하는 prop_id
			parent_group_prop_id: string; // 부모 그룹 prop_id
		}
	) {
		if (!grid_tree) {
			return;
		}
		let result = 1;
		// grid_tree가 있는 prop을 찾는다. 무조건 하나만 있어야 한다고 전제한다
		const parent_group_prop_id = grid_tree?.parent_group_prop_id;
		const parent_item_group = data_model[parent_group_prop_id];
		if (parent_item_group) {
			result = infiniteLoop(parent_item_group, parent_group_prop_id, data_models, result);
		}

		return result;

		function infiniteLoop(parent_item_group, parent_group_prop_id, data_models, result) {
			result++;
			const parents_exist = data_models.find((data_model) => data_model.item_group === parent_item_group);
			const parent_group_prop = parents_exist?.[parent_group_prop_id];

			if (parent_group_prop) {
				return infiniteLoop(parent_group_prop, parent_group_prop_id, data_models, result);
			}

			return result;
		}
	}

설명

  1. parent_item_group에 빈값이면 부모요소, 값이있으면 자식요소
  2. 부모요소라면 return, 자식요소라면 재귀로 infiniteLoop함수를 돌린다.
  3. 1번 반복 gn result return
  4. 해당 result 값대로 indent 적용.
profile
Frontend Junior

0개의 댓글

관련 채용 정보