@parallelworks/tandem-web 0.141.2 → 0.143.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_virtual/_virtual_i18n/en/common.js +162 -5
- package/_virtual/_virtual_i18n/es/common.js +162 -5
- package/_virtual/_virtual_i18n/ja/common.js +162 -5
- package/_virtual/_virtual_i18n/ko/common.js +162 -5
- package/_virtual/_virtual_i18n/zh/common.js +162 -5
- package/components/AccessGrants.js +6 -6
- package/components/ActivityTimeline.js +2 -0
- package/components/CodeHostSettings.js +25 -25
- package/components/CustomFields.js +349 -0
- package/components/DocProperties.js +320 -0
- package/components/DocTable.js +176 -0
- package/components/DocViewBlock.js +104 -0
- package/components/DocsTree.js +16 -6
- package/components/Editor.js +30 -28
- package/components/GitHub.js +22 -22
- package/components/IssueBoard.js +48 -43
- package/components/IssueEvent.js +2 -0
- package/components/IssueFilters.js +210 -122
- package/components/IssueImport.js +1 -1
- package/components/IssueRow.js +96 -79
- package/components/IssueTemplates.js +216 -156
- package/components/IssueTypes.js +318 -0
- package/components/NewIssueDialog.js +254 -216
- package/components/SettingsNav.js +40 -35
- package/components/SlashMenu.js +2 -0
- package/components/TeamForm.js +49 -35
- package/components/TeamRepositories.js +51 -51
- package/components/TeamWorkflow.js +8 -8
- package/components/Updates.js +8 -8
- package/lib/boardMove.js +69 -47
- package/lib/customFields.js +113 -0
- package/lib/docProperties.js +135 -0
- package/lib/issueDisplay.js +27 -12
- package/lib/issueList.js +166 -62
- package/lib/issueTypes.js +50 -0
- package/lib/teamTree.js +24 -0
- package/lib/views.js +13 -11
- package/package.json +1 -1
- package/pages/issues.js +331 -291
- package/routeTree.gen.js +174 -162
- package/routes/_workspace/agents/index2.js +9 -9
- package/routes/_workspace/docs/_doc2.js +147 -140
- package/routes/_workspace/docs/space._space.js +6 -0
- package/routes/_workspace/docs/space2._space.js +256 -0
- package/routes/_workspace/docs2.js +3 -3
- package/routes/_workspace/issues/_identifier2.js +433 -370
- package/routes/_workspace/projects/_projectId3.js +213 -201
- package/routes/_workspace/settings/audit-log3.js +2 -0
- package/routes/_workspace/settings/fields.js +6 -0
- package/routes/_workspace/settings/fields2.js +30 -0
- package/routes/_workspace/settings/fields3.js +5 -0
- package/routes/_workspace/settings/groups2.js +74 -74
- package/routes/_workspace/settings/labels2.js +33 -33
- package/routes/_workspace/settings/members2.js +35 -35
- package/routes/_workspace/settings/roles2.js +24 -24
- package/routes/_workspace/settings/runners2.js +18 -18
- package/routes/_workspace/settings/sessions2.js +9 -9
- package/routes/_workspace/settings/slack2.js +8 -8
- package/routes/_workspace/settings/sso2.js +50 -50
- package/routes/_workspace/settings/tokens2.js +15 -15
- package/routes/_workspace/settings/webhooks2.js +42 -42
- package/routes/_workspace/teams/_key/settings2.js +138 -76
- package/routes/_workspace2.js +321 -319
- package/styles.css +39 -0
|
@@ -115,7 +115,8 @@ var e = {
|
|
|
115
115
|
webhooks: "웹훅",
|
|
116
116
|
sso: "싱글 사인온",
|
|
117
117
|
slack: "Slack",
|
|
118
|
-
roles: "역할"
|
|
118
|
+
roles: "역할",
|
|
119
|
+
fields: "필드"
|
|
119
120
|
},
|
|
120
121
|
account: {
|
|
121
122
|
connectionsDescription: "다른 서비스에 있는 내 계정입니다. 연결하면 그곳에서 한 일이 여기에 내 이름으로 표시됩니다.",
|
|
@@ -859,7 +860,8 @@ var e = {
|
|
|
859
860
|
priority: "우선순위",
|
|
860
861
|
project: "프로젝트",
|
|
861
862
|
label: "레이블",
|
|
862
|
-
none: "그룹 없음"
|
|
863
|
+
none: "그룹 없음",
|
|
864
|
+
type: "유형"
|
|
863
865
|
},
|
|
864
866
|
foldGroup: "{group} 접기",
|
|
865
867
|
unfoldGroup: "{group} 펼치기",
|
|
@@ -974,7 +976,10 @@ var e = {
|
|
|
974
976
|
dueDateCleared: "<actor>{name}</actor>이(가) 마감일을 제거함",
|
|
975
977
|
attachmentAdded: "<actor>{name}</actor>이(가) {file}을(를) 첨부함",
|
|
976
978
|
archivedBy: "<actor>{name}</actor>님이 이슈를 보관했습니다",
|
|
977
|
-
restored: "<actor>{name}</actor>님이 이슈를 복원했습니다"
|
|
979
|
+
restored: "<actor>{name}</actor>님이 이슈를 복원했습니다",
|
|
980
|
+
fieldsChanged: "<actor>{name}</actor>이(가) {fields}을(를) 변경함",
|
|
981
|
+
typeChanged: "<actor>{name}</actor>이(가) 유형을 {type}(으)로 변경함",
|
|
982
|
+
typeCleared: "<actor>{name}</actor>이(가) 유형을 제거함"
|
|
978
983
|
},
|
|
979
984
|
activity: {
|
|
980
985
|
title: "활동",
|
|
@@ -1244,6 +1249,13 @@ var e = {
|
|
|
1244
1249
|
selectAll: "모두 선택",
|
|
1245
1250
|
clear: "지우기"
|
|
1246
1251
|
},
|
|
1252
|
+
teamParent: {
|
|
1253
|
+
title: "상위 팀",
|
|
1254
|
+
description: "다른 팀 아래 있는 팀의 이슈는 상위 팀 목록에도 보입니다. 새 하위 팀은 상위 팀의 워크플로로 시작하며 레이블은 워크스페이스 공통입니다.",
|
|
1255
|
+
parent: "상위",
|
|
1256
|
+
none: "상위 팀 없음",
|
|
1257
|
+
subTeams: "하위 팀"
|
|
1258
|
+
},
|
|
1247
1259
|
intakeForm: {
|
|
1248
1260
|
heading: "요청 보내기",
|
|
1249
1261
|
title: "{team}에 요청 보내기",
|
|
@@ -1279,6 +1291,60 @@ var e = {
|
|
|
1279
1291
|
title: "팀 생성",
|
|
1280
1292
|
description: "팀마다 고유한 이슈, 워크플로, 멤버가 있습니다. 팀 키는 ENG-42처럼 각 이슈 ID의 앞부분이 됩니다."
|
|
1281
1293
|
},
|
|
1294
|
+
docProperties: {
|
|
1295
|
+
issueExample: "이슈(예: ENG-42)",
|
|
1296
|
+
title: "속성",
|
|
1297
|
+
yes: "예",
|
|
1298
|
+
edit: "속성 변경",
|
|
1299
|
+
remove: "속성 삭제",
|
|
1300
|
+
empty: "비어 있음",
|
|
1301
|
+
add: "속성 추가",
|
|
1302
|
+
name: "이름",
|
|
1303
|
+
kind: "종류",
|
|
1304
|
+
options: "옵션(한 줄에 하나)",
|
|
1305
|
+
optionsHint: "옵션을 지우면 그 옵션을 가진 문서에서도 지워집니다.",
|
|
1306
|
+
save: "저장",
|
|
1307
|
+
kinds: {
|
|
1308
|
+
text: "텍스트",
|
|
1309
|
+
number: "숫자",
|
|
1310
|
+
select: "선택",
|
|
1311
|
+
multi_select: "다중 선택",
|
|
1312
|
+
person: "사람",
|
|
1313
|
+
date: "날짜",
|
|
1314
|
+
checkbox: "체크박스",
|
|
1315
|
+
issue: "이슈"
|
|
1316
|
+
},
|
|
1317
|
+
urlExample: "https://…"
|
|
1318
|
+
},
|
|
1319
|
+
docViews: {
|
|
1320
|
+
title: "문서 표",
|
|
1321
|
+
docs: "문서",
|
|
1322
|
+
loading: "불러오는 중…",
|
|
1323
|
+
pickGroup: "보드를 묶을 선택 또는 사람 속성을 고르세요.",
|
|
1324
|
+
none: "일치하는 문서가 없습니다.",
|
|
1325
|
+
docTitle: "제목",
|
|
1326
|
+
updated: "수정됨",
|
|
1327
|
+
board: "보드",
|
|
1328
|
+
table: "표",
|
|
1329
|
+
layout: "레이아웃",
|
|
1330
|
+
noValue: "{property} 없음",
|
|
1331
|
+
unsaved: "저장하지 않은 보기",
|
|
1332
|
+
savedViews: "저장된 보기",
|
|
1333
|
+
update: "보기 업데이트",
|
|
1334
|
+
save: "보기 저장",
|
|
1335
|
+
viewName: "보기 이름",
|
|
1336
|
+
groupBy: "묶기",
|
|
1337
|
+
columns: "열",
|
|
1338
|
+
sortBy: "정렬",
|
|
1339
|
+
ascending: "오름차순",
|
|
1340
|
+
descending: "내림차순",
|
|
1341
|
+
checked: "체크됨",
|
|
1342
|
+
anyValue: "모든 {property}",
|
|
1343
|
+
filterBy: "{property}(으)로 필터",
|
|
1344
|
+
openTable: "표로 열기",
|
|
1345
|
+
embedPick: "보여 줄 저장된 보기를 고르세요",
|
|
1346
|
+
open: "열기"
|
|
1347
|
+
},
|
|
1282
1348
|
docs: {
|
|
1283
1349
|
spaceDefault: "이 스페이스의 새 문서에 사용",
|
|
1284
1350
|
duplicate: "복제",
|
|
@@ -2173,7 +2239,10 @@ var e = {
|
|
|
2173
2239
|
memberRoleChanged: "<actor>{name}</actor>님이 {person}님에게 {role} 역할을 줬습니다",
|
|
2174
2240
|
workspaceAccessChanged: "<actor>{name}</actor>님이 워크스페이스 전체 역할을 바꿨습니다",
|
|
2175
2241
|
teamAccessChanged: "<actor>{name}</actor>님이 <link>{target}</link>에 접근할 수 있는 사람을 바꿨습니다",
|
|
2176
|
-
projectAccessChanged: "<actor>{name}</actor>님이 프로젝트 <link>{target}</link>의 역할을 바꿨습니다"
|
|
2242
|
+
projectAccessChanged: "<actor>{name}</actor>님이 프로젝트 <link>{target}</link>의 역할을 바꿨습니다",
|
|
2243
|
+
issueFieldsChanged: "<actor>{name}</actor>이(가) <link>{target}</link>의 {fields}을(를) 변경함",
|
|
2244
|
+
issueTypeChanged: "<actor>{name}</actor>이(가) <link>{target}</link>의 유형을 {type}(으)로 변경함",
|
|
2245
|
+
issueTypeCleared: "<actor>{name}</actor>이(가) <link>{target}</link>의 유형을 제거함"
|
|
2177
2246
|
}
|
|
2178
2247
|
},
|
|
2179
2248
|
oneTimeSecret: {
|
|
@@ -2389,6 +2458,11 @@ var e = {
|
|
|
2389
2458
|
hint: "행과 열",
|
|
2390
2459
|
keywords: "표 테이블 그리드 열 행 grid columns rows"
|
|
2391
2460
|
},
|
|
2461
|
+
docView: {
|
|
2462
|
+
label: "문서 보기",
|
|
2463
|
+
hint: "스페이스 문서의 저장된 표나 보드",
|
|
2464
|
+
keywords: "표 보드 보기 데이터베이스 문서"
|
|
2465
|
+
},
|
|
2392
2466
|
button: {
|
|
2393
2467
|
label: "버튼",
|
|
2394
2468
|
hint: "블록을 넣거나 템플릿으로 문서를 만드는 버튼",
|
|
@@ -3144,7 +3218,9 @@ var e = {
|
|
|
3144
3218
|
label: "라벨",
|
|
3145
3219
|
project: "프로젝트",
|
|
3146
3220
|
estimate: "추정치",
|
|
3147
|
-
dueDate: "마감일"
|
|
3221
|
+
dueDate: "마감일",
|
|
3222
|
+
field: "필드",
|
|
3223
|
+
type: "유형"
|
|
3148
3224
|
}
|
|
3149
3225
|
},
|
|
3150
3226
|
follow: {
|
|
@@ -3359,6 +3435,87 @@ var e = {
|
|
|
3359
3435
|
projectAccess: {
|
|
3360
3436
|
title: "{name} 접근",
|
|
3361
3437
|
description: "여기서 준 역할은 워크스페이스와 팀 역할에 더해 이 프로젝트와 그 이슈에 적용됩니다. 팀 관리자가 아니어도 프로젝트를 이끌 수 있게 할 때 쓰세요."
|
|
3438
|
+
},
|
|
3439
|
+
customFields: {
|
|
3440
|
+
title: "필드",
|
|
3441
|
+
pageDescription: "관리자가 이슈와 프로젝트에 추가하는 필드(심각도, 예산 등). 값은 구성원이 설정하고, 목록은 이 값으로 필터링·정렬·그룹화합니다.",
|
|
3442
|
+
issueFields: "이슈 필드",
|
|
3443
|
+
projectFields: "프로젝트 필드",
|
|
3444
|
+
issueFieldsHelp: "모든 팀의 이슈에 표시됩니다.",
|
|
3445
|
+
teamFieldsHelp: "이 팀의 이슈에만 워크스페이스 필드 다음에 표시됩니다.",
|
|
3446
|
+
projectFieldsHelp: "모든 프로젝트에 표시됩니다.",
|
|
3447
|
+
add: "필드 추가",
|
|
3448
|
+
none: "아직 필드가 없습니다.",
|
|
3449
|
+
edit: "편집",
|
|
3450
|
+
moveUp: "위로",
|
|
3451
|
+
moveDown: "아래로",
|
|
3452
|
+
archive: "보관",
|
|
3453
|
+
restore: "복원",
|
|
3454
|
+
archived: "보관됨",
|
|
3455
|
+
delete: "삭제",
|
|
3456
|
+
deleteTitle: "{name}을(를) 삭제할까요?",
|
|
3457
|
+
deleteDescription: "{count, plural, =0 {값이 있는 이슈나 프로젝트가 없습니다.} other {이슈와 프로젝트 #개의 값도 함께 삭제됩니다.}}",
|
|
3458
|
+
required: "필수",
|
|
3459
|
+
requiredLabel: "이슈를 만들 때 필수",
|
|
3460
|
+
values: "{count, plural, =0 {값 없음} other {값 #개}}",
|
|
3461
|
+
actions: "{name} 작업",
|
|
3462
|
+
name: "이름",
|
|
3463
|
+
kind: "종류",
|
|
3464
|
+
description: "설명",
|
|
3465
|
+
options: "옵션",
|
|
3466
|
+
optionsHint: "한 줄에 하나씩.",
|
|
3467
|
+
cancel: "취소",
|
|
3468
|
+
save: "저장",
|
|
3469
|
+
noValue: "값 없음",
|
|
3470
|
+
noField: "{name} 없음",
|
|
3471
|
+
yes: "예",
|
|
3472
|
+
kinds: {
|
|
3473
|
+
text: "텍스트",
|
|
3474
|
+
number: "숫자",
|
|
3475
|
+
select: "선택",
|
|
3476
|
+
multi_select: "다중 선택",
|
|
3477
|
+
person: "사람",
|
|
3478
|
+
date: "날짜",
|
|
3479
|
+
checkbox: "체크박스",
|
|
3480
|
+
url: "URL"
|
|
3481
|
+
},
|
|
3482
|
+
onRows: "행에 표시할 필드",
|
|
3483
|
+
noneOnRows: "없음"
|
|
3484
|
+
},
|
|
3485
|
+
issueTypes: {
|
|
3486
|
+
title: "이슈 유형",
|
|
3487
|
+
description: "팀이 따로 추적하는 이슈 종류(버그, 위험 등). 유형마다 표시할 필드와 필수 필드, 설명 템플릿을 정할 수 있습니다. 유형이 없는 팀에는 선택지가 보이지 않습니다.",
|
|
3488
|
+
add: "유형 추가",
|
|
3489
|
+
none: "유형이 없습니다. 모든 이슈가 한 종류입니다.",
|
|
3490
|
+
edit: "편집",
|
|
3491
|
+
moveUp: "위로",
|
|
3492
|
+
moveDown: "아래로",
|
|
3493
|
+
archive: "보관",
|
|
3494
|
+
restore: "복원",
|
|
3495
|
+
archived: "보관됨",
|
|
3496
|
+
delete: "삭제",
|
|
3497
|
+
deleteTitle: "{name}을(를) 삭제할까요?",
|
|
3498
|
+
deleteDescription: "{count, plural, =0 {이 유형의 이슈가 없습니다.} other {이슈 #개가 유형 없음이 됩니다.}}",
|
|
3499
|
+
everyTeam: "모든 팀",
|
|
3500
|
+
issues: "{count, plural, =0 {이슈 없음} other {이슈 #개}}",
|
|
3501
|
+
actions: "{name} 작업",
|
|
3502
|
+
name: "이름",
|
|
3503
|
+
icon: "이모지",
|
|
3504
|
+
iconHint: "선택 사항",
|
|
3505
|
+
color: "색",
|
|
3506
|
+
descriptionLabel: "설명",
|
|
3507
|
+
teams: "팀",
|
|
3508
|
+
fields: "표시할 필드",
|
|
3509
|
+
allFields: "모든 필드",
|
|
3510
|
+
required: "필수 필드",
|
|
3511
|
+
noneRequired: "없음",
|
|
3512
|
+
template: "설명 템플릿",
|
|
3513
|
+
templateHint: "이 유형의 새 이슈가 시작할 Markdown",
|
|
3514
|
+
type: "유형",
|
|
3515
|
+
noType: "유형 없음",
|
|
3516
|
+
hiddenTitle: "유형을 바꿀까요?",
|
|
3517
|
+
hidden: "{type}에서는 {fields}이(가) 표시되지 않습니다. 값은 숨겨진 채 남고, 유형을 다시 바꾸면 돌아옵니다.",
|
|
3518
|
+
change: "유형 변경"
|
|
3362
3519
|
}
|
|
3363
3520
|
};
|
|
3364
3521
|
export { e as default };
|
|
@@ -115,7 +115,8 @@ var e = {
|
|
|
115
115
|
webhooks: "Webhook",
|
|
116
116
|
sso: "单点登录",
|
|
117
117
|
slack: "Slack",
|
|
118
|
-
roles: "角色"
|
|
118
|
+
roles: "角色",
|
|
119
|
+
fields: "字段"
|
|
119
120
|
},
|
|
120
121
|
account: {
|
|
121
122
|
connectionsDescription: "你在其他服务上的账户。关联后,你在那里的操作会以你的身份显示在这里。",
|
|
@@ -859,7 +860,8 @@ var e = {
|
|
|
859
860
|
priority: "优先级",
|
|
860
861
|
project: "项目",
|
|
861
862
|
label: "标签",
|
|
862
|
-
none: "不分组"
|
|
863
|
+
none: "不分组",
|
|
864
|
+
type: "类型"
|
|
863
865
|
},
|
|
864
866
|
foldGroup: "折叠 {group}",
|
|
865
867
|
unfoldGroup: "展开 {group}",
|
|
@@ -974,7 +976,10 @@ var e = {
|
|
|
974
976
|
dueDateCleared: "<actor>{name}</actor> 移除了截止日期",
|
|
975
977
|
attachmentAdded: "<actor>{name}</actor> 附加了 {file}",
|
|
976
978
|
archivedBy: "<actor>{name}</actor> 归档了此问题",
|
|
977
|
-
restored: "<actor>{name}</actor> 恢复了此问题"
|
|
979
|
+
restored: "<actor>{name}</actor> 恢复了此问题",
|
|
980
|
+
fieldsChanged: "<actor>{name}</actor> 更改了{fields}",
|
|
981
|
+
typeChanged: "<actor>{name}</actor> 将类型改为{type}",
|
|
982
|
+
typeCleared: "<actor>{name}</actor> 移除了类型"
|
|
978
983
|
},
|
|
979
984
|
activity: {
|
|
980
985
|
title: "活动",
|
|
@@ -1244,6 +1249,13 @@ var e = {
|
|
|
1244
1249
|
selectAll: "全选",
|
|
1245
1250
|
clear: "清除"
|
|
1246
1251
|
},
|
|
1252
|
+
teamParent: {
|
|
1253
|
+
title: "上级团队",
|
|
1254
|
+
description: "位于其他团队之下的团队,其问题会出现在上级团队的问题列表中。新的子团队沿用上级的工作流;标签在整个工作区共享。",
|
|
1255
|
+
parent: "上级",
|
|
1256
|
+
none: "无上级团队",
|
|
1257
|
+
subTeams: "子团队"
|
|
1258
|
+
},
|
|
1247
1259
|
intakeForm: {
|
|
1248
1260
|
heading: "提交请求",
|
|
1249
1261
|
title: "向 {team} 提交请求",
|
|
@@ -1279,6 +1291,60 @@ var e = {
|
|
|
1279
1291
|
title: "创建团队",
|
|
1280
1292
|
description: "团队拥有自己的议题、工作流和成员。团队标识会作为每个议题 ID 的开头,例如 ENG-42。"
|
|
1281
1293
|
},
|
|
1294
|
+
docProperties: {
|
|
1295
|
+
issueExample: "问题,例如 ENG-42",
|
|
1296
|
+
title: "属性",
|
|
1297
|
+
yes: "是",
|
|
1298
|
+
edit: "更改属性",
|
|
1299
|
+
remove: "移除属性",
|
|
1300
|
+
empty: "空",
|
|
1301
|
+
add: "添加属性",
|
|
1302
|
+
name: "名称",
|
|
1303
|
+
kind: "类型",
|
|
1304
|
+
options: "选项(每行一个)",
|
|
1305
|
+
optionsHint: "移除选项会从拥有它的文档中清除。",
|
|
1306
|
+
save: "保存",
|
|
1307
|
+
kinds: {
|
|
1308
|
+
text: "文本",
|
|
1309
|
+
number: "数字",
|
|
1310
|
+
select: "单选",
|
|
1311
|
+
multi_select: "多选",
|
|
1312
|
+
person: "人员",
|
|
1313
|
+
date: "日期",
|
|
1314
|
+
checkbox: "复选框",
|
|
1315
|
+
issue: "问题"
|
|
1316
|
+
},
|
|
1317
|
+
urlExample: "https://…"
|
|
1318
|
+
},
|
|
1319
|
+
docViews: {
|
|
1320
|
+
title: "文档表格",
|
|
1321
|
+
docs: "文档",
|
|
1322
|
+
loading: "加载中…",
|
|
1323
|
+
pickGroup: "请选择用于分组看板的单选或人员属性。",
|
|
1324
|
+
none: "没有匹配的文档。",
|
|
1325
|
+
docTitle: "标题",
|
|
1326
|
+
updated: "更新于",
|
|
1327
|
+
board: "看板",
|
|
1328
|
+
table: "表格",
|
|
1329
|
+
layout: "布局",
|
|
1330
|
+
noValue: "无{property}",
|
|
1331
|
+
unsaved: "未保存的视图",
|
|
1332
|
+
savedViews: "已保存视图",
|
|
1333
|
+
update: "更新视图",
|
|
1334
|
+
save: "保存视图",
|
|
1335
|
+
viewName: "视图名称",
|
|
1336
|
+
groupBy: "分组",
|
|
1337
|
+
columns: "列",
|
|
1338
|
+
sortBy: "排序",
|
|
1339
|
+
ascending: "升序",
|
|
1340
|
+
descending: "降序",
|
|
1341
|
+
checked: "已勾选",
|
|
1342
|
+
anyValue: "任意{property}",
|
|
1343
|
+
filterBy: "按{property}筛选",
|
|
1344
|
+
openTable: "以表格打开",
|
|
1345
|
+
embedPick: "选择要显示的已保存视图",
|
|
1346
|
+
open: "打开"
|
|
1347
|
+
},
|
|
1282
1348
|
docs: {
|
|
1283
1349
|
spaceDefault: "此空间的新文档从它开始",
|
|
1284
1350
|
duplicate: "复制一份",
|
|
@@ -2173,7 +2239,10 @@ var e = {
|
|
|
2173
2239
|
memberRoleChanged: "<actor>{name}</actor> 授予 {person} 角色 {role}",
|
|
2174
2240
|
workspaceAccessChanged: "<actor>{name}</actor> 修改了整个工作区的角色",
|
|
2175
2241
|
teamAccessChanged: "<actor>{name}</actor> 修改了可访问 <link>{target}</link> 的人员",
|
|
2176
|
-
projectAccessChanged: "<actor>{name}</actor> 修改了项目 <link>{target}</link> 的角色"
|
|
2242
|
+
projectAccessChanged: "<actor>{name}</actor> 修改了项目 <link>{target}</link> 的角色",
|
|
2243
|
+
issueFieldsChanged: "<actor>{name}</actor> 更改了 <link>{target}</link> 的{fields}",
|
|
2244
|
+
issueTypeChanged: "<actor>{name}</actor> 将 <link>{target}</link> 的类型改为{type}",
|
|
2245
|
+
issueTypeCleared: "<actor>{name}</actor> 移除了 <link>{target}</link> 的类型"
|
|
2177
2246
|
}
|
|
2178
2247
|
},
|
|
2179
2248
|
oneTimeSecret: {
|
|
@@ -2389,6 +2458,11 @@ var e = {
|
|
|
2389
2458
|
hint: "行和列",
|
|
2390
2459
|
keywords: "表格 网格 列 行 grid columns rows"
|
|
2391
2460
|
},
|
|
2461
|
+
docView: {
|
|
2462
|
+
label: "文档视图",
|
|
2463
|
+
hint: "空间文档的已保存表格或看板",
|
|
2464
|
+
keywords: "表格 看板 视图 数据库 文档"
|
|
2465
|
+
},
|
|
2392
2466
|
button: {
|
|
2393
2467
|
label: "按钮",
|
|
2394
2468
|
hint: "插入块或从模板创建文档的按钮",
|
|
@@ -3144,7 +3218,9 @@ var e = {
|
|
|
3144
3218
|
label: "标签",
|
|
3145
3219
|
project: "项目",
|
|
3146
3220
|
estimate: "估算",
|
|
3147
|
-
dueDate: "截止日期"
|
|
3221
|
+
dueDate: "截止日期",
|
|
3222
|
+
field: "字段",
|
|
3223
|
+
type: "类型"
|
|
3148
3224
|
}
|
|
3149
3225
|
},
|
|
3150
3226
|
follow: {
|
|
@@ -3359,6 +3435,87 @@ var e = {
|
|
|
3359
3435
|
projectAccess: {
|
|
3360
3436
|
title: "{name} 的访问权限",
|
|
3361
3437
|
description: "在此授予的角色适用于该项目及其议题,叠加在成员的工作区和团队角色之上。可用于让某人在不担任团队管理员的情况下负责一个项目。"
|
|
3438
|
+
},
|
|
3439
|
+
customFields: {
|
|
3440
|
+
title: "字段",
|
|
3441
|
+
pageDescription: "管理员为问题和项目添加的字段,例如严重程度或预算。成员填写字段值,列表可按字段筛选、排序和分组。",
|
|
3442
|
+
issueFields: "问题字段",
|
|
3443
|
+
projectFields: "项目字段",
|
|
3444
|
+
issueFieldsHelp: "所有团队的问题都有这些字段。",
|
|
3445
|
+
teamFieldsHelp: "仅此团队的问题有这些字段,排在工作区字段之后。",
|
|
3446
|
+
projectFieldsHelp: "所有项目都有这些字段。",
|
|
3447
|
+
add: "添加字段",
|
|
3448
|
+
none: "还没有字段。",
|
|
3449
|
+
edit: "编辑",
|
|
3450
|
+
moveUp: "上移",
|
|
3451
|
+
moveDown: "下移",
|
|
3452
|
+
archive: "归档",
|
|
3453
|
+
restore: "恢复",
|
|
3454
|
+
archived: "已归档",
|
|
3455
|
+
delete: "删除",
|
|
3456
|
+
deleteTitle: "删除 {name}?",
|
|
3457
|
+
deleteDescription: "{count, plural, =0 {没有问题或项目填写了此字段。} other {# 个问题和项目上的值将一并删除。}}",
|
|
3458
|
+
required: "必填",
|
|
3459
|
+
requiredLabel: "创建问题时必填",
|
|
3460
|
+
values: "{count, plural, =0 {没有值} other {# 个值}}",
|
|
3461
|
+
actions: "{name} 的操作",
|
|
3462
|
+
name: "名称",
|
|
3463
|
+
kind: "类型",
|
|
3464
|
+
description: "描述",
|
|
3465
|
+
options: "选项",
|
|
3466
|
+
optionsHint: "每行一个。",
|
|
3467
|
+
cancel: "取消",
|
|
3468
|
+
save: "保存",
|
|
3469
|
+
noValue: "无值",
|
|
3470
|
+
noField: "无{name}",
|
|
3471
|
+
yes: "是",
|
|
3472
|
+
kinds: {
|
|
3473
|
+
text: "文本",
|
|
3474
|
+
number: "数字",
|
|
3475
|
+
select: "单选",
|
|
3476
|
+
multi_select: "多选",
|
|
3477
|
+
person: "人员",
|
|
3478
|
+
date: "日期",
|
|
3479
|
+
checkbox: "复选框",
|
|
3480
|
+
url: "URL"
|
|
3481
|
+
},
|
|
3482
|
+
onRows: "行上显示的字段",
|
|
3483
|
+
noneOnRows: "无"
|
|
3484
|
+
},
|
|
3485
|
+
issueTypes: {
|
|
3486
|
+
title: "问题类型",
|
|
3487
|
+
description: "团队分开跟踪的问题种类,例如缺陷或风险。每种类型可以只显示部分字段、要求自己的必填字段,并用模板开始。没有类型的团队不会看到这个选项。",
|
|
3488
|
+
add: "添加类型",
|
|
3489
|
+
none: "没有类型;所有问题都是同一种。",
|
|
3490
|
+
edit: "编辑",
|
|
3491
|
+
moveUp: "上移",
|
|
3492
|
+
moveDown: "下移",
|
|
3493
|
+
archive: "归档",
|
|
3494
|
+
restore: "恢复",
|
|
3495
|
+
archived: "已归档",
|
|
3496
|
+
delete: "删除",
|
|
3497
|
+
deleteTitle: "删除 {name}?",
|
|
3498
|
+
deleteDescription: "{count, plural, =0 {没有问题是这个类型。} other {# 个问题将变为无类型。}}",
|
|
3499
|
+
everyTeam: "所有团队",
|
|
3500
|
+
issues: "{count, plural, =0 {没有问题} other {# 个问题}}",
|
|
3501
|
+
actions: "{name} 的操作",
|
|
3502
|
+
name: "名称",
|
|
3503
|
+
icon: "表情",
|
|
3504
|
+
iconHint: "可选",
|
|
3505
|
+
color: "颜色",
|
|
3506
|
+
descriptionLabel: "描述",
|
|
3507
|
+
teams: "团队",
|
|
3508
|
+
fields: "显示的字段",
|
|
3509
|
+
allFields: "所有字段",
|
|
3510
|
+
required: "必填字段",
|
|
3511
|
+
noneRequired: "无",
|
|
3512
|
+
template: "描述模板",
|
|
3513
|
+
templateHint: "此类型新问题开头的 Markdown",
|
|
3514
|
+
type: "类型",
|
|
3515
|
+
noType: "无类型",
|
|
3516
|
+
hiddenTitle: "更改类型?",
|
|
3517
|
+
hidden: "{type}不显示{fields}。它们的值会隐藏保留,类型改回后会再次显示。",
|
|
3518
|
+
change: "更改类型"
|
|
3362
3519
|
}
|
|
3363
3520
|
};
|
|
3364
3521
|
export { e as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { groupsQuery as e, membersQuery as t, peopleQuery as n, rolesQuery as r } from "../api/queries.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useConfirm as i } from "../lib/confirm.js";
|
|
3
|
+
import { isBuiltIn as a, permissionGroups as o } from "../lib/roles.js";
|
|
4
4
|
import { useMemo as s } from "react";
|
|
5
5
|
import { useErrorMessage as c } from "@parallelworks/problem/react";
|
|
6
6
|
import { useTranslations as l } from "use-intl";
|
|
@@ -10,13 +10,13 @@ import { AccessPanel as h } from "@parallelworks/ui/access";
|
|
|
10
10
|
// src/components/AccessGrants.tsx
|
|
11
11
|
var g = (e) => `${e.kind}:${e.handle}`;
|
|
12
12
|
function _({ workspace: _, resourceName: v, access: y, openLabel: b, rules: x, readOnly: S = !1, footer: C, save: w }) {
|
|
13
|
-
let { data: T } = m(e(_)), { data: E } = m(n(_)), { data: D = [] } = p(t(_)), O = l("access"), k = l("roles"), A = l("permissions"), { data: j = [] } = p(r(_)), M = c(), { confirm: N, dialog: P } =
|
|
13
|
+
let { data: T } = m(e(_)), { data: E } = m(n(_)), { data: D = [] } = p(t(_)), O = l("access"), k = l("roles"), A = l("permissions"), { data: j = [] } = p(r(_)), M = c(), { confirm: N, dialog: P } = i(), F = s(() => j.map((e) => ({
|
|
14
14
|
id: e.id,
|
|
15
|
-
name:
|
|
16
|
-
...
|
|
15
|
+
name: a(e.id) ? k(`${e.id}.name`) : e.name,
|
|
16
|
+
...a(e.id) ? { description: k(`${e.id}.description`) } : e.description && { description: e.description },
|
|
17
17
|
permissions: e.permissions,
|
|
18
18
|
privileged: e.permissions.includes("manage_members")
|
|
19
|
-
})), [j, k]), I = s(() =>
|
|
19
|
+
})), [j, k]), I = s(() => o.flatMap((e) => e.permissions).map((e) => ({
|
|
20
20
|
id: e,
|
|
21
21
|
label: A(`${e}.name`)
|
|
22
22
|
})), [A]), L = s(() => {
|
|
@@ -78,6 +78,8 @@ function H(F, I) {
|
|
|
78
78
|
case "cycle.updated": return /* @__PURE__ */ B(u, {});
|
|
79
79
|
case "issue.estimate_changed": return /* @__PURE__ */ B(f, {});
|
|
80
80
|
case "issue.due_date_changed": return /* @__PURE__ */ B(s, {});
|
|
81
|
+
case "issue.fields_changed":
|
|
82
|
+
case "issue.type_changed": return /* @__PURE__ */ B(d, {});
|
|
81
83
|
case "issue.area_changed":
|
|
82
84
|
case "doc.area_changed":
|
|
83
85
|
case "area.updated":
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { api as e, unwrap as t } from "../api/client.js";
|
|
2
2
|
import { codeHostAccountsQuery as n, codeHostQuery as r, meQuery as i } from "../api/queries.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { useConfirm as a } from "../lib/confirm.js";
|
|
4
|
+
import { CodeHostIcon as o } from "./icons.js";
|
|
5
|
+
import { usePeople as s } from "../lib/people.js";
|
|
6
|
+
import { useFormError as c } from "./settings.js";
|
|
7
7
|
import { externalUrl as l } from "../lib/externalUrl.js";
|
|
8
8
|
import { ConnectionCard as u, ConnectionPanel as d } from "./ConnectionCard.js";
|
|
9
9
|
import { Avatar as f, Button as p, Card as m, ErrorText as h, Section as g, Select as _, SettingsCard as v, StatusLabel as y } from "@parallelworks/ui";
|
|
@@ -13,7 +13,7 @@ import { Fragment as S, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
|
13
13
|
import { useMutation as T, useQueryClient as E, useSuspenseQuery as D } from "@tanstack/react-query";
|
|
14
14
|
// src/components/CodeHostSettings.tsx
|
|
15
15
|
function O({ workspace: n }) {
|
|
16
|
-
let
|
|
16
|
+
let o = x("code"), { data: s } = D(i), { data: l } = D(r(n)), u = E(), d = c(), { confirm: f, dialog: m } = a(), v = T({
|
|
17
17
|
mutationFn: async (r) => t(await e.DELETE("/api/v1/workspaces/{workspace}/code-host/connections/{account}", { params: { path: {
|
|
18
18
|
workspace: n,
|
|
19
19
|
account: r
|
|
@@ -27,11 +27,11 @@ function O({ workspace: n }) {
|
|
|
27
27
|
] });
|
|
28
28
|
}
|
|
29
29
|
}), y = (e) => f({
|
|
30
|
-
title:
|
|
31
|
-
description:
|
|
32
|
-
confirmLabel:
|
|
30
|
+
title: o("disconnectConfirm", { account: e }),
|
|
31
|
+
description: o("disconnectDetail"),
|
|
32
|
+
confirmLabel: o("disconnect"),
|
|
33
33
|
onConfirm: () => v.mutateAsync(e)
|
|
34
|
-
}), [S, O] = b(""), k = l.connections.filter((e) => e.connectedBy ===
|
|
34
|
+
}), [S, O] = b(""), k = l.connections.filter((e) => e.connectedBy === s?.user.username), A = k[0];
|
|
35
35
|
if (!A) return null;
|
|
36
36
|
let j = k.some((e) => e.account === S) ? S : A.account;
|
|
37
37
|
return /* @__PURE__ */ w(g, {
|
|
@@ -39,8 +39,8 @@ function O({ workspace: n }) {
|
|
|
39
39
|
tone: "error",
|
|
40
40
|
collapsible: !1,
|
|
41
41
|
headingLevel: 2,
|
|
42
|
-
title:
|
|
43
|
-
description:
|
|
42
|
+
title: o("dangerZone"),
|
|
43
|
+
description: o("disconnectDetail"),
|
|
44
44
|
className: "mt-10",
|
|
45
45
|
children: [
|
|
46
46
|
/* @__PURE__ */ w("div", {
|
|
@@ -48,7 +48,7 @@ function O({ workspace: n }) {
|
|
|
48
48
|
children: [/* @__PURE__ */ C("div", {
|
|
49
49
|
className: "w-56 max-w-full",
|
|
50
50
|
children: /* @__PURE__ */ C(_, {
|
|
51
|
-
"aria-label":
|
|
51
|
+
"aria-label": o("disconnectWhich"),
|
|
52
52
|
value: j,
|
|
53
53
|
onValueChange: (e) => e && O(e),
|
|
54
54
|
items: k.map((e) => ({
|
|
@@ -60,7 +60,7 @@ function O({ workspace: n }) {
|
|
|
60
60
|
variant: "danger",
|
|
61
61
|
onClick: () => y(j),
|
|
62
62
|
loading: v.isPending,
|
|
63
|
-
children:
|
|
63
|
+
children: o("disconnectAccount", { account: j })
|
|
64
64
|
})]
|
|
65
65
|
}),
|
|
66
66
|
/* @__PURE__ */ C(h, {
|
|
@@ -72,8 +72,8 @@ function O({ workspace: n }) {
|
|
|
72
72
|
]
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
-
function k({ workspace: n, isAdmin: i, result:
|
|
76
|
-
let m = x("code"), { data: h } = D(r(n)), { person: g } =
|
|
75
|
+
function k({ workspace: n, isAdmin: i, result: a }) {
|
|
76
|
+
let m = x("code"), { data: h } = D(r(n)), { person: g } = s(n), _ = c(), b = T({
|
|
77
77
|
mutationFn: async () => t(await e.POST("/api/v1/workspaces/{workspace}/code-host/connect", { params: { path: { workspace: n } } })),
|
|
78
78
|
onMutate: _.clear,
|
|
79
79
|
onSuccess: ({ url: e }) => {
|
|
@@ -86,13 +86,13 @@ function k({ workspace: n, isAdmin: i, result: c }) {
|
|
|
86
86
|
className: "px-3 py-2 text-sm text-muted-foreground",
|
|
87
87
|
children: m("notConfigured")
|
|
88
88
|
}) }) : /* @__PURE__ */ w(S, { children: [
|
|
89
|
-
|
|
89
|
+
a && a !== "choose" && /* @__PURE__ */ C("p", {
|
|
90
90
|
role: "status",
|
|
91
|
-
className: `mb-3 rounded-md bg-muted px-3 py-2 text-sm ${
|
|
92
|
-
children: m(`result.${
|
|
91
|
+
className: `mb-3 rounded-md bg-muted px-3 py-2 text-sm ${a === "failed" ? "text-danger" : ""}`,
|
|
92
|
+
children: m(`result.${a}`)
|
|
93
93
|
}),
|
|
94
94
|
/* @__PURE__ */ C(u, {
|
|
95
|
-
icon: /* @__PURE__ */ C(
|
|
95
|
+
icon: /* @__PURE__ */ C(o, { className: "size-7" }),
|
|
96
96
|
name: m("provider"),
|
|
97
97
|
status: h.connections.length > 0 ? m("linkedCount", { count: h.connections.length }) : m("description"),
|
|
98
98
|
error: _.error,
|
|
@@ -129,12 +129,12 @@ function k({ workspace: n, isAdmin: i, result: c }) {
|
|
|
129
129
|
}),
|
|
130
130
|
i && /* @__PURE__ */ C(A, {
|
|
131
131
|
workspace: n,
|
|
132
|
-
chosen:
|
|
132
|
+
chosen: a === "choose"
|
|
133
133
|
})
|
|
134
134
|
] });
|
|
135
135
|
}
|
|
136
136
|
function A({ workspace: i, chosen: a }) {
|
|
137
|
-
let o = x("code"), { data:
|
|
137
|
+
let o = x("code"), { data: s } = D(n(i)), u = E(), d = c(), f = T({
|
|
138
138
|
mutationFn: async (n) => t(await e.POST("/api/v1/workspaces/{workspace}/code-host/connections", {
|
|
139
139
|
params: { path: { workspace: i } },
|
|
140
140
|
body: { id: n }
|
|
@@ -156,7 +156,7 @@ function A({ workspace: i, chosen: a }) {
|
|
|
156
156
|
onMutate: d.clear,
|
|
157
157
|
onError: d.set
|
|
158
158
|
});
|
|
159
|
-
return !a &&
|
|
159
|
+
return !a && s.length === 0 ? null : /* @__PURE__ */ w(m, {
|
|
160
160
|
size: "fill",
|
|
161
161
|
padding: "sm",
|
|
162
162
|
className: "mt-4",
|
|
@@ -167,11 +167,11 @@ function A({ workspace: i, chosen: a }) {
|
|
|
167
167
|
}),
|
|
168
168
|
/* @__PURE__ */ C("p", {
|
|
169
169
|
className: "mt-0.5 text-sm text-muted-foreground",
|
|
170
|
-
children:
|
|
170
|
+
children: s.length > 0 ? o("chooseDescription") : o("noAccounts")
|
|
171
171
|
}),
|
|
172
|
-
|
|
172
|
+
s.length > 0 && /* @__PURE__ */ C("ul", {
|
|
173
173
|
className: "mt-3 divide-y divide-border rounded-md border border-border",
|
|
174
|
-
children:
|
|
174
|
+
children: s.map((e) => /* @__PURE__ */ w("li", {
|
|
175
175
|
className: "px-3 py-2 text-sm",
|
|
176
176
|
children: [/* @__PURE__ */ w("div", {
|
|
177
177
|
className: "flex items-center gap-3",
|