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 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, `pet`)
96
+ const openInNewPane = useOpenInNewPane(pet._id, pet._type)
97
97
 
98
98
  return (
99
- <Button onClick={() => openInNewPane(pet._id)}>
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. Will return an array of user `id`s.
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
- // TODO: Example
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<CardProps>
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: any
99
- onRemove: any
100
- onClear: any
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: "Unassign myself"
268
+ text: labels.removeMe
258
269
  }) : /* @__PURE__ */jsx(MenuItem, {
259
270
  tone: "positive",
260
271
  onClick: handleAssignMyself,
261
272
  icon: AddCircleIcon,
262
- text: "Assign myself"
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: "Clear assignees"
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: "Search members",
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: "No matches"
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),
@@ -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":"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"}
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":"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"}
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: "Unassign myself"
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: "Assign myself"
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: "Clear assignees"
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: "Search members",
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: "No matches"
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":"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"}
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":";;;;;;;;;;;;;;;;;;;;;;;;;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;AASO,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;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,cAAAA,CAAAA,OAAA,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,aAAyB,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,eAAA,CAAC6D,EAAAA,CAAAA;IAAKlB,KACH;IAAAjD,QAAA,EAAA,CACCwD,UAAA,kBAAAvD,UAAA,CAAAA,GAAA,CAACmE,EAAA,CAAAA,QAAA,EAAA;MACC1E,IAAK,EAAA,SAAA;MACL2E,UAAU,CAAChB,EAAA;MACXiB,OAAS,EAAAL,oBAAA;MACTlE,IAAM,EAAAwE,KAAA,CAAAA,gBAAA;MACNC,MAAMtB,MAAO,CAAAX;IAAA,CAAA,CAGf,kBAAAtC,UAAA,CAAAA,GAAA,CAACmE,EAAA,CAAAA,QAAA,EAAA;MACC1E,IAAK,EAAA,UAAA;MACL4E,OAAS,EAAAN,kBAAA;MACTjE,IAAM,EAAA0E,KAAA,CAAAA,aAAA;MACND,MAAMtB,MAAO,CAAAZ;IAAA,CAAA,CACf,EAAA,eAGFrC,UAAA,CAAAA,GAAA,CAACmE,EAAA,CAAAA,QAAA,EAAA;MACC1E,IAAK,EAAA,UAAA;MACL2E,QAAA,EAAUzB,MAAMrE,MAAW,KAAA,CAAA;MAC3B+F,OAAS,EAAAJ,yBAAA;MACTnE,IAAM,EAAA2E,KAAA,CAAAA,WAAA;MACNF,MAAMtB,MAAO,CAAAV;IAAA,CAAA,CACf,EAEAvC,eAAAA,UAAAA,CAAAA,GAAA,CAACO,EAAAA,CAAAA,GAAI,EAAA;MAAAL,OAAA,EAAS,CACZ;MAAAH,QAAA,EAAA,eAAAC,UAAA,CAAAA,GAAA,CAAC0E,EAAA,CAAAA,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,IAAA0B,eAAAA,UAAAA,CAAAA,GAAA,CAACmE,EAAAA,CAAAA;MAASC,QAAQ,EAAA,IAAA;MAACG,IAAM,EAAAtB,MAAA,CAAOR;KAAU,CAAA,EAG3CU,aACC,IAAAA,aAAA,CAAclF,GAAI,CAACC,IACjB,IAAA,eAAA8B,UAAA,CAAAA,GAAA,CAACmE,EAAA,CAAAA,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,UAAA,CAAAA,IAAA,CAACC,EAAK,CAAAA,IAAA,EAAA;QAAA0E,KAAA,EAAM,QACV;QAAAjF,QAAA,EAAA,CAACC,eAAAA,UAAAA,CAAAA,GAAA,CAAAiF,MAAAA,CAAAA,UAAA,EAAA;UAAW/G,IAAY;UAAA2C,IAAA,EAAM;QAAG,CAAA,CAAA,EAAA,eACjCb,UAAA,CAAAA,GAAA,CAACO,EAAI,CAAAA,GAAA,EAAA;UAAA2E,QAAA,EAAU,CAAG;UAAA1E,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,CAACmF,EAAM,CAAAA,KAAA,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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-utils",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "description": "A collection of useful Hooks and Components when creating Plugins",
5
5
  "keywords": [
6
6
  "sanity",
@@ -1,4 +1,4 @@
1
- import React, {PropsWithChildren} from 'react'
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<CardProps>
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: any
30
- onRemove: any
31
- onClear: any
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="Unassign myself"
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="Assign myself"
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="Clear assignees"
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="Search members"
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="No matches" />
137
+ <MenuItem disabled text={labels.notFound} />
120
138
  )}
121
139
 
122
140
  {searchResults &&