(menu = null)} onkeydown={(e) => { if (e.key === "Escape") menu = null; }} />
Group 树
{ if ((e.target as HTMLElement).closest("[data-node]") !== null) return; openMenu(e, null); }} > {#if !loaded}
加载中…
{:else if listError !== null}
{listError}
{:else if groups.length === 0}
暂无成员组 · 点上方「根组」开始
{:else if rows.length === 0}
无匹配的组
{:else} {#each rows as { g, hasKids, hit } (g.id)} {@const arch = g.archivedAt !== null}
select(g.id)} onkeydown={(e) => { if (e.key === "Enter" || e.key === " ") { e.preventDefault(); select(g.id); } }} oncontextmenu={(e) => openMenu(e, g)} > {#if hasKids} { e.stopPropagation(); toggleCollapsed(g.id); }} onkeydown={(e) => { if (e.key === "Enter") toggleCollapsed(g.id); }} > {:else} {/if} {g.name} {g.memberCount} {#if arch} 已删除 {/if}
{/each} {/if}
{loaded ? treeFoot : ""}
{#if selected === null}
从左侧选择一个 Group 查看成员
{:else} {#if isArchived}
此 Group 已删除于 {fmtDate(selected.archivedAt ?? "")} · 成员只读,不再授予任何权限
{/if}
{#each chain as c, i (c.id)} {#if i > 0}/{/if} {c.name} {/each}
{selected.name}
{#if selected.description !== null && selected.description !== ""}
{selected.description}
{:else}
无描述
{/if}
{#if !isArchived} {/if}
{members.length} 名成员 层级 {selected.depth} {childCount} 个子组
{memberFilter.trim() === "" ? "" : `${shownMembers.length} / ${members.length}`}
{#if !membersLoaded}
加载中…
{:else if membersError !== null}
{membersError}
{:else if members.length === 0}
{isArchived ? "此组无成员记录" : "此组暂无成员 · 点右上「添加成员」"}
{:else if shownMembers.length === 0}
无匹配成员
{:else} {#if !isArchived}{/if} {#each shownMembers as m (m.userId)} {#if !isArchived} {/if} {/each}
成员 userId 飞书 openId 加入时间操作
{m.displayName || "(未命名)"} {m.userId} {m.feishuOpenId || "—"} {fmtDate(m.joinedAt)}
{/if}
{/if}
{#if menu !== null} {/if} {#if showCreate} (showCreate = false)} >
{/if} {#if showRename && renameTarget !== null} (showRename = false)}>
{/if} {#if showAdd && selected !== null} (showAdd = false)}>
{ if (e.key === "Enter") void searchUsers(); }} />
已在本组的成员不会出现在结果里。
{#if addSearching}
搜索中…
{:else if addResults.length === 0}
无候选用户 · 先点「搜索」
{:else} {#each addResults as u (u.userId)}
{u.displayName || "(未命名)"}
{u.feishuOpenId || u.userId}
{/each} {/if}
{/if}