Team 패널 (Level 5)
📝 초안 (Draft)
이 문서는 검토 중입니다. 내용이 변경될 수 있습니다.
Group Leader 전용 패널 기능을 설명합니다.
개요
Team 패널은 **Level 5 (Group Leader)**을 위한 관리 패널입니다. 팀 내의 멤버를 관리하고, 업무를 할당하며, 팀 성과를 추적합니다.
접근 권한
| 항목 | 값 |
|---|---|
| 권한 레벨 | Level 5 (Group Leader) |
| 기본 경로 | /team |
| 환경변수 | PANEL_PATH_TEAM |
| 접근 가능자 | Level 0, 1, 2, 3, 4, 5 |
담당 범위
Group Leader는 자신의 팀 내에서만 권한을 가집니다:
Team A (담당)
├── Member 1 ✅ 관리 가능
├── Member 2 ✅ 관리 가능
├── Member 3 ✅ 관리 가능
└── 팀 설정 ✅ 조회 가능
Team B (타 팀)
└── 모든 데이터 ❌ 접근 불가
주요 기능
1. 멤버 관리
팀 내의 Level 6 멤버를 관리합니다.
MemberResource 주요 필드:
| 필드 | 설명 | 예시 |
|---|---|---|
name | 이름 | "홍길동" |
email | 이메일 | "hong@example.com" |
password | 비밀번호 | (암호화됨) |
organization | 소속 조직 | "개발부" |
leader | 담당 리더 | "김팀장" |
테이블 컬럼:
- ID
- 이름 (검색 가능)
- 이메일 (검색 가능)
- 소속 조직
- 담당 리더
- 생성일
2. 멤버 생성
새로운 팀원을 **Level 6 (Member)**로 생성합니다.
// MemberResource.php - 자동 설정값
Forms\Components\Hidden::make('level')
->default(UserLevel::MEMBER->value),
Forms\Components\Hidden::make('tenant_id')
->default(fn () => auth()->user()?->tenant_id),
Forms\Components\Hidden::make('organization_id')
->default(fn () => auth()->user()?->organization_id),
Forms\Components\Hidden::make('parent_id')
->default(fn () => auth()->id()), // 현재 리더가 상위자
3. Impersonate 기능
Group Leader는 팀원으로 전환하여 팀원 시점에서 시스템을 확인할 수 있습니다.
// MemberResource.php
->recordActions([
ImpersonateAction::make(), // 멤버로 전환
EditAction::make(),
DeleteAction::make(),
])
사용 사례:
- 팀원이 겪는 문제 재현
- 팀원 화면 확인
- 교육/온보딩 지원
4. 팀 통계
팀의 현황 및 성과를 조회합니다.
| 지표 | 설명 |
|---|---|
| 팀원 수 | 현재 팀 인원 |
| 활동 현황 | 최근 로그인/활동 |
| 업무 진행률 | 할당된 업무 완료율 |
파일 구조
app/Filament/Team/
├── Resources/
│ └── MemberResource.php # 멤버 관리
│ └── Pages/
│ ├── ListMembers.php
│ ├── CreateMember.php
│ └── EditMember.php
│
├── Pages/
│ └── Dashboard.php
│
└── Widgets/
├── TeamStatsWidget.php
└── MemberActivityWidget.php
PanelProvider 설정
// app/Providers/Filament/TeamPanelProvider.php
class TeamPanelProvider extends PanelProvider
{
public function panel(Panel $panel): Panel
{
return $panel
->id('team')
->path(env('PANEL_PATH_TEAM', 'team'))
->login()
->colors(['primary' => Color::Green])
->discoverResources(
in: app_path('Filament/Team/Resources'),
for: 'App\Filament\Team\Resources'
)
->authMiddleware([
Authenticate::class,
EnsureUserLevel::class.':0,1,2,3,4,5', // Level 0-5 접근
]);
}
}
데이터 필터링
HasLevelBasedAuthorization Trait
MemberResource는 Level 기반 권한 검사를 사용합니다.
class MemberResource extends Resource
{
use HasLevelBasedAuthorization;
// 이 Resource가 관리하는 대상: Level 6
protected static function getTargetLevel(): int
{
return UserLevel::MEMBER->value;
}
}
자동 필터링
팀 리더는 자신의 하위 멤버만 조회합니다:
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->where('parent_id', auth()->id())
->where('level', UserLevel::MEMBER->value);
}