sanity-plugin-utils 0.0.3 → 1.0.1
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 +29 -6
- package/lib/index.esm.js +2 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/src/index.d.ts +99 -0
- package/package.json +57 -44
- package/lib/cjs/index.js +0 -330
- package/lib/cjs/index.js.map +0 -1
- package/lib/esm/index.js +0 -317
- package/lib/esm/index.js.map +0 -1
- package/lib/types/index.d.ts +0 -72
- package/lib/types/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
> This is exclusively a **Sanity Studio v3** plugin.
|
|
2
|
+
|
|
1
3
|
# sanity-plugin-utils
|
|
2
4
|
|
|
3
5
|
## Installation
|
|
@@ -16,7 +18,7 @@ yarn add sanity-plugin-utils
|
|
|
16
18
|
|
|
17
19
|
Handy hooks and clever components for Sanity Studio v3
|
|
18
20
|
|
|
19
|
-
### useListeningQuery()
|
|
21
|
+
### `useListeningQuery()`
|
|
20
22
|
|
|
21
23
|
Sanity's real-time APIs power excellent editorial experiences. Your plugins should respond to other users collaborating on documents in real time. This hook is a convenient way to perform a GROQ query that responds to changes, along with built-in `loading` and `error` states.
|
|
22
24
|
|
|
@@ -51,7 +53,7 @@ export default function DocumentList() {
|
|
|
51
53
|
}
|
|
52
54
|
```
|
|
53
55
|
|
|
54
|
-
### useProjectUsers()
|
|
56
|
+
### `useProjectUsers()`
|
|
55
57
|
|
|
56
58
|
Hook for getting extended details on all Users in the project. Such as name.
|
|
57
59
|
|
|
@@ -64,7 +66,9 @@ export default function DocumentList() {
|
|
|
64
66
|
return (
|
|
65
67
|
<Stack>
|
|
66
68
|
{users?.length > 0 ? (
|
|
67
|
-
users.map((user) =>
|
|
69
|
+
users.map((user) => (
|
|
70
|
+
<Profile key={user.id} {...user}>
|
|
71
|
+
))
|
|
68
72
|
) : (
|
|
69
73
|
<Spinner>
|
|
70
74
|
)}
|
|
@@ -101,9 +105,9 @@ export default function DocumentList() {
|
|
|
101
105
|
}
|
|
102
106
|
```
|
|
103
107
|
|
|
104
|
-
### Table
|
|
108
|
+
### `Table`, `Row` and `Cell`
|
|
105
109
|
|
|
106
|
-
These components are all
|
|
110
|
+
These components are all `@sanity/ui` `Card`'s but with their HTML DOM elements and CSS updated to output and behave like tables.
|
|
107
111
|
|
|
108
112
|
```jsx
|
|
109
113
|
import {Table, Row, Cell} from 'sanity-plugin-utils'
|
|
@@ -138,7 +142,7 @@ export default function Report(documents) {
|
|
|
138
142
|
}
|
|
139
143
|
```
|
|
140
144
|
|
|
141
|
-
### UserSelectMenu
|
|
145
|
+
### `UserSelectMenu`
|
|
142
146
|
|
|
143
147
|
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.
|
|
144
148
|
|
|
@@ -152,3 +156,22 @@ import {UserSelectMenu} from 'sanity-plugin-utils'
|
|
|
152
156
|
|
|
153
157
|
MIT © Simeon Griggs
|
|
154
158
|
See LICENSE
|
|
159
|
+
|
|
160
|
+
## License
|
|
161
|
+
|
|
162
|
+
[MIT](LICENSE) © Simeon Griggs
|
|
163
|
+
|
|
164
|
+
## Develop & test
|
|
165
|
+
|
|
166
|
+
This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
|
|
167
|
+
with default configuration for build & watch scripts.
|
|
168
|
+
|
|
169
|
+
See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
|
|
170
|
+
on how to run this plugin with hotreload in the studio.
|
|
171
|
+
|
|
172
|
+
### Release new version
|
|
173
|
+
|
|
174
|
+
Run ["CI & Release" workflow](https://github.com/SimeonGriggs/sanity-plugin-utils/actions/workflows/main.yml).
|
|
175
|
+
Make sure to select the main branch and check "Release new version".
|
|
176
|
+
|
|
177
|
+
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
package/lib/index.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=["children"],n=["children"],t=["children"];var r,i,o;function l(e,n){if(null==e)return{};var t,r,i=function(e,n){if(null==e)return{};var t,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||(i[t]=e[t]);return i}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)t=o[r],n.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(i[t]=e[t])}return i}function c(e,n){return n||(n=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(n)}}))}function s(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function a(e){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?s(Object(t),!0).forEach((function(n){d(e,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):s(Object(t)).forEach((function(n){Object.defineProperty(e,n,Object.getOwnPropertyDescriptor(t,n))}))}return e}function d(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}import u,{useState as p,useRef as f,useEffect as h}from"react";import{distinctUntilChanged as m,catchError as b}from"rxjs/operators";import y from"react-fast-compare";import{useDocumentStore as g,useWorkspace as O,useClient as v,UserAvatar as j}from"sanity";import{jsx as w,jsxs as C}from"react/jsx-runtime";import{Card as P,Flex as x,Box as S,Stack as U,Text as k,Menu as N,MenuItem as z,TextInput as L,Badge as D}from"@sanity/ui";import I,{css as W}from"styled-components";import{RemoveCircleIcon as E,AddCircleIcon as q,RestoreIcon as A}from"@sanity/icons";const V={},M={apiVersion:"v2022-05-09"},Q=null;function R(e,n){let{params:t=V,options:r=M,initialValue:i=Q}=n;const[o,l]=p(!0),[c,s]=p(!1),[a,d]=p(i),u=f(null),O=g();return h((()=>(e&&(u.current=O.listenQuery(e,t,r).pipe(m(y),b((e=>(console.error(e),s(e),l(!1),d(null),e)))).subscribe((e=>{d((n=>y(n,e)?n:e)),l(!1),s(!1)}))),()=>{var e;return null==(e=null==u?void 0:u.current)?void 0:e.unsubscribe()})),[e,t,r,O]),{data:a,loading:o,error:c}}function X(){const{currentUser:e}=O(),n=v(),[t,r]=p([]);return h((()=>{const{projectId:i}=n.config();t.length||async function(){const t=await n.request({url:"/projects/".concat(i,"/acl")}).then((async t=>Promise.all(t.map((async t=>a({isCurrentUser:t.projectUserId===(null==e?void 0:e.id)},await async function(e){return await n.request({url:"/projects/".concat(i,"/users/").concat(e)})}(t.projectUserId))))))).catch((e=>e));r(t)}()}),[n,null==e?void 0:e.id,t.length]),t}const B={tone:"primary"};function F(e){const{title:n,description:t,icon:r,tone:i,children:o}=a(a({},B),e);return w(P,{tone:i,padding:4,radius:3,border:!0,children:C(x,{children:[r?"display icon":null,o||w(S,{flex:1,children:C(U,{space:4,children:[n?w(k,{weight:"semibold",children:n}):null,t?w(k,{size:2,children:t}):null]})})]})})}const G=I((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return w(P,a({as:"table"},e))}))((()=>W(r||(r=c(["\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\n }\n "])))));function H(n){const{children:t}=n,r=l(n,e);return w(G,a(a({},r),{},{children:t}))}const J=I((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return w(P,a({as:"tr"},e))}))((()=>W(i||(i=c(["\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n "])))));function K(e){const{children:t}=e,r=l(e,n);return w(J,a(a({},r),{},{children:t}))}const T=I((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return w(P,a({as:"td"},e))}))((()=>W(o||(o=c(["\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n "])))));function Y(e){const{children:n}=e,r=l(e,t);return w(T,a(a({},r),{},{children:n}))}function Z(e){const{value:n=[],userList:t=[],onAdd:r,onRemove:i,onClear:o,style:l={}}=e,[c,s]=u.useState(""),a=function(e,n){return e.filter((e=>!!(e.displayName||"").toLowerCase().startsWith(n)||(!!(e.givenName||"").toLowerCase().startsWith(n)||(!!(e.middleName||"").toLowerCase().startsWith(n)||!!(e.familyName||"").toLowerCase().startsWith(n)))))}(t||[],c),d=t.find((e=>e.isCurrentUser)),p=d&&n.includes(d.id),h=f();return C(N,{style:l,children:[w(z,p?{tone:"caution",disabled:!d,onClick:()=>{d&&i&&i(d.id)},icon:E,text:"Unassign myself"}:{tone:"positive",onClick:()=>{d&&r&&r(d.id)},icon:q,text:"Assign myself"}),w(z,{tone:"critical",disabled:0===n.length,onClick:()=>{o&&o()},icon:A,text:"Clear assignees"}),w(S,{padding:1,children:w(L,{ref:h,onChange:e=>{s(e.target.value)},placeholder:"Search members",value:c})}),c&&0===(null==a?void 0:a.length)&&w(z,{disabled:!0,text:"No matches"}),a&&a.map((e=>w(z,{pressed:n.includes(e.id),onClick:()=>((e,n)=>{e?i&&i(n.id):r&&r(n.id)})(n.indexOf(e.id)>-1,e),children:C(x,{align:"center",children:[w(j,{user:e,size:1}),w(S,{paddingX:2,flex:1,children:w(k,{children:e.displayName})}),e.isCurrentUser&&w(D,{fontSize:1,tone:"positive",mode:"outline",children:"Me"})]})},e.id)))]})}export{Y as Cell,F as Feedback,K as Row,H as Table,Z as UserSelectMenu,R as useListeningQuery,X as useProjectUsers};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +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\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers(): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient()\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","_ref","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","length","async","userRoles","request","url","then","Promise","all","res","map","_objectSpread","isCurrentUser","user","projectUserId","id","concat","getUser","catch","getUsersWithRoles","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","StyledTable","styled","arguments","undefined","as","css","_templateObject","_taggedTemplateLiteral","Table","rest","_excluded","StyledRow","_templateObject2","Row","_excluded2","StyledCell","_templateObject3","Cell","_excluded3","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","searchString","setSearchString","React","searchResults","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","searchUsers","me","find","u","meAssigned","includes","input","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","event","target","placeholder","pressed","isChecked","handleSelect","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":"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"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const e=["children"],t=["children"],n=["children"];var r,s,i;function o(e,t){if(null==e)return{};var n,r,s=function(e,t){if(null==e)return{};var n,r,s={},i=Object.keys(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||(s[n]=e[n]);return s}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r<i.length;r++)n=i[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(s[n]=e[n])}return s}function c(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?l(Object(n),!0).forEach((function(t){u(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):l(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function u(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}Object.defineProperty(exports,"__esModule",{value:!0});var d=require("react"),f=require("rxjs/operators"),p=require("react-fast-compare"),j=require("sanity"),h=require("react/jsx-runtime"),x=require("@sanity/ui"),b=require("styled-components"),y=require("@sanity/icons");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var g=m(d),v=m(p),O=m(b);const C={},w={apiVersion:"v2022-05-09"},P=null;const S={tone:"primary"};const I=O.default((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return h.jsx(x.Card,a({as:"table"},e))}))((()=>b.css(r||(r=c(["\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\n }\n "])))));const U=O.default((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return h.jsx(x.Card,a({as:"tr"},e))}))((()=>b.css(s||(s=c(["\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n "])))));const q=O.default((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return h.jsx(x.Card,a({as:"td"},e))}))((()=>b.css(i||(i=c(["\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n "])))));exports.Cell=function(e){const{children:t}=e,r=o(e,n);return h.jsx(q,a(a({},r),{},{children:t}))},exports.Feedback=function(e){const{title:t,description:n,icon:r,tone:s,children:i}=a(a({},S),e);return h.jsx(x.Card,{tone:s,padding:4,radius:3,border:!0,children:h.jsxs(x.Flex,{children:[r?"display icon":null,i||h.jsx(x.Box,{flex:1,children:h.jsxs(x.Stack,{space:4,children:[t?h.jsx(x.Text,{weight:"semibold",children:t}):null,n?h.jsx(x.Text,{size:2,children:n}):null]})})]})})},exports.Row=function(e){const{children:n}=e,r=o(e,t);return h.jsx(U,a(a({},r),{},{children:n}))},exports.Table=function(t){const{children:n}=t,r=o(t,e);return h.jsx(I,a(a({},r),{},{children:n}))},exports.UserSelectMenu=function(e){const{value:t=[],userList:n=[],onAdd:r,onRemove:s,onClear:i,style:o={}}=e,[c,l]=g.default.useState(""),a=function(e,t){return e.filter((e=>!!(e.displayName||"").toLowerCase().startsWith(t)||(!!(e.givenName||"").toLowerCase().startsWith(t)||(!!(e.middleName||"").toLowerCase().startsWith(t)||!!(e.familyName||"").toLowerCase().startsWith(t)))))}(n||[],c),u=n.find((e=>e.isCurrentUser)),f=u&&t.includes(u.id),p=d.useRef();return h.jsxs(x.Menu,{style:o,children:[f?h.jsx(x.MenuItem,{tone:"caution",disabled:!u,onClick:()=>{u&&s&&s(u.id)},icon:y.RemoveCircleIcon,text:"Unassign myself"}):h.jsx(x.MenuItem,{tone:"positive",onClick:()=>{u&&r&&r(u.id)},icon:y.AddCircleIcon,text:"Assign myself"}),h.jsx(x.MenuItem,{tone:"critical",disabled:0===t.length,onClick:()=>{i&&i()},icon:y.RestoreIcon,text:"Clear assignees"}),h.jsx(x.Box,{padding:1,children:h.jsx(x.TextInput,{ref:p,onChange:e=>{l(e.target.value)},placeholder:"Search members",value:c})}),c&&0===(null==a?void 0:a.length)&&h.jsx(x.MenuItem,{disabled:!0,text:"No matches"}),a&&a.map((e=>h.jsx(x.MenuItem,{pressed:t.includes(e.id),onClick:()=>((e,t)=>{e?s&&s(t.id):r&&r(t.id)})(t.indexOf(e.id)>-1,e),children:h.jsxs(x.Flex,{align:"center",children:[h.jsx(j.UserAvatar,{user:e,size:1}),h.jsx(x.Box,{paddingX:2,flex:1,children:h.jsx(x.Text,{children:e.displayName})}),e.isCurrentUser&&h.jsx(x.Badge,{fontSize:1,tone:"positive",mode:"outline",children:"Me"})]})},e.id)))]})},exports.useListeningQuery=function(e,t){let{params:n=C,options:r=w,initialValue:s=P}=t;const[i,o]=d.useState(!0),[c,l]=d.useState(!1),[a,u]=d.useState(s),p=d.useRef(null),h=j.useDocumentStore();return d.useEffect((()=>(e&&(p.current=h.listenQuery(e,n,r).pipe(f.distinctUntilChanged(v.default),f.catchError((e=>(console.error(e),l(e),o(!1),u(null),e)))).subscribe((e=>{u((t=>v.default(t,e)?t:e)),o(!1),l(!1)}))),()=>{var e;return null==(e=null==p?void 0:p.current)?void 0:e.unsubscribe()})),[e,n,r,h]),{data:a,loading:i,error:c}},exports.useProjectUsers=function(){const{currentUser:e}=j.useWorkspace(),t=j.useClient(),[n,r]=d.useState([]);return d.useEffect((()=>{const{projectId:s}=t.config();n.length||async function(){const n=await t.request({url:"/projects/".concat(s,"/acl")}).then((async n=>Promise.all(n.map((async n=>a({isCurrentUser:n.projectUserId===(null==e?void 0:e.id)},await async function(e){return await t.request({url:"/projects/".concat(s,"/users/").concat(e)})}(n.projectUserId))))))).catch((e=>e));r(n)}()}),[t,null==e?void 0:e.id,n.length]),n};
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useProjectUsers.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 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","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\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers(): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient()\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"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","DEFAULT_PROPS","tone","StyledTable","styled","props","arguments","length","undefined","jsx","Card","_objectSpread","as","css","StyledRow","StyledCell","children","rest","_excluded3","title","description","icon","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","_excluded2","_excluded","value","userList","onAdd","onRemove","onClear","style","searchString","setSearchString","React","useState","searchResults","users","filter","user","displayName","toLowerCase","startsWith","givenName","middleName","familyName","searchUsers","me","find","u","isCurrentUser","meAssigned","includes","id","input","useRef","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","event","target","placeholder","map","pressed","isChecked","handleSelect","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode","query","_ref","params","options","initialValue","loading","setLoading","error","setError","data","setData","subscription","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","currentUser","useWorkspace","client","useClient","setUsers","projectId","config","async","userRoles","request","url","then","Promise","all","res","projectUserId","concat","getUser","catch","getUsersWithRoles"],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import {CardProps} from '@sanity/ui'
|
|
2
|
+
import {CardTone} from '@sanity/ui'
|
|
3
|
+
import {PropsWithChildren} from 'react'
|
|
4
|
+
import {default as React_2} from 'react'
|
|
5
|
+
|
|
6
|
+
export declare function Cell(props: TableCellProps): JSX.Element
|
|
7
|
+
|
|
8
|
+
declare interface Config<V> {
|
|
9
|
+
params: Params
|
|
10
|
+
options?: ListenQueryOptions
|
|
11
|
+
initialValue?: null | V
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export declare function Feedback(props: FeedbackProps): JSX.Element
|
|
15
|
+
|
|
16
|
+
declare type FeedbackChildren = {
|
|
17
|
+
children?: React_2.ReactNode
|
|
18
|
+
title?: never
|
|
19
|
+
description?: never
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
declare type FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {
|
|
23
|
+
tone?: CardTone
|
|
24
|
+
icon?: React_2.ReactNode
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
declare type FeedbackTextProps = {
|
|
28
|
+
title?: string
|
|
29
|
+
description?: React_2.ReactNode
|
|
30
|
+
children?: never
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
declare interface ListenQueryOptions {
|
|
34
|
+
tag?: string
|
|
35
|
+
apiVersion?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
declare type Params = Record<string, string | number | boolean | string[]>
|
|
39
|
+
|
|
40
|
+
declare interface Return<V> {
|
|
41
|
+
loading: boolean
|
|
42
|
+
error: boolean
|
|
43
|
+
data: null | V
|
|
44
|
+
initialValue?: Value
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export declare function Row(props: TableRowProps): JSX.Element
|
|
48
|
+
|
|
49
|
+
export declare function Table(props: TableProps): JSX.Element
|
|
50
|
+
|
|
51
|
+
declare type TableCellProps = PropsWithChildren<CardProps>
|
|
52
|
+
|
|
53
|
+
declare type TableProps = PropsWithChildren<CardProps>
|
|
54
|
+
|
|
55
|
+
declare type TableRowProps = PropsWithChildren<CardProps>
|
|
56
|
+
|
|
57
|
+
export declare function useListeningQuery<V>(
|
|
58
|
+
query:
|
|
59
|
+
| string
|
|
60
|
+
| {
|
|
61
|
+
fetch: string
|
|
62
|
+
listen: string
|
|
63
|
+
},
|
|
64
|
+
{params, options, initialValue}: Config<V>
|
|
65
|
+
): Return<V>
|
|
66
|
+
|
|
67
|
+
export declare function useProjectUsers(): UserExtended[]
|
|
68
|
+
|
|
69
|
+
declare type UserExtended = {
|
|
70
|
+
createdAt: string
|
|
71
|
+
displayName: string
|
|
72
|
+
email: string
|
|
73
|
+
familyName: string
|
|
74
|
+
givenName: string
|
|
75
|
+
id: string
|
|
76
|
+
imageUrl: string
|
|
77
|
+
isCurrentUser: boolean
|
|
78
|
+
middleName: string
|
|
79
|
+
projectId: string
|
|
80
|
+
provider: string
|
|
81
|
+
sanityUserId: string
|
|
82
|
+
updatedAt: string
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export declare function UserSelectMenu(props: UserSelectMenuProps): JSX.Element
|
|
86
|
+
|
|
87
|
+
declare type UserSelectMenuProps = {
|
|
88
|
+
value: string[]
|
|
89
|
+
userList: UserExtended[]
|
|
90
|
+
onAdd: any
|
|
91
|
+
onRemove: any
|
|
92
|
+
onClear: any
|
|
93
|
+
open: boolean
|
|
94
|
+
style?: React_2.CSSProperties
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
declare type Value = any
|
|
98
|
+
|
|
99
|
+
export {}
|
package/package.json
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "A collection of useful Hooks and Components when creating Plugins",
|
|
5
|
-
"
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sanity",
|
|
7
|
+
"sanity-plugin"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://github.com/SimeonGriggs/sanity-plugin-utils#readme",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/SimeonGriggs/sanity-plugin-utils/issues"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git@github.com:SimeonGriggs/sanity-plugin-utils.git"
|
|
16
|
+
},
|
|
6
17
|
"license": "MIT",
|
|
7
|
-
"
|
|
8
|
-
"main": "./lib/cjs/index.js",
|
|
9
|
-
"module": "./lib/esm/index.js",
|
|
10
|
-
"types": "./lib/types/index.d.ts",
|
|
18
|
+
"author": "Simeon Griggs <simeon@sanity.io>",
|
|
11
19
|
"exports": {
|
|
12
20
|
".": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
21
|
+
"types": "./lib/src/index.d.ts",
|
|
22
|
+
"source": "./src/index.ts",
|
|
23
|
+
"import": "./lib/index.esm.js",
|
|
24
|
+
"require": "./lib/index.js",
|
|
25
|
+
"default": "./lib/index.esm.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
16
28
|
},
|
|
29
|
+
"main": "./lib/index.js",
|
|
30
|
+
"module": "./lib/index.esm.js",
|
|
31
|
+
"source": "./src/index.ts",
|
|
32
|
+
"types": "./lib/src/index.d.ts",
|
|
17
33
|
"files": [
|
|
18
34
|
"src",
|
|
19
35
|
"lib",
|
|
@@ -21,56 +37,53 @@
|
|
|
21
37
|
"sanity.json"
|
|
22
38
|
],
|
|
23
39
|
"scripts": {
|
|
40
|
+
"prebuild": "npm run clean && plugin-kit verify-package --silent && pkg-utils",
|
|
41
|
+
"build": "pkg-utils build",
|
|
24
42
|
"clean": "rimraf lib",
|
|
25
|
-
"lint": "eslint .",
|
|
26
|
-
"prebuild": "npm run clean && plugin-kit verify-package --silent",
|
|
27
|
-
"build": "parcel build --no-cache",
|
|
28
|
-
"watch": "parcel watch",
|
|
29
43
|
"link-watch": "plugin-kit link-watch",
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"url": "git+ssh://git@github.com/simeongriggs/sanity-plugin-utils.git"
|
|
35
|
-
},
|
|
36
|
-
"engines": {
|
|
37
|
-
"node": ">=14.0.0"
|
|
44
|
+
"lint": "eslint .",
|
|
45
|
+
"prepare": "husky install",
|
|
46
|
+
"prepublishOnly": "npm run build",
|
|
47
|
+
"watch": "pkg-utils watch"
|
|
38
48
|
},
|
|
39
49
|
"dependencies": {
|
|
40
|
-
"@sanity/icons": "^1.3.
|
|
41
|
-
"@sanity/incompatible-plugin": "^1.0.
|
|
42
|
-
"styled-components": "^5.3.
|
|
50
|
+
"@sanity/icons": "^1.3.6",
|
|
51
|
+
"@sanity/incompatible-plugin": "^1.0.4",
|
|
52
|
+
"styled-components": "^5.3.6"
|
|
43
53
|
},
|
|
44
54
|
"devDependencies": {
|
|
45
|
-
"@
|
|
46
|
-
"@
|
|
47
|
-
"@sanity/
|
|
55
|
+
"@commitlint/cli": "^17.2.0",
|
|
56
|
+
"@commitlint/config-conventional": "^17.2.0",
|
|
57
|
+
"@sanity/pkg-utils": "^1.18.0",
|
|
58
|
+
"@sanity/plugin-kit": "^2.2.0",
|
|
59
|
+
"@sanity/semantic-release-preset": "^2.0.3",
|
|
60
|
+
"@sanity/ui": "1.0.1",
|
|
48
61
|
"@types/styled-components": "^5.1.26",
|
|
49
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
50
|
-
"@typescript-eslint/parser": "^5.
|
|
51
|
-
"eslint": "^8.
|
|
62
|
+
"@typescript-eslint/eslint-plugin": "^5.43.0",
|
|
63
|
+
"@typescript-eslint/parser": "^5.43.0",
|
|
64
|
+
"eslint": "^8.27.0",
|
|
52
65
|
"eslint-config-prettier": "^8.5.0",
|
|
53
66
|
"eslint-config-sanity": "^6.0.0",
|
|
54
67
|
"eslint-plugin-prettier": "^4.2.1",
|
|
55
|
-
"eslint-plugin-react": "^7.31.
|
|
68
|
+
"eslint-plugin-react": "^7.31.10",
|
|
56
69
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
57
|
-
"
|
|
70
|
+
"husky": "^8.0.2",
|
|
71
|
+
"lint-staged": "^13.0.3",
|
|
58
72
|
"prettier": "^2.7.1",
|
|
73
|
+
"prettier-plugin-packagejson": "^2.3.0",
|
|
74
|
+
"react": "^18",
|
|
59
75
|
"rimraf": "^3.0.2",
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"react": "^18.0.0",
|
|
63
|
-
"sanity": "dev-preview || 3.0.0-rc.0"
|
|
76
|
+
"sanity": "^3.0.0",
|
|
77
|
+
"typescript": "^4.9.3"
|
|
64
78
|
},
|
|
65
79
|
"peerDependencies": {
|
|
80
|
+
"@sanity/ui": "1.0.1",
|
|
81
|
+
"react": "^18",
|
|
66
82
|
"react-fast-compare": "^3.2.0",
|
|
67
|
-
"rxjs": "^6.
|
|
68
|
-
"
|
|
69
|
-
"react": "^18.0.0",
|
|
70
|
-
"sanity": "dev-preview || 3.0.0-rc.0"
|
|
83
|
+
"rxjs": "^6.0.0",
|
|
84
|
+
"sanity": "^3.0.0"
|
|
71
85
|
},
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
}
|
|
75
|
-
"homepage": "https://github.com/simeongriggs/sanity-plugin-utils#readme"
|
|
86
|
+
"engines": {
|
|
87
|
+
"node": ">=14"
|
|
88
|
+
}
|
|
76
89
|
}
|
package/lib/cjs/index.js
DELETED
|
@@ -1,330 +0,0 @@
|
|
|
1
|
-
var $k7rGe$react = require("react");
|
|
2
|
-
var $k7rGe$rxjsoperators = require("rxjs/operators");
|
|
3
|
-
var $k7rGe$reactfastcompare = require("react-fast-compare");
|
|
4
|
-
var $k7rGe$sanity = require("sanity");
|
|
5
|
-
var $k7rGe$reactjsxruntime = require("react/jsx-runtime");
|
|
6
|
-
var $k7rGe$sanityui = require("@sanity/ui");
|
|
7
|
-
var $k7rGe$styledcomponents = require("styled-components");
|
|
8
|
-
var $k7rGe$sanityicons = require("@sanity/icons");
|
|
9
|
-
|
|
10
|
-
function $parcel$export(e, n, v, s) {
|
|
11
|
-
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
12
|
-
}
|
|
13
|
-
function $parcel$interopDefault(a) {
|
|
14
|
-
return a && a.__esModule ? a.default : a;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
$parcel$export(module.exports, "useListeningQuery", () => $38e62e17b2ecf1ab$export$3a1bc984843df335);
|
|
18
|
-
$parcel$export(module.exports, "useProjectUsers", () => $9be8b8b7af8d7d37$export$a38963ede7c2ac91);
|
|
19
|
-
$parcel$export(module.exports, "Feedback", () => $aaf4d804384afd00$export$175e500a48a60fd2);
|
|
20
|
-
$parcel$export(module.exports, "Table", () => $acfbfc6ee2363807$export$54ec01a60f47d33d);
|
|
21
|
-
$parcel$export(module.exports, "Row", () => $acfbfc6ee2363807$export$b59bdbef9ce70de2);
|
|
22
|
-
$parcel$export(module.exports, "Cell", () => $acfbfc6ee2363807$export$f6f0c3fe4ec306ea);
|
|
23
|
-
$parcel$export(module.exports, "UserSelectMenu", () => $cce1a432d06a385f$export$4a7d9e0c70b27556);
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const $38e62e17b2ecf1ab$var$DEFAULT_PARAMS = {};
|
|
29
|
-
const $38e62e17b2ecf1ab$var$DEFAULT_OPTIONS = {
|
|
30
|
-
apiVersion: `v2022-05-09`
|
|
31
|
-
};
|
|
32
|
-
const $38e62e17b2ecf1ab$var$DEFAULT_INITIAL_VALUE = null;
|
|
33
|
-
function $38e62e17b2ecf1ab$export$3a1bc984843df335(query, { params: params = $38e62e17b2ecf1ab$var$DEFAULT_PARAMS , options: options = $38e62e17b2ecf1ab$var$DEFAULT_OPTIONS , initialValue: initialValue = $38e62e17b2ecf1ab$var$DEFAULT_INITIAL_VALUE }) {
|
|
34
|
-
const [loading, setLoading] = (0, $k7rGe$react.useState)(true);
|
|
35
|
-
const [error, setError] = (0, $k7rGe$react.useState)(false);
|
|
36
|
-
const [data, setData] = (0, $k7rGe$react.useState)(initialValue);
|
|
37
|
-
const subscription = (0, $k7rGe$react.useRef)(null);
|
|
38
|
-
const documentStore = (0, $k7rGe$sanity.useDocumentStore)();
|
|
39
|
-
(0, $k7rGe$react.useEffect)(()=>{
|
|
40
|
-
if (query) subscription.current = documentStore.listenQuery(query, params, options).pipe((0, $k7rGe$rxjsoperators.distinctUntilChanged)((0, ($parcel$interopDefault($k7rGe$reactfastcompare)))), (0, $k7rGe$rxjsoperators.catchError)((err)=>{
|
|
41
|
-
console.error(err);
|
|
42
|
-
setError(err);
|
|
43
|
-
setLoading(false);
|
|
44
|
-
setData(null);
|
|
45
|
-
return err;
|
|
46
|
-
})).subscribe((documents)=>{
|
|
47
|
-
setData((current)=>(0, ($parcel$interopDefault($k7rGe$reactfastcompare)))(current, documents) ? current : documents);
|
|
48
|
-
setLoading(false);
|
|
49
|
-
setError(false);
|
|
50
|
-
});
|
|
51
|
-
return ()=>subscription?.current?.unsubscribe();
|
|
52
|
-
}, [
|
|
53
|
-
query,
|
|
54
|
-
params,
|
|
55
|
-
options,
|
|
56
|
-
documentStore
|
|
57
|
-
]);
|
|
58
|
-
return {
|
|
59
|
-
data: data,
|
|
60
|
-
loading: loading,
|
|
61
|
-
error: error
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
function $9be8b8b7af8d7d37$export$a38963ede7c2ac91() {
|
|
69
|
-
const { currentUser: currentUser } = (0, $k7rGe$sanity.useWorkspace)();
|
|
70
|
-
const client = (0, $k7rGe$sanity.useClient)();
|
|
71
|
-
const [users, setUsers] = (0, $k7rGe$react.useState)([]);
|
|
72
|
-
(0, $k7rGe$react.useEffect)(()=>{
|
|
73
|
-
const { projectId: projectId } = client.config();
|
|
74
|
-
async function getUser(id) {
|
|
75
|
-
const userDetails = await client.request({
|
|
76
|
-
url: `/projects/${projectId}/users/${id}`
|
|
77
|
-
});
|
|
78
|
-
return userDetails;
|
|
79
|
-
}
|
|
80
|
-
async function getUsersWithRoles() {
|
|
81
|
-
const userRoles = await client.request({
|
|
82
|
-
url: `/projects/${projectId}/acl`
|
|
83
|
-
}).then(async (res)=>Promise.all(res.map(async (user)=>({
|
|
84
|
-
isCurrentUser: user.projectUserId === currentUser?.id,
|
|
85
|
-
...await getUser(user.projectUserId)
|
|
86
|
-
})))).catch((err)=>err);
|
|
87
|
-
setUsers(userRoles);
|
|
88
|
-
}
|
|
89
|
-
if (!users.length) getUsersWithRoles();
|
|
90
|
-
}, [
|
|
91
|
-
client,
|
|
92
|
-
currentUser?.id,
|
|
93
|
-
users.length
|
|
94
|
-
]);
|
|
95
|
-
return users;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
const $aaf4d804384afd00$var$DEFAULT_PROPS = {
|
|
103
|
-
tone: "primary"
|
|
104
|
-
};
|
|
105
|
-
function $aaf4d804384afd00$export$175e500a48a60fd2(props) {
|
|
106
|
-
const { title: title , description: description , icon: icon , tone: tone , children: children } = {
|
|
107
|
-
...$aaf4d804384afd00$var$DEFAULT_PROPS,
|
|
108
|
-
...props
|
|
109
|
-
};
|
|
110
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
|
|
111
|
-
tone: tone,
|
|
112
|
-
padding: 4,
|
|
113
|
-
radius: 3,
|
|
114
|
-
border: true,
|
|
115
|
-
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
|
|
116
|
-
children: [
|
|
117
|
-
icon ? `display icon` : null,
|
|
118
|
-
children ? children : /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
119
|
-
flex: 1,
|
|
120
|
-
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Stack), {
|
|
121
|
-
space: 4,
|
|
122
|
-
children: [
|
|
123
|
-
title ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
|
|
124
|
-
weight: "semibold",
|
|
125
|
-
children: title
|
|
126
|
-
}) : null,
|
|
127
|
-
description ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
|
|
128
|
-
size: 2,
|
|
129
|
-
children: description
|
|
130
|
-
}) : null
|
|
131
|
-
]
|
|
132
|
-
})
|
|
133
|
-
})
|
|
134
|
-
]
|
|
135
|
-
})
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// Wrappers required because of bug with passing down "as" prop
|
|
145
|
-
// https://github.com/styled-components/styled-components/issues/2449
|
|
146
|
-
// Table
|
|
147
|
-
const $acfbfc6ee2363807$var$TableWrapper = (props = {})=>{
|
|
148
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
|
|
149
|
-
as: "table",
|
|
150
|
-
...props
|
|
151
|
-
});
|
|
152
|
-
};
|
|
153
|
-
const $acfbfc6ee2363807$var$StyledTable = (0, ($parcel$interopDefault($k7rGe$styledcomponents)))($acfbfc6ee2363807$var$TableWrapper)(()=>(0, $k7rGe$styledcomponents.css)`
|
|
154
|
-
display: table;
|
|
155
|
-
width: 100%;
|
|
156
|
-
|
|
157
|
-
&:not([hidden]) {
|
|
158
|
-
display: table;
|
|
159
|
-
}
|
|
160
|
-
`);
|
|
161
|
-
function $acfbfc6ee2363807$export$54ec01a60f47d33d(props) {
|
|
162
|
-
const { children: children , ...rest } = props;
|
|
163
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledTable, {
|
|
164
|
-
...rest,
|
|
165
|
-
children: children
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
// Row
|
|
169
|
-
const $acfbfc6ee2363807$var$RowWrapper = (props = {})=>{
|
|
170
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
|
|
171
|
-
as: "tr",
|
|
172
|
-
...props
|
|
173
|
-
});
|
|
174
|
-
};
|
|
175
|
-
const $acfbfc6ee2363807$var$StyledRow = (0, ($parcel$interopDefault($k7rGe$styledcomponents)))($acfbfc6ee2363807$var$RowWrapper)(()=>(0, $k7rGe$styledcomponents.css)`
|
|
176
|
-
display: table-row;
|
|
177
|
-
|
|
178
|
-
&:not([hidden]) {
|
|
179
|
-
display: table-row;
|
|
180
|
-
}
|
|
181
|
-
`);
|
|
182
|
-
function $acfbfc6ee2363807$export$b59bdbef9ce70de2(props) {
|
|
183
|
-
const { children: children , ...rest } = props;
|
|
184
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledRow, {
|
|
185
|
-
...rest,
|
|
186
|
-
children: children
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
// Cell
|
|
190
|
-
const $acfbfc6ee2363807$var$CellWrapper = (props = {})=>{
|
|
191
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Card), {
|
|
192
|
-
as: "td",
|
|
193
|
-
...props
|
|
194
|
-
});
|
|
195
|
-
};
|
|
196
|
-
const $acfbfc6ee2363807$var$StyledCell = (0, ($parcel$interopDefault($k7rGe$styledcomponents)))($acfbfc6ee2363807$var$CellWrapper)(()=>(0, $k7rGe$styledcomponents.css)`
|
|
197
|
-
display: table-cell;
|
|
198
|
-
|
|
199
|
-
&:not([hidden]) {
|
|
200
|
-
display: table-cell;
|
|
201
|
-
}
|
|
202
|
-
`);
|
|
203
|
-
function $acfbfc6ee2363807$export$f6f0c3fe4ec306ea(props) {
|
|
204
|
-
const { children: children , ...rest } = props;
|
|
205
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledCell, {
|
|
206
|
-
...rest,
|
|
207
|
-
children: children
|
|
208
|
-
});
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
function $cce1a432d06a385f$var$searchUsers(users, searchString) {
|
|
218
|
-
return users.filter((user)=>{
|
|
219
|
-
const displayName = (user.displayName || "").toLowerCase();
|
|
220
|
-
if (displayName.startsWith(searchString)) return true;
|
|
221
|
-
const givenName = (user.givenName || "").toLowerCase();
|
|
222
|
-
if (givenName.startsWith(searchString)) return true;
|
|
223
|
-
const middleName = (user.middleName || "").toLowerCase();
|
|
224
|
-
if (middleName.startsWith(searchString)) return true;
|
|
225
|
-
const familyName = (user.familyName || "").toLowerCase();
|
|
226
|
-
if (familyName.startsWith(searchString)) return true;
|
|
227
|
-
return false;
|
|
228
|
-
});
|
|
229
|
-
}
|
|
230
|
-
function $cce1a432d06a385f$export$4a7d9e0c70b27556(props) {
|
|
231
|
-
const { value: value = [] , userList: userList = [] , onAdd: onAdd , onRemove: onRemove , onClear: onClear , style: style = {} } = props;
|
|
232
|
-
const [searchString, setSearchString] = (0, ($parcel$interopDefault($k7rGe$react))).useState("");
|
|
233
|
-
const searchResults = $cce1a432d06a385f$var$searchUsers(userList || [], searchString);
|
|
234
|
-
const me = userList.find((u)=>u.isCurrentUser);
|
|
235
|
-
const meAssigned = me && value.includes(me.id);
|
|
236
|
-
// Focus input on open
|
|
237
|
-
// TODO: Fix focus, it gets immediately taken away
|
|
238
|
-
const input = (0, $k7rGe$react.useRef)();
|
|
239
|
-
// useEffect(() => {
|
|
240
|
-
// if (open && input?.current) {
|
|
241
|
-
// input.current.focus()
|
|
242
|
-
// }
|
|
243
|
-
// }, [open])
|
|
244
|
-
const handleSearchChange = (event)=>{
|
|
245
|
-
setSearchString(event.target.value);
|
|
246
|
-
};
|
|
247
|
-
const handleSelect = (isChecked, user)=>{
|
|
248
|
-
if (!isChecked) {
|
|
249
|
-
if (onAdd) onAdd(user.id);
|
|
250
|
-
} else if (onRemove) onRemove(user.id);
|
|
251
|
-
};
|
|
252
|
-
const handleAssignMyself = ()=>{
|
|
253
|
-
if (me && onAdd) onAdd(me.id);
|
|
254
|
-
};
|
|
255
|
-
const handleUnassignMyself = ()=>{
|
|
256
|
-
if (me && onRemove) onRemove(me.id);
|
|
257
|
-
};
|
|
258
|
-
const handleClearAssigneesClick = ()=>{
|
|
259
|
-
if (onClear) onClear();
|
|
260
|
-
};
|
|
261
|
-
return /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Menu), {
|
|
262
|
-
style: style,
|
|
263
|
-
children: [
|
|
264
|
-
meAssigned ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
|
|
265
|
-
tone: "caution",
|
|
266
|
-
disabled: !me,
|
|
267
|
-
onClick: handleUnassignMyself,
|
|
268
|
-
icon: (0, $k7rGe$sanityicons.RemoveCircleIcon),
|
|
269
|
-
text: "Unassign myself"
|
|
270
|
-
}) : /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
|
|
271
|
-
tone: "positive",
|
|
272
|
-
onClick: handleAssignMyself,
|
|
273
|
-
icon: (0, $k7rGe$sanityicons.AddCircleIcon),
|
|
274
|
-
text: "Assign myself"
|
|
275
|
-
}),
|
|
276
|
-
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
|
|
277
|
-
tone: "critical",
|
|
278
|
-
disabled: value.length === 0,
|
|
279
|
-
onClick: handleClearAssigneesClick,
|
|
280
|
-
icon: (0, $k7rGe$sanityicons.RestoreIcon),
|
|
281
|
-
text: "Clear assignees"
|
|
282
|
-
}),
|
|
283
|
-
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
284
|
-
padding: 1,
|
|
285
|
-
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.TextInput), {
|
|
286
|
-
// @ts-ignore TODO: Satisfy ref
|
|
287
|
-
ref: input,
|
|
288
|
-
onChange: handleSearchChange,
|
|
289
|
-
placeholder: "Search members",
|
|
290
|
-
value: searchString
|
|
291
|
-
})
|
|
292
|
-
}),
|
|
293
|
-
searchString && searchResults?.length === 0 && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
|
|
294
|
-
disabled: true,
|
|
295
|
-
text: "No matches"
|
|
296
|
-
}),
|
|
297
|
-
searchResults && searchResults.map((user)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
|
|
298
|
-
pressed: value.includes(user.id),
|
|
299
|
-
onClick: ()=>handleSelect(value.indexOf(user.id) > -1, user),
|
|
300
|
-
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
|
|
301
|
-
align: "center",
|
|
302
|
-
children: [
|
|
303
|
-
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanity.UserAvatar), {
|
|
304
|
-
user: user,
|
|
305
|
-
size: 1
|
|
306
|
-
}),
|
|
307
|
-
/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
|
|
308
|
-
paddingX: 2,
|
|
309
|
-
flex: 1,
|
|
310
|
-
children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
|
|
311
|
-
children: user.displayName
|
|
312
|
-
})
|
|
313
|
-
}),
|
|
314
|
-
user.isCurrentUser && /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Badge), {
|
|
315
|
-
fontSize: 1,
|
|
316
|
-
tone: "positive",
|
|
317
|
-
mode: "outline",
|
|
318
|
-
children: "Me"
|
|
319
|
-
})
|
|
320
|
-
]
|
|
321
|
-
})
|
|
322
|
-
}, user.id))
|
|
323
|
-
]
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
//# sourceMappingURL=index.js.map
|
package/lib/cjs/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/hooks/useListeningQuery.tsx","src/hooks/useProjectUsers.tsx","src/components/Feedback.tsx","src/components/Table.tsx","src/components/UserSelectMenu/index.tsx"],"sourcesContent":["export {useListeningQuery} from './hooks/useListeningQuery'\nexport {useProjectUsers} from './hooks/useProjectUsers'\n\nexport {Feedback} from './components/Feedback'\nexport {Table, Row, Cell} from './components/Table'\nexport {UserSelectMenu} from './components/UserSelectMenu/index'\n","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\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers(): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient()\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":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
|
package/lib/esm/index.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
import $gGrEF$react, {useState as $gGrEF$useState, useRef as $gGrEF$useRef, useEffect as $gGrEF$useEffect} from "react";
|
|
2
|
-
import {distinctUntilChanged as $gGrEF$distinctUntilChanged, catchError as $gGrEF$catchError} from "rxjs/operators";
|
|
3
|
-
import $gGrEF$reactfastcompare from "react-fast-compare";
|
|
4
|
-
import {useDocumentStore as $gGrEF$useDocumentStore, useWorkspace as $gGrEF$useWorkspace, useClient as $gGrEF$useClient, UserAvatar as $gGrEF$UserAvatar} from "sanity";
|
|
5
|
-
import {jsx as $gGrEF$jsx, jsxs as $gGrEF$jsxs} from "react/jsx-runtime";
|
|
6
|
-
import {Card as $gGrEF$Card, Flex as $gGrEF$Flex, Box as $gGrEF$Box, Stack as $gGrEF$Stack, Text as $gGrEF$Text, Menu as $gGrEF$Menu, MenuItem as $gGrEF$MenuItem, TextInput as $gGrEF$TextInput, Badge as $gGrEF$Badge} from "@sanity/ui";
|
|
7
|
-
import $gGrEF$styledcomponents, {css as $gGrEF$css} from "styled-components";
|
|
8
|
-
import {RemoveCircleIcon as $gGrEF$RemoveCircleIcon, AddCircleIcon as $gGrEF$AddCircleIcon, RestoreIcon as $gGrEF$RestoreIcon} from "@sanity/icons";
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const $2130373f599d0e67$var$DEFAULT_PARAMS = {};
|
|
15
|
-
const $2130373f599d0e67$var$DEFAULT_OPTIONS = {
|
|
16
|
-
apiVersion: `v2022-05-09`
|
|
17
|
-
};
|
|
18
|
-
const $2130373f599d0e67$var$DEFAULT_INITIAL_VALUE = null;
|
|
19
|
-
function $2130373f599d0e67$export$3a1bc984843df335(query, { params: params = $2130373f599d0e67$var$DEFAULT_PARAMS , options: options = $2130373f599d0e67$var$DEFAULT_OPTIONS , initialValue: initialValue = $2130373f599d0e67$var$DEFAULT_INITIAL_VALUE }) {
|
|
20
|
-
const [loading, setLoading] = (0, $gGrEF$useState)(true);
|
|
21
|
-
const [error, setError] = (0, $gGrEF$useState)(false);
|
|
22
|
-
const [data, setData] = (0, $gGrEF$useState)(initialValue);
|
|
23
|
-
const subscription = (0, $gGrEF$useRef)(null);
|
|
24
|
-
const documentStore = (0, $gGrEF$useDocumentStore)();
|
|
25
|
-
(0, $gGrEF$useEffect)(()=>{
|
|
26
|
-
if (query) subscription.current = documentStore.listenQuery(query, params, options).pipe((0, $gGrEF$distinctUntilChanged)((0, $gGrEF$reactfastcompare)), (0, $gGrEF$catchError)((err)=>{
|
|
27
|
-
console.error(err);
|
|
28
|
-
setError(err);
|
|
29
|
-
setLoading(false);
|
|
30
|
-
setData(null);
|
|
31
|
-
return err;
|
|
32
|
-
})).subscribe((documents)=>{
|
|
33
|
-
setData((current)=>(0, $gGrEF$reactfastcompare)(current, documents) ? current : documents);
|
|
34
|
-
setLoading(false);
|
|
35
|
-
setError(false);
|
|
36
|
-
});
|
|
37
|
-
return ()=>subscription?.current?.unsubscribe();
|
|
38
|
-
}, [
|
|
39
|
-
query,
|
|
40
|
-
params,
|
|
41
|
-
options,
|
|
42
|
-
documentStore
|
|
43
|
-
]);
|
|
44
|
-
return {
|
|
45
|
-
data: data,
|
|
46
|
-
loading: loading,
|
|
47
|
-
error: error
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
function $b47a7d3337e6d4c7$export$a38963ede7c2ac91() {
|
|
55
|
-
const { currentUser: currentUser } = (0, $gGrEF$useWorkspace)();
|
|
56
|
-
const client = (0, $gGrEF$useClient)();
|
|
57
|
-
const [users, setUsers] = (0, $gGrEF$useState)([]);
|
|
58
|
-
(0, $gGrEF$useEffect)(()=>{
|
|
59
|
-
const { projectId: projectId } = client.config();
|
|
60
|
-
async function getUser(id) {
|
|
61
|
-
const userDetails = await client.request({
|
|
62
|
-
url: `/projects/${projectId}/users/${id}`
|
|
63
|
-
});
|
|
64
|
-
return userDetails;
|
|
65
|
-
}
|
|
66
|
-
async function getUsersWithRoles() {
|
|
67
|
-
const userRoles = await client.request({
|
|
68
|
-
url: `/projects/${projectId}/acl`
|
|
69
|
-
}).then(async (res)=>Promise.all(res.map(async (user)=>({
|
|
70
|
-
isCurrentUser: user.projectUserId === currentUser?.id,
|
|
71
|
-
...await getUser(user.projectUserId)
|
|
72
|
-
})))).catch((err)=>err);
|
|
73
|
-
setUsers(userRoles);
|
|
74
|
-
}
|
|
75
|
-
if (!users.length) getUsersWithRoles();
|
|
76
|
-
}, [
|
|
77
|
-
client,
|
|
78
|
-
currentUser?.id,
|
|
79
|
-
users.length
|
|
80
|
-
]);
|
|
81
|
-
return users;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const $e183d660634d2ba0$var$DEFAULT_PROPS = {
|
|
89
|
-
tone: "primary"
|
|
90
|
-
};
|
|
91
|
-
function $e183d660634d2ba0$export$175e500a48a60fd2(props) {
|
|
92
|
-
const { title: title , description: description , icon: icon , tone: tone , children: children } = {
|
|
93
|
-
...$e183d660634d2ba0$var$DEFAULT_PROPS,
|
|
94
|
-
...props
|
|
95
|
-
};
|
|
96
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
97
|
-
tone: tone,
|
|
98
|
-
padding: 4,
|
|
99
|
-
radius: 3,
|
|
100
|
-
border: true,
|
|
101
|
-
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
102
|
-
children: [
|
|
103
|
-
icon ? `display icon` : null,
|
|
104
|
-
children ? children : /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
105
|
-
flex: 1,
|
|
106
|
-
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Stack), {
|
|
107
|
-
space: 4,
|
|
108
|
-
children: [
|
|
109
|
-
title ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
110
|
-
weight: "semibold",
|
|
111
|
-
children: title
|
|
112
|
-
}) : null,
|
|
113
|
-
description ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
114
|
-
size: 2,
|
|
115
|
-
children: description
|
|
116
|
-
}) : null
|
|
117
|
-
]
|
|
118
|
-
})
|
|
119
|
-
})
|
|
120
|
-
]
|
|
121
|
-
})
|
|
122
|
-
});
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
// Wrappers required because of bug with passing down "as" prop
|
|
131
|
-
// https://github.com/styled-components/styled-components/issues/2449
|
|
132
|
-
// Table
|
|
133
|
-
const $32ee6db03f46d8dd$var$TableWrapper = (props = {})=>{
|
|
134
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
135
|
-
as: "table",
|
|
136
|
-
...props
|
|
137
|
-
});
|
|
138
|
-
};
|
|
139
|
-
const $32ee6db03f46d8dd$var$StyledTable = (0, $gGrEF$styledcomponents)($32ee6db03f46d8dd$var$TableWrapper)(()=>(0, $gGrEF$css)`
|
|
140
|
-
display: table;
|
|
141
|
-
width: 100%;
|
|
142
|
-
|
|
143
|
-
&:not([hidden]) {
|
|
144
|
-
display: table;
|
|
145
|
-
}
|
|
146
|
-
`);
|
|
147
|
-
function $32ee6db03f46d8dd$export$54ec01a60f47d33d(props) {
|
|
148
|
-
const { children: children , ...rest } = props;
|
|
149
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)($32ee6db03f46d8dd$var$StyledTable, {
|
|
150
|
-
...rest,
|
|
151
|
-
children: children
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
// Row
|
|
155
|
-
const $32ee6db03f46d8dd$var$RowWrapper = (props = {})=>{
|
|
156
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
157
|
-
as: "tr",
|
|
158
|
-
...props
|
|
159
|
-
});
|
|
160
|
-
};
|
|
161
|
-
const $32ee6db03f46d8dd$var$StyledRow = (0, $gGrEF$styledcomponents)($32ee6db03f46d8dd$var$RowWrapper)(()=>(0, $gGrEF$css)`
|
|
162
|
-
display: table-row;
|
|
163
|
-
|
|
164
|
-
&:not([hidden]) {
|
|
165
|
-
display: table-row;
|
|
166
|
-
}
|
|
167
|
-
`);
|
|
168
|
-
function $32ee6db03f46d8dd$export$b59bdbef9ce70de2(props) {
|
|
169
|
-
const { children: children , ...rest } = props;
|
|
170
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)($32ee6db03f46d8dd$var$StyledRow, {
|
|
171
|
-
...rest,
|
|
172
|
-
children: children
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
// Cell
|
|
176
|
-
const $32ee6db03f46d8dd$var$CellWrapper = (props = {})=>{
|
|
177
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Card), {
|
|
178
|
-
as: "td",
|
|
179
|
-
...props
|
|
180
|
-
});
|
|
181
|
-
};
|
|
182
|
-
const $32ee6db03f46d8dd$var$StyledCell = (0, $gGrEF$styledcomponents)($32ee6db03f46d8dd$var$CellWrapper)(()=>(0, $gGrEF$css)`
|
|
183
|
-
display: table-cell;
|
|
184
|
-
|
|
185
|
-
&:not([hidden]) {
|
|
186
|
-
display: table-cell;
|
|
187
|
-
}
|
|
188
|
-
`);
|
|
189
|
-
function $32ee6db03f46d8dd$export$f6f0c3fe4ec306ea(props) {
|
|
190
|
-
const { children: children , ...rest } = props;
|
|
191
|
-
return /*#__PURE__*/ (0, $gGrEF$jsx)($32ee6db03f46d8dd$var$StyledCell, {
|
|
192
|
-
...rest,
|
|
193
|
-
children: children
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
function $c0010e70fdfb1cf2$var$searchUsers(users, searchString) {
|
|
204
|
-
return users.filter((user)=>{
|
|
205
|
-
const displayName = (user.displayName || "").toLowerCase();
|
|
206
|
-
if (displayName.startsWith(searchString)) return true;
|
|
207
|
-
const givenName = (user.givenName || "").toLowerCase();
|
|
208
|
-
if (givenName.startsWith(searchString)) return true;
|
|
209
|
-
const middleName = (user.middleName || "").toLowerCase();
|
|
210
|
-
if (middleName.startsWith(searchString)) return true;
|
|
211
|
-
const familyName = (user.familyName || "").toLowerCase();
|
|
212
|
-
if (familyName.startsWith(searchString)) return true;
|
|
213
|
-
return false;
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
function $c0010e70fdfb1cf2$export$4a7d9e0c70b27556(props) {
|
|
217
|
-
const { value: value = [] , userList: userList = [] , onAdd: onAdd , onRemove: onRemove , onClear: onClear , style: style = {} } = props;
|
|
218
|
-
const [searchString, setSearchString] = (0, $gGrEF$react).useState("");
|
|
219
|
-
const searchResults = $c0010e70fdfb1cf2$var$searchUsers(userList || [], searchString);
|
|
220
|
-
const me = userList.find((u)=>u.isCurrentUser);
|
|
221
|
-
const meAssigned = me && value.includes(me.id);
|
|
222
|
-
// Focus input on open
|
|
223
|
-
// TODO: Fix focus, it gets immediately taken away
|
|
224
|
-
const input = (0, $gGrEF$useRef)();
|
|
225
|
-
// useEffect(() => {
|
|
226
|
-
// if (open && input?.current) {
|
|
227
|
-
// input.current.focus()
|
|
228
|
-
// }
|
|
229
|
-
// }, [open])
|
|
230
|
-
const handleSearchChange = (event)=>{
|
|
231
|
-
setSearchString(event.target.value);
|
|
232
|
-
};
|
|
233
|
-
const handleSelect = (isChecked, user)=>{
|
|
234
|
-
if (!isChecked) {
|
|
235
|
-
if (onAdd) onAdd(user.id);
|
|
236
|
-
} else if (onRemove) onRemove(user.id);
|
|
237
|
-
};
|
|
238
|
-
const handleAssignMyself = ()=>{
|
|
239
|
-
if (me && onAdd) onAdd(me.id);
|
|
240
|
-
};
|
|
241
|
-
const handleUnassignMyself = ()=>{
|
|
242
|
-
if (me && onRemove) onRemove(me.id);
|
|
243
|
-
};
|
|
244
|
-
const handleClearAssigneesClick = ()=>{
|
|
245
|
-
if (onClear) onClear();
|
|
246
|
-
};
|
|
247
|
-
return /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Menu), {
|
|
248
|
-
style: style,
|
|
249
|
-
children: [
|
|
250
|
-
meAssigned ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
|
|
251
|
-
tone: "caution",
|
|
252
|
-
disabled: !me,
|
|
253
|
-
onClick: handleUnassignMyself,
|
|
254
|
-
icon: (0, $gGrEF$RemoveCircleIcon),
|
|
255
|
-
text: "Unassign myself"
|
|
256
|
-
}) : /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
|
|
257
|
-
tone: "positive",
|
|
258
|
-
onClick: handleAssignMyself,
|
|
259
|
-
icon: (0, $gGrEF$AddCircleIcon),
|
|
260
|
-
text: "Assign myself"
|
|
261
|
-
}),
|
|
262
|
-
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
|
|
263
|
-
tone: "critical",
|
|
264
|
-
disabled: value.length === 0,
|
|
265
|
-
onClick: handleClearAssigneesClick,
|
|
266
|
-
icon: (0, $gGrEF$RestoreIcon),
|
|
267
|
-
text: "Clear assignees"
|
|
268
|
-
}),
|
|
269
|
-
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
270
|
-
padding: 1,
|
|
271
|
-
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$TextInput), {
|
|
272
|
-
// @ts-ignore TODO: Satisfy ref
|
|
273
|
-
ref: input,
|
|
274
|
-
onChange: handleSearchChange,
|
|
275
|
-
placeholder: "Search members",
|
|
276
|
-
value: searchString
|
|
277
|
-
})
|
|
278
|
-
}),
|
|
279
|
-
searchString && searchResults?.length === 0 && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
|
|
280
|
-
disabled: true,
|
|
281
|
-
text: "No matches"
|
|
282
|
-
}),
|
|
283
|
-
searchResults && searchResults.map((user)=>/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
|
|
284
|
-
pressed: value.includes(user.id),
|
|
285
|
-
onClick: ()=>handleSelect(value.indexOf(user.id) > -1, user),
|
|
286
|
-
children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
|
|
287
|
-
align: "center",
|
|
288
|
-
children: [
|
|
289
|
-
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$UserAvatar), {
|
|
290
|
-
user: user,
|
|
291
|
-
size: 1
|
|
292
|
-
}),
|
|
293
|
-
/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
|
|
294
|
-
paddingX: 2,
|
|
295
|
-
flex: 1,
|
|
296
|
-
children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
|
|
297
|
-
children: user.displayName
|
|
298
|
-
})
|
|
299
|
-
}),
|
|
300
|
-
user.isCurrentUser && /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Badge), {
|
|
301
|
-
fontSize: 1,
|
|
302
|
-
tone: "positive",
|
|
303
|
-
mode: "outline",
|
|
304
|
-
children: "Me"
|
|
305
|
-
})
|
|
306
|
-
]
|
|
307
|
-
})
|
|
308
|
-
}, user.id))
|
|
309
|
-
]
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
export {$2130373f599d0e67$export$3a1bc984843df335 as useListeningQuery, $b47a7d3337e6d4c7$export$a38963ede7c2ac91 as useProjectUsers, $e183d660634d2ba0$export$175e500a48a60fd2 as Feedback, $32ee6db03f46d8dd$export$54ec01a60f47d33d as Table, $32ee6db03f46d8dd$export$b59bdbef9ce70de2 as Row, $32ee6db03f46d8dd$export$f6f0c3fe4ec306ea as Cell, $c0010e70fdfb1cf2$export$4a7d9e0c70b27556 as UserSelectMenu};
|
|
317
|
-
//# sourceMappingURL=index.js.map
|
package/lib/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"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","sources":["src/index.ts","src/hooks/useListeningQuery.tsx","src/hooks/useProjectUsers.tsx","src/components/Feedback.tsx","src/components/Table.tsx","src/components/UserSelectMenu/index.tsx"],"sourcesContent":["export {useListeningQuery} from './hooks/useListeningQuery'\nexport {useProjectUsers} from './hooks/useProjectUsers'\n\nexport {Feedback} from './components/Feedback'\nexport {Table, Row, Cell} from './components/Table'\nexport {UserSelectMenu} from './components/UserSelectMenu/index'\n","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\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers(): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient()\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":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
|
package/lib/types/index.d.ts
DELETED
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import React, { PropsWithChildren } from "react";
|
|
2
|
-
import { CardTone, CardProps } from "@sanity/ui";
|
|
3
|
-
type Params = Record<string, string | number | boolean | string[]>;
|
|
4
|
-
interface ListenQueryOptions {
|
|
5
|
-
tag?: string;
|
|
6
|
-
apiVersion?: string;
|
|
7
|
-
}
|
|
8
|
-
type Value = any;
|
|
9
|
-
interface Config<V> {
|
|
10
|
-
params: Params;
|
|
11
|
-
options?: ListenQueryOptions;
|
|
12
|
-
initialValue?: null | V;
|
|
13
|
-
}
|
|
14
|
-
interface Return<V> {
|
|
15
|
-
loading: boolean;
|
|
16
|
-
error: boolean;
|
|
17
|
-
data: null | V;
|
|
18
|
-
initialValue?: Value;
|
|
19
|
-
}
|
|
20
|
-
export function useListeningQuery<V>(query: string | {
|
|
21
|
-
fetch: string;
|
|
22
|
-
listen: string;
|
|
23
|
-
}, { params, options, initialValue, }: Config<V>): Return<V>;
|
|
24
|
-
type UserExtended = {
|
|
25
|
-
createdAt: string;
|
|
26
|
-
displayName: string;
|
|
27
|
-
email: string;
|
|
28
|
-
familyName: string;
|
|
29
|
-
givenName: string;
|
|
30
|
-
id: string;
|
|
31
|
-
imageUrl: string;
|
|
32
|
-
isCurrentUser: boolean;
|
|
33
|
-
middleName: string;
|
|
34
|
-
projectId: string;
|
|
35
|
-
provider: string;
|
|
36
|
-
sanityUserId: string;
|
|
37
|
-
updatedAt: string;
|
|
38
|
-
};
|
|
39
|
-
export function useProjectUsers(): UserExtended[];
|
|
40
|
-
type FeedbackChildren = {
|
|
41
|
-
children?: React.ReactNode;
|
|
42
|
-
title?: never;
|
|
43
|
-
description?: never;
|
|
44
|
-
};
|
|
45
|
-
type FeedbackTextProps = {
|
|
46
|
-
title?: string;
|
|
47
|
-
description?: React.ReactNode;
|
|
48
|
-
children?: never;
|
|
49
|
-
};
|
|
50
|
-
type FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {
|
|
51
|
-
tone?: CardTone;
|
|
52
|
-
icon?: React.ReactNode;
|
|
53
|
-
};
|
|
54
|
-
export function Feedback(props: FeedbackProps): JSX.Element;
|
|
55
|
-
type TableProps = PropsWithChildren<CardProps>;
|
|
56
|
-
export function Table(props: TableProps): JSX.Element;
|
|
57
|
-
type TableRowProps = PropsWithChildren<CardProps>;
|
|
58
|
-
export function Row(props: TableRowProps): JSX.Element;
|
|
59
|
-
type TableCellProps = PropsWithChildren<CardProps>;
|
|
60
|
-
export function Cell(props: TableCellProps): JSX.Element;
|
|
61
|
-
type UserSelectMenuProps = {
|
|
62
|
-
value: string[];
|
|
63
|
-
userList: UserExtended[];
|
|
64
|
-
onAdd: any;
|
|
65
|
-
onRemove: any;
|
|
66
|
-
onClear: any;
|
|
67
|
-
open: boolean;
|
|
68
|
-
style?: React.CSSProperties;
|
|
69
|
-
};
|
|
70
|
-
export function UserSelectMenu(props: UserSelectMenuProps): JSX.Element;
|
|
71
|
-
|
|
72
|
-
//# sourceMappingURL=index.d.ts.map
|
package/lib/types/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":";;AAMA,cAAc,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC,CAAA;AAElE;IACE,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,aAAa,GAAG,CAAA;AAEhB,iBAAiB,CAAC;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,kBAAkB,CAAA;IAC5B,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,CAAA;CACxB;AAED,iBAAiB,CAAC;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,IAAI,EAAE,IAAI,GAAG,CAAC,CAAA;IACd,YAAY,CAAC,EAAE,KAAK,CAAA;CACrB;AAMD,kCAAkC,CAAC,EACjC,KAAK,EAAE,MAAM,GAAG;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAC,EAC/C,EACE,MAAuB,EACvB,OAAyB,EACzB,YAAoC,GACrC,EAAE,OAAO,CAAC,CAAC,GACX,OAAO,CAAC,CAAC,CAiCX;ACrED,oBAA2B;IACzB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,OAAO,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAeD,mCAAmC,YAAY,EAAE,CAwChD;ACrED,wBAAwB;IACtB,QAAQ,CAAC,EAAE,MAAM,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,WAAW,CAAC,EAAE,KAAK,CAAA;CACpB,CAAA;AAED,yBAAyB;IACvB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,SAAS,CAAA;IAC7B,QAAQ,CAAC,EAAE,KAAK,CAAA;CACjB,CAAA;AAED,qBAAqB,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,GAAG;IAC5D,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,SAAS,CAAA;CACvB,CAAA;AAMD,yBAAyB,KAAK,EAAE,aAAa,eAoB5C;ACpBD,kBAAkB,kBAAkB,SAAS,CAAC,CAAA;AAE9C,sBAAsB,KAAK,EAAE,UAAU,eAItC;AAkBD,qBAAqB,kBAAkB,SAAS,CAAC,CAAA;AAEjD,oBAAoB,KAAK,EAAE,aAAa,eAIvC;AAkBD,sBAAsB,kBAAkB,SAAS,CAAC,CAAA;AAElD,qBAAqB,KAAK,EAAE,cAAc,eAIzC;ACxDD,2BAA2B;IACzB,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,KAAK,EAAE,GAAG,CAAA;IACV,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,GAAG,CAAA;IACZ,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,aAAa,CAAA;CAC5B,CAAA;AAED,+BAA+B,KAAK,EAAE,mBAAmB,eAoGxD","sources":["src/src/hooks/useListeningQuery.tsx","src/src/hooks/useProjectUsers.tsx","src/src/components/Feedback.tsx","src/src/components/Table.tsx","src/src/components/UserSelectMenu/index.tsx","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,"export {useListeningQuery} from './hooks/useListeningQuery'\nexport {useProjectUsers} from './hooks/useProjectUsers'\n\nexport {Feedback} from './components/Feedback'\nexport {Table, Row, Cell} from './components/Table'\nexport {UserSelectMenu} from './components/UserSelectMenu/index'\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
|