sanity-plugin-utils 0.0.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -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) => <Profile key={user.id} {...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, Row and Cell
108
+ ### `Table`, `Row` and `Cell`
105
109
 
106
- These components are all @sanity/ui Card's but with their HTML DOM elements and CSS updated to output and behave like tables.
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.
@@ -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
@@ -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": "0.0.3",
3
+ "version": "1.0.0",
4
4
  "description": "A collection of useful Hooks and Components when creating Plugins",
5
- "author": "Simeon Griggs <simeon@sanity.io>",
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
- "source": "./src/index.ts",
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
- "require": "./lib/cjs/index.js",
14
- "default": "./lib/esm/index.js"
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
- "prepublishOnly": "npm run build"
31
- },
32
- "repository": {
33
- "type": "git",
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.4",
41
- "@sanity/incompatible-plugin": "^1.0.0",
42
- "styled-components": "^5.3.5"
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
- "@parcel/packager-ts": "^2.7.0",
46
- "@parcel/transformer-typescript-types": "^2.7.0",
47
- "@sanity/plugin-kit": "^1.1.0",
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.1.16",
59
+ "@sanity/semantic-release-preset": "^2.0.2",
60
+ "@sanity/ui": "1.0.0-beta.32",
48
61
  "@types/styled-components": "^5.1.26",
49
- "@typescript-eslint/eslint-plugin": "^5.36.1",
50
- "@typescript-eslint/parser": "^5.36.1",
51
- "eslint": "^8.23.0",
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.1",
68
+ "eslint-plugin-react": "^7.31.10",
56
69
  "eslint-plugin-react-hooks": "^4.6.0",
57
- "parcel": "^2.7.0",
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
- "typescript": "4.7.4",
61
- "@sanity/ui": "1.0.0-beta.32",
62
- "react": "^18.0.0",
63
- "sanity": "dev-preview || 3.0.0-rc.0"
76
+ "sanity": "3.0.0-rc.2",
77
+ "typescript": "^4.9.3"
64
78
  },
65
79
  "peerDependencies": {
66
- "react-fast-compare": "^3.2.0",
67
- "rxjs": "^6.5.3",
68
80
  "@sanity/ui": "1.0.0-beta.32",
69
- "react": "^18.0.0",
70
- "sanity": "dev-preview || 3.0.0-rc.0"
71
- },
72
- "bugs": {
73
- "url": "https://github.com/simeongriggs/sanity-plugin-utils/issues"
81
+ "react": "^18",
82
+ "react-fast-compare": "^3.2.0",
83
+ "rxjs": "^6.0.0",
84
+ "sanity": "dev-preview || 3.0.0-rc.2"
74
85
  },
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
@@ -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
@@ -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":"../../"}
@@ -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
@@ -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":"../../"}