@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.
Files changed (64) hide show
  1. package/_virtual/_virtual_i18n/en/common.js +162 -5
  2. package/_virtual/_virtual_i18n/es/common.js +162 -5
  3. package/_virtual/_virtual_i18n/ja/common.js +162 -5
  4. package/_virtual/_virtual_i18n/ko/common.js +162 -5
  5. package/_virtual/_virtual_i18n/zh/common.js +162 -5
  6. package/components/AccessGrants.js +6 -6
  7. package/components/ActivityTimeline.js +2 -0
  8. package/components/CodeHostSettings.js +25 -25
  9. package/components/CustomFields.js +349 -0
  10. package/components/DocProperties.js +320 -0
  11. package/components/DocTable.js +176 -0
  12. package/components/DocViewBlock.js +104 -0
  13. package/components/DocsTree.js +16 -6
  14. package/components/Editor.js +30 -28
  15. package/components/GitHub.js +22 -22
  16. package/components/IssueBoard.js +48 -43
  17. package/components/IssueEvent.js +2 -0
  18. package/components/IssueFilters.js +210 -122
  19. package/components/IssueImport.js +1 -1
  20. package/components/IssueRow.js +96 -79
  21. package/components/IssueTemplates.js +216 -156
  22. package/components/IssueTypes.js +318 -0
  23. package/components/NewIssueDialog.js +254 -216
  24. package/components/SettingsNav.js +40 -35
  25. package/components/SlashMenu.js +2 -0
  26. package/components/TeamForm.js +49 -35
  27. package/components/TeamRepositories.js +51 -51
  28. package/components/TeamWorkflow.js +8 -8
  29. package/components/Updates.js +8 -8
  30. package/lib/boardMove.js +69 -47
  31. package/lib/customFields.js +113 -0
  32. package/lib/docProperties.js +135 -0
  33. package/lib/issueDisplay.js +27 -12
  34. package/lib/issueList.js +166 -62
  35. package/lib/issueTypes.js +50 -0
  36. package/lib/teamTree.js +24 -0
  37. package/lib/views.js +13 -11
  38. package/package.json +1 -1
  39. package/pages/issues.js +331 -291
  40. package/routeTree.gen.js +174 -162
  41. package/routes/_workspace/agents/index2.js +9 -9
  42. package/routes/_workspace/docs/_doc2.js +147 -140
  43. package/routes/_workspace/docs/space._space.js +6 -0
  44. package/routes/_workspace/docs/space2._space.js +256 -0
  45. package/routes/_workspace/docs2.js +3 -3
  46. package/routes/_workspace/issues/_identifier2.js +433 -370
  47. package/routes/_workspace/projects/_projectId3.js +213 -201
  48. package/routes/_workspace/settings/audit-log3.js +2 -0
  49. package/routes/_workspace/settings/fields.js +6 -0
  50. package/routes/_workspace/settings/fields2.js +30 -0
  51. package/routes/_workspace/settings/fields3.js +5 -0
  52. package/routes/_workspace/settings/groups2.js +74 -74
  53. package/routes/_workspace/settings/labels2.js +33 -33
  54. package/routes/_workspace/settings/members2.js +35 -35
  55. package/routes/_workspace/settings/roles2.js +24 -24
  56. package/routes/_workspace/settings/runners2.js +18 -18
  57. package/routes/_workspace/settings/sessions2.js +9 -9
  58. package/routes/_workspace/settings/slack2.js +8 -8
  59. package/routes/_workspace/settings/sso2.js +50 -50
  60. package/routes/_workspace/settings/tokens2.js +15 -15
  61. package/routes/_workspace/settings/webhooks2.js +42 -42
  62. package/routes/_workspace/teams/_key/settings2.js +138 -76
  63. package/routes/_workspace2.js +321 -319
  64. 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 { isBuiltIn as i, permissionGroups as a } from "../lib/roles.js";
3
- import { useConfirm as o } from "../lib/confirm.js";
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 } = o(), F = s(() => j.map((e) => ({
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: i(e.id) ? k(`${e.id}.name`) : e.name,
16
- ...i(e.id) ? { description: k(`${e.id}.description`) } : e.description && { description: e.description },
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(() => a.flatMap((e) => e.permissions).map((e) => ({
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 { CodeHostIcon as a } from "./icons.js";
4
- import { usePeople as o } from "../lib/people.js";
5
- import { useFormError as s } from "./settings.js";
6
- import { useConfirm as c } from "../lib/confirm.js";
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 a = x("code"), { data: o } = D(i), { data: l } = D(r(n)), u = E(), d = s(), { confirm: f, dialog: m } = c(), v = T({
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: a("disconnectConfirm", { account: e }),
31
- description: a("disconnectDetail"),
32
- confirmLabel: a("disconnect"),
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 === o?.user.username), A = k[0];
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: a("dangerZone"),
43
- description: a("disconnectDetail"),
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": a("disconnectWhich"),
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: a("disconnectAccount", { account: j })
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: c }) {
76
- let m = x("code"), { data: h } = D(r(n)), { person: g } = o(n), _ = s(), b = T({
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
- c && c !== "choose" && /* @__PURE__ */ C("p", {
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 ${c === "failed" ? "text-danger" : ""}`,
92
- children: m(`result.${c}`)
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(a, { className: "size-7" }),
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: c === "choose"
132
+ chosen: a === "choose"
133
133
  })
134
134
  ] });
135
135
  }
136
136
  function A({ workspace: i, chosen: a }) {
137
- let o = x("code"), { data: c } = D(n(i)), u = E(), d = s(), f = T({
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 && c.length === 0 ? null : /* @__PURE__ */ w(m, {
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: c.length > 0 ? o("chooseDescription") : o("noAccounts")
170
+ children: s.length > 0 ? o("chooseDescription") : o("noAccounts")
171
171
  }),
172
- c.length > 0 && /* @__PURE__ */ C("ul", {
172
+ s.length > 0 && /* @__PURE__ */ C("ul", {
173
173
  className: "mt-3 divide-y divide-border rounded-md border border-border",
174
- children: c.map((e) => /* @__PURE__ */ w("li", {
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",