feat: 负责人下钻视图+项目负责人编辑管理+企微授权自助绑定

- 任务/项目负责人 union scope:任务中心分组视图、工作台项目进度卡、收录验证列
- 项目负责人可管理自己项目:编辑/删除项目、编辑任务、分配负责人、推送、项目内建任务;堵死转移归属/越权新建/任务迁移
- 只读依赖放开给已登录:inspect_feishu、wecom_list_internal_contacts
- 企微 OAuth 自助绑定:/api/wecom-bind(state 签名校验+登录态一致性+归属冲突检查),未绑定 banner 增加入口
- 工作台项目进度卡与未绑定 banner 排版修复
- 修 user-auth 判空分支被 Turbopack dev 折叠删除导致匿名请求 500
This commit is contained in:
ABAPPLO
2026-09-17 15:21:24 +08:00
parent dd5b603149
commit 8f1ebf7697
24 changed files with 1812 additions and 213 deletions

View File

@@ -338,6 +338,13 @@ button:disabled {
margin: 0 !important;
}
.related-task-meta {
color: #277a5d;
background: #e6f3ee;
border-radius: 9px;
padding: 2px 8px;
}
a {
color: inherit;
text-decoration: none;
@@ -985,7 +992,9 @@ a {
.workflow-panel,
.task-mini-panel,
.table-panel,
.wecom-status-panel {
.wecom-status-panel,
.project-progress-panel,
.owner-unbound-banner {
padding: 21px;
}
@@ -1013,6 +1022,44 @@ a {
font-size: 10px;
}
.owner-unbound-banner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.owner-unbound-banner h2 {
margin: 0;
font-size: 15px;
font-weight: 670;
letter-spacing: -0.02em;
}
.owner-unbound-banner p {
margin: 6px 0 0;
color: #7d8683;
font-size: 12px;
line-height: 1.7;
}
.owner-bind-button {
flex-shrink: 0;
padding: 9px 18px;
border: 1px solid var(--green-deep);
border-radius: 10px;
color: white;
background: var(--green);
font-size: 12px;
font-weight: 600;
text-decoration: none;
white-space: nowrap;
}
.owner-bind-button:hover {
background: var(--green-deep);
}
.workflow-track {
display: grid;
grid-template-columns: auto 1fr auto 1fr auto 1fr auto;
@@ -1334,7 +1381,8 @@ a {
background: #e9f3f6;
}
.status-pill.complete {
.status-pill.complete,
.status-pill.completed {
color: #277a5d;
background: #e6f3ee;
}
@@ -1942,6 +1990,15 @@ a {
background: #e5e9e6;
}
.inline-summary.related-summary {
border-color: #bfe3d6;
background: #f4faf7;
}
.inline-summary.related-summary strong {
font-size: 14px;
}
.summary-note {
display: flex;
align-items: center;
@@ -2131,6 +2188,46 @@ a {
letter-spacing: -0.03em;
}
.task-scope-companion {
display: flex;
align-items: center;
gap: 10px;
margin-top: 2px;
padding: 10px 12px;
border: 1px dashed #cfe0d8;
border-radius: 9px;
background: #f6faf8;
font-size: 10px;
}
.task-scope-companion .companion-label {
color: #277a5d;
font-weight: 650;
}
.task-scope-companion strong {
flex: 1;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 10px;
}
.task-scope-companion .companion-progress {
color: #99a29f;
white-space: nowrap;
}
.tag-weak {
padding: 1px 7px;
border-radius: 8px;
color: #b3aba5;
background: #f6f4f2;
font-size: 8px;
white-space: nowrap;
}
.task-scope-open {
display: flex;
width: 100%;
@@ -3331,6 +3428,98 @@ a {
gap: 6px;
}
.collection-verify-cell {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 4px;
}
.collection-verify-cell small {
color: #99a29f;
font-size: 8px;
}
.project-progress-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.project-progress-row {
display: flex;
align-items: center;
gap: 18px;
padding: 13px 16px;
border: 1px solid #eef1ef;
border-radius: 11px;
background: #fbfcfb;
}
.project-progress-title {
display: flex;
flex: 1;
min-width: 0;
align-items: center;
gap: 12px;
}
.project-progress-title .avatar {
width: 34px;
height: 34px;
flex-shrink: 0;
}
.project-progress-title strong {
display: block;
font-size: 13px;
}
.project-progress-title span {
display: block;
margin-top: 3px;
color: #7d8683;
font-size: 11px;
}
.project-progress-funnel {
display: flex;
align-items: center;
gap: 12px;
white-space: nowrap;
}
.project-progress-funnel i {
color: #c6cdc9;
font-size: 11px;
font-style: normal;
}
.funnel-chip {
display: inline-flex;
align-items: baseline;
gap: 6px;
padding: 5px 12px;
border-radius: 9px;
color: #6b7470;
background: #f1f4f2;
font-size: 11px;
}
.funnel-chip b {
color: #37423d;
font-size: 13px;
}
.funnel-chip.done {
color: #277a5d;
background: #e6f3ee;
}
.funnel-chip.done b {
color: #277a5d;
}
.creator-screenshot-link {
position: relative;
width: 72px;