Skip to content

Commit 0085495

Browse files
committed
feat: users can now manage GitHub ids for provisioning
1 parent e2764f0 commit 0085495

File tree

2 files changed

+163
-13
lines changed

2 files changed

+163
-13
lines changed

client/src/components/TeamManagement.vue

Lines changed: 156 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import MainButton from '@/components/MainButton.vue'
66
import ActionFormCard from '@/components/ActionFormCard.vue'
77
import { useUsers } from '@/lib/useUsers'
88
import ErrorMessage from '@/components/ErrorMessage.vue'
9+
import { ref } from 'vue'
910
1011
const { teamId } = defineProps<{ teamId: string }>()
1112
@@ -15,30 +16,54 @@ const { getUserById, getUserByName } = useUsers()
1516
const { mutate: updateTeam } = useUpdateTeam()
1617
1718
const 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
2223
const 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
3032
const 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
3840
const 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>

client/src/lib/useServerData.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,15 @@ export const useCreateTeam = () => {
120120
export const useUpdateTeam = () => {
121121
const client = useQueryClient()
122122
return useMutation({
123-
mutationFn: (params: { teamId: string; name: string; members: string[] }) =>
123+
mutationFn: (params: {
124+
teamId: string
125+
name?: string
126+
members?: string[]
127+
githubIds?: string[]
128+
}) =>
124129
api.PATCH('/teams/{teamId}', {
125130
params: { path: { teamId: params.teamId } },
126-
body: params,
131+
body: { name: params.name, members: params.members, githubIds: params.githubIds },
127132
}),
128133
onSuccess: (_, params) => {
129134
void client.invalidateQueries({ queryKey: ['team', params.teamId] })

0 commit comments

Comments
 (0)