sanity-plugin-utils 1.0.2 → 1.1.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
@@ -38,7 +38,7 @@ import {useListeningQuery} from 'sanity-plugin-utils'
38
38
  export default function DocumentList() {
39
39
  const {data, loading, error} = useListeningQuery(`*[_type == $type]`, {
40
40
  params: {type: 'pet'},
41
- initialData: [],
41
+ initialValue: [],
42
42
  })
43
43
 
44
44
  if (loading) {
package/lib/index.d.ts CHANGED
@@ -68,11 +68,13 @@ export declare function useListeningQuery<V>(
68
68
  {params, options, initialValue}: Config<V>
69
69
  ): Return<V>
70
70
 
71
+ export declare function useOpenInNewPane(id?: string, type?: string): () => void
72
+
71
73
  export declare function useProjectUsers({
72
74
  apiVersion,
73
75
  }: HookConfig): UserExtended[]
74
76
 
75
- declare type UserExtended = {
77
+ export declare type UserExtended = {
76
78
  createdAt: string
77
79
  displayName: string
78
80
  email: string
@@ -96,7 +98,6 @@ declare type UserSelectMenuProps = {
96
98
  onAdd: any
97
99
  onRemove: any
98
100
  onClear: any
99
- open: boolean
100
101
  style?: React_2.CSSProperties
101
102
  }
102
103
 
package/lib/index.esm.js CHANGED
@@ -4,6 +4,8 @@ import React, { useState, useRef, useEffect } from 'react';
4
4
  import { distinctUntilChanged, catchError } from 'rxjs/operators';
5
5
  import isEqual from 'react-fast-compare';
6
6
  import { useDocumentStore, useWorkspace, useClient, UserAvatar } from 'sanity';
7
+ import { usePaneRouter } from 'sanity/desk';
8
+ import { RouterContext } from 'sanity/router';
7
9
  import { jsx, jsxs } from 'react/jsx-runtime';
8
10
  import { Card, Flex, Box, Stack, Text, Menu, MenuItem, TextInput, Badge } from '@sanity/ui';
9
11
  import styled, { css } from 'styled-components';
@@ -85,6 +87,32 @@ function useProjectUsers(_ref2) {
85
87
  }, [client, currentUser == null ? void 0 : currentUser.id, users.length]);
86
88
  return users;
87
89
  }
90
+ function useOpenInNewPane(id, type) {
91
+ const routerContext = React.useContext(RouterContext);
92
+ const {
93
+ routerPanesState,
94
+ groupIndex
95
+ } = usePaneRouter();
96
+ const openInNewPane = React.useCallback(() => {
97
+ if (!routerContext || !id || !type) {
98
+ return;
99
+ }
100
+ const panes = [...routerPanesState];
101
+ panes.splice(groupIndex + 1, 0, [{
102
+ id,
103
+ params: {
104
+ type
105
+ }
106
+ }]);
107
+ const href = routerContext.resolvePathFromState({
108
+ panes
109
+ });
110
+ routerContext.navigateUrl({
111
+ path: href
112
+ });
113
+ }, [id, type, routerContext, routerPanesState, groupIndex]);
114
+ return openInNewPane;
115
+ }
88
116
  const DEFAULT_PROPS = {
89
117
  tone: "primary"
90
118
  };
@@ -273,5 +301,5 @@ function UserSelectMenu(props) {
273
301
  }, user.id))]
274
302
  });
275
303
  }
276
- export { Cell, Feedback, Row, Table, UserSelectMenu, useListeningQuery, useProjectUsers };
304
+ export { Cell, Feedback, Row, Table, UserSelectMenu, useListeningQuery, useOpenInNewPane, useProjectUsers };
277
305
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.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 {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(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n open: boolean\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = 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 && <MenuItem disabled text=\"No matches\" />}\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","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","React","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 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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"}
package/lib/index.js CHANGED
@@ -9,6 +9,8 @@ var React = require('react');
9
9
  var operators = require('rxjs/operators');
10
10
  var isEqual = require('react-fast-compare');
11
11
  var sanity = require('sanity');
12
+ var desk = require('sanity/desk');
13
+ var router = require('sanity/router');
12
14
  var jsxRuntime = require('react/jsx-runtime');
13
15
  var ui = require('@sanity/ui');
14
16
  var styled = require('styled-components');
@@ -98,6 +100,32 @@ function useProjectUsers(_ref2) {
98
100
  }, [client, currentUser == null ? void 0 : currentUser.id, users.length]);
99
101
  return users;
100
102
  }
103
+ function useOpenInNewPane(id, type) {
104
+ const routerContext = React__default.default.useContext(router.RouterContext);
105
+ const {
106
+ routerPanesState,
107
+ groupIndex
108
+ } = desk.usePaneRouter();
109
+ const openInNewPane = React__default.default.useCallback(() => {
110
+ if (!routerContext || !id || !type) {
111
+ return;
112
+ }
113
+ const panes = [...routerPanesState];
114
+ panes.splice(groupIndex + 1, 0, [{
115
+ id,
116
+ params: {
117
+ type
118
+ }
119
+ }]);
120
+ const href = routerContext.resolvePathFromState({
121
+ panes
122
+ });
123
+ routerContext.navigateUrl({
124
+ path: href
125
+ });
126
+ }, [id, type, routerContext, routerPanesState, groupIndex]);
127
+ return openInNewPane;
128
+ }
101
129
  const DEFAULT_PROPS = {
102
130
  tone: "primary"
103
131
  };
@@ -292,5 +320,6 @@ exports.Row = Row;
292
320
  exports.Table = Table;
293
321
  exports.UserSelectMenu = UserSelectMenu;
294
322
  exports.useListeningQuery = useListeningQuery;
323
+ exports.useOpenInNewPane = useOpenInNewPane;
295
324
  exports.useProjectUsers = useProjectUsers;
296
325
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.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 {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(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n open: boolean\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = 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 && <MenuItem disabled text=\"No matches\" />}\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","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","React","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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-utils",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "A collection of useful Hooks and Components when creating Plugins",
5
5
  "keywords": [
6
6
  "sanity",
@@ -60,7 +60,7 @@
60
60
  "@commitlint/config-conventional": "^17.4.2",
61
61
  "@sanity/pkg-utils": "^2.2.4",
62
62
  "@sanity/plugin-kit": "^3.1.4",
63
- "@sanity/semantic-release-preset": "^2.0.2",
63
+ "@sanity/semantic-release-preset": "^4.0.0",
64
64
  "@sanity/ui": "^1.2.2",
65
65
  "@types/react": "^18.0.27",
66
66
  "@types/styled-components": "^5.1.26",
@@ -82,6 +82,7 @@
82
82
  "react-is": "^18.2.0",
83
83
  "rimraf": "^4.1.2",
84
84
  "sanity": "^3.3.1",
85
+ "semantic-release": "^20.1.0",
85
86
  "styled-components": "^5.3.6",
86
87
  "typescript": "^4.9.5"
87
88
  },
@@ -5,7 +5,10 @@ import {UserAvatar} from 'sanity'
5
5
 
6
6
  import {UserExtended} from '../../hooks/useProjectUsers'
7
7
 
8
- function searchUsers(users: UserExtended[], searchString: string): UserExtended[] {
8
+ function searchUsers(
9
+ users: UserExtended[],
10
+ searchString: string
11
+ ): UserExtended[] {
9
12
  return users.filter((user) => {
10
13
  const displayName = (user.displayName || '').toLowerCase()
11
14
  if (displayName.startsWith(searchString)) return true
@@ -26,12 +29,18 @@ type UserSelectMenuProps = {
26
29
  onAdd: any
27
30
  onRemove: any
28
31
  onClear: any
29
- open: boolean
30
32
  style?: React.CSSProperties
31
33
  }
32
34
 
33
35
  export function UserSelectMenu(props: UserSelectMenuProps) {
34
- const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = props
36
+ const {
37
+ value = [],
38
+ userList = [],
39
+ onAdd,
40
+ onRemove,
41
+ onClear,
42
+ style = {},
43
+ } = props
35
44
  const [searchString, setSearchString] = React.useState('')
36
45
  const searchResults = searchUsers(userList || [], searchString)
37
46
 
@@ -106,7 +115,9 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
106
115
  />
107
116
  </Box>
108
117
 
109
- {searchString && searchResults?.length === 0 && <MenuItem disabled text="No matches" />}
118
+ {searchString && searchResults?.length === 0 && (
119
+ <MenuItem disabled text="No matches" />
120
+ )}
110
121
 
111
122
  {searchResults &&
112
123
  searchResults.map((user) => (
@@ -0,0 +1,27 @@
1
+ import React from 'react'
2
+ import {usePaneRouter} from 'sanity/desk'
3
+ import {RouterContext} from 'sanity/router'
4
+
5
+ export function useOpenInNewPane(id?: string, type?: string) {
6
+ const routerContext = React.useContext(RouterContext)
7
+ const {routerPanesState, groupIndex} = usePaneRouter()
8
+
9
+ const openInNewPane = React.useCallback(() => {
10
+ if (!routerContext || !id || !type) {
11
+ return
12
+ }
13
+
14
+ const panes = [...routerPanesState]
15
+ panes.splice(groupIndex + 1, 0, [
16
+ {
17
+ id: id,
18
+ params: {type},
19
+ },
20
+ ])
21
+
22
+ const href = routerContext.resolvePathFromState({panes})
23
+ routerContext.navigateUrl({path: href})
24
+ }, [id, type, routerContext, routerPanesState, groupIndex])
25
+
26
+ return openInNewPane
27
+ }
package/src/index.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export {useListeningQuery} from './hooks/useListeningQuery'
2
2
  export {useProjectUsers} from './hooks/useProjectUsers'
3
+ export type {UserExtended} from './hooks/useProjectUsers'
4
+ export {useOpenInNewPane} from './hooks/useOpenInNewPane'
3
5
 
4
6
  export {Feedback} from './components/Feedback'
5
7
  export {Table, Row, Cell} from './components/Table'