본문 바로가기
기술자료 (KB)/Power Platform

PowerApps으로 만드는 조직도 솔루션 - 12. 홈 화면 (왼쪽 메뉴)

by 이완주 2024. 10. 15.

 

 

PowerApps으로 만든 조직도 솔루션 제안서

작년에 Power Apps으로 만들어 아직까지 저희 회사에 잘 쓰고 있는 솔루션 입니다.조직도는 연차 결재 솔루션과 연동하여 사용 중에 있습니다. 해당 솔루션의 구성 방법 입니다. 대략 10개 내외 정

leemcse.tistory.com

 

홈 화면 왼쪽 메뉴 구성

1. 다양한 검색 조건으로 직원을 검색

2. 조직을 계층적으로 표시 

3. 조직을 확장 및 축소

4. 조직에 포함된 직원의 수를 표시

5. 모바일에서 전화를 바로 걸수 있는 아이콘 표시

6. 편집 아이콘으로 자기 자신의 일부 정보 수정 가능 할 수 있게 구성

 

[구성 화면]

 

앱 실행 초기 구성

ColOrgAllList 앱을 실행하면 컬렉션을 만들어 홈 화면에 표시 할 수 있게 구성

// 관리자 그룹인지 확인하여 관리자 그룹이면 왼쪽 메뉴가 나타나게 하고 그렇지 않은 일반 사용자는 왼쪽 메뉴가 나타나지 않게 구성
Set(varGroupMembers,Office365그룹.ListGroupMembers("1eddd77c-c080-4427-a3c7-5908af36d342").value);
// varLeftSize 값이 관리자이면 false로 설정, 관리자가 아니면 true
Set(varLeftSize,IsBlank(LookUp(varGroupMembers,mail=User().Email)));

// ColDepartment 초기화 및 생성
ClearCollect(ColDepartment,AddColumns(OrgDepartment,NewID,ID));

// OrgCompany의 회사 정보를 ColDepartment에 추가
ForAll(
    OrgCompany,
    Collect(
        ColDepartment,
        {
            No: Text(OrderNo,"00"),
            CompanyID : ID,
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true
        }
    )
);

// ColEmployee 초기화 및 생성
ClearCollect(ColEmployee,AddColumns(OrgEmployee,NewID,ID));
ForAll(
    OrgCompany,
    Collect(
        ColEmployee,
        {
            No: Text(OrderNo,"00"),
            CompanyID : ID,
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true
        }
    )
);


Clear(ColOrgAllList);
ForAll(
    OrgCompany,
    Collect(ColOrgAllList,
        {
            Name: Name,
            Level: 0,
            OrderNo: Text(OrderNo,"00") & "000000000000000000000000000000",
            Visible:true,
            Type:"Company"
        }
    )
);


ForAll(
    Filter(ColDepartment,Level<>0),
    Collect(ColOrgAllList,
        {
            Company:Company,
            Name: Name,
            DepartmentID: ID,
            Level: Level,
            OrderNo: OrderNo,
            Visible:true,
            Type:"Department"
        }
    )
);

ForAll(
    Filter(ColEmployee,!IsBlank(No) And Level<>0),
    Collect(ColOrgAllList,
        {
            Company:Company,
            CompanyID:CompanyID,
            Name: Name,
            DepartmentID: DepartmentID,
            Department:Department,
            EmpNo: EmpNo,
            EmployeeID:ID,
            Level: Level,
            No:No,
            OrderNo: OrderNo,
            Jobtitle : Jobtitle,
            Position : Position,
            Mail:Mail,
            Phone:Phone,
            Mobile:Mobile,
            ShortNumber:ShortNumber,
            Visible:true,
            ResignationDate:ResignationDate,
            JoinDate:JoinDate,
            Specialize:Specialize,
            Type:"Employee",
            DepartmentNum : 1
        }
    )
);
ForAll(
    Filter(ColEmployee,!IsBlank(No1)),
    Collect(ColOrgAllList,
        {
            Company:Company,
            CompanyID:CompanyID,
            Name: Name,
            DepartmentID: DepartmentID1,
            Department:Department1,
            EmpNo: EmpNo,
            EmployeeID:ID,
            Level: Level1,
            No:No1,
            OrderNo: OrderNo1,
            Jobtitle : Jobtitle,
            Position : Position,
            Mail:Mail,
            Phone:Phone,
            Mobile:Mobile,
            ShortNumber:ShortNumber,
            Visible:true,
            ResignationDate:ResignationDate,
            JoinDate:JoinDate,
            Specialize:Specialize,
            Type:"Employee",
            DepartmentNum : 2
        }
    )
);
ForAll(
    Filter(ColEmployee,!IsBlank(No2)),
    Collect(ColOrgAllList,
        {
            Company:Company,
            CompanyID:CompanyID,
            Name: Name,
            DepartmentID: DepartmentID2,
            Department:Department2,
            EmpNo: EmpNo,
            EmployeeID:ID,
            Level: Level2,
            No:No2,
            OrderNo: OrderNo2,
            Jobtitle : Jobtitle,
            Position : Position,
            Mail:Mail,
            Phone:Phone,
            Mobile:Mobile,
            ShortNumber:ShortNumber,
            Visible:true,
            ResignationDate:ResignationDate,
            JoinDate:JoinDate,
            Specialize:Specialize,
            Type:"Employee",
            DepartmentNum : 3
        }
    )
);


 

 

갤러리 Items 속성

Filter(
        // ColOrgAllList OrderNo로 정렬 한 값을 기준으로 필터
        Sort(ColOrgAllList,OrderNo),
       
        // 조직의  확장 표시를 위해 Visible 값이 True 인 것만 화면에 표시
        Visible=true And
       
        // 퇴사자는 화면에 표시 하지 않음
        IsBlank(ResignationDate) And
               
        (
             // Type이 회사와 부서는 모두 표시
            Type="Company" Or Type="Department" Or

            // 검색 조건을 이름, 전문분야, 휴대폰, 메일, 소속부서로 설정
            Name in Search(ColOrgAllList,HomeSearch.Text,Name).Name Or
            Specialize in Search(ColOrgAllList,HomeSearch.Text,Specialize).Specialize Or
            Mobile in Search(ColOrgAllList,HomeSearch.Text,Mobile).Mobile Or
            Mail in Search(ColOrgAllList,HomeSearch.Text,Mail).Mail Or
            Department in Search(ColOrgAllList,HomeSearch.Text,Department).Department
        )
)

 

OnSelect 속성

OnSelect = UpdateContext({ itemSelected: true, CurrentItem: ThisItem , editMode:false, newMode:false,deleteMode:false})

 

 

홈 아이콘 설정

 

OnSelect 속성

// 클릭하면 조직의 확장 및 축소
UpdateIf(ColOrgAllList,StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level * 5 + 2)) And DepartmentID <> ThisItem.DepartmentID,{Visible:!Visible});
UpdateIf(ColOrgAllList,StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level * 5 + 2)) And DepartmentID <> ThisItem.DepartmentID And Level > ThisItem.Level + 1,{Visible:false});
UpdateIf(ColOrgAllList,StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level * 5 + 2)) And Type="Employee" ,{Visible:!Visible});
UpdateIf(ColOrgAllList,StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level * 5 + 2)) And Type="Employee" And Level > ThisItem.Level + 1,{Visible:false});

 

아이콘 위치 X 속성

Level을 기준으로 아이콘의 위치를 설정

X = ThisItem.Level * 20

 

아이콘 모양

회사와 부서 직원의 아이콘 모양을 다르게 표현 한다.

Icon = If(ThisItem.Type="Company",Icon.OfficeBuilding,ThisItem.Type="Department",Icon.People,Icon.Person)

 

조직에 포함된 직원의 수를 표시

하위 조직에 포함된 직원 수를 나타낸다.

위치를 조직 아이콘 좌측 하단에 표시

 

Text 속성

If(
    // 직원이 아닌 경우
ThisItem.Type<>"Employee",If(
        // 회사에 포함된 직원으로 퇴사자 제외
ThisItem.Type="Company",CountRows(Filter(ColEmployee,IsBlank(ResignationDate) And StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level*5+2))))-1,
        // 소속 부서에 포함된 직원으로 퇴사자 제외
CountRows(Filter(Filter(ColOrgAllList,Type="Employee" And IsBlank(ResignationDate)),StartsWith(OrderNo,Left(ThisItem.OrderNo,ThisItem.Level*5+2))))))

 

위치 설정

아이콘 왼쪽 하단에 위치

X = HomeIcon.X + 27

 

글꼴 크기 8, 여백으로 위치 지정

 

아이콘 설정

 

모바일 아이콘

Icon = Icon.Mobile
X = Parent.Width - Self.Width - 10
OnSelect = Launch("Tel:"&ThisItem.Mobile)
HoverFill = ColorFade(RGBA(248, 248, 255, 0.2), -30%)

// 직원일 경우 표시
Visible =  ThisItem.Type="Employee"

 

전화 아이콘 위치는 위의 모바일 아이콘 위치를 기준으로 설정

Icon = Icon.Phone
X = MobileIcon_1.X - Self.Width
OnSelect =
Launch("Tel:"&ThisItem.Phone)
HoverFill = ColorFade(RGBA(248, 248, 255, 0.2), -30%)

// 직원일 경우 표시  및 모바일 화면이 작을 경우 화면에 나타나지 않게 구성
Visible = And(ThisItem.Type="Employee",Parent.Width>300)

 

메일 아이콘
Icon = Icon.Mail
X = PhoneIcon_1
.X - Self.Width
OnSelect = Launch("Mailto:"&ThisItem.Mail)
HoverFill = ColorFade(RGBA(248, 248, 255, 0.2), -30%)
And(ThisItem.Type="Employee",Parent.Width>300)

// 직원일 경우 표시 및 모바일 화면이 작을 경우 화면에 나타나지 않게 구성
Visible = And(ThisItem.Type="Employee",Parent.Width>300)

 

자기 자신의 정보 수정

왼쪽 메뉴의 편집 버튼을 눌렀을 경우 

2번 화면 구성 및 설정은 13. 홈 화면 (상세 화면) 에서 표시하기 위한 기본 설정

OnSelect = UpdateContext({editMode: true});

댓글