Skip to content

Commit e03dfeb

Browse files
authored
Merge pull request #301 from code0-tech/feat/#300
User input doesn't work with multiply user selection
2 parents ca2e6a8 + b76f569 commit e03dfeb

3 files changed

Lines changed: 21 additions & 15 deletions

File tree

src/packages/ce/src/member/pages/MemberAddPage.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@ import {useParams, useRouter} from "next/navigation";
77
import {Namespace, User} from "@code0-tech/sagittarius-graphql-types";
88
import Link from "next/link";
99
import {UserService} from "@edition/user/services/User.service";
10-
import {InputSyntaxSegment} from "@code0-tech/pictor/dist/components/form/Input.syntax.hook";
11-
import {UserInputComponent} from "@edition/user/components/UserInputComponent";
10+
import {UserInputComponent, UserSyntaxSegment} from "@edition/user/components/UserInputComponent";
1211
import {addIslandSuccessNotification} from "@code0-tech/pictor/dist/components/island/Island.hook";
1312

1413
export const MemberAddPage: React.FC = () => {
@@ -32,13 +31,13 @@ export const MemberAddPage: React.FC = () => {
3231
}
3332
}, [members])
3433

35-
const [inputs, validate] = useForm<{ users: null | InputSyntaxSegment[] }>({
34+
const [inputs, validate] = useForm<{ users: null | UserSyntaxSegment[] }>({
3635
useInitialValidation: false,
3736
initialValues: formInitialValues,
3837
validate: {
3938
users: (value) => {
4039
if (!value) return "Please select at least one user"
41-
if (value.length <= 0) return "Please select at least one user"
40+
if (value.filter(segment => segment.type === "block").length <= 0) return "Please select at least one user"
4241
return null
4342
}
4443
},
@@ -47,7 +46,9 @@ export const MemberAddPage: React.FC = () => {
4746

4847
const payload = await memberService.memberBulkInvite({
4948
namespaceId: namespaceId!!,
50-
userIds: values.users!!.map((value) => (value.value).id!!)
49+
userIds: values.users!!
50+
.filter(segment => segment.type === "block")
51+
.map(segment => segment.valueData!!.id!!)
5152
})
5253

5354
if ((payload?.errors?.length ?? 0) <= 0) {

src/packages/ce/src/member/services/Member.service.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ export type MemberDependencies = {
2828
export class MemberService extends ReactiveArrayService<NamespaceMember, MemberDependencies> {
2929

3030
private readonly client: GraphqlClient
31-
private i = 0
3231

3332
constructor(client: GraphqlClient, store: ReactiveArrayStore<View<NamespaceMember>>) {
3433
super(store)
@@ -56,7 +55,7 @@ export class MemberService extends ReactiveArrayService<NamespaceMember, MemberD
5655
const nodes = res.data?.namespace?.members?.nodes ?? []
5756
nodes.forEach(member => {
5857
if (member && !this.hasById(member.id)) {
59-
this.set(this.i++, new View(member))
58+
this.add(new View(member))
6059
}
6160
})
6261
})
@@ -66,7 +65,7 @@ export class MemberService extends ReactiveArrayService<NamespaceMember, MemberD
6665
}
6766

6867
hasById(id: NamespaceMember["id"]): boolean {
69-
const member = super.values().find(o => o.id === id)
68+
const member = super.values().find(o => o?.id === id)
7069
return member !== undefined
7170
}
7271

@@ -88,7 +87,7 @@ export class MemberService extends ReactiveArrayService<NamespaceMember, MemberD
8887

8988
if (result.data && result.data.namespacesMembersAssignRoles) {
9089
const currentMember = this.getById(payload.memberId)
91-
const index = super.values().findIndex(m => m.id === payload.memberId)
90+
const index = super.values().findIndex(m => m?.id === payload.memberId)
9291

9392
if (currentMember && index >= 0) {
9493
const newMember: NamespaceMember = {
@@ -135,8 +134,8 @@ export class MemberService extends ReactiveArrayService<NamespaceMember, MemberD
135134

136135
if (result.data && result.data.namespacesMembersDelete && result.data.namespacesMembersDelete.namespaceMember) {
137136
const member = result.data.namespacesMembersDelete.namespaceMember
138-
const index = super.values().findIndex(m => m.id == member.id)
139-
this.delete(index)
137+
const index = super.values().findIndex(m => m?.id == member.id)
138+
if (index >= 0) this.delete(index)
140139
}
141140

142141
return result.data?.namespacesMembersDelete ?? undefined
@@ -152,7 +151,7 @@ export class MemberService extends ReactiveArrayService<NamespaceMember, MemberD
152151

153152
result.data?.namespacesMembersBulkInvite?.namespaceMembers?.forEach(member => {
154153
if (!this.hasById(member.id)) {
155-
this.set(this.i++, new View(member))
154+
this.add(new View(member))
156155
}
157156
})
158157

src/packages/ce/src/user/components/UserInputComponent.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export interface UserInputComponentProps extends TextInputProps {
2121
filter?: (user: User, index: number) => boolean
2222
}
2323

24+
export type UserSyntaxSegment = InputSyntaxSegment & { valueData?: User }
25+
2426
export const UserInputComponent: React.FC<UserInputComponentProps> = (props) => {
2527

2628
const {filter = () => true, ...rest} = props
@@ -43,15 +45,19 @@ export const UserInputComponent: React.FC<UserInputComponentProps> = (props) =>
4345
const transformSyntax = (
4446
_?: string | null,
4547
appliedParts: (InputSuggestion | any)[] = [],
46-
): InputSyntaxSegment[] => {
48+
): UserSyntaxSegment[] => {
4749

4850
let cursor = 0
4951

5052
return appliedParts.map((part: string | InputSuggestion, index) => {
5153
if (typeof part === "object") {
5254
const segment = {
5355
type: "block",
54-
value: part.valueData,
56+
// value must stay the raw suggestion value (username) so pictor can
57+
// re-match the segment to its token on re-serialization; the User
58+
// object travels alongside in valueData
59+
value: part.value,
60+
valueData: part.valueData,
5561
start: cursor,
5662
end: cursor + part.value.length,
5763
visualLength: 1,
@@ -81,7 +87,7 @@ export const UserInputComponent: React.FC<UserInputComponentProps> = (props) =>
8187
}
8288
cursor += textString.length
8389
return {}
84-
}) as InputSyntaxSegment[]
90+
}) as UserSyntaxSegment[]
8591
}
8692

8793
return <TextInput placeholder={"Enter users"}

0 commit comments

Comments
 (0)