Skip to content

Commit 544b5ab

Browse files
feat: People picker in forms (#1216)
AB#68534 --------- Co-authored-by: Antoine Hurard <antoine@reliefapplications.org>
1 parent 0d9994a commit 544b5ab

File tree

7 files changed

+132
-0
lines changed

7 files changed

+132
-0
lines changed

src/utils/files/getColumns.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,20 @@ export const getColumns = async (
170170
}
171171
break;
172172
}
173+
case 'people-dropdown':
174+
case 'people-tagbox': {
175+
// people-dropdown: single object, people-tagbox: array of objects
176+
columns.push({
177+
name: field.name,
178+
label: field.label || field.name,
179+
field: field.name,
180+
type: field.type,
181+
meta: {
182+
field,
183+
},
184+
});
185+
break;
186+
}
173187
default: {
174188
const name = `${field.name}`;
175189
columns.push({

src/utils/files/getRows.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,49 @@ export const getRows = async (
5555
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
5656
break;
5757
}
58+
case 'people-dropdown': {
59+
// People dropdown: { userid, firstname, lastname, emailaddress }
60+
const personData: any = get(data, column.field);
61+
if (personData) {
62+
const firstName = personData.firstname || '';
63+
const lastName = personData.lastname || '';
64+
const email = personData.emailaddress || '';
65+
const name = [firstName, lastName].filter(Boolean).join(' ').trim();
66+
const displayValue = email
67+
? name
68+
? `${name} (${email})`
69+
: email
70+
: name || personData.userid || '';
71+
set(row, column.name, displayValue);
72+
} else {
73+
set(row, column.name, '');
74+
}
75+
break;
76+
}
77+
case 'people-tagbox': {
78+
// People tagbox: array of { userid, firstname, lastname, emailaddress }
79+
const peopleData: any[] = get(data, column.field) || [];
80+
if (Array.isArray(peopleData) && peopleData.length > 0) {
81+
const displayValues = peopleData.map((person) => {
82+
const firstName = person.firstname || '';
83+
const lastName = person.lastname || '';
84+
const email = person.emailaddress || '';
85+
const name = [firstName, lastName]
86+
.filter(Boolean)
87+
.join(' ')
88+
.trim();
89+
return email
90+
? name
91+
? `${name} (${email})`
92+
: email
93+
: name || person.userid || '';
94+
});
95+
set(row, column.name, displayValues.join(', '));
96+
} else {
97+
set(row, column.name, '');
98+
}
99+
break;
100+
}
58101
case 'multipletext':
59102
case 'matrix':
60103
case 'matrixdropdown': {

src/utils/files/getRowsFromMeta.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,49 @@ export const getRowsFromMeta = (
7777
set(row, column.name, Array.isArray(value) ? value.join(',') : value);
7878
break;
7979
}
80+
case 'people-dropdown': {
81+
// People dropdown: { userid, firstname, lastname, emailaddress }
82+
const personData: any = get(record, column.field);
83+
if (personData) {
84+
const firstName = personData.firstname || '';
85+
const lastName = personData.lastname || '';
86+
const email = personData.emailaddress || '';
87+
const name = [firstName, lastName].filter(Boolean).join(' ').trim();
88+
const displayValue = email
89+
? name
90+
? `${name} (${email})`
91+
: email
92+
: name || personData.userid || '';
93+
set(row, column.name, displayValue);
94+
} else {
95+
set(row, column.name, '');
96+
}
97+
break;
98+
}
99+
case 'people-tagbox': {
100+
// People tagbox: array of { userid, firstname, lastname, emailaddress }
101+
const peopleData: any[] = get(record, column.field) || [];
102+
if (Array.isArray(peopleData) && peopleData.length > 0) {
103+
const displayValues = peopleData.map((person) => {
104+
const firstName = person.firstname || '';
105+
const lastName = person.lastname || '';
106+
const email = person.emailaddress || '';
107+
const name = [firstName, lastName]
108+
.filter(Boolean)
109+
.join(' ')
110+
.trim();
111+
return email
112+
? name
113+
? `${name} (${email})`
114+
: email
115+
: name || person.userid || '';
116+
});
117+
set(row, column.name, displayValues.join(', '));
118+
} else {
119+
set(row, column.name, '');
120+
}
121+
break;
122+
}
80123
case 'checkbox':
81124
case 'tagbox': {
82125
setMultiselectRow(column, record, row);

src/utils/form/getFieldType.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,12 @@ export const getFieldType = async (question: {
8686
case 'editor': {
8787
return 'editor';
8888
}
89+
case 'people-dropdown': {
90+
return 'people-dropdown';
91+
}
92+
case 'people-tagbox': {
93+
return 'people-tagbox';
94+
}
8995
default:
9096
return 'text';
9197
}

src/utils/form/transformRecord.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ export const formatValue = (field: any, value: any): any => {
6161
);
6262
}
6363
break;
64+
case 'people-dropdown':
65+
if (!isNil(value)) {
66+
return value;
67+
}
68+
break;
69+
case 'people-tagbox':
70+
if (!isNil(value) && Array.isArray(value)) {
71+
return value;
72+
}
73+
break;
6474
default:
6575
return value;
6676
}

src/utils/schema/introspection/getFieldType.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ const getFieldType = (
128128
case 'editor': {
129129
return GraphQLString;
130130
}
131+
case 'people-dropdown': {
132+
return GraphQLJSON;
133+
}
134+
case 'people-tagbox': {
135+
return GraphQLJSON;
136+
}
131137
default: {
132138
return GraphQLString;
133139
}

src/utils/schema/resolvers/Query/getSortField.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ export default (sortField: string, field?: any): string => {
4242
) {
4343
return `_${sortField}`;
4444
}
45+
if (field) {
46+
switch (field.type) {
47+
case 'people-dropdown':
48+
case 'people-tagbox': {
49+
// Sort by last name within people fields
50+
return `data.${sortField}.lastname`;
51+
}
52+
// By default, continue
53+
}
54+
}
4555
return `data.${sortField}`;
4656
}
4757
return defaultSortField ? defaultSortField.path : 'createdAt';

0 commit comments

Comments
 (0)