Slot Widget 추가
플랫폼 소유 Shell Slot을 App 컴포넌트와 버전 있는 props 계약, permission-gated descriptor로 채웁니다.
Host가 소유한 화면 안에 App 컴포넌트를 넣습니다. People 고용 카드는 profile.self.employment 슬롯과 ProfileSlotPropsV2를 사용하며, 인증된 API로 현재 사용자의 근로자 정보를 읽습니다.
컴포넌트와 descriptor 연결
App 화면 만들기를 마친 프런트엔드에서 다음 세 가지를 연결합니다.
- 해당 슬롯의 SDK props로 컴포넌트를 구현합니다. People은
props.workContext?.ref를 읽어queryKeys.profileSelfProjection(...)캐시 키와/people/me의work_context_ref인자에 넣습니다. 값이 없으면 컨텍스트 선택 안내만 표시하고 요청하지 않습니다. 대상 근로자는 인증된 API에서 결정하며 브라우저가 보낸 근로자 식별자를 권한으로 취급하지 않습니다. - App 프런트엔드 진입점에 컴포넌트 이름을 등록합니다.
packages/people/resources/js/index.ts는autoRegisterPackageSurfaces({ overrides: ... })에PeopleEmploymentProfileWidget을 두고./profile/PeopleEmploymentProfileWidget을 로드합니다. - Manifest의 contribution 경로에
AppDescriptorContribution을 만들고 다음 descriptor를 반환합니다.packages/people/src/Descriptors/PeopleCoreSlotWidgets.php의 실제 선언입니다.
new \Nexia\AppDescriptors\SlotWidgetDescriptor(
key: 'people.self.employment.profile',
version: '1.0',
slot: 'profile.self.employment',
component: 'PeopleEmploymentProfileWidget',
slotApiVersion: 2,
status: \Nexia\AppDescriptors\DescriptorStatus::Active,
permission: 'people.worker_profile.read',
sort: 10,
labelKey: 'people.worker_profile.widget.title',
familyKey: 'people.self.employment',
);클래스를 추가했다면 discovery를 갱신합니다.
task artisan -- nexia-runtime:generate-app-map
task artisan -- nexia-runtime:refresh-runtime-caches변경한 프런트엔드는 App 패키지 만들기의 패키지 빌드·활성화 절차로 반영합니다. Descriptor 권한은 배치를 결정하므로 조회 API에서도 별도로 요청을 허가해야 합니다.
결과 확인
People이 운영 가능한 테넌트에서 읽기 권한과 유효한 업무 컨텍스트를 가진 사용자로 내 프로필의 고용 탭을 엽니다. 현재 근로자의 카드가 보여야 합니다. 컨텍스트 없음, 로딩, 빈 결과, 일반 통신 실패, 권한 회수도 확인하세요. 권한이 회수되었다면 이전 캐시를 정상 결과처럼 계속 표시해서는 안 됩니다.
재시도와 오래된 데이터 처리까지 포함한 어댑터는 packages/people/resources/js/profile/PeopleEmploymentProfileWidget.tsx입니다. Package doctor의 페이지 연결 점검만으로 위젯 등록이 증명되지는 않으므로 실제 슬롯을 열어 확인합니다. 자동 검사는 App 테스트하기를 따릅니다.
슬롯과 버전 선택
현재 프로필 호스트가 받는 슬롯 키와 props 버전입니다. 새 위젯은 V2로 작성하고, V1은 아래에 표시한 기존 슬롯의 호환 지원에만 사용하세요.
| 슬롯 키 | 호스트 화면 | Props 버전 |
|---|---|---|
profile.self.overview | 개요 | 1, 2 |
profile.self.employment | 고용 | 1, 2 |
profile.self.organization | 조직 | 2 |
profile.self.time_leave | 근태·휴가 | 1, 2 |
profile.self.pay | 급여 | 1, 2 |
profile.self.projects | 프로젝트 | 1, 2 |
profile.self.growth | 성장 | 1, 2 |
profile.self.documents | 문서 | 2 |
approval.composer.business_form | 전자 결재 업무 폼 | 2 |
프로필 슬롯은 ProfileSlotPropsV2를 사용합니다. 전자 결재 행은 현재 composer가 전달하는 ApprovalBusinessFormSlotPropsV2 기준입니다. 결재 위젯은 프로필 컴포넌트 registry가 아니라 바인딩의 formWidgetKey로 approvalComposerBusinessFormRegistry에서 찾습니다. 해당 등록 절차는 전자 결재를 따르세요.
프로필의 허용 버전은 app/Shell/Profile/ProfileSlotContract.php, 결재 props와 registry는 resources/js/core/approval/approval-composer-business-form.ts에 정의되어 있습니다.
| 설정 | 의미 |
|---|---|
slot | 이미 존재하는 host 슬롯; 이름을 쓰는 것만으로 새 슬롯이 생기지 않음 |
slotApiVersion | 컴포넌트가 구현한 SDK props 계약 버전 |
version | 위젯 descriptor 자체 버전 |
component | 프런트엔드에 등록한 정확한 이름 |
sort, familyKey | 순서와 묶음; 접근 권한을 부여하지 않음 |
Props는 React 컴포넌트와 훅에서 확인합니다. 프로필 카드, 결재 업무 양식, Process 사용자 태스크는 서로 다른 계약입니다. 결재 연결은 전자 결재, 사용자가 배치하는 위젯은 Dashboard Widget 추가를 보세요.
Props 구현과 slotApiVersion은 함께 변경합니다. 기존 참조가 있는 descriptor는 식별자를 유지하고 사용 중단 뒤 제거하세요. SDK 타입과 host facade만 가져오며, 필요한 컨텍스트가 없다면 공개 슬롯 계약부터 확장해야 합니다.