sanity-plugin-utils 1.1.1 → 1.3.0
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/README.md +17 -4
- package/lib/index.d.ts +18 -4
- package/lib/index.esm.js +17 -6
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +17 -6
- package/lib/index.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Table.tsx +7 -2
- package/src/components/UserSelectMenu/index.tsx +28 -10
package/README.md
CHANGED
|
@@ -93,10 +93,10 @@ Returns a function that will open a document in a new view pane, alongside the c
|
|
|
93
93
|
import {useOpenInNewPane} from 'sanity-plugin-utils'
|
|
94
94
|
|
|
95
95
|
export default function SidePetOpener(pet: SanityDocument) {
|
|
96
|
-
const openInNewPane = useOpenInNewPane(pet._id,
|
|
96
|
+
const openInNewPane = useOpenInNewPane(pet._id, pet._type)
|
|
97
97
|
|
|
98
98
|
return (
|
|
99
|
-
<Button onClick={() => openInNewPane(
|
|
99
|
+
<Button onClick={() => openInNewPane()}>
|
|
100
100
|
{pet.title}
|
|
101
101
|
</Button>
|
|
102
102
|
)
|
|
@@ -170,12 +170,25 @@ export default function Report(documents) {
|
|
|
170
170
|
|
|
171
171
|
### `UserSelectMenu`
|
|
172
172
|
|
|
173
|
-
A Menu component for searching and interacting with users. Requires Users to be passed into the component.
|
|
173
|
+
A Menu component for searching and interacting with users. Requires Users to be passed into the component.
|
|
174
174
|
|
|
175
175
|
```jsx
|
|
176
176
|
import {UserSelectMenu} from 'sanity-plugin-utils'
|
|
177
177
|
|
|
178
|
-
|
|
178
|
+
export default function Report() {
|
|
179
|
+
const users = useProjectUsers({apiVersion: `2023-01-01`})
|
|
180
|
+
const [selectedUsers, setSelectedUsers] = useState([])
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<UserSelectMenu
|
|
184
|
+
userList={users}
|
|
185
|
+
value={selectedUsers}
|
|
186
|
+
onAdd={(id) => selectedUsers((current) => [...current, id])}
|
|
187
|
+
onRemove={(id) => setSelectedUsers((current) => current.filter((id) => id !== id))}
|
|
188
|
+
onClear={() => setSelectedUsers([])}
|
|
189
|
+
>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
179
192
|
```
|
|
180
193
|
|
|
181
194
|
## License
|
package/lib/index.d.ts
CHANGED
|
@@ -34,6 +34,14 @@ declare type HookConfig = {
|
|
|
34
34
|
apiVersion?: string
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
declare type Labels = {
|
|
38
|
+
addMe?: string
|
|
39
|
+
removeMe?: string
|
|
40
|
+
clear?: string
|
|
41
|
+
searchPlaceholder?: string
|
|
42
|
+
notFound?: string
|
|
43
|
+
}
|
|
44
|
+
|
|
37
45
|
declare interface ListenQueryOptions {
|
|
38
46
|
tag?: string
|
|
39
47
|
apiVersion?: string
|
|
@@ -52,7 +60,12 @@ export declare function Row(props: TableRowProps): JSX.Element
|
|
|
52
60
|
|
|
53
61
|
export declare function Table(props: TableProps): JSX.Element
|
|
54
62
|
|
|
55
|
-
declare type TableCellProps = PropsWithChildren<
|
|
63
|
+
declare type TableCellProps = PropsWithChildren<
|
|
64
|
+
CardProps & {
|
|
65
|
+
colSpan?: number
|
|
66
|
+
rowSpan?: number
|
|
67
|
+
}
|
|
68
|
+
>
|
|
56
69
|
|
|
57
70
|
declare type TableProps = PropsWithChildren<CardProps>
|
|
58
71
|
|
|
@@ -95,9 +108,10 @@ export declare function UserSelectMenu(props: UserSelectMenuProps): JSX.Element
|
|
|
95
108
|
declare type UserSelectMenuProps = {
|
|
96
109
|
value: string[]
|
|
97
110
|
userList: UserExtended[]
|
|
98
|
-
onAdd:
|
|
99
|
-
onRemove:
|
|
100
|
-
onClear:
|
|
111
|
+
onAdd: (userId: string) => void
|
|
112
|
+
onRemove: (userId: string) => void
|
|
113
|
+
onClear: () => void
|
|
114
|
+
labels?: Labels
|
|
101
115
|
style?: React_2.CSSProperties
|
|
102
116
|
}
|
|
103
117
|
|
package/lib/index.esm.js
CHANGED
|
@@ -216,6 +216,13 @@ function searchUsers(users, searchString) {
|
|
|
216
216
|
return false;
|
|
217
217
|
});
|
|
218
218
|
}
|
|
219
|
+
const LABELS = {
|
|
220
|
+
addMe: "Assign myself",
|
|
221
|
+
removeMe: "Unassign myself",
|
|
222
|
+
clear: "Clear assignees",
|
|
223
|
+
searchPlaceholder: "Search users",
|
|
224
|
+
notFound: "No users found"
|
|
225
|
+
};
|
|
219
226
|
function UserSelectMenu(props) {
|
|
220
227
|
const {
|
|
221
228
|
value = [],
|
|
@@ -225,11 +232,15 @@ function UserSelectMenu(props) {
|
|
|
225
232
|
onClear,
|
|
226
233
|
style = {}
|
|
227
234
|
} = props;
|
|
235
|
+
const labels = (props == null ? void 0 : props.labels) ? {
|
|
236
|
+
...props.labels,
|
|
237
|
+
...LABELS
|
|
238
|
+
} : LABELS;
|
|
228
239
|
const [searchString, setSearchString] = React.useState("");
|
|
229
240
|
const searchResults = searchUsers(userList || [], searchString);
|
|
230
241
|
const me = userList.find(u => u.isCurrentUser);
|
|
231
242
|
const meAssigned = me && value.includes(me.id);
|
|
232
|
-
const input = useRef();
|
|
243
|
+
const input = useRef(null);
|
|
233
244
|
const handleSearchChange = event => {
|
|
234
245
|
setSearchString(event.target.value);
|
|
235
246
|
};
|
|
@@ -254,29 +265,29 @@ function UserSelectMenu(props) {
|
|
|
254
265
|
disabled: !me,
|
|
255
266
|
onClick: handleUnassignMyself,
|
|
256
267
|
icon: RemoveCircleIcon,
|
|
257
|
-
text:
|
|
268
|
+
text: labels.removeMe
|
|
258
269
|
}) : /* @__PURE__ */jsx(MenuItem, {
|
|
259
270
|
tone: "positive",
|
|
260
271
|
onClick: handleAssignMyself,
|
|
261
272
|
icon: AddCircleIcon,
|
|
262
|
-
text:
|
|
273
|
+
text: labels.addMe
|
|
263
274
|
}), /* @__PURE__ */jsx(MenuItem, {
|
|
264
275
|
tone: "critical",
|
|
265
276
|
disabled: value.length === 0,
|
|
266
277
|
onClick: handleClearAssigneesClick,
|
|
267
278
|
icon: RestoreIcon,
|
|
268
|
-
text:
|
|
279
|
+
text: labels.clear
|
|
269
280
|
}), /* @__PURE__ */jsx(Box, {
|
|
270
281
|
padding: 1,
|
|
271
282
|
children: /* @__PURE__ */jsx(TextInput, {
|
|
272
283
|
ref: input,
|
|
273
284
|
onChange: handleSearchChange,
|
|
274
|
-
placeholder:
|
|
285
|
+
placeholder: labels.searchPlaceholder,
|
|
275
286
|
value: searchString
|
|
276
287
|
})
|
|
277
288
|
}), searchString && (searchResults == null ? void 0 : searchResults.length) === 0 && /* @__PURE__ */jsx(MenuItem, {
|
|
278
289
|
disabled: true,
|
|
279
|
-
text:
|
|
290
|
+
text: labels.notFound
|
|
280
291
|
}), searchResults && searchResults.map(user => /* @__PURE__ */jsx(MenuItem, {
|
|
281
292
|
pressed: value.includes(user.id),
|
|
282
293
|
onClick: () => handleSelect(value.indexOf(user.id) > -1, user),
|
package/lib/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/hooks/useOpenInNewPane.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {RouterContext} from 'sanity/router'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = React.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 React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && (\n <MenuItem disabled text=\"No matches\" />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","useOpenInNewPane","type","routerContext","React","useContext","RouterContext","routerPanesState","groupIndex","usePaneRouter","openInNewPane","useCallback","panes","splice","href","resolvePathFromState","navigateUrl","path","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":";;;;;;;;;;;;AA4BA,MAAMA,iBAAiB,CAAA,CAAC;AACxB,MAAMC,eAAA,GAAkB;EAACC,UAAA;AAAyB,CAAA;AAClD,MAAMC,qBAAwB,GAAA,IAAA;AAEvB,SAASC,kBACdC,KACA,QAKW;EAAA,IALX;IACEC,MAAS,GAAAN,cAAA;IACTO,OAAU,GAAAN,eAAA;IACVO,YAAe,GAAAL;EACjB,CACW;EACX,MAAM,CAACM,OAAA,EAASC,UAAU,CAAA,GAAIC,SAAS,IAAI,CAAA;EAC3C,MAAM,CAACC,KAAA,EAAOC,QAAQ,CAAA,GAAIF,SAAS,KAAK,CAAA;EACxC,MAAM,CAACG,IAAA,EAAMC,OAAO,CAAA,GAAIJ,SAASH,YAAY,CAAA;EACvC,MAAAQ,YAAA,GAAeC,OAA4B,IAAI,CAAA;EACrD,MAAMC,gBAAgBC,gBAAiB,EAAA;EAEvCC,SAAA,CAAU,MAAM;IACd,IAAIf,KAAO,EAAA;MACTW,YAAA,CAAaK,UAAUH,aACpB,CAAAI,WAAA,CAAYjB,KAAO,EAAAC,MAAA,EAAQC,OAAO,CAClC,CAAAgB,IAAA,CACCC,qBAAqBC,OAAO,CAAA,EAC5BC,UAAA,CAAYC,GAAQ,IAAA;QAClBC,OAAA,CAAQhB,MAAMe,GAAG,CAAA;QACjBd,QAAA,CAASc,GAAG,CAAA;QACZjB,UAAA,CAAW,KAAK,CAAA;QAChBK,OAAA,CAAQ,IAAI,CAAA;QAEL,OAAAY,GAAA;MAAA,CACR,CAAA,CACH,CACCE,SAAU,CAACC,SAAc,IAAA;QACxBf,OAAA,CAASM,OAAoB,IAAAI,OAAA,CAAQJ,SAASS,SAAS,CAAA,GAAIT,UAAUS,SAAU,CAAA;QAC/EpB,UAAA,CAAW,KAAK,CAAA;QAChBG,QAAA,CAAS,KAAK,CAAA;MAAA,CACf,CAAA;IACL;IAEA,OAAO,MAAG;MApEd,IAAAkB,EAAA;MAoEiB,OAAA,CAAAA,EAAA,GAAAf,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,YAAA,CAAcK,YAAd,IAAuB,GAAA,KAAA,CAAA,GAAAU,EAAA,CAAAC,WAAA,EAAA;IAAA,CAAA;KACnC,CAAC3B,KAAA,EAAOC,MAAQ,EAAAC,OAAA,EAASW,aAAa,CAAC,CAAA;EAEnC,OAAA;IAACJ,IAAM;IAAAL,OAAA;IAASG;GAAK;AAC9B;ACpCgB,SAAAqB,eAAA,QAA0D;EAAA,IAA1C;IAAC/B;GAAyC;EAClE,MAAA;IAACgC;GAAW,GAAIC,YAAa,EAAA;EACnC,MAAMC,SAASC,SAAU,CAAA;IAACnC,UAAY,EAAAA,UAAA,IAAA,IAAA,GAAAA,UAAA,GAAc;GAAa,CAAA;EACjE,MAAM,CAACoC,KAAO,EAAAC,QAAQ,CAAI,GAAA5B,QAAA,CAAS,EAAE,CAAA;EAErCS,SAAA,CAAU,MAAM;IACd,MAAM;MAACoB;IAAA,CAAa,GAAAJ,MAAA,CAAOK,MAAO,EAAA;IAElC,eAAeC,QAAQC,EAAY,EAAA;MAC3B,MAAAC,WAAA,GAAc,MAAMR,MAAA,CAAOS,OAAQ,CAAA;QACvCC,GAAA,sBAAkBN,SAAmB,oBAAAG,EAAA;MAAA,CACtC,CAAA;MAEM,OAAAC,WAAA;IACT;IAEA,eAAeG,iBAAoB,GAAA;MAC3B,MAAAC,SAAA,GAAY,MAAMZ,MAAA,CACrBS,OAAQ,CAAA;QACPC,yBAAkBN,SAAA;MACnB,CAAA,CACA,CAAAS,IAAA,CAAK,MAAOC,OACXC,OAAQ,CAAAC,GAAA,CACNF,GAAA,CAAIG,GAAI,CAAA,MAAOC,IAAwB,KAAA;QACrCC,aAAA,EAAeD,IAAK,CAAAE,aAAA,MAAkBtB,WAAa,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,WAAA,CAAAS,EAAA,CAAA;QACnD,IAAI,MAAMD,OAAQ,CAAAY,IAAA,CAAKE,aAAa,CAAA;MAAA,CACpC,CAAA,CAAA,CACJ,CAED,CAAAC,KAAA,CAAO9B,GAAA,IAAQA,GAAG,CAAA;MAErBY,QAAA,CAASS,SAAS,CAAA;IACpB;IAEI,IAAA,CAACV,MAAMoB,MAAQ,EAAA;MACCX,iBAAA,EAAA;IACpB;KACC,CAACX,MAAA,EAAQF,2CAAaS,EAAI,EAAAL,KAAA,CAAMoB,MAAM,CAAC,CAAA;EAEnC,OAAApB,KAAA;AACT;ACxEgB,SAAAqB,gBAAA,CAAiBhB,IAAaiB,IAAe,EAAA;EACrD,MAAAC,aAAA,GAAgBC,KAAM,CAAAC,UAAA,CAAWC,aAAa,CAAA;EACpD,MAAM;IAACC,gBAAA;IAAkBC;EAAU,CAAA,GAAIC,aAAc,EAAA;EAE/C,MAAAC,aAAA,GAAgBN,KAAM,CAAAO,WAAA,CAAY,MAAM;IAC5C,IAAI,CAACR,aAAA,IAAiB,CAAClB,EAAA,IAAM,CAACiB,IAAM,EAAA;MAClC;IACF;IAEM,MAAAU,KAAA,GAAQ,CAAC,GAAGL,gBAAgB,CAAA;IAC5BK,KAAA,CAAAC,MAAA,CAAOL,UAAa,GAAA,CAAA,EAAG,CAAG,EAAA,CAC9B;MACEvB,EAAA;MACArC,MAAA,EAAQ;QAACsD;MAAI;IACf,CAAA,CACD,CAAA;IAED,MAAMY,IAAO,GAAAX,aAAA,CAAcY,oBAAqB,CAAA;MAACH;IAAM,CAAA,CAAA;IACvDT,aAAA,CAAca,WAAY,CAAA;MAACC,IAAM,EAAAH;IAAK,CAAA,CAAA;EAAA,GACrC,CAAC7B,EAAA,EAAIiB,MAAMC,aAAe,EAAAI,gBAAA,EAAkBC,UAAU,CAAC,CAAA;EAEnD,OAAAE,aAAA;AACT;ACNA,MAAMQ,aAA+B,GAAA;EACnCC,IAAM,EAAA;AACR,CAAA;AAEO,SAASC,SAASC,KAAsB,EAAA;EACvC,MAAA;IAACC,KAAO;IAAAC,WAAA;IAAaC,IAAM;IAAAL,IAAA;IAAMM;EAAQ,CAAA,GAAI;IAAC,GAAGP,aAAe;IAAA,GAAGG;GAAK;EAG5E,OAAA,eAAAK,GAAA,CAACC,IAAK,EAAA;IAAAR,IAAA;IAAYS,OAAS,EAAA,CAAA;IAAGC,QAAQ,CAAG;IAAAC,MAAA,EAAM,IAC7C;IAAAL,QAAA,EAAA,eAAAM,IAAA,CAACC,IACE,EAAA;MAAAP,QAAA,EAAA,CAAAD,IAAA,oBAAwB,IAAA,EACxBC,QAAA,GACCA,WAEC,eAAAC,GAAA,CAAAO,GAAA,EAAA;QAAIC,MAAM,CACT;QAAAT,QAAA,EAAA,eAAAM,IAAA,CAACI,KAAM,EAAA;UAAAC,KAAA,EAAO,CACX;UAAAX,QAAA,EAAA,CAAAH,KAAA,GAAS,eAAAI,GAAA,CAAAW,IAAA,EAAA;YAAKC,MAAO,EAAA,UAAA;YAAYb;UAAM,CAAA,CAAU,GAAA,IAAA,EACjDF,cAAe,eAAAG,GAAA,CAAAW,IAAA,EAAA;YAAKE,IAAM,EAAA,CAAA;YAAId;UAAY,CAAA,CAAU,GAAA,IAAA;QAAA,CACvD;MACF,CAAA,CAAA;IAEJ,CAAA;EACF,CAAA,CAAA;AAEJ;ACpCA,MAAMe,YAAe,GAAA,YAA2B;EAAA,IAA1BnB,KAAmB,uEAAA,EAAO;EAC9C,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,OAAA;IAAS,GAAGpB;EAAO,CAAA,CAAA;AACrC,CAAA;AAEA,MAAMqB,WAAA,GAAcC,OAAOH,YAAY,CAAA,CACrC,MACEI,GAAA,mLAAA,CAQJ;AAIO,SAASC,MAAMxB,KAAmB,EAAA;EACvC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAgB,WAAA,EAAA;IAAa,GAAGI,IAAA;IAAOrB;EAAS,CAAA,CAAA;AAC1C;AAGA,MAAMsB,UAAa,GAAA,YAA2B;EAAA,IAA1B1B,KAAmB,uEAAA,EAAO;EAC5C,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM2B,SAAA,GAAYL,OAAOI,UAAU,CAAA,CACjC,MACEH,GAAA,yKAAA,CAOJ;AAIO,SAASK,IAAI5B,KAAsB,EAAA;EACxC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAsB,SAAA,EAAA;IAAW,GAAGF,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACxC;AAGA,MAAMyB,WAAc,GAAA,YAAgB;EAAA,IAAf7B,KAAQ,uEAAA,EAAO;EAClC,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM8B,UAAA,GAAaR,OAAOO,WAAW,CAAA,CACnC,MACEN,GAAA,2KAAA,CAOJ;AAIO,SAASQ,KAAK/B,KAAuB,EAAA;EAC1C,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAyB,UAAA,EAAA;IAAY,GAAGL,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACzC;ACvEA,SAAS4B,WAAA,CACPzE,OACA0E,YACgB,EAAA;EACT,OAAA1E,KAAA,CAAM2E,MAAO,CAAC3D,IAAS,IAAA;IAC5B,MAAM4D,WAAe,GAAA,CAAA5D,IAAA,CAAK4D,WAAe,IAAA,EAAA,EAAIC,WAAY,EAAA;IACrD,IAAAD,WAAA,CAAYE,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IACjD,MAAMK,SAAa,GAAA,CAAA/D,IAAA,CAAK+D,SAAa,IAAA,EAAA,EAAIF,WAAY,EAAA;IACjD,IAAAE,SAAA,CAAUD,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAC/C,MAAMM,UAAc,GAAA,CAAAhE,IAAA,CAAKgE,UAAc,IAAA,EAAA,EAAIH,WAAY,EAAA;IACnD,IAAAG,UAAA,CAAWF,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAChD,MAAMO,UAAc,GAAA,CAAAjE,IAAA,CAAKiE,UAAc,IAAA,EAAA,EAAIJ,WAAY,EAAA;IACnD,IAAAI,UAAA,CAAWH,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAEzC,OAAA,KAAA;EAAA,CACR,CAAA;AACH;AAWO,SAASQ,eAAezC,KAA4B,EAAA;EACnD,MAAA;IACJ0C,QAAQ,EAAC;IACTC,WAAW,EAAC;IACZC,KAAA;IACAC,QAAA;IACAC,OAAA;IACAC,QAAQ,CAAC;EACP,CAAA,GAAA/C,KAAA;EACJ,MAAM,CAACiC,YAAc,EAAAe,eAAe,CAAI,GAAAjE,KAAA,CAAMnD,SAAS,EAAE,CAAA;EACzD,MAAMqH,aAAgB,GAAAjB,WAAA,CAAYW,QAAY,IAAA,IAAIV,YAAY,CAAA;EAE9D,MAAMiB,KAAKP,QAAS,CAAAQ,IAAA,CAAMC,CAAA,IAAMA,EAAE5E,aAAa,CAAA;EAC/C,MAAM6E,UAAa,GAAAH,EAAA,IAAMR,KAAM,CAAAY,QAAA,CAASJ,GAAGtF,EAAE,CAAA;EAI7C,MAAM2F,QAAQrH,MAAyB,EAAA;EAOjC,MAAAsH,kBAAA,GAAsBC,KAA+C,IAAA;IACzDT,eAAA,CAAAS,KAAA,CAAMC,OAAOhB,KAAK,CAAA;EAAA,CACpC;EAEM,MAAAiB,YAAA,GAAe,CAACC,SAAA,EAAoBrF,IAAuB,KAAA;IAC/D,IAAI,CAACqF,SAAW,EAAA;MACV,IAAAhB,KAAA,EAAOA,KAAA,CAAMrE,KAAKX,EAAE,CAAA;IACf,CAAA,MAAA,IAAAiF,QAAA,EAAUA,QAAA,CAAStE,KAAKX,EAAE,CAAA;EAAA,CACvC;EAEA,MAAMiG,qBAAqB,MAAM;IAC/B,IAAIX,EAAM,IAAAN,KAAA,EAAOA,KAAA,CAAMM,GAAGtF,EAAE,CAAA;EAAA,CAC9B;EAEA,MAAMkG,uBAAuB,MAAM;IACjC,IAAIZ,EAAM,IAAAL,QAAA,EAAUA,QAAA,CAASK,GAAGtF,EAAE,CAAA;EAAA,CACpC;EAEA,MAAMmG,4BAA4B,MAAM;IAClC,IAAAjB,OAAA,EAAiBA,OAAA,EAAA;EAAA,CACvB;EAGE,OAAA,eAAApC,IAAA,CAACsD;IAAKjB,KACH;IAAA3C,QAAA,EAAA,CACCiD,UAAA,kBAAAhD,GAAA,CAAC4D,QAAA,EAAA;MACCnE,IAAK,EAAA,SAAA;MACLoE,UAAU,CAAChB,EAAA;MACXiB,OAAS,EAAAL,oBAAA;MACT3D,IAAM,EAAAiE,gBAAA;MACNC,IAAK,EAAA;IAAA,CAAA,CAGP,kBAAAhE,GAAA,CAAC4D,QAAA,EAAA;MACCnE,IAAK,EAAA,UAAA;MACLqE,OAAS,EAAAN,kBAAA;MACT1D,IAAM,EAAAmE,aAAA;MACND,IAAK,EAAA;IAAA,CAAA,CACP,EAAA,eAGFhE,GAAA,CAAC4D,QAAA,EAAA;MACCnE,IAAK,EAAA,UAAA;MACLoE,QAAA,EAAUxB,MAAM/D,MAAW,KAAA,CAAA;MAC3BwF,OAAS,EAAAJ,yBAAA;MACT5D,IAAM,EAAAoE,WAAA;MACNF,IAAK,EAAA;IAAA,CAAA,CACP,EAEA,eAAAhE,GAAA,CAACO,GAAI,EAAA;MAAAL,OAAA,EAAS,CACZ;MAAAH,QAAA,EAAA,eAAAC,GAAA,CAACmE,SAAA,EAAA;QAECC,GAAK,EAAAlB,KAAA;QACLmB,QAAU,EAAAlB,kBAAA;QACVmB,WAAY,EAAA,gBAAA;QACZjC,KAAO,EAAAT;MAAA,CAAA;KAEX,CAAA,EAECA,YAAA,IAAA,CAAgBgB,+CAAetE,MAAW,MAAA,CAAA,IAAA,mBACxCsF,QAAS,EAAA;MAAAC,QAAA,EAAQ,IAAC;MAAAG,IAAA,EAAK;KAAa,CAAA,EAGtCpB,aACC,IAAAA,aAAA,CAAc3E,GAAI,CAACC,IACjB,IAAA,eAAA8B,GAAA,CAAC4D,QAAA,EAAA;MAECW,OAAS,EAAAlC,KAAA,CAAMY,QAAS,CAAA/E,IAAA,CAAKX,EAAE,CAAA;MAC/BuG,OAAA,EAAS,MAAMR,YAAa,CAAAjB,KAAA,CAAMmC,QAAQtG,IAAK,CAAAX,EAAE,CAAI,GAAA,CAAA,CAAA,EAAIW,IAAI,CAAA;MAE7D6B,QAAA,EAAA,eAAAM,IAAA,CAACC,IAAK,EAAA;QAAAmE,KAAA,EAAM,QACV;QAAA1E,QAAA,EAAA,CAAC,eAAAC,GAAA,CAAA0E,UAAA,EAAA;UAAWxG,IAAY;UAAA2C,IAAA,EAAM;QAAG,CAAA,CAAA,EAAA,eACjCb,GAAA,CAACO,GAAI,EAAA;UAAAoE,QAAA,EAAU,CAAG;UAAAnE,IAAA,EAAM;UACtBT,QAAC,EAAA,eAAAC,GAAA,CAAAW,IAAA,EAAA;YAAMZ,QAAK,EAAA7B,IAAA,CAAA4D;UAAA,CAAY;QAC1B,CAAA,CAAA,EACC5D,IAAA,CAAKC,aACJ,IAAA,eAAA6B,GAAA,CAAC4E,KAAM,EAAA;UAAAC,QAAA,EAAU;UAAGpF,IAAK,EAAA,UAAA;UAAWqF,IAAK,EAAA,SAAA;UAAU/E,QAEnD,EAAA;QAAA,CAAA,CAAA;OAEJ;IAAA,CAAA,EAdK7B,IAAK,CAAAX,EAAA,CAgBb,CAAA;EACL,CAAA,CAAA;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/hooks/useOpenInNewPane.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {RouterContext} from 'sanity/router'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = React.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 React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\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 React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const labels = props?.labels ? {...props.labels, ...LABELS} : LABELS\n\n const [searchString, setSearchString] = React.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: React.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 && (\n <MenuItem disabled text={labels.notFound} />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","useOpenInNewPane","type","routerContext","React","useContext","RouterContext","routerPanesState","groupIndex","usePaneRouter","openInNewPane","useCallback","panes","splice","href","resolvePathFromState","navigateUrl","path","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","LABELS","addMe","removeMe","clear","searchPlaceholder","notFound","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","labels","setSearchString","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":";;;;;;;;;;;;AA4BA,MAAMA,iBAAiB,CAAA,CAAC;AACxB,MAAMC,eAAA,GAAkB;EAACC,UAAA;AAAyB,CAAA;AAClD,MAAMC,qBAAwB,GAAA,IAAA;AAEvB,SAASC,kBACdC,KACA,QAKW;EAAA,IALX;IACEC,MAAS,GAAAN,cAAA;IACTO,OAAU,GAAAN,eAAA;IACVO,YAAe,GAAAL;EACjB,CACW;EACX,MAAM,CAACM,OAAA,EAASC,UAAU,CAAA,GAAIC,SAAS,IAAI,CAAA;EAC3C,MAAM,CAACC,KAAA,EAAOC,QAAQ,CAAA,GAAIF,SAAS,KAAK,CAAA;EACxC,MAAM,CAACG,IAAA,EAAMC,OAAO,CAAA,GAAIJ,SAASH,YAAY,CAAA;EACvC,MAAAQ,YAAA,GAAeC,OAA4B,IAAI,CAAA;EACrD,MAAMC,gBAAgBC,gBAAiB,EAAA;EAEvCC,SAAA,CAAU,MAAM;IACd,IAAIf,KAAO,EAAA;MACTW,YAAA,CAAaK,UAAUH,aACpB,CAAAI,WAAA,CAAYjB,KAAO,EAAAC,MAAA,EAAQC,OAAO,CAClC,CAAAgB,IAAA,CACCC,qBAAqBC,OAAO,CAAA,EAC5BC,UAAA,CAAYC,GAAQ,IAAA;QAClBC,OAAA,CAAQhB,MAAMe,GAAG,CAAA;QACjBd,QAAA,CAASc,GAAG,CAAA;QACZjB,UAAA,CAAW,KAAK,CAAA;QAChBK,OAAA,CAAQ,IAAI,CAAA;QAEL,OAAAY,GAAA;MAAA,CACR,CAAA,CACH,CACCE,SAAU,CAACC,SAAc,IAAA;QACxBf,OAAA,CAASM,OAAoB,IAAAI,OAAA,CAAQJ,SAASS,SAAS,CAAA,GAAIT,UAAUS,SAAU,CAAA;QAC/EpB,UAAA,CAAW,KAAK,CAAA;QAChBG,QAAA,CAAS,KAAK,CAAA;MAAA,CACf,CAAA;IACL;IAEA,OAAO,MAAG;MApEd,IAAAkB,EAAA;MAoEiB,OAAA,CAAAA,EAAA,GAAAf,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,YAAA,CAAcK,YAAd,IAAuB,GAAA,KAAA,CAAA,GAAAU,EAAA,CAAAC,WAAA,EAAA;IAAA,CAAA;KACnC,CAAC3B,KAAA,EAAOC,MAAQ,EAAAC,OAAA,EAASW,aAAa,CAAC,CAAA;EAEnC,OAAA;IAACJ,IAAM;IAAAL,OAAA;IAASG;GAAK;AAC9B;ACpCgB,SAAAqB,eAAA,QAA0D;EAAA,IAA1C;IAAC/B;GAAyC;EAClE,MAAA;IAACgC;GAAW,GAAIC,YAAa,EAAA;EACnC,MAAMC,SAASC,SAAU,CAAA;IAACnC,UAAY,EAAAA,UAAA,IAAA,IAAA,GAAAA,UAAA,GAAc;GAAa,CAAA;EACjE,MAAM,CAACoC,KAAO,EAAAC,QAAQ,CAAI,GAAA5B,QAAA,CAAS,EAAE,CAAA;EAErCS,SAAA,CAAU,MAAM;IACd,MAAM;MAACoB;IAAA,CAAa,GAAAJ,MAAA,CAAOK,MAAO,EAAA;IAElC,eAAeC,QAAQC,EAAY,EAAA;MAC3B,MAAAC,WAAA,GAAc,MAAMR,MAAA,CAAOS,OAAQ,CAAA;QACvCC,GAAA,sBAAkBN,SAAmB,oBAAAG,EAAA;MAAA,CACtC,CAAA;MAEM,OAAAC,WAAA;IACT;IAEA,eAAeG,iBAAoB,GAAA;MAC3B,MAAAC,SAAA,GAAY,MAAMZ,MAAA,CACrBS,OAAQ,CAAA;QACPC,yBAAkBN,SAAA;MACnB,CAAA,CACA,CAAAS,IAAA,CAAK,MAAOC,OACXC,OAAQ,CAAAC,GAAA,CACNF,GAAA,CAAIG,GAAI,CAAA,MAAOC,IAAwB,KAAA;QACrCC,aAAA,EAAeD,IAAK,CAAAE,aAAA,MAAkBtB,WAAa,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,WAAA,CAAAS,EAAA,CAAA;QACnD,IAAI,MAAMD,OAAQ,CAAAY,IAAA,CAAKE,aAAa,CAAA;MAAA,CACpC,CAAA,CAAA,CACJ,CAED,CAAAC,KAAA,CAAO9B,GAAA,IAAQA,GAAG,CAAA;MAErBY,QAAA,CAASS,SAAS,CAAA;IACpB;IAEI,IAAA,CAACV,MAAMoB,MAAQ,EAAA;MACCX,iBAAA,EAAA;IACpB;KACC,CAACX,MAAA,EAAQF,2CAAaS,EAAI,EAAAL,KAAA,CAAMoB,MAAM,CAAC,CAAA;EAEnC,OAAApB,KAAA;AACT;ACxEgB,SAAAqB,gBAAA,CAAiBhB,IAAaiB,IAAe,EAAA;EACrD,MAAAC,aAAA,GAAgBC,KAAM,CAAAC,UAAA,CAAWC,aAAa,CAAA;EACpD,MAAM;IAACC,gBAAA;IAAkBC;EAAU,CAAA,GAAIC,aAAc,EAAA;EAE/C,MAAAC,aAAA,GAAgBN,KAAM,CAAAO,WAAA,CAAY,MAAM;IAC5C,IAAI,CAACR,aAAA,IAAiB,CAAClB,EAAA,IAAM,CAACiB,IAAM,EAAA;MAClC;IACF;IAEM,MAAAU,KAAA,GAAQ,CAAC,GAAGL,gBAAgB,CAAA;IAC5BK,KAAA,CAAAC,MAAA,CAAOL,UAAa,GAAA,CAAA,EAAG,CAAG,EAAA,CAC9B;MACEvB,EAAA;MACArC,MAAA,EAAQ;QAACsD;MAAI;IACf,CAAA,CACD,CAAA;IAED,MAAMY,IAAO,GAAAX,aAAA,CAAcY,oBAAqB,CAAA;MAACH;IAAM,CAAA,CAAA;IACvDT,aAAA,CAAca,WAAY,CAAA;MAACC,IAAM,EAAAH;IAAK,CAAA,CAAA;EAAA,GACrC,CAAC7B,EAAA,EAAIiB,MAAMC,aAAe,EAAAI,gBAAA,EAAkBC,UAAU,CAAC,CAAA;EAEnD,OAAAE,aAAA;AACT;ACNA,MAAMQ,aAA+B,GAAA;EACnCC,IAAM,EAAA;AACR,CAAA;AAEO,SAASC,SAASC,KAAsB,EAAA;EACvC,MAAA;IAACC,KAAO;IAAAC,WAAA;IAAaC,IAAM;IAAAL,IAAA;IAAMM;EAAQ,CAAA,GAAI;IAAC,GAAGP,aAAe;IAAA,GAAGG;GAAK;EAG5E,OAAA,eAAAK,GAAA,CAACC,IAAK,EAAA;IAAAR,IAAA;IAAYS,OAAS,EAAA,CAAA;IAAGC,QAAQ,CAAG;IAAAC,MAAA,EAAM,IAC7C;IAAAL,QAAA,EAAA,eAAAM,IAAA,CAACC,IACE,EAAA;MAAAP,QAAA,EAAA,CAAAD,IAAA,oBAAwB,IAAA,EACxBC,QAAA,GACCA,WAEC,eAAAC,GAAA,CAAAO,GAAA,EAAA;QAAIC,MAAM,CACT;QAAAT,QAAA,EAAA,eAAAM,IAAA,CAACI,KAAM,EAAA;UAAAC,KAAA,EAAO,CACX;UAAAX,QAAA,EAAA,CAAAH,KAAA,GAAS,eAAAI,GAAA,CAAAW,IAAA,EAAA;YAAKC,MAAO,EAAA,UAAA;YAAYb;UAAM,CAAA,CAAU,GAAA,IAAA,EACjDF,cAAe,eAAAG,GAAA,CAAAW,IAAA,EAAA;YAAKE,IAAM,EAAA,CAAA;YAAId;UAAY,CAAA,CAAU,GAAA,IAAA;QAAA,CACvD;MACF,CAAA,CAAA;IAEJ,CAAA;EACF,CAAA,CAAA;AAEJ;ACpCA,MAAMe,YAAe,GAAA,YAA2B;EAAA,IAA1BnB,KAAmB,uEAAA,EAAO;EAC9C,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,OAAA;IAAS,GAAGpB;EAAO,CAAA,CAAA;AACrC,CAAA;AAEA,MAAMqB,WAAA,GAAcC,OAAOH,YAAY,CAAA,CACrC,MACEI,GAAA,mLAAA,CAQJ;AAIO,SAASC,MAAMxB,KAAmB,EAAA;EACvC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAgB,WAAA,EAAA;IAAa,GAAGI,IAAA;IAAOrB;EAAS,CAAA,CAAA;AAC1C;AAGA,MAAMsB,UAAa,GAAA,YAA2B;EAAA,IAA1B1B,KAAmB,uEAAA,EAAO;EAC5C,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM2B,SAAA,GAAYL,OAAOI,UAAU,CAAA,CACjC,MACEH,GAAA,yKAAA,CAOJ;AAIO,SAASK,IAAI5B,KAAsB,EAAA;EACxC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAsB,SAAA,EAAA;IAAW,GAAGF,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACxC;AAGA,MAAMyB,WAAc,GAAA,YAAgB;EAAA,IAAf7B,KAAQ,uEAAA,EAAO;EAClC,OAAQ,eAAAK,GAAA,CAAAC,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM8B,UAAA,GAAaR,OAAOO,WAAW,CAAA,CACnC,MACEN,GAAA,2KAAA,CAOJ;AASO,SAASQ,KAAK/B,KAAuB,EAAA;EAC1C,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQ,eAAAK,GAAA,CAAAyB,UAAA,EAAA;IAAY,GAAGL,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACzC;AC5EA,SAAS4B,WAAA,CACPzE,OACA0E,YACgB,EAAA;EACT,OAAA1E,KAAA,CAAM2E,MAAO,CAAC3D,IAAS,IAAA;IAC5B,MAAM4D,WAAe,GAAA,CAAA5D,IAAA,CAAK4D,WAAe,IAAA,EAAA,EAAIC,WAAY,EAAA;IACrD,IAAAD,WAAA,CAAYE,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IACjD,MAAMK,SAAa,GAAA,CAAA/D,IAAA,CAAK+D,SAAa,IAAA,EAAA,EAAIF,WAAY,EAAA;IACjD,IAAAE,SAAA,CAAUD,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAC/C,MAAMM,UAAc,GAAA,CAAAhE,IAAA,CAAKgE,UAAc,IAAA,EAAA,EAAIH,WAAY,EAAA;IACnD,IAAAG,UAAA,CAAWF,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAChD,MAAMO,UAAc,GAAA,CAAAjE,IAAA,CAAKiE,UAAc,IAAA,EAAA,EAAIJ,WAAY,EAAA;IACnD,IAAAI,UAAA,CAAWH,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAEzC,OAAA,KAAA;EAAA,CACR,CAAA;AACH;AAoBA,MAAMQ,MAAiB,GAAA;EACrBC,KAAO,EAAA,eAAA;EACPC,QAAU,EAAA,iBAAA;EACVC,KAAO,EAAA,iBAAA;EACPC,iBAAmB,EAAA,cAAA;EACnBC,QAAU,EAAA;AACZ,CAAA;AAEO,SAASC,eAAe/C,KAA4B,EAAA;EACnD,MAAA;IACJgD,QAAQ,EAAC;IACTC,WAAW,EAAC;IACZC,KAAA;IACAC,QAAA;IACAC,OAAA;IACAC,QAAQ,CAAC;EACP,CAAA,GAAArD,KAAA;EACE,MAAAsD,MAAA,GAAA,CAAStD,+BAAOsD,MAAS,IAAA;IAAC,GAAGtD,KAAM,CAAAsD,MAAA;IAAQ,GAAGb;EAAA,CAAU,GAAAA,MAAA;EAE9D,MAAM,CAACR,YAAc,EAAAsB,eAAe,CAAI,GAAAxE,KAAA,CAAMnD,SAAS,EAAE,CAAA;EACzD,MAAM4H,aAAgB,GAAAxB,WAAA,CAAYiB,QAAY,IAAA,IAAIhB,YAAY,CAAA;EAE9D,MAAMwB,KAAKR,QAAS,CAAAS,IAAA,CAAMC,CAAA,IAAMA,EAAEnF,aAAa,CAAA;EAC/C,MAAMoF,UAAa,GAAAH,EAAA,IAAMT,KAAM,CAAAa,QAAA,CAASJ,GAAG7F,EAAE,CAAA;EAIvC,MAAAkG,KAAA,GAAQ5H,OAAyB,IAAI,CAAA;EAOrC,MAAA6H,kBAAA,GAAsBC,KAA+C,IAAA;IACzDT,eAAA,CAAAS,KAAA,CAAMC,OAAOjB,KAAK,CAAA;EAAA,CACpC;EAEM,MAAAkB,YAAA,GAAe,CAACC,SAAA,EAAoB5F,IAAuB,KAAA;IAC/D,IAAI,CAAC4F,SAAW,EAAA;MACV,IAAAjB,KAAA,EAAOA,KAAA,CAAM3E,KAAKX,EAAE,CAAA;IACf,CAAA,MAAA,IAAAuF,QAAA,EAAUA,QAAA,CAAS5E,KAAKX,EAAE,CAAA;EAAA,CACvC;EAEA,MAAMwG,qBAAqB,MAAM;IAC/B,IAAIX,EAAM,IAAAP,KAAA,EAAOA,KAAA,CAAMO,GAAG7F,EAAE,CAAA;EAAA,CAC9B;EAEA,MAAMyG,uBAAuB,MAAM;IACjC,IAAIZ,EAAM,IAAAN,QAAA,EAAUA,QAAA,CAASM,GAAG7F,EAAE,CAAA;EAAA,CACpC;EAEA,MAAM0G,4BAA4B,MAAM;IAClC,IAAAlB,OAAA,EAAiBA,OAAA,EAAA;EAAA,CACvB;EAGE,OAAA,eAAA1C,IAAA,CAAC6D;IAAKlB,KACH;IAAAjD,QAAA,EAAA,CACCwD,UAAA,kBAAAvD,GAAA,CAACmE,QAAA,EAAA;MACC1E,IAAK,EAAA,SAAA;MACL2E,UAAU,CAAChB,EAAA;MACXiB,OAAS,EAAAL,oBAAA;MACTlE,IAAM,EAAAwE,gBAAA;MACNC,MAAMtB,MAAO,CAAAX;IAAA,CAAA,CAGf,kBAAAtC,GAAA,CAACmE,QAAA,EAAA;MACC1E,IAAK,EAAA,UAAA;MACL4E,OAAS,EAAAN,kBAAA;MACTjE,IAAM,EAAA0E,aAAA;MACND,MAAMtB,MAAO,CAAAZ;IAAA,CAAA,CACf,EAAA,eAGFrC,GAAA,CAACmE,QAAA,EAAA;MACC1E,IAAK,EAAA,UAAA;MACL2E,QAAA,EAAUzB,MAAMrE,MAAW,KAAA,CAAA;MAC3B+F,OAAS,EAAAJ,yBAAA;MACTnE,IAAM,EAAA2E,WAAA;MACNF,MAAMtB,MAAO,CAAAV;IAAA,CAAA,CACf,EAEA,eAAAvC,GAAA,CAACO,GAAI,EAAA;MAAAL,OAAA,EAAS,CACZ;MAAAH,QAAA,EAAA,eAAAC,GAAA,CAAC0E,SAAA,EAAA;QACCC,GAAK,EAAAlB,KAAA;QACLmB,QAAU,EAAAlB,kBAAA;QACVmB,aAAa5B,MAAO,CAAAT,iBAAA;QACpBG,KAAO,EAAAf;MAAA,CAAA;KAEX,CAAA,EAECA,YAAA,IAAA,CAAgBuB,aAAe,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,aAAA,CAAA7E,MAAA,MAAW,CACzC,IAAA,eAAA0B,GAAA,CAACmE;MAASC,QAAQ,EAAA,IAAA;MAACG,IAAM,EAAAtB,MAAA,CAAOR;KAAU,CAAA,EAG3CU,aACC,IAAAA,aAAA,CAAclF,GAAI,CAACC,IACjB,IAAA,eAAA8B,GAAA,CAACmE,QAAA,EAAA;MAECW,OAAS,EAAAnC,KAAA,CAAMa,QAAS,CAAAtF,IAAA,CAAKX,EAAE,CAAA;MAC/B8G,OAAA,EAAS,MAAMR,YAAa,CAAAlB,KAAA,CAAMoC,QAAQ7G,IAAK,CAAAX,EAAE,CAAI,GAAA,CAAA,CAAA,EAAIW,IAAI,CAAA;MAE7D6B,QAAA,EAAA,eAAAM,IAAA,CAACC,IAAK,EAAA;QAAA0E,KAAA,EAAM,QACV;QAAAjF,QAAA,EAAA,CAAC,eAAAC,GAAA,CAAAiF,UAAA,EAAA;UAAW/G,IAAY;UAAA2C,IAAA,EAAM;QAAG,CAAA,CAAA,EAAA,eACjCb,GAAA,CAACO,GAAI,EAAA;UAAA2E,QAAA,EAAU,CAAG;UAAA1E,IAAA,EAAM;UACtBT,QAAC,EAAA,eAAAC,GAAA,CAAAW,IAAA,EAAA;YAAMZ,QAAK,EAAA7B,IAAA,CAAA4D;UAAA,CAAY;QAC1B,CAAA,CAAA,EACC5D,IAAA,CAAKC,aACJ,IAAA,eAAA6B,GAAA,CAACmF,KAAM,EAAA;UAAAC,QAAA,EAAU;UAAG3F,IAAK,EAAA,UAAA;UAAW4F,IAAK,EAAA,SAAA;UAAUtF,QAEnD,EAAA;QAAA,CAAA,CAAA;OAEJ;IAAA,CAAA,EAdK7B,IAAK,CAAAX,EAAA,CAgBb,CAAA;EACL,CAAA,CAAA;AAEJ;"}
|
package/lib/index.js
CHANGED
|
@@ -229,6 +229,13 @@ function searchUsers(users, searchString) {
|
|
|
229
229
|
return false;
|
|
230
230
|
});
|
|
231
231
|
}
|
|
232
|
+
const LABELS = {
|
|
233
|
+
addMe: "Assign myself",
|
|
234
|
+
removeMe: "Unassign myself",
|
|
235
|
+
clear: "Clear assignees",
|
|
236
|
+
searchPlaceholder: "Search users",
|
|
237
|
+
notFound: "No users found"
|
|
238
|
+
};
|
|
232
239
|
function UserSelectMenu(props) {
|
|
233
240
|
const {
|
|
234
241
|
value = [],
|
|
@@ -238,11 +245,15 @@ function UserSelectMenu(props) {
|
|
|
238
245
|
onClear,
|
|
239
246
|
style = {}
|
|
240
247
|
} = props;
|
|
248
|
+
const labels = (props == null ? void 0 : props.labels) ? {
|
|
249
|
+
...props.labels,
|
|
250
|
+
...LABELS
|
|
251
|
+
} : LABELS;
|
|
241
252
|
const [searchString, setSearchString] = React__default.default.useState("");
|
|
242
253
|
const searchResults = searchUsers(userList || [], searchString);
|
|
243
254
|
const me = userList.find(u => u.isCurrentUser);
|
|
244
255
|
const meAssigned = me && value.includes(me.id);
|
|
245
|
-
const input = React.useRef();
|
|
256
|
+
const input = React.useRef(null);
|
|
246
257
|
const handleSearchChange = event => {
|
|
247
258
|
setSearchString(event.target.value);
|
|
248
259
|
};
|
|
@@ -267,29 +278,29 @@ function UserSelectMenu(props) {
|
|
|
267
278
|
disabled: !me,
|
|
268
279
|
onClick: handleUnassignMyself,
|
|
269
280
|
icon: icons.RemoveCircleIcon,
|
|
270
|
-
text:
|
|
281
|
+
text: labels.removeMe
|
|
271
282
|
}) : /* @__PURE__ */jsxRuntime.jsx(ui.MenuItem, {
|
|
272
283
|
tone: "positive",
|
|
273
284
|
onClick: handleAssignMyself,
|
|
274
285
|
icon: icons.AddCircleIcon,
|
|
275
|
-
text:
|
|
286
|
+
text: labels.addMe
|
|
276
287
|
}), /* @__PURE__ */jsxRuntime.jsx(ui.MenuItem, {
|
|
277
288
|
tone: "critical",
|
|
278
289
|
disabled: value.length === 0,
|
|
279
290
|
onClick: handleClearAssigneesClick,
|
|
280
291
|
icon: icons.RestoreIcon,
|
|
281
|
-
text:
|
|
292
|
+
text: labels.clear
|
|
282
293
|
}), /* @__PURE__ */jsxRuntime.jsx(ui.Box, {
|
|
283
294
|
padding: 1,
|
|
284
295
|
children: /* @__PURE__ */jsxRuntime.jsx(ui.TextInput, {
|
|
285
296
|
ref: input,
|
|
286
297
|
onChange: handleSearchChange,
|
|
287
|
-
placeholder:
|
|
298
|
+
placeholder: labels.searchPlaceholder,
|
|
288
299
|
value: searchString
|
|
289
300
|
})
|
|
290
301
|
}), searchString && (searchResults == null ? void 0 : searchResults.length) === 0 && /* @__PURE__ */jsxRuntime.jsx(ui.MenuItem, {
|
|
291
302
|
disabled: true,
|
|
292
|
-
text:
|
|
303
|
+
text: labels.notFound
|
|
293
304
|
}), searchResults && searchResults.map(user => /* @__PURE__ */jsxRuntime.jsx(ui.MenuItem, {
|
|
294
305
|
pressed: value.includes(user.id),
|
|
295
306
|
onClick: () => handleSelect(value.indexOf(user.id) > -1, user),
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/hooks/useOpenInNewPane.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {RouterContext} from 'sanity/router'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = React.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 React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && (\n <MenuItem disabled text=\"No matches\" />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","useOpenInNewPane","type","routerContext","React","useContext","RouterContext","routerPanesState","groupIndex","usePaneRouter","openInNewPane","useCallback","panes","splice","href","resolvePathFromState","navigateUrl","path","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAMA,iBAAiB,CAAA,CAAC;AACxB,MAAMC,eAAA,GAAkB;EAACC,UAAA;AAAyB,CAAA;AAClD,MAAMC,qBAAwB,GAAA,IAAA;AAEvB,SAASC,kBACdC,KACA,QAKW;EAAA,IALX;IACEC,MAAS,GAAAN,cAAA;IACTO,OAAU,GAAAN,eAAA;IACVO,YAAe,GAAAL;EACjB,CACW;EACX,MAAM,CAACM,OAAA,EAASC,UAAU,CAAA,GAAIC,eAAS,IAAI,CAAA;EAC3C,MAAM,CAACC,KAAA,EAAOC,QAAQ,CAAA,GAAIF,eAAS,KAAK,CAAA;EACxC,MAAM,CAACG,IAAA,EAAMC,OAAO,CAAA,GAAIJ,eAASH,YAAY,CAAA;EACvC,MAAAQ,YAAA,GAAeC,aAA4B,IAAI,CAAA;EACrD,MAAMC,gBAAgBC,MAAAA,CAAAA,gBAAiB,EAAA;EAEvCC,KAAAA,CAAAA,SAAA,CAAU,MAAM;IACd,IAAIf,KAAO,EAAA;MACTW,YAAA,CAAaK,UAAUH,aACpB,CAAAI,WAAA,CAAYjB,KAAO,EAAAC,MAAA,EAAQC,OAAO,CAClC,CAAAgB,IAAA,CACCC,SAAAA,CAAAA,qBAAqBC,gBAAAA,CAAAA,OAAO,CAAA,EAC5BC,SAAA,CAAAA,UAAA,CAAYC,GAAQ,IAAA;QAClBC,OAAA,CAAQhB,MAAMe,GAAG,CAAA;QACjBd,QAAA,CAASc,GAAG,CAAA;QACZjB,UAAA,CAAW,KAAK,CAAA;QAChBK,OAAA,CAAQ,IAAI,CAAA;QAEL,OAAAY,GAAA;MAAA,CACR,CAAA,CACH,CACCE,SAAU,CAACC,SAAc,IAAA;QACxBf,OAAA,CAASM,OAAoB,IAAAI,wBAAA,CAAQJ,SAASS,SAAS,CAAA,GAAIT,UAAUS,SAAU,CAAA;QAC/EpB,UAAA,CAAW,KAAK,CAAA;QAChBG,QAAA,CAAS,KAAK,CAAA;MAAA,CACf,CAAA;IACL;IAEA,OAAO,MAAG;MApEd,IAAAkB,EAAA;MAoEiB,OAAA,CAAAA,EAAA,GAAAf,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,YAAA,CAAcK,YAAd,IAAuB,GAAA,KAAA,CAAA,GAAAU,EAAA,CAAAC,WAAA,EAAA;IAAA,CAAA;KACnC,CAAC3B,KAAA,EAAOC,MAAQ,EAAAC,OAAA,EAASW,aAAa,CAAC,CAAA;EAEnC,OAAA;IAACJ,IAAM;IAAAL,OAAA;IAASG;GAAK;AAC9B;ACpCgB,SAAAqB,eAAA,QAA0D;EAAA,IAA1C;IAAC/B;GAAyC;EAClE,MAAA;IAACgC;GAAW,GAAIC,MAAAA,CAAAA,YAAa,EAAA;EACnC,MAAMC,SAASC,MAAU,CAAAA,SAAA,CAAA;IAACnC,UAAY,EAAAA,UAAA,IAAA,IAAA,GAAAA,UAAA,GAAc;GAAa,CAAA;EACjE,MAAM,CAACoC,KAAO,EAAAC,QAAQ,CAAI,GAAA5B,KAAA,CAAAA,QAAA,CAAS,EAAE,CAAA;EAErCS,KAAAA,CAAAA,SAAA,CAAU,MAAM;IACd,MAAM;MAACoB;IAAA,CAAa,GAAAJ,MAAA,CAAOK,MAAO,EAAA;IAElC,eAAeC,QAAQC,EAAY,EAAA;MAC3B,MAAAC,WAAA,GAAc,MAAMR,MAAA,CAAOS,OAAQ,CAAA;QACvCC,GAAA,sBAAkBN,SAAmB,oBAAAG,EAAA;MAAA,CACtC,CAAA;MAEM,OAAAC,WAAA;IACT;IAEA,eAAeG,iBAAoB,GAAA;MAC3B,MAAAC,SAAA,GAAY,MAAMZ,MAAA,CACrBS,OAAQ,CAAA;QACPC,yBAAkBN,SAAA;MACnB,CAAA,CACA,CAAAS,IAAA,CAAK,MAAOC,OACXC,OAAQ,CAAAC,GAAA,CACNF,GAAA,CAAIG,GAAI,CAAA,MAAOC,IAAwB,KAAA;QACrCC,aAAA,EAAeD,IAAK,CAAAE,aAAA,MAAkBtB,WAAa,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,WAAA,CAAAS,EAAA,CAAA;QACnD,IAAI,MAAMD,OAAQ,CAAAY,IAAA,CAAKE,aAAa,CAAA;MAAA,CACpC,CAAA,CAAA,CACJ,CAED,CAAAC,KAAA,CAAO9B,GAAA,IAAQA,GAAG,CAAA;MAErBY,QAAA,CAASS,SAAS,CAAA;IACpB;IAEI,IAAA,CAACV,MAAMoB,MAAQ,EAAA;MACCX,iBAAA,EAAA;IACpB;KACC,CAACX,MAAA,EAAQF,2CAAaS,EAAI,EAAAL,KAAA,CAAMoB,MAAM,CAAC,CAAA;EAEnC,OAAApB,KAAA;AACT;ACxEgB,SAAAqB,gBAAA,CAAiBhB,IAAaiB,IAAe,EAAA;EACrD,MAAAC,aAAA,GAAgBC,cAAAA,CAAAA,OAAM,CAAAC,UAAA,CAAWC,MAAa,CAAAA,aAAA,CAAA;EACpD,MAAM;IAACC,gBAAA;IAAkBC;EAAU,CAAA,GAAIC,IAAc,CAAAA,aAAA,EAAA;EAE/C,MAAAC,aAAA,GAAgBN,sBAAM,CAAAO,WAAA,CAAY,MAAM;IAC5C,IAAI,CAACR,aAAA,IAAiB,CAAClB,EAAA,IAAM,CAACiB,IAAM,EAAA;MAClC;IACF;IAEM,MAAAU,KAAA,GAAQ,CAAC,GAAGL,gBAAgB,CAAA;IAC5BK,KAAA,CAAAC,MAAA,CAAOL,UAAa,GAAA,CAAA,EAAG,CAAG,EAAA,CAC9B;MACEvB,EAAA;MACArC,MAAA,EAAQ;QAACsD;MAAI;IACf,CAAA,CACD,CAAA;IAED,MAAMY,IAAO,GAAAX,aAAA,CAAcY,oBAAqB,CAAA;MAACH;IAAM,CAAA,CAAA;IACvDT,aAAA,CAAca,WAAY,CAAA;MAACC,IAAM,EAAAH;IAAK,CAAA,CAAA;EAAA,GACrC,CAAC7B,EAAA,EAAIiB,MAAMC,aAAe,EAAAI,gBAAA,EAAkBC,UAAU,CAAC,CAAA;EAEnD,OAAAE,aAAA;AACT;ACNA,MAAMQ,aAA+B,GAAA;EACnCC,IAAM,EAAA;AACR,CAAA;AAEO,SAASC,SAASC,KAAsB,EAAA;EACvC,MAAA;IAACC,KAAO;IAAAC,WAAA;IAAaC,IAAM;IAAAL,IAAA;IAAMM;EAAQ,CAAA,GAAI;IAAC,GAAGP,aAAe;IAAA,GAAGG;GAAK;EAG5E,OAAAK,eAAAA,UAAAA,CAAAA,GAAA,CAACC,EAAAA,CAAAA,IAAK,EAAA;IAAAR,IAAA;IAAYS,OAAS,EAAA,CAAA;IAAGC,QAAQ,CAAG;IAAAC,MAAA,EAAM,IAC7C;IAAAL,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACC,EACE,CAAAA,IAAA,EAAA;MAAAP,QAAA,EAAA,CAAAD,IAAA,oBAAwB,IAAA,EACxBC,QAAA,GACCA,WAECC,eAAAA,UAAAA,CAAAA,GAAA,CAAAO,EAAA,CAAAA,GAAA,EAAA;QAAIC,MAAM,CACT;QAAAT,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACI,EAAM,CAAAA,KAAA,EAAA;UAAAC,KAAA,EAAO,CACX;UAAAX,QAAA,EAAA,CAAAH,KAAA,GAASI,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAKC,MAAO,EAAA,UAAA;YAAYb;UAAM,CAAA,CAAU,GAAA,IAAA,EACjDF,cAAeG,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAKE,IAAM,EAAA,CAAA;YAAId;UAAY,CAAA,CAAU,GAAA,IAAA;QAAA,CACvD;MACF,CAAA,CAAA;IAEJ,CAAA;EACF,CAAA,CAAA;AAEJ;ACpCA,MAAMe,YAAe,GAAA,YAA2B;EAAA,IAA1BnB,KAAmB,uEAAA,EAAO;EAC9C,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,OAAA;IAAS,GAAGpB;EAAO,CAAA,CAAA;AACrC,CAAA;AAEA,MAAMqB,WAAA,GAAcC,wBAAOH,YAAY,CAAA,CACrC,MACEI,UAAA,mLAAA,CAQJ;AAIO,SAASC,MAAMxB,KAAmB,EAAA;EACvC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAgB,WAAA,EAAA;IAAa,GAAGI,IAAA;IAAOrB;EAAS,CAAA,CAAA;AAC1C;AAGA,MAAMsB,UAAa,GAAA,YAA2B;EAAA,IAA1B1B,KAAmB,uEAAA,EAAO;EAC5C,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM2B,SAAA,GAAYL,wBAAOI,UAAU,CAAA,CACjC,MACEH,UAAA,yKAAA,CAOJ;AAIO,SAASK,IAAI5B,KAAsB,EAAA;EACxC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAsB,SAAA,EAAA;IAAW,GAAGF,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACxC;AAGA,MAAMyB,WAAc,GAAA,YAAgB;EAAA,IAAf7B,KAAQ,uEAAA,EAAO;EAClC,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM8B,UAAA,GAAaR,wBAAOO,WAAW,CAAA,CACnC,MACEN,UAAA,2KAAA,CAOJ;AAIO,SAASQ,KAAK/B,KAAuB,EAAA;EAC1C,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAyB,UAAA,EAAA;IAAY,GAAGL,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACzC;ACvEA,SAAS4B,WAAA,CACPzE,OACA0E,YACgB,EAAA;EACT,OAAA1E,KAAA,CAAM2E,MAAO,CAAC3D,IAAS,IAAA;IAC5B,MAAM4D,WAAe,GAAA,CAAA5D,IAAA,CAAK4D,WAAe,IAAA,EAAA,EAAIC,WAAY,EAAA;IACrD,IAAAD,WAAA,CAAYE,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IACjD,MAAMK,SAAa,GAAA,CAAA/D,IAAA,CAAK+D,SAAa,IAAA,EAAA,EAAIF,WAAY,EAAA;IACjD,IAAAE,SAAA,CAAUD,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAC/C,MAAMM,UAAc,GAAA,CAAAhE,IAAA,CAAKgE,UAAc,IAAA,EAAA,EAAIH,WAAY,EAAA;IACnD,IAAAG,UAAA,CAAWF,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAChD,MAAMO,UAAc,GAAA,CAAAjE,IAAA,CAAKiE,UAAc,IAAA,EAAA,EAAIJ,WAAY,EAAA;IACnD,IAAAI,UAAA,CAAWH,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAEzC,OAAA,KAAA;EAAA,CACR,CAAA;AACH;AAWO,SAASQ,eAAezC,KAA4B,EAAA;EACnD,MAAA;IACJ0C,QAAQ,EAAC;IACTC,WAAW,EAAC;IACZC,KAAA;IACAC,QAAA;IACAC,OAAA;IACAC,QAAQ,CAAC;EACP,CAAA,GAAA/C,KAAA;EACJ,MAAM,CAACiC,YAAc,EAAAe,eAAe,CAAI,GAAAjE,cAAAA,CAAAA,OAAA,CAAMnD,SAAS,EAAE,CAAA;EACzD,MAAMqH,aAAgB,GAAAjB,WAAA,CAAYW,QAAY,IAAA,IAAIV,YAAY,CAAA;EAE9D,MAAMiB,KAAKP,QAAS,CAAAQ,IAAA,CAAMC,CAAA,IAAMA,EAAE5E,aAAa,CAAA;EAC/C,MAAM6E,UAAa,GAAAH,EAAA,IAAMR,KAAM,CAAAY,QAAA,CAASJ,GAAGtF,EAAE,CAAA;EAI7C,MAAM2F,QAAQrH,KAAAA,CAAAA,MAAyB,EAAA;EAOjC,MAAAsH,kBAAA,GAAsBC,KAA+C,IAAA;IACzDT,eAAA,CAAAS,KAAA,CAAMC,OAAOhB,KAAK,CAAA;EAAA,CACpC;EAEM,MAAAiB,YAAA,GAAe,CAACC,SAAA,EAAoBrF,IAAuB,KAAA;IAC/D,IAAI,CAACqF,SAAW,EAAA;MACV,IAAAhB,KAAA,EAAOA,KAAA,CAAMrE,KAAKX,EAAE,CAAA;IACf,CAAA,MAAA,IAAAiF,QAAA,EAAUA,QAAA,CAAStE,KAAKX,EAAE,CAAA;EAAA,CACvC;EAEA,MAAMiG,qBAAqB,MAAM;IAC/B,IAAIX,EAAM,IAAAN,KAAA,EAAOA,KAAA,CAAMM,GAAGtF,EAAE,CAAA;EAAA,CAC9B;EAEA,MAAMkG,uBAAuB,MAAM;IACjC,IAAIZ,EAAM,IAAAL,QAAA,EAAUA,QAAA,CAASK,GAAGtF,EAAE,CAAA;EAAA,CACpC;EAEA,MAAMmG,4BAA4B,MAAM;IAClC,IAAAjB,OAAA,EAAiBA,OAAA,EAAA;EAAA,CACvB;EAGE,OAAA,eAAApC,eAAA,CAACsD,EAAAA,CAAAA;IAAKjB,KACH;IAAA3C,QAAA,EAAA,CACCiD,UAAA,kBAAAhD,UAAA,CAAAA,GAAA,CAAC4D,EAAA,CAAAA,QAAA,EAAA;MACCnE,IAAK,EAAA,SAAA;MACLoE,UAAU,CAAChB,EAAA;MACXiB,OAAS,EAAAL,oBAAA;MACT3D,IAAM,EAAAiE,KAAA,CAAAA,gBAAA;MACNC,IAAK,EAAA;IAAA,CAAA,CAGP,kBAAAhE,UAAA,CAAAA,GAAA,CAAC4D,EAAA,CAAAA,QAAA,EAAA;MACCnE,IAAK,EAAA,UAAA;MACLqE,OAAS,EAAAN,kBAAA;MACT1D,IAAM,EAAAmE,KAAA,CAAAA,aAAA;MACND,IAAK,EAAA;IAAA,CAAA,CACP,EAAA,eAGFhE,UAAA,CAAAA,GAAA,CAAC4D,EAAA,CAAAA,QAAA,EAAA;MACCnE,IAAK,EAAA,UAAA;MACLoE,QAAA,EAAUxB,MAAM/D,MAAW,KAAA,CAAA;MAC3BwF,OAAS,EAAAJ,yBAAA;MACT5D,IAAM,EAAAoE,KAAA,CAAAA,WAAA;MACNF,IAAK,EAAA;IAAA,CAAA,CACP,EAEAhE,eAAAA,UAAAA,CAAAA,GAAA,CAACO,EAAAA,CAAAA,GAAI,EAAA;MAAAL,OAAA,EAAS,CACZ;MAAAH,QAAA,EAAA,eAAAC,UAAA,CAAAA,GAAA,CAACmE,EAAA,CAAAA,SAAA,EAAA;QAECC,GAAK,EAAAlB,KAAA;QACLmB,QAAU,EAAAlB,kBAAA;QACVmB,WAAY,EAAA,gBAAA;QACZjC,KAAO,EAAAT;MAAA,CAAA;KAEX,CAAA,EAECA,YAAA,IAAA,CAAgBgB,+CAAetE,MAAW,MAAA,CAAA,IAAA,8BACxCsF,EAAS,CAAAA,QAAA,EAAA;MAAAC,QAAA,EAAQ,IAAC;MAAAG,IAAA,EAAK;KAAa,CAAA,EAGtCpB,aACC,IAAAA,aAAA,CAAc3E,GAAI,CAACC,IACjB,IAAA,eAAA8B,UAAA,CAAAA,GAAA,CAAC4D,EAAA,CAAAA,QAAA,EAAA;MAECW,OAAS,EAAAlC,KAAA,CAAMY,QAAS,CAAA/E,IAAA,CAAKX,EAAE,CAAA;MAC/BuG,OAAA,EAAS,MAAMR,YAAa,CAAAjB,KAAA,CAAMmC,QAAQtG,IAAK,CAAAX,EAAE,CAAI,GAAA,CAAA,CAAA,EAAIW,IAAI,CAAA;MAE7D6B,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACC,EAAK,CAAAA,IAAA,EAAA;QAAAmE,KAAA,EAAM,QACV;QAAA1E,QAAA,EAAA,CAACC,eAAAA,UAAAA,CAAAA,GAAA,CAAA0E,MAAAA,CAAAA,UAAA,EAAA;UAAWxG,IAAY;UAAA2C,IAAA,EAAM;QAAG,CAAA,CAAA,EAAA,eACjCb,UAAA,CAAAA,GAAA,CAACO,EAAI,CAAAA,GAAA,EAAA;UAAAoE,QAAA,EAAU,CAAG;UAAAnE,IAAA,EAAM;UACtBT,QAAC,EAAAC,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAMZ,QAAK,EAAA7B,IAAA,CAAA4D;UAAA,CAAY;QAC1B,CAAA,CAAA,EACC5D,IAAA,CAAKC,aACJ,IAAA6B,eAAAA,UAAAA,CAAAA,GAAA,CAAC4E,EAAM,CAAAA,KAAA,EAAA;UAAAC,QAAA,EAAU;UAAGpF,IAAK,EAAA,UAAA;UAAWqF,IAAK,EAAA,SAAA;UAAU/E,QAEnD,EAAA;QAAA,CAAA,CAAA;OAEJ;IAAA,CAAA,EAdK7B,IAAK,CAAAX,EAAA,CAgBb,CAAA;EACL,CAAA,CAAA;AAEJ;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/hooks/useOpenInNewPane.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {usePaneRouter} from 'sanity/desk'\nimport {RouterContext} from 'sanity/router'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = React.useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = React.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 React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\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 React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const labels = props?.labels ? {...props.labels, ...LABELS} : LABELS\n\n const [searchString, setSearchString] = React.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: React.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 && (\n <MenuItem disabled text={labels.notFound} />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","useOpenInNewPane","type","routerContext","React","useContext","RouterContext","routerPanesState","groupIndex","usePaneRouter","openInNewPane","useCallback","panes","splice","href","resolvePathFromState","navigateUrl","path","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","LABELS","addMe","removeMe","clear","searchPlaceholder","notFound","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","labels","setSearchString","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":"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"}
|
package/package.json
CHANGED
package/src/components/Table.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {PropsWithChildren} from 'react'
|
|
2
2
|
import styled, {css} from 'styled-components'
|
|
3
3
|
import {Card, CardProps} from '@sanity/ui'
|
|
4
4
|
|
|
@@ -70,7 +70,12 @@ const StyledCell = styled(CellWrapper)(
|
|
|
70
70
|
`
|
|
71
71
|
)
|
|
72
72
|
|
|
73
|
-
type TableCellProps = PropsWithChildren<
|
|
73
|
+
type TableCellProps = PropsWithChildren<
|
|
74
|
+
CardProps & {
|
|
75
|
+
colSpan?: number
|
|
76
|
+
rowSpan?: number
|
|
77
|
+
}
|
|
78
|
+
>
|
|
74
79
|
|
|
75
80
|
export function Cell(props: TableCellProps) {
|
|
76
81
|
const {children, ...rest} = props
|
|
@@ -23,15 +23,32 @@ function searchUsers(
|
|
|
23
23
|
})
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
type Labels = {
|
|
27
|
+
addMe?: string
|
|
28
|
+
removeMe?: string
|
|
29
|
+
clear?: string
|
|
30
|
+
searchPlaceholder?: string
|
|
31
|
+
notFound?: string
|
|
32
|
+
}
|
|
33
|
+
|
|
26
34
|
type UserSelectMenuProps = {
|
|
27
35
|
value: string[]
|
|
28
36
|
userList: UserExtended[]
|
|
29
|
-
onAdd:
|
|
30
|
-
onRemove:
|
|
31
|
-
onClear:
|
|
37
|
+
onAdd: (userId: string) => void
|
|
38
|
+
onRemove: (userId: string) => void
|
|
39
|
+
onClear: () => void
|
|
40
|
+
labels?: Labels
|
|
32
41
|
style?: React.CSSProperties
|
|
33
42
|
}
|
|
34
43
|
|
|
44
|
+
const LABELS: Labels = {
|
|
45
|
+
addMe: 'Assign myself',
|
|
46
|
+
removeMe: 'Unassign myself',
|
|
47
|
+
clear: 'Clear assignees',
|
|
48
|
+
searchPlaceholder: 'Search users',
|
|
49
|
+
notFound: 'No users found',
|
|
50
|
+
}
|
|
51
|
+
|
|
35
52
|
export function UserSelectMenu(props: UserSelectMenuProps) {
|
|
36
53
|
const {
|
|
37
54
|
value = [],
|
|
@@ -41,6 +58,8 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
|
|
|
41
58
|
onClear,
|
|
42
59
|
style = {},
|
|
43
60
|
} = props
|
|
61
|
+
const labels = props?.labels ? {...props.labels, ...LABELS} : LABELS
|
|
62
|
+
|
|
44
63
|
const [searchString, setSearchString] = React.useState('')
|
|
45
64
|
const searchResults = searchUsers(userList || [], searchString)
|
|
46
65
|
|
|
@@ -49,7 +68,7 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
|
|
|
49
68
|
|
|
50
69
|
// Focus input on open
|
|
51
70
|
// TODO: Fix focus, it gets immediately taken away
|
|
52
|
-
const input = useRef<HTMLInputElement>()
|
|
71
|
+
const input = useRef<HTMLInputElement>(null)
|
|
53
72
|
// useEffect(() => {
|
|
54
73
|
// if (open && input?.current) {
|
|
55
74
|
// input.current.focus()
|
|
@@ -86,14 +105,14 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
|
|
|
86
105
|
disabled={!me}
|
|
87
106
|
onClick={handleUnassignMyself}
|
|
88
107
|
icon={RemoveCircleIcon}
|
|
89
|
-
text=
|
|
108
|
+
text={labels.removeMe}
|
|
90
109
|
/>
|
|
91
110
|
) : (
|
|
92
111
|
<MenuItem
|
|
93
112
|
tone="positive"
|
|
94
113
|
onClick={handleAssignMyself}
|
|
95
114
|
icon={AddCircleIcon}
|
|
96
|
-
text=
|
|
115
|
+
text={labels.addMe}
|
|
97
116
|
/>
|
|
98
117
|
)}
|
|
99
118
|
|
|
@@ -102,21 +121,20 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
|
|
|
102
121
|
disabled={value.length === 0}
|
|
103
122
|
onClick={handleClearAssigneesClick}
|
|
104
123
|
icon={RestoreIcon}
|
|
105
|
-
text=
|
|
124
|
+
text={labels.clear}
|
|
106
125
|
/>
|
|
107
126
|
|
|
108
127
|
<Box padding={1}>
|
|
109
128
|
<TextInput
|
|
110
|
-
// @ts-ignore TODO: Satisfy ref
|
|
111
129
|
ref={input}
|
|
112
130
|
onChange={handleSearchChange}
|
|
113
|
-
placeholder=
|
|
131
|
+
placeholder={labels.searchPlaceholder}
|
|
114
132
|
value={searchString}
|
|
115
133
|
/>
|
|
116
134
|
</Box>
|
|
117
135
|
|
|
118
136
|
{searchString && searchResults?.length === 0 && (
|
|
119
|
-
<MenuItem disabled text=
|
|
137
|
+
<MenuItem disabled text={labels.notFound} />
|
|
120
138
|
)}
|
|
121
139
|
|
|
122
140
|
{searchResults &&
|