sanity-plugin-utils 2.0.16 → 2.0.17
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.
- package/dist/index.js +80 -78
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -56,7 +56,7 @@ const TableWrapper = (t0) => {
|
|
|
56
56
|
}), $[2] = props, $[3] = t2), t2;
|
|
57
57
|
}, StyledTable = /* @__PURE__ */ styled(TableWrapper).withConfig({
|
|
58
58
|
displayName: "StyledTable",
|
|
59
|
-
componentId: "sc-
|
|
59
|
+
componentId: "sc-54lbmo-0"
|
|
60
60
|
})(() => css`display:table;width:100%;border-collapse:collapse;&:not([hidden]){display:table;border-collapse:collapse;}`);
|
|
61
61
|
function Table(props) {
|
|
62
62
|
let $ = c(6), children, rest;
|
|
@@ -77,7 +77,7 @@ const RowWrapper = (t0) => {
|
|
|
77
77
|
}), $[2] = props, $[3] = t2), t2;
|
|
78
78
|
}, StyledRow = /* @__PURE__ */ styled(RowWrapper).withConfig({
|
|
79
79
|
displayName: "StyledRow",
|
|
80
|
-
componentId: "sc-
|
|
80
|
+
componentId: "sc-54lbmo-1"
|
|
81
81
|
})(() => css`display:table-row;&:not([hidden]){display:table-row;}`);
|
|
82
82
|
function Row(props) {
|
|
83
83
|
let $ = c(6), children, rest;
|
|
@@ -98,7 +98,7 @@ const CellWrapper = (t0) => {
|
|
|
98
98
|
}), $[2] = props, $[3] = t2), t2;
|
|
99
99
|
}, StyledCell = /* @__PURE__ */ styled(CellWrapper).withConfig({
|
|
100
100
|
displayName: "StyledCell",
|
|
101
|
-
componentId: "sc-
|
|
101
|
+
componentId: "sc-54lbmo-2"
|
|
102
102
|
})(() => css`display:table-cell;&:not([hidden]){display:table-cell;}`);
|
|
103
103
|
function Cell(props) {
|
|
104
104
|
let $ = c(6), children, rest;
|
|
@@ -109,44 +109,6 @@ function Cell(props) {
|
|
|
109
109
|
children
|
|
110
110
|
}), $[3] = children, $[4] = rest, $[5] = t0) : t0 = $[5], t0;
|
|
111
111
|
}
|
|
112
|
-
function chunkArray(array, size) {
|
|
113
|
-
let chunks = [];
|
|
114
|
-
for (let i = 0; i < array.length; i += size) chunks.push(array.slice(i, i + size));
|
|
115
|
-
return chunks;
|
|
116
|
-
}
|
|
117
|
-
function useProjectUsers(t0) {
|
|
118
|
-
let $ = c(11), { apiVersion } = t0, { currentUser } = useWorkspace(), t1 = apiVersion ?? "2023-01-01", t2;
|
|
119
|
-
$[0] === t1 ? t2 = $[1] : (t2 = { apiVersion: t1 }, $[0] = t1, $[1] = t2);
|
|
120
|
-
let client = useClient(t2), t3;
|
|
121
|
-
$[2] === Symbol.for("react.memo_cache_sentinel") ? (t3 = [], $[2] = t3) : t3 = $[2];
|
|
122
|
-
let [users, setUsers] = useState(t3), t4;
|
|
123
|
-
$[3] !== client || $[4] !== currentUser?.id || $[5] !== users.length ? (t4 = () => {
|
|
124
|
-
let { projectId } = client.config();
|
|
125
|
-
users.length || async function getUsersWithRoles() {
|
|
126
|
-
try {
|
|
127
|
-
let aclData = await client.request({ url: `/projects/${projectId}/acl` }), userIdChunks = chunkArray(aclData.map(_temp$1), 200), usersWithRoles = (await Promise.all(userIdChunks.map((chunk) => client.request({ url: `/projects/${projectId}/users/${chunk.join(",")}` })))).flat().map((user_0) => {
|
|
128
|
-
let userRoles = aclData.find((aclUser) => aclUser.projectUserId === user_0.id)?.roles || [];
|
|
129
|
-
return Object.assign(user_0, {
|
|
130
|
-
isCurrentUser: user_0.id === currentUser?.id,
|
|
131
|
-
roles: userRoles
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
setUsers(usersWithRoles);
|
|
135
|
-
} catch (t5) {
|
|
136
|
-
console.error("Failed to fetch users:", t5);
|
|
137
|
-
}
|
|
138
|
-
}();
|
|
139
|
-
}, $[3] = client, $[4] = currentUser?.id, $[5] = users.length, $[6] = t4) : t4 = $[6];
|
|
140
|
-
let t5 = currentUser?.id, t6;
|
|
141
|
-
return $[7] !== client || $[8] !== t5 || $[9] !== users.length ? (t6 = [
|
|
142
|
-
client,
|
|
143
|
-
t5,
|
|
144
|
-
users.length
|
|
145
|
-
], $[7] = client, $[8] = t5, $[9] = users.length, $[10] = t6) : t6 = $[10], useEffect(t4, t6), users;
|
|
146
|
-
}
|
|
147
|
-
function _temp$1(user) {
|
|
148
|
-
return user.projectUserId;
|
|
149
|
-
}
|
|
150
112
|
function searchUsers(users, searchString) {
|
|
151
113
|
return users.filter((user) => !!((user.displayName || "").toLowerCase().startsWith(searchString) || (user.givenName || "").toLowerCase().startsWith(searchString) || (user.middleName || "").toLowerCase().startsWith(searchString) || (user.familyName || "").toLowerCase().startsWith(searchString)));
|
|
152
114
|
}
|
|
@@ -158,37 +120,39 @@ const LABELS = {
|
|
|
158
120
|
notFound: "No users found"
|
|
159
121
|
};
|
|
160
122
|
function UserSelectMenu(props) {
|
|
161
|
-
let $ = c(
|
|
123
|
+
let $ = c(44), { value, userList, onAdd, onRemove, onClear, style: t0 } = props, t1;
|
|
162
124
|
$[0] === t0 ? t1 = $[1] : (t1 = t0 === void 0 ? {} : t0, $[0] = t0, $[1] = t1);
|
|
163
125
|
let style = t1, t2;
|
|
164
126
|
$[2] === props.labels ? t2 = $[3] : (t2 = props?.labels ? {
|
|
165
127
|
...LABELS,
|
|
166
128
|
...props.labels
|
|
167
129
|
} : LABELS, $[2] = props.labels, $[3] = t2);
|
|
168
|
-
let labels = t2, [searchString, setSearchString] = useState(""),
|
|
169
|
-
$[4]
|
|
170
|
-
let
|
|
171
|
-
$[
|
|
130
|
+
let labels = t2, [searchString, setSearchString] = useState(""), t3;
|
|
131
|
+
$[4] === userList ? t3 = $[5] : (t3 = userList || [], $[4] = userList, $[5] = t3);
|
|
132
|
+
let searchResults = searchUsers(t3, searchString), me, t4;
|
|
133
|
+
$[6] !== userList || $[7] !== value ? (me = userList.find(_temp$1), t4 = me && value.includes(me.id), $[6] = userList, $[7] = value, $[8] = me, $[9] = t4) : (me = $[8], t4 = $[9]);
|
|
134
|
+
let meAssigned = t4, input = useRef(null), t5;
|
|
135
|
+
$[10] === Symbol.for("react.memo_cache_sentinel") ? (t5 = (event) => {
|
|
172
136
|
setSearchString(event.target.value);
|
|
173
|
-
}, $[
|
|
174
|
-
let handleSearchChange =
|
|
175
|
-
$[
|
|
137
|
+
}, $[10] = t5) : t5 = $[10];
|
|
138
|
+
let handleSearchChange = t5, t6;
|
|
139
|
+
$[11] !== onAdd || $[12] !== onRemove ? (t6 = (isChecked, user) => {
|
|
176
140
|
isChecked ? onRemove && onRemove(user.id) : onAdd && onAdd(user.id);
|
|
177
|
-
}, $[
|
|
178
|
-
let handleSelect =
|
|
179
|
-
$[
|
|
141
|
+
}, $[11] = onAdd, $[12] = onRemove, $[13] = t6) : t6 = $[13];
|
|
142
|
+
let handleSelect = t6, t7;
|
|
143
|
+
$[14] !== me || $[15] !== onAdd ? (t7 = () => {
|
|
180
144
|
me && onAdd && onAdd(me.id);
|
|
181
|
-
}, $[
|
|
182
|
-
let handleAssignMyself =
|
|
183
|
-
$[
|
|
145
|
+
}, $[14] = me, $[15] = onAdd, $[16] = t7) : t7 = $[16];
|
|
146
|
+
let handleAssignMyself = t7, t8;
|
|
147
|
+
$[17] !== me || $[18] !== onRemove ? (t8 = () => {
|
|
184
148
|
me && onRemove && onRemove(me.id);
|
|
185
|
-
}, $[
|
|
186
|
-
let handleUnassignMyself =
|
|
187
|
-
$[
|
|
149
|
+
}, $[17] = me, $[18] = onRemove, $[19] = t8) : t8 = $[19];
|
|
150
|
+
let handleUnassignMyself = t8, t9;
|
|
151
|
+
$[20] === onClear ? t9 = $[21] : (t9 = () => {
|
|
188
152
|
onClear && onClear();
|
|
189
|
-
}, $[
|
|
190
|
-
let handleClearAssigneesClick =
|
|
191
|
-
$[
|
|
153
|
+
}, $[20] = onClear, $[21] = t9);
|
|
154
|
+
let handleClearAssigneesClick = t9, T0 = Menu, t10;
|
|
155
|
+
$[22] !== handleAssignMyself || $[23] !== handleUnassignMyself || $[24] !== labels.addMe || $[25] !== labels.removeMe || $[26] !== me || $[27] !== meAssigned ? (t10 = meAssigned ? /* @__PURE__ */ jsx(MenuItem, {
|
|
192
156
|
tone: "caution",
|
|
193
157
|
disabled: !me,
|
|
194
158
|
onClick: handleUnassignMyself,
|
|
@@ -199,17 +163,17 @@ function UserSelectMenu(props) {
|
|
|
199
163
|
onClick: handleAssignMyself,
|
|
200
164
|
icon: AddCircleIcon,
|
|
201
165
|
text: labels.addMe
|
|
202
|
-
}), $[
|
|
203
|
-
let
|
|
204
|
-
$[
|
|
166
|
+
}), $[22] = handleAssignMyself, $[23] = handleUnassignMyself, $[24] = labels.addMe, $[25] = labels.removeMe, $[26] = me, $[27] = meAssigned, $[28] = t10) : t10 = $[28];
|
|
167
|
+
let t11 = value.length === 0, t12;
|
|
168
|
+
$[29] !== handleClearAssigneesClick || $[30] !== labels.clear || $[31] !== t11 ? (t12 = /* @__PURE__ */ jsx(MenuItem, {
|
|
205
169
|
tone: "critical",
|
|
206
|
-
disabled:
|
|
170
|
+
disabled: t11,
|
|
207
171
|
onClick: handleClearAssigneesClick,
|
|
208
172
|
icon: RestoreIcon,
|
|
209
173
|
text: labels.clear
|
|
210
|
-
}), $[
|
|
211
|
-
let
|
|
212
|
-
$[
|
|
174
|
+
}), $[29] = handleClearAssigneesClick, $[30] = labels.clear, $[31] = t11, $[32] = t12) : t12 = $[32];
|
|
175
|
+
let t13;
|
|
176
|
+
$[33] !== labels.searchPlaceholder || $[34] !== searchString ? (t13 = /* @__PURE__ */ jsx(Box, {
|
|
213
177
|
padding: 1,
|
|
214
178
|
children: /* @__PURE__ */ jsx(TextInput, {
|
|
215
179
|
ref: input,
|
|
@@ -217,11 +181,11 @@ function UserSelectMenu(props) {
|
|
|
217
181
|
placeholder: labels.searchPlaceholder,
|
|
218
182
|
value: searchString
|
|
219
183
|
})
|
|
220
|
-
}), $[
|
|
221
|
-
let
|
|
184
|
+
}), $[33] = labels.searchPlaceholder, $[34] = searchString, $[35] = t13) : t13 = $[35];
|
|
185
|
+
let t14 = searchString && searchResults?.length === 0 && /* @__PURE__ */ jsx(MenuItem, {
|
|
222
186
|
disabled: !0,
|
|
223
187
|
text: labels.notFound
|
|
224
|
-
}),
|
|
188
|
+
}), t15 = searchResults && searchResults.map((user_0) => /* @__PURE__ */ jsx(MenuItem, {
|
|
225
189
|
pressed: value.includes(user_0.id),
|
|
226
190
|
onClick: () => handleSelect(value.indexOf(user_0.id) > -1, user_0),
|
|
227
191
|
children: /* @__PURE__ */ jsxs(Flex, {
|
|
@@ -243,19 +207,19 @@ function UserSelectMenu(props) {
|
|
|
243
207
|
})
|
|
244
208
|
]
|
|
245
209
|
})
|
|
246
|
-
}, user_0.id)),
|
|
247
|
-
return $[
|
|
210
|
+
}, user_0.id)), t16;
|
|
211
|
+
return $[36] !== T0 || $[37] !== style || $[38] !== t10 || $[39] !== t12 || $[40] !== t13 || $[41] !== t14 || $[42] !== t15 ? (t16 = /* @__PURE__ */ jsxs(T0, {
|
|
248
212
|
style,
|
|
249
213
|
children: [
|
|
250
|
-
|
|
251
|
-
t11,
|
|
214
|
+
t10,
|
|
252
215
|
t12,
|
|
253
216
|
t13,
|
|
254
|
-
t14
|
|
217
|
+
t14,
|
|
218
|
+
t15
|
|
255
219
|
]
|
|
256
|
-
}), $[
|
|
220
|
+
}), $[36] = T0, $[37] = style, $[38] = t10, $[39] = t12, $[40] = t13, $[41] = t14, $[42] = t15, $[43] = t16) : t16 = $[43], t16;
|
|
257
221
|
}
|
|
258
|
-
function _temp(u) {
|
|
222
|
+
function _temp$1(u) {
|
|
259
223
|
return u.isCurrentUser;
|
|
260
224
|
}
|
|
261
225
|
function useImageUrlBuilder(clientOptions) {
|
|
@@ -314,6 +278,44 @@ function useOpenInNewPane(id, type) {
|
|
|
314
278
|
routerContext.navigateUrl({ path: href });
|
|
315
279
|
}, $[0] = groupIndex, $[1] = id, $[2] = routerContext, $[3] = routerPanesState, $[4] = type, $[5] = t0) : t0 = $[5], t0;
|
|
316
280
|
}
|
|
281
|
+
function chunkArray(array, size) {
|
|
282
|
+
let chunks = [];
|
|
283
|
+
for (let i = 0; i < array.length; i += size) chunks.push(array.slice(i, i + size));
|
|
284
|
+
return chunks;
|
|
285
|
+
}
|
|
286
|
+
function useProjectUsers(t0) {
|
|
287
|
+
let $ = c(11), { apiVersion } = t0, { currentUser } = useWorkspace(), t1 = apiVersion ?? "2023-01-01", t2;
|
|
288
|
+
$[0] === t1 ? t2 = $[1] : (t2 = { apiVersion: t1 }, $[0] = t1, $[1] = t2);
|
|
289
|
+
let client = useClient(t2), t3;
|
|
290
|
+
$[2] === Symbol.for("react.memo_cache_sentinel") ? (t3 = [], $[2] = t3) : t3 = $[2];
|
|
291
|
+
let [users, setUsers] = useState(t3), t4;
|
|
292
|
+
$[3] !== client || $[4] !== currentUser?.id || $[5] !== users.length ? (t4 = () => {
|
|
293
|
+
let { projectId } = client.config();
|
|
294
|
+
users.length || async function getUsersWithRoles() {
|
|
295
|
+
try {
|
|
296
|
+
let aclData = await client.request({ url: `/projects/${projectId}/acl` }), userIdChunks = chunkArray(aclData.map(_temp), 200), usersWithRoles = (await Promise.all(userIdChunks.map((chunk) => client.request({ url: `/projects/${projectId}/users/${chunk.join(",")}` })))).flat().map((user_0) => {
|
|
297
|
+
let userRoles = aclData.find((aclUser) => aclUser.projectUserId === user_0.id)?.roles || [];
|
|
298
|
+
return Object.assign(user_0, {
|
|
299
|
+
isCurrentUser: user_0.id === currentUser?.id,
|
|
300
|
+
roles: userRoles
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
setUsers(usersWithRoles);
|
|
304
|
+
} catch (t5) {
|
|
305
|
+
console.error("Failed to fetch users:", t5);
|
|
306
|
+
}
|
|
307
|
+
}();
|
|
308
|
+
}, $[3] = client, $[4] = currentUser?.id, $[5] = users.length, $[6] = t4) : t4 = $[6];
|
|
309
|
+
let t5 = currentUser?.id, t6;
|
|
310
|
+
return $[7] !== client || $[8] !== t5 || $[9] !== users.length ? (t6 = [
|
|
311
|
+
client,
|
|
312
|
+
t5,
|
|
313
|
+
users.length
|
|
314
|
+
], $[7] = client, $[8] = t5, $[9] = users.length, $[10] = t6) : t6 = $[10], useEffect(t4, t6), users;
|
|
315
|
+
}
|
|
316
|
+
function _temp(user) {
|
|
317
|
+
return user.projectUserId;
|
|
318
|
+
}
|
|
317
319
|
export { Cell, Feedback, Row, Table, UserSelectMenu, useImageUrlBuilder, useImageUrlBuilderImage, useListeningQuery, useOpenInNewPane, useProjectUsers };
|
|
318
320
|
|
|
319
321
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["Box","Card","Flex","Stack","Text","CardTone","ReactNode","FeedbackChildren","children","title","description","FeedbackTextProps","FeedbackProps","tone","icon","DEFAULT_PROPS","Feedback","props","$","_c","t0","t1","t2","t3","t4","Card","CardProps","PropsWithChildren","css","styled","TableWrapper","t0","$","_c","t1","undefined","props","t2","StyledTable","TableProps","Table","children","rest","RowWrapper","StyledRow","TableRowProps","Row","CellWrapper","StyledCell","TableCellProps","colSpan","rowSpan","Cell","useEffect","useState","useClient","useWorkspace","UserRole","name","title","UserExtended","createdAt","displayName","email","familyName","givenName","id","imageUrl","isCurrentUser","middleName","projectId","provider","roles","sanityUserId","updatedAt","UserResponse","isRobot","projectUserId","HookConfig","apiVersion","chunkArray","array","T","size","chunks","i","length","push","slice","useProjectUsers","t0","$","_c","currentUser","t1","t2","client","t3","Symbol","for","users","setUsers","t4","config","getUsersWithRoles","aclData","request","url","userIds","map","_temp","userIdChunks","userResponses","Promise","all","chunk","join","usersData","flat","usersWithRoles","user_0","userRoles","find","aclUser","user","Object","assign","t5","err","console","error","t6","AddCircleIcon","RemoveCircleIcon","RestoreIcon","Badge","Box","Flex","Text","TextInput","Menu","MenuItem","ChangeEvent","useRef","useState","UserAvatar","UserExtended","searchUsers","users","searchString","filter","user","displayName","toLowerCase","startsWith","givenName","middleName","familyName","Labels","addMe","removeMe","clear","searchPlaceholder","notFound","UserSelectMenuProps","value","userList","onAdd","userId","onRemove","onClear","labels","style","React","CSSProperties","LABELS","UserSelectMenu","props","$","_c","t0","t1","undefined","t2","setSearchString","searchResults","me","t3","find","_temp","includes","id","meAssigned","input","t4","Symbol","for","event","target","handleSearchChange","t5","isChecked","handleSelect","t6","handleAssignMyself","t7","handleUnassignMyself","t8","handleClearAssigneesClick","T0","t9","t10","length","t11","t12","t13","t14","map","user_0","indexOf","isCurrentUser","t15","u","createImageUrlBuilder","useMemo","ImageUrlBuilder","SourceClientOptions","useClient","useImageUrlBuilder","clientOptions","$","_c","client","t0","builder","SanityImageSource","useMemo","ImageUrlBuilder","SourceClientOptions","useImageUrlBuilder","useImageUrlBuilderImage","source","clientOptions","$","_c","builder","t0","image","useEffect","useMemo","useRef","useState","isEqual","Subscription","catchError","distinctUntilChanged","ListenQueryOptions","ListenQueryParams","useDocumentStore","Config","params","options","initialValue","V","Return","loading","error","data","DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useParams","$","_c","t0","JSON","stringify","stringifiedParams","t1","parse","useListeningQuery","query","t2","t3","undefined","setLoading","setError","setData","memoParams","memoOptions","subscription","documentStore","t4","t5","current","listenQuery","pipe","err_0","console","err","subscribe","documents","t6","unsubscribe","useCallback","useContext","RouterContext","usePaneRouter","useOpenInNewPane","id","type","$","_c","routerContext","routerPanesState","groupIndex","t0","panes","splice","params","href","resolvePathFromState","navigateUrl","path","openInNewPane"],"sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/hooks/useProjectUsers.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx"],"sourcesContent":["import {Box, Card, Flex, Stack, Text, type CardTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackChildren = {\n children?: ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {\n ...DEFAULT_PROPS,\n ...props,\n }\n\n return (\n <Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {Card, type CardProps} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\nimport {css, styled} from 'styled-components'\n\n// Wrappers required because of bug with passing down \"as\" prop\n// https://github.com/styled-components/styled-components/issues/2449\n\n// Table\nconst TableWrapper = (props: CardProps = {}) => {\n return <Card as=\"table\" {...props} />\n}\n\nconst StyledTable = styled(TableWrapper)(\n () => css`\n display: table;\n width: 100%;\n border-collapse: collapse;\n\n &:not([hidden]) {\n display: table;\n border-collapse: collapse;\n }\n `,\n)\n\ntype TableProps = PropsWithChildren<CardProps>\n\nexport function Table(props: TableProps) {\n const {children, ...rest} = props\n\n return <StyledTable {...rest}>{children}</StyledTable>\n}\n\n// Row\nconst RowWrapper = (props: CardProps = {}) => {\n return <Card as=\"tr\" {...props} />\n}\n\nconst StyledRow = styled(RowWrapper)(\n () => css`\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n `,\n)\n\ntype TableRowProps = PropsWithChildren<CardProps>\n\nexport function Row(props: TableRowProps) {\n const {children, ...rest} = props\n\n return <StyledRow {...rest}>{children}</StyledRow>\n}\n\n// Cell\nconst CellWrapper = (props = {}) => {\n return <Card as=\"td\" {...props} />\n}\n\nconst StyledCell = styled(CellWrapper)(\n () => css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `,\n)\n\ntype TableCellProps = PropsWithChildren<\n CardProps & {\n colSpan?: number\n rowSpan?: number\n }\n>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {useEffect, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\n\ntype UserRole = {\n name: string\n title: string\n}\n\nexport type UserExtended = {\n createdAt: string\n displayName: string\n email: string\n familyName: string\n givenName: string\n id: string\n imageUrl: string\n isCurrentUser: boolean\n middleName: string\n projectId: string\n provider: string\n roles?: UserRole[]\n sanityUserId: string\n updatedAt: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n// Custom hook to fetch user details and roles in batches\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState<UserExtended[]>([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {RestoreIcon} from '@sanity/icons/Restore'\nimport {Badge, Box, Flex, Text, TextInput} from '@sanity/ui'\nimport {Menu, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent, useRef, useState} from 'react'\nimport {UserAvatar} from 'sanity'\n\nimport {type UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype Labels = {\n addMe?: string\n removeMe?: string\n clear?: string\n searchPlaceholder?: string\n notFound?: string\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: (userId: string) => void\n onRemove: (userId: string) => void\n onClear: () => void\n labels?: Labels\n style?: React.CSSProperties\n}\n\nconst LABELS: Labels = {\n addMe: 'Assign myself',\n removeMe: 'Unassign myself',\n clear: 'Clear assignees',\n searchPlaceholder: 'Search users',\n notFound: 'No users found',\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value, userList, onAdd, onRemove, onClear, style = {}} = props\n const labels = props?.labels ? {...LABELS, ...props.labels} : LABELS\n\n const [searchString, setSearchString] = useState('')\n const searchResults = searchUsers(userList || [], searchString)\n\n const me = userList.find((u) => u.isCurrentUser)\n const meAssigned = me && value.includes(me.id)\n\n // Focus input on open\n // TODO: Fix focus, it gets immediately taken away\n const input = useRef<HTMLInputElement>(null)\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }\n\n const handleSelect = (isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }\n\n const handleAssignMyself = () => {\n if (me && onAdd) onAdd(me.id)\n }\n\n const handleUnassignMyself = () => {\n if (me && onRemove) onRemove(me.id)\n }\n\n const handleClearAssigneesClick = () => {\n if (onClear) onClear()\n }\n\n return (\n <Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\nimport {useClient} from 'sanity'\n\nexport function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null {\n const client = useClient(clientOptions)\n const builder = useMemo(() => createImageUrlBuilder(client), [client])\n\n return builder\n}\n","import type {SanityImageSource} from '@sanity/asset-utils'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\n\nimport {useImageUrlBuilder} from './useImageUrlBuilder'\n\nexport function useImageUrlBuilderImage(\n source: SanityImageSource,\n clientOptions: SourceClientOptions,\n): ImageUrlBuilder | null {\n const builder = useImageUrlBuilder(clientOptions)\n const image = useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])\n\n return image\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport type {Subscription} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, type ListenQueryParams, useDocumentStore} from 'sanity'\n\ninterface Config<V> {\n params?: ListenQueryParams\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: unknown\n data: V | null\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2023-05-01`}\nconst DEFAULT_INITIAL_VALUE = null\n\nfunction useParams(params?: null | ListenQueryParams | ListenQueryOptions): ListenQueryParams {\n const stringifiedParams = useMemo(() => JSON.stringify(params || {}), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n\nexport function useListeningQuery<V>(\n query: string | {fetch: string; listen: string},\n {\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>,\n): Return<V> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<unknown>(null)\n const [data, setData] = useState<Return<V>['data']>(initialValue)\n const memoParams = useParams(params)\n const memoOptions = useParams(options)\n\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }, [query, error, memoParams, memoOptions, documentStore])\n\n return {data, loading, error}\n}\n","import {useCallback, useContext} from 'react'\nimport {RouterContext} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["{\n ...DEFAULT_PROPS,\n ...props,\n }","children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )","<Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>","icon ? `display icon` : null","<Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>","props: CardProps = {}","<Card as=\"table\" {...props} />","<StyledTable {...rest}>{children}</StyledTable>","<Card as=\"tr\" {...props} />","<StyledRow {...rest}>{children}</StyledRow>","props = {}","<Card as=\"td\" {...props} />","<StyledCell {...rest}>{children}</StyledCell>","style = {}","props?.labels ? {...LABELS, ...props.labels} : LABELS","labels","userList || []","me && value.includes(me.id)","(u) => u.isCurrentUser","(event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }","(isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }","() => {\n if (me && onAdd) onAdd(me.id)\n }","() => {\n if (me && onRemove) onRemove(me.id)\n }","() => {\n if (onClear) onClear()\n }","meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )","addMe","removeMe","<MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />","clear","value.length === 0","<Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>","searchPlaceholder","user","<Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>","Menu","searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />","searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))","createImageUrlBuilder(client)","useMemo(() => createImageUrlBuilder(client), [client])","source && builder ? builder.image(source) : null","useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])","JSON.stringify(params || {})","useMemo(() => JSON.stringify(params || {}), [params])","JSON.parse(stringifiedParams)","useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])","{\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>","params = DEFAULT_PARAMS","options = DEFAULT_OPTIONS","initialValue = DEFAULT_INITIAL_VALUE","() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }","[query, error, memoParams, memoOptions, documentStore]","err","{data, loading, error}","() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }","useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])","{apiVersion}: HookConfig","{apiVersion: apiVersion ?? '2023-01-01'}","apiVersion ?? '2023-01-01'","[]","() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }","id","length","(user: UserResponse) => user.projectUserId","user","err","[client, currentUser?.id, users.length]","currentUser?.id"],"sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx","../src/hooks/useProjectUsers.tsx"],"sourcesContent":["import {Box, Card, Flex, Stack, Text, type CardTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackChildren = {\n children?: ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {\n ...DEFAULT_PROPS,\n ...props,\n }\n\n return (\n <Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {Card, type CardProps} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\nimport {css, styled} from 'styled-components'\n\n// Wrappers required because of bug with passing down \"as\" prop\n// https://github.com/styled-components/styled-components/issues/2449\n\n// Table\nconst TableWrapper = (props: CardProps = {}) => {\n return <Card as=\"table\" {...props} />\n}\n\nconst StyledTable = styled(TableWrapper)(\n () => css`\n display: table;\n width: 100%;\n border-collapse: collapse;\n\n &:not([hidden]) {\n display: table;\n border-collapse: collapse;\n }\n `,\n)\n\ntype TableProps = PropsWithChildren<CardProps>\n\nexport function Table(props: TableProps) {\n const {children, ...rest} = props\n\n return <StyledTable {...rest}>{children}</StyledTable>\n}\n\n// Row\nconst RowWrapper = (props: CardProps = {}) => {\n return <Card as=\"tr\" {...props} />\n}\n\nconst StyledRow = styled(RowWrapper)(\n () => css`\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n `,\n)\n\ntype TableRowProps = PropsWithChildren<CardProps>\n\nexport function Row(props: TableRowProps) {\n const {children, ...rest} = props\n\n return <StyledRow {...rest}>{children}</StyledRow>\n}\n\n// Cell\nconst CellWrapper = (props = {}) => {\n return <Card as=\"td\" {...props} />\n}\n\nconst StyledCell = styled(CellWrapper)(\n () => css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `,\n)\n\ntype TableCellProps = PropsWithChildren<\n CardProps & {\n colSpan?: number\n rowSpan?: number\n }\n>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {RestoreIcon} from '@sanity/icons/Restore'\nimport {Badge, Box, Flex, Text, TextInput} from '@sanity/ui'\nimport {Menu, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent, useRef, useState} from 'react'\nimport {UserAvatar} from 'sanity'\n\nimport {type UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype Labels = {\n addMe?: string\n removeMe?: string\n clear?: string\n searchPlaceholder?: string\n notFound?: string\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: (userId: string) => void\n onRemove: (userId: string) => void\n onClear: () => void\n labels?: Labels\n style?: React.CSSProperties\n}\n\nconst LABELS: Labels = {\n addMe: 'Assign myself',\n removeMe: 'Unassign myself',\n clear: 'Clear assignees',\n searchPlaceholder: 'Search users',\n notFound: 'No users found',\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value, userList, onAdd, onRemove, onClear, style = {}} = props\n const labels = props?.labels ? {...LABELS, ...props.labels} : LABELS\n\n const [searchString, setSearchString] = useState('')\n const searchResults = searchUsers(userList || [], searchString)\n\n const me = userList.find((u) => u.isCurrentUser)\n const meAssigned = me && value.includes(me.id)\n\n // Focus input on open\n // TODO: Fix focus, it gets immediately taken away\n const input = useRef<HTMLInputElement>(null)\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }\n\n const handleSelect = (isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }\n\n const handleAssignMyself = () => {\n if (me && onAdd) onAdd(me.id)\n }\n\n const handleUnassignMyself = () => {\n if (me && onRemove) onRemove(me.id)\n }\n\n const handleClearAssigneesClick = () => {\n if (onClear) onClear()\n }\n\n return (\n <Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\nimport {useClient} from 'sanity'\n\nexport function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null {\n const client = useClient(clientOptions)\n const builder = useMemo(() => createImageUrlBuilder(client), [client])\n\n return builder\n}\n","import type {SanityImageSource} from '@sanity/asset-utils'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\n\nimport {useImageUrlBuilder} from './useImageUrlBuilder'\n\nexport function useImageUrlBuilderImage(\n source: SanityImageSource,\n clientOptions: SourceClientOptions,\n): ImageUrlBuilder | null {\n const builder = useImageUrlBuilder(clientOptions)\n const image = useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])\n\n return image\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport type {Subscription} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, type ListenQueryParams, useDocumentStore} from 'sanity'\n\ninterface Config<V> {\n params?: ListenQueryParams\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: unknown\n data: V | null\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2023-05-01`}\nconst DEFAULT_INITIAL_VALUE = null\n\nfunction useParams(params?: null | ListenQueryParams | ListenQueryOptions): ListenQueryParams {\n const stringifiedParams = useMemo(() => JSON.stringify(params || {}), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n\nexport function useListeningQuery<V>(\n query: string | {fetch: string; listen: string},\n {\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>,\n): Return<V> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<unknown>(null)\n const [data, setData] = useState<Return<V>['data']>(initialValue)\n const memoParams = useParams(params)\n const memoOptions = useParams(options)\n\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }, [query, error, memoParams, memoOptions, documentStore])\n\n return {data, loading, error}\n}\n","import {useCallback, useContext} from 'react'\nimport {RouterContext} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {useEffect, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\n\ntype UserRole = {\n name: string\n title: string\n}\n\nexport type UserExtended = {\n createdAt: string\n displayName: string\n email: string\n familyName: string\n givenName: string\n id: string\n imageUrl: string\n isCurrentUser: boolean\n middleName: string\n projectId: string\n provider: string\n roles?: UserRole[]\n sanityUserId: string\n updatedAt: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n// Custom hook to fetch user details and roles in batches\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState<UserExtended[]>([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.17",
|
|
4
4
|
"description": "Handy hooks and clever components for Sanity Studio v3",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"@sanity/tsdown-config": "^0.26.0",
|
|
40
40
|
"@types/react": "^19.2.18",
|
|
41
41
|
"@types/react-dom": "^19.2.4",
|
|
42
|
-
"
|
|
42
|
+
"oxc-transform-react": "^0.145.0",
|
|
43
43
|
"react": "^19.2.8",
|
|
44
44
|
"react-dom": "^19.2.8",
|
|
45
45
|
"sanity": "^6.10.1",
|