@@ -6,6 +6,7 @@ import MainButton from '@/components/MainButton.vue'
66import ActionFormCard from ' @/components/ActionFormCard.vue'
77import { useUsers } from ' @/lib/useUsers'
88import ErrorMessage from ' @/components/ErrorMessage.vue'
9+ import { ref } from ' vue'
910
1011const { teamId } = defineProps <{ teamId: string }>()
1112
@@ -15,30 +16,54 @@ const { getUserById, getUserByName } = useUsers()
1516const { mutate : updateTeam } = useUpdateTeam ()
1617
1718const changeTeamName = (name : string ) => {
18- if (team .value === undefined ) return
19- updateTeam ({ teamId: team .value .id , name , members: team . value . members })
19+ if (team .value === undefined ) return false
20+ updateTeam ({ teamId: team .value .id , name })
2021}
2122
2223const removeMember = (memberId : string ) => {
23- if (team .value === undefined ) return
24- if (! team .value .members .includes (memberId )) return
24+ if (team .value === undefined ) return false
25+ if (! team .value .members .includes (memberId )) return false
2526
2627 const newMembers = team .value .members .filter ((member ) => member !== memberId )
27- updateTeam ({ teamId: team .value .id , name: team .value .name , members: newMembers })
28+ updateTeam ({ teamId: team .value .id , members: newMembers })
29+ return true
2830}
2931
3032const addMember = (memberId : string ) => {
31- if (team .value === undefined ) return
32- if (team .value .members .includes (memberId )) return
33-
33+ if (team .value === undefined ) return false
34+ if (team .value .members .includes (memberId )) return false
3435 const newMembers = [... team .value .members , memberId ]
35- updateTeam ({ teamId: team .value .id , name: team .value .name , members: newMembers })
36+ updateTeam ({ teamId: team .value .id , members: newMembers })
37+ return true
3638}
3739
3840const addNewMemberHandler = (newMemberName : string ) => {
3941 const user = getUserByName (newMemberName )
40- if (user === undefined ) return
41- addMember (user .id )
42+ if (user === undefined ) return false
43+ return addMember (user .id )
44+ }
45+
46+ const githubIdValue = ref (' ' )
47+
48+ const addGitHubId = () => {
49+ if (githubIdValue .value === ' ' ) return
50+ if (team .value ?.githubIds ?.includes (githubIdValue .value )) return
51+
52+ updateTeam ({
53+ teamId: teamId ,
54+ githubIds: [... (team .value ?.githubIds ?? []), githubIdValue .value ],
55+ })
56+
57+ githubIdValue .value = ' '
58+ }
59+
60+ const removeGitHubId = (id : string ) => {
61+ if (team .value === undefined ) return
62+ if (! team .value .githubIds ?.includes (id )) return
63+
64+ const newGithubIds = team .value .githubIds .filter ((githubId ) => githubId !== id )
65+ updateTeam ({ teamId: team .value .id , githubIds: newGithubIds })
66+ githubIdValue .value = ' '
4267}
4368 </script >
4469
@@ -91,6 +116,48 @@ const addNewMemberHandler = (newMemberName: string) => {
91116 actionLabel =" 保存"
92117 />
93118 </div >
119+ <div class =" github-id-management-card" >
120+ <div >
121+ <div class =" github-id-management-card-title" >GitHub ID 管理</div >
122+ <div class =" github-id-management-card-description" >
123+ チームメンバーの GitHub ID を追加すると、GitHub
124+ に登録されている公開鍵が自動的にインスタンスに登録されます
125+ </div >
126+ <div class =" github-id-management-card-description" >
127+ ※設定が反映されるのは新しく作成されたインスタンスのみです
128+ </div >
129+ </div >
130+ <div >
131+ <div class =" github-id-chip-container" >
132+ <div v-for =" id in team.githubIds" :key =" id" class =" github-id-chip" >
133+ <Icon icon =" mdi:github" width =" 20" height =" 20" />
134+ <a :href =" `https://github.com/${id}`" >
135+ {{ id }}
136+ </a >
137+ <button @click.prevent =" removeGitHubId(id)" >
138+ <Icon icon =" mdi:close" width =" 20" height =" 20" />
139+ </button >
140+ </div >
141+ </div >
142+ <div
143+ v-if =" team.githubIds === undefined || team.githubIds.length === 0"
144+ class =" no-github-id-registered"
145+ >
146+ まだ GitHub ID が登録されていません
147+ </div >
148+ <form class =" github-id-management-form" @submit.prevent =" addGitHubId" >
149+ <InputText
150+ v-model =" githubIdValue"
151+ placeholder =" GitHub ID (例: cp-20)"
152+ class =" github-id-management-form-input"
153+ />
154+ <MainButton type =" submit" >
155+ <Icon icon =" mdi:account-plus" width =" 20" height =" 20" />
156+ <span >追加</span >
157+ </MainButton >
158+ </form >
159+ </div >
160+ </div >
94161 </div >
95162 </div >
96163</template >
@@ -180,4 +247,82 @@ const addNewMemberHandler = (newMemberName: string) => {
180247 grid-template-columns : 1fr ;
181248 }
182249}
250+
251+ .github-id-management-card {
252+ display : flex ;
253+ flex-direction : column ;
254+ gap : 1rem ;
255+ border : 1px solid var (--ct-slate-300 );
256+ border-radius : 4px ;
257+ padding : 1rem ;
258+ container-type : inline-size;
259+ }
260+
261+ .github-id-chip-container {
262+ display : flex ;
263+ flex-wrap : wrap ;
264+ gap : 0.5rem ;
265+ margin-bottom : 1rem ;
266+ }
267+
268+ .github-id-management-card-title {
269+ font-weight : 600 ;
270+ font-size : 1.2rem ;
271+ margin-bottom : 0.25rem ;
272+ }
273+
274+ .github-id-management-card-description {
275+ font-size : 0.9rem ;
276+ color : var (--ct-slate-500 );
277+ }
278+ .github-id-chip {
279+ display : flex ;
280+ align-items : center ;
281+ gap : 0.25rem ;
282+ font-weight : 600 ;
283+ padding : 0.25rem 0.5rem ;
284+ border-radius : 4px ;
285+ background-color : var (--ct-slate-100 );
286+ color : inherit ;
287+ text-decoration : none ;
288+ }
289+
290+ .github-id-chip a {
291+ color : inherit ;
292+ }
293+
294+ .github-id-chip button {
295+ background : none ;
296+ border : none ;
297+ padding : 0 ;
298+ cursor : pointer ;
299+ width : 20px ;
300+ height : 20px ;
301+ margin-left : 0.25rem ;
302+ }
303+
304+ .no-github-id-registered {
305+ color : var (--ct-slate-500 );
306+ font-weight : bold ;
307+ text-align : center ;
308+ margin-bottom : 1rem ;
309+ }
310+
311+ .github-id-management-form {
312+ display : flex ;
313+ gap : 0.5rem ;
314+ align-items : center ;
315+ }
316+
317+ .github-id-management-form-input {
318+ flex : 1 ;
319+ font-size : 0.8rem ;
320+ }
321+
322+ @container (max-width: 320px) {
323+ .github-id-management-form {
324+ flex-direction : column ;
325+ align-items : stretch ;
326+ }
327+ }
183328 </style >
0 commit comments