feat(M02): 화면 권한 맡은 회사 — accessFor 짝 · 개인 단추 = 회사 사람 나무(나 맨 위 · 비어 있음) · 「〇〇로 복사…」 볼 회사까지 · 대상 폴더 고르기 창(39-6 E5~E8)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013rJwJMVL4EE31y77TB11AP
This commit is contained in:
2026-10-04 17:39:38 +09:00
co-authored by Claude Opus 5.5
parent 54ba657ff1
commit a2d1471931
8 changed files with 91 additions and 35 deletions
@@ -4,8 +4,8 @@
* 「구조물 조합」 아래 한 줄 · 나무 종류와 무관한 공용 부품. 고른 층의 나무는 부르는 쪽이 이 줄 아래에 붙임.
* 권한 없는 층 = 단추 글 끝에 「읽기」(권한 = `accessFor` · 서버 `M02_Layer_Access` 와 짝)
* 회사 = 볼 회사(`viewCompany` — 시스템 관리자는 해시 `company` · `aislo.adminCompany` · 자기 회사)
* 시스템 관리자가 남의 회사를 보면 그 회사 관리자처럼(PLAN 29-6) — 「개인」 = 그 회사 사람 나무
* (`createPeopleTree` · 사람 줄 → 그 사람 라이브러리 · 읽기) · 자기 개인 층은 자기 회사를 고를 때만
* 볼 회사를 맡으면(`manages` · 39-6 — 시스템 관리자 · 그 회사 관리자) 「개인」 = 그 회사 사람 나무
* (`createPeopleTree` · 나 맨 위 · 사람 줄 → 그 사람 라이브러리 · 고침) · 일반 = 내 개인 그대로
* 누르면 `go`(부르는 쪽이 해시로 다시 엶).
* ========================================================================== */
@@ -18,6 +18,7 @@ import {
accessFor,
buildNeedCompany,
layerOfRoot,
manages,
ownOwner,
type Root,
} from "./M02_MasterTemplete_Layer";
@@ -40,9 +41,9 @@ export interface LayerBarOptions {
export const companyOwner = (company: string | null, user: SessionUser | null): string | null =>
company && company !== ownOwner("company", user) ? company : null;
/** 시스템 관리자가 남의 회사를 봄 — 「개인」 단추 = 그 회사 사람 나무(읽기) */
/** 볼 회사를 맡음(39-6) — 「개인」 단추 = 그 회사 사람 나무 */
export const seesOthers = (company: string | null, user: SessionUser | null): boolean =>
user?.role === "SYSTEM_ADMIN" && !!companyOwner(company, user);
manages(company, user);
export function createLayerBar(opt: LayerBarOptions): HTMLElement {
const { user, active } = opt;
@@ -57,7 +58,7 @@ export function createLayerBar(opt: LayerBarOptions): HTMLElement {
}
function button(root: Root, owner: string | null, people = false): HTMLButtonElement {
const readOnly = people || !accessFor(layerOfRoot(root), owner, user).canWrite;
const readOnly = !people && !accessFor(layerOfRoot(root), owner, user).canWrite;
const name = L(
root === "master"
? "M02_PickerSystem"
@@ -113,7 +114,8 @@ export function createPeopleTree(opt: PeopleTreeOptions): HTMLElement {
box.replaceChildren(
...rows.flatMap((one) => {
const current = one.owner === opt.active;
const node = { id: one.owner, label: one.name, count: null, folder: true };
const label = one.비어있음 ? `${one.name} · ${L("M02_PeopleEmpty")}` : one.name;
const node = { id: one.owner, label, count: null, folder: true };
const row = createTreeRow(node, current ? "▾" : "▸", 0, () => {
if (!current) return opt.go(one.owner);
wrap.hidden = !wrap.hidden;