sanity-plugin-utils 1.7.0 → 2.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/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2025 Simeon Griggs
3
+ Copyright (c) 2026 Sanity.io
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,9 +1,3 @@
1
- ## Installation
2
-
3
- ```sh
4
- npm install sanity-plugin-utils
5
- ```
6
-
7
1
  # sanity-plugin-utils
8
2
 
9
3
  Handy hooks and clever components for Sanity Studio v3.
@@ -32,13 +26,10 @@ The `data` variable will be constantly updated as changes are made to the data r
32
26
  import {useListeningQuery} from 'sanity-plugin-utils'
33
27
 
34
28
  export default function DocumentList() {
35
- const {data, loading, error} = useListeningQuery<SanityDocument[]>(
36
- `*[_type == $type]`,
37
- {
38
- params: {type: 'pet'},
39
- initialValue: [],
40
- }
41
- )
29
+ const {data, loading, error} = useListeningQuery<SanityDocument[]>(`*[_type == $type]`, {
30
+ params: {type: 'pet'},
31
+ initialValue: [],
32
+ })
42
33
 
43
34
  if (loading) {
44
35
  return <Spinner />
@@ -114,10 +105,7 @@ export default function PetPics(pet: SanityDocument) {
114
105
  <ul>
115
106
  {pet.pics.map((pic) => (
116
107
  <li key={pic._key}>
117
- <img
118
- src={builder.source(pic).width(200).height(200).url()}
119
- alt={pic.altText}
120
- />
108
+ <img src={builder.source(pic).width(200).height(200).url()} alt={pic.altText} />
121
109
  </li>
122
110
  ))}
123
111
  </ul>
@@ -149,42 +137,22 @@ Component for consistently displaying feedback in a card with a title, text and
149
137
  import {Feedback, useListeningQuery} from 'sanity-plugin-utils'
150
138
 
151
139
  export default function DocumentList() {
152
- const {data, loading, error} = useListeningQuery(
153
- `*[_type == "task" && !complete]`
154
- )
140
+ const {data, loading, error} = useListeningQuery(`*[_type == "task" && !complete]`)
155
141
 
156
142
  if (loading) {
157
- return (
158
- <Feedback
159
- tone="primary"
160
- title="Please hold"
161
- description="Fetching tasks..."
162
- />
163
- )
143
+ return <Feedback tone="primary" title="Please hold" description="Fetching tasks..." />
164
144
  }
165
145
 
166
146
  if (error) {
167
147
  return (
168
- <Feedback
169
- tone="critical"
170
- title="There was an error"
171
- description="Please try again later"
172
- />
148
+ <Feedback tone="critical" title="There was an error" description="Please try again later" />
173
149
  )
174
150
  }
175
151
 
176
152
  return data?.length > 0 ? (
177
- <Feedback
178
- tone="caution"
179
- title="There are unfinished tasks"
180
- description="Please get to work"
181
- />
153
+ <Feedback tone="caution" title="There are unfinished tasks" description="Please get to work" />
182
154
  ) : (
183
- <Feedback
184
- tone="success"
185
- title="You're all done"
186
- description="You should feel accomplished"
187
- />
155
+ <Feedback tone="success" title="You're all done" description="You should feel accomplished" />
188
156
  )
189
157
  }
190
158
  ```
@@ -0,0 +1,95 @@
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+ import { CardProps, CardTone } from "@sanity/ui";
3
+ import { PropsWithChildren, ReactNode } from "react";
4
+ import { ImageUrlBuilder, ListenQueryOptions, ListenQueryParams, SourceClientOptions } from "sanity";
5
+ import { SanityImageSource } from "@sanity/asset-utils";
6
+ type FeedbackChildren = {
7
+ children?: ReactNode;
8
+ title?: never;
9
+ description?: never;
10
+ };
11
+ type FeedbackTextProps = {
12
+ title?: string;
13
+ description?: ReactNode;
14
+ children?: never;
15
+ };
16
+ type FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {
17
+ tone?: CardTone;
18
+ icon?: ReactNode;
19
+ };
20
+ declare function Feedback(props: FeedbackProps): _$react_jsx_runtime0.JSX.Element;
21
+ type TableProps = PropsWithChildren<CardProps>;
22
+ declare function Table(props: TableProps): _$react_jsx_runtime0.JSX.Element;
23
+ type TableRowProps = PropsWithChildren<CardProps>;
24
+ declare function Row(props: TableRowProps): _$react_jsx_runtime0.JSX.Element;
25
+ type TableCellProps = PropsWithChildren<CardProps & {
26
+ colSpan?: number;
27
+ rowSpan?: number;
28
+ }>;
29
+ declare function Cell(props: TableCellProps): _$react_jsx_runtime0.JSX.Element;
30
+ type UserRole = {
31
+ name: string;
32
+ title: string;
33
+ };
34
+ type UserExtended = {
35
+ createdAt: string;
36
+ displayName: string;
37
+ email: string;
38
+ familyName: string;
39
+ givenName: string;
40
+ id: string;
41
+ imageUrl: string;
42
+ isCurrentUser: boolean;
43
+ middleName: string;
44
+ projectId: string;
45
+ provider: string;
46
+ roles?: UserRole[];
47
+ sanityUserId: string;
48
+ updatedAt: string;
49
+ };
50
+ type HookConfig = {
51
+ apiVersion?: string;
52
+ };
53
+ declare function useProjectUsers({
54
+ apiVersion
55
+ }: HookConfig): UserExtended[];
56
+ type Labels = {
57
+ addMe?: string;
58
+ removeMe?: string;
59
+ clear?: string;
60
+ searchPlaceholder?: string;
61
+ notFound?: string;
62
+ };
63
+ type UserSelectMenuProps = {
64
+ value: string[];
65
+ userList: UserExtended[];
66
+ onAdd: (userId: string) => void;
67
+ onRemove: (userId: string) => void;
68
+ onClear: () => void;
69
+ labels?: Labels;
70
+ style?: React.CSSProperties;
71
+ };
72
+ declare function UserSelectMenu(props: UserSelectMenuProps): _$react_jsx_runtime0.JSX.Element;
73
+ declare function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null;
74
+ declare function useImageUrlBuilderImage(source: SanityImageSource, clientOptions: SourceClientOptions): ImageUrlBuilder | null;
75
+ interface Config<V> {
76
+ params?: ListenQueryParams;
77
+ options?: ListenQueryOptions;
78
+ initialValue?: null | V;
79
+ }
80
+ interface Return<V> {
81
+ loading: boolean;
82
+ error: unknown;
83
+ data: V | null;
84
+ }
85
+ declare function useListeningQuery<V>(query: string | {
86
+ fetch: string;
87
+ listen: string;
88
+ }, {
89
+ params,
90
+ options,
91
+ initialValue
92
+ }: Config<V>): Return<V>;
93
+ declare function useOpenInNewPane(id?: string, type?: string): () => void;
94
+ export { Cell, Feedback, Row, Table, type UserExtended, UserSelectMenu, useImageUrlBuilder, useImageUrlBuilderImage, useListeningQuery, useOpenInNewPane, useProjectUsers };
95
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/hooks/useProjectUsers.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx"],"mappings":";;;;;KAGK,gBAAA;EACH,QAAA,GAAW,SAAA;EACX,KAAA;EACA,WAAA;AAAA;AAAA,KAGG,iBAAA;EACH,KAAA;EACA,WAAA,GAAc,SAAA;EACd,QAAA;AAAA;AAAA,KAGG,aAAA,IAAiB,gBAAA,GAAmB,iBAAA;EACvC,IAAA,GAAO,QAAA;EACP,IAAA,GAAO,SAAA;AAAA;AAAA,iBAOO,QAAA,CAAS,KAAA,EAAO,aAAA,GAAa,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KCCxC,UAAA,GAAa,iBAAA,CAAkB,SAAA;AAAA,iBAEpB,KAAA,CAAM,KAAA,EAAO,UAAA,GAAU,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KAqBlC,aAAA,GAAgB,iBAAA,CAAkB,SAAA;AAAA,iBAEvB,GAAA,CAAI,KAAA,EAAO,aAAA,GAAa,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KAqBnC,cAAA,GAAiB,iBAAA,CACpB,SAAA;EACE,OAAA;EACA,OAAA;AAAA;AAAA,iBAIY,IAAA,CAAK,KAAA,EAAO,cAAA,GAAc,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,KC3ErC,QAAA;EACH,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,YAAA;EACV,SAAA;EACA,WAAA;EACA,KAAA;EACA,UAAA;EACA,SAAA;EACA,EAAA;EACA,QAAA;EACA,aAAA;EACA,UAAA;EACA,SAAA;EACA,QAAA;EACA,KAAA,GAAQ,QAAA;EACR,YAAA;EACA,SAAA;AAAA;AAAA,KASG,UAAA;EACH,UAAA;AAAA;AAAA,iBAYc,eAAA,CAAA;EAAiB;AAAA,GAAa,UAAA,GAAa,YAAA;AAAA,KCtBtD,MAAA;EACH,KAAA;EACA,QAAA;EACA,KAAA;EACA,iBAAA;EACA,QAAA;AAAA;AAAA,KAGG,mBAAA;EACH,KAAA;EACA,QAAA,EAAU,YAAA;EACV,KAAA,GAAQ,MAAA;EACR,QAAA,GAAW,MAAA;EACX,OAAA;EACA,MAAA,GAAS,MAAA;EACT,KAAA,GAAQ,KAAA,CAAM,aAAA;AAAA;AAAA,iBAWA,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAmB,oBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBC3CzC,kBAAA,CAAmB,aAAA,EAAe,mBAAA,GAAsB,eAAA;AAAA,iBCCxD,uBAAA,CACd,MAAA,EAAQ,iBAAA,EACR,aAAA,EAAe,mBAAA,GACd,eAAA;AAAA,UCHO,MAAA;EACR,MAAA,GAAS,iBAAA;EACT,OAAA,GAAU,kBAAA;EACV,YAAA,UAAsB,CAAA;AAAA;AAAA,UAGd,MAAA;EACR,OAAA;EACA,KAAA;EACA,IAAA,EAAM,CAAA;AAAA;AAAA,iBAYQ,iBAAA,GAAA,CACd,KAAA;EAAiB,KAAA;EAAe,MAAA;AAAA;EAE9B,MAAA;EACA,OAAA;EACA;AAAA,GACC,MAAA,CAAO,CAAA,IACT,MAAA,CAAO,CAAA;AAAA,iBC9BM,gBAAA,CAAiB,EAAA,WAAa,IAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,343 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { c } from "react/compiler-runtime";
3
+ import { Card, Box, Stack, Text, Flex, MenuItem, Badge, Menu, TextInput } from "@sanity/ui";
4
+ import { styled, css } from "styled-components";
5
+ import { RemoveCircleIcon, AddCircleIcon, RestoreIcon } from "@sanity/icons";
6
+ import { useState, useRef, useEffect, useContext } from "react";
7
+ import { UserAvatar, useClient, useDocumentStore, useWorkspace } from "sanity";
8
+ import { createImageUrlBuilder } from "@sanity/image-url";
9
+ import isEqual from "react-fast-compare";
10
+ import { distinctUntilChanged, catchError } from "rxjs/operators";
11
+ import { RouterContext } from "sanity/router";
12
+ import { usePaneRouter } from "sanity/structure";
13
+ const DEFAULT_PROPS = {
14
+ tone: "primary"
15
+ };
16
+ function Feedback(props) {
17
+ const $ = c(12);
18
+ let t0;
19
+ $[0] !== props ? (t0 = {
20
+ ...DEFAULT_PROPS,
21
+ ...props
22
+ }, $[0] = props, $[1] = t0) : t0 = $[1];
23
+ const {
24
+ title,
25
+ description,
26
+ icon,
27
+ tone,
28
+ children
29
+ } = t0, t1 = icon ? "display icon" : null;
30
+ let t2;
31
+ $[2] !== children || $[3] !== description || $[4] !== title ? (t2 = children || /* @__PURE__ */ jsx(Box, { flex: 1, children: /* @__PURE__ */ jsxs(Stack, { gap: 4, children: [
32
+ title ? /* @__PURE__ */ jsx(Text, { weight: "semibold", children: title }) : null,
33
+ description ? /* @__PURE__ */ jsx(Text, { size: 2, children: description }) : null
34
+ ] }) }), $[2] = children, $[3] = description, $[4] = title, $[5] = t2) : t2 = $[5];
35
+ let t3;
36
+ $[6] !== t1 || $[7] !== t2 ? (t3 = /* @__PURE__ */ jsxs(Flex, { children: [
37
+ t1,
38
+ t2
39
+ ] }), $[6] = t1, $[7] = t2, $[8] = t3) : t3 = $[8];
40
+ let t4;
41
+ return $[9] !== t3 || $[10] !== tone ? (t4 = /* @__PURE__ */ jsx(Card, { tone, padding: 4, radius: 3, border: !0, children: t3 }), $[9] = t3, $[10] = tone, $[11] = t4) : t4 = $[11], t4;
42
+ }
43
+ const TableWrapper = (t0) => {
44
+ const $ = c(4);
45
+ let t1;
46
+ $[0] !== t0 ? (t1 = t0 === void 0 ? {} : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
47
+ const props = t1;
48
+ let t2;
49
+ return $[2] !== props ? (t2 = /* @__PURE__ */ jsx(Card, { as: "table", ...props }), $[2] = props, $[3] = t2) : t2 = $[3], t2;
50
+ }, StyledTable = /* @__PURE__ */ styled(TableWrapper).withConfig({
51
+ displayName: "StyledTable",
52
+ componentId: "sc-1po0jg7-0"
53
+ })(() => css`
54
+ display: table;
55
+ width: 100%;
56
+ border-collapse: collapse;
57
+
58
+ &:not([hidden]) {
59
+ display: table;
60
+ border-collapse: collapse;
61
+ }
62
+ `);
63
+ function Table(props) {
64
+ const $ = c(6);
65
+ let children, rest;
66
+ $[0] !== props ? ({
67
+ children,
68
+ ...rest
69
+ } = props, $[0] = props, $[1] = children, $[2] = rest) : (children = $[1], rest = $[2]);
70
+ let t0;
71
+ return $[3] !== children || $[4] !== rest ? (t0 = /* @__PURE__ */ jsx(StyledTable, { ...rest, children }), $[3] = children, $[4] = rest, $[5] = t0) : t0 = $[5], t0;
72
+ }
73
+ const RowWrapper = (t0) => {
74
+ const $ = c(4);
75
+ let t1;
76
+ $[0] !== t0 ? (t1 = t0 === void 0 ? {} : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
77
+ const props = t1;
78
+ let t2;
79
+ return $[2] !== props ? (t2 = /* @__PURE__ */ jsx(Card, { as: "tr", ...props }), $[2] = props, $[3] = t2) : t2 = $[3], t2;
80
+ }, StyledRow = /* @__PURE__ */ styled(RowWrapper).withConfig({
81
+ displayName: "StyledRow",
82
+ componentId: "sc-1po0jg7-1"
83
+ })(() => css`
84
+ display: table-row;
85
+
86
+ &:not([hidden]) {
87
+ display: table-row;
88
+ }
89
+ `);
90
+ function Row(props) {
91
+ const $ = c(6);
92
+ let children, rest;
93
+ $[0] !== props ? ({
94
+ children,
95
+ ...rest
96
+ } = props, $[0] = props, $[1] = children, $[2] = rest) : (children = $[1], rest = $[2]);
97
+ let t0;
98
+ return $[3] !== children || $[4] !== rest ? (t0 = /* @__PURE__ */ jsx(StyledRow, { ...rest, children }), $[3] = children, $[4] = rest, $[5] = t0) : t0 = $[5], t0;
99
+ }
100
+ const CellWrapper = (t0) => {
101
+ const $ = c(4);
102
+ let t1;
103
+ $[0] !== t0 ? (t1 = t0 === void 0 ? {} : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
104
+ const props = t1;
105
+ let t2;
106
+ return $[2] !== props ? (t2 = /* @__PURE__ */ jsx(Card, { as: "td", ...props }), $[2] = props, $[3] = t2) : t2 = $[3], t2;
107
+ }, StyledCell = /* @__PURE__ */ styled(CellWrapper).withConfig({
108
+ displayName: "StyledCell",
109
+ componentId: "sc-1po0jg7-2"
110
+ })(() => css`
111
+ display: table-cell;
112
+
113
+ &:not([hidden]) {
114
+ display: table-cell;
115
+ }
116
+ `);
117
+ function Cell(props) {
118
+ const $ = c(6);
119
+ let children, rest;
120
+ $[0] !== props ? ({
121
+ children,
122
+ ...rest
123
+ } = props, $[0] = props, $[1] = children, $[2] = rest) : (children = $[1], rest = $[2]);
124
+ let t0;
125
+ return $[3] !== children || $[4] !== rest ? (t0 = /* @__PURE__ */ jsx(StyledCell, { ...rest, children }), $[3] = children, $[4] = rest, $[5] = t0) : t0 = $[5], t0;
126
+ }
127
+ function searchUsers(users, searchString) {
128
+ return users.filter((user) => !!((user.displayName || "").toLowerCase().startsWith(searchString) || (user.givenName || "").toLowerCase().startsWith(searchString) || (user.middleName || "").toLowerCase().startsWith(searchString) || (user.familyName || "").toLowerCase().startsWith(searchString)));
129
+ }
130
+ const LABELS = {
131
+ addMe: "Assign myself",
132
+ removeMe: "Unassign myself",
133
+ clear: "Clear assignees",
134
+ searchPlaceholder: "Search users",
135
+ notFound: "No users found"
136
+ };
137
+ function UserSelectMenu(props) {
138
+ const $ = c(42), {
139
+ value,
140
+ userList,
141
+ onAdd,
142
+ onRemove,
143
+ onClear,
144
+ style: t0
145
+ } = props;
146
+ let t1;
147
+ $[0] !== t0 ? (t1 = t0 === void 0 ? {} : t0, $[0] = t0, $[1] = t1) : t1 = $[1];
148
+ const style = t1;
149
+ let t2;
150
+ $[2] !== props.labels ? (t2 = props?.labels ? {
151
+ ...LABELS,
152
+ ...props.labels
153
+ } : LABELS, $[2] = props.labels, $[3] = t2) : t2 = $[3];
154
+ const labels = t2, [searchString, setSearchString] = useState(""), searchResults = searchUsers(userList || [], searchString);
155
+ let me, t3;
156
+ $[4] !== userList || $[5] !== value ? (me = userList.find(_temp$1), t3 = me && value.includes(me.id), $[4] = userList, $[5] = value, $[6] = me, $[7] = t3) : (me = $[6], t3 = $[7]);
157
+ const meAssigned = t3, input = useRef(null);
158
+ let t4;
159
+ $[8] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t4 = (event) => {
160
+ setSearchString(event.target.value);
161
+ }, $[8] = t4) : t4 = $[8];
162
+ const handleSearchChange = t4;
163
+ let t5;
164
+ $[9] !== onAdd || $[10] !== onRemove ? (t5 = (isChecked, user) => {
165
+ isChecked ? onRemove && onRemove(user.id) : onAdd && onAdd(user.id);
166
+ }, $[9] = onAdd, $[10] = onRemove, $[11] = t5) : t5 = $[11];
167
+ const handleSelect = t5;
168
+ let t6;
169
+ $[12] !== me || $[13] !== onAdd ? (t6 = () => {
170
+ me && onAdd && onAdd(me.id);
171
+ }, $[12] = me, $[13] = onAdd, $[14] = t6) : t6 = $[14];
172
+ const handleAssignMyself = t6;
173
+ let t7;
174
+ $[15] !== me || $[16] !== onRemove ? (t7 = () => {
175
+ me && onRemove && onRemove(me.id);
176
+ }, $[15] = me, $[16] = onRemove, $[17] = t7) : t7 = $[17];
177
+ const handleUnassignMyself = t7;
178
+ let t8;
179
+ $[18] !== onClear ? (t8 = () => {
180
+ onClear && onClear();
181
+ }, $[18] = onClear, $[19] = t8) : t8 = $[19];
182
+ const handleClearAssigneesClick = t8, T0 = Menu;
183
+ let t9;
184
+ $[20] !== handleAssignMyself || $[21] !== handleUnassignMyself || $[22] !== labels.addMe || $[23] !== labels.removeMe || $[24] !== me || $[25] !== meAssigned ? (t9 = meAssigned ? /* @__PURE__ */ jsx(MenuItem, { tone: "caution", disabled: !me, onClick: handleUnassignMyself, icon: RemoveCircleIcon, text: labels.removeMe }) : /* @__PURE__ */ jsx(MenuItem, { tone: "positive", onClick: handleAssignMyself, icon: AddCircleIcon, text: labels.addMe }), $[20] = handleAssignMyself, $[21] = handleUnassignMyself, $[22] = labels.addMe, $[23] = labels.removeMe, $[24] = me, $[25] = meAssigned, $[26] = t9) : t9 = $[26];
185
+ const t10 = value.length === 0;
186
+ let t11;
187
+ $[27] !== handleClearAssigneesClick || $[28] !== labels.clear || $[29] !== t10 ? (t11 = /* @__PURE__ */ jsx(MenuItem, { tone: "critical", disabled: t10, onClick: handleClearAssigneesClick, icon: RestoreIcon, text: labels.clear }), $[27] = handleClearAssigneesClick, $[28] = labels.clear, $[29] = t10, $[30] = t11) : t11 = $[30];
188
+ let t12;
189
+ $[31] !== labels.searchPlaceholder || $[32] !== searchString ? (t12 = /* @__PURE__ */ jsx(Box, { padding: 1, children: /* @__PURE__ */ jsx(TextInput, { ref: input, onChange: handleSearchChange, placeholder: labels.searchPlaceholder, value: searchString }) }), $[31] = labels.searchPlaceholder, $[32] = searchString, $[33] = t12) : t12 = $[33];
190
+ const t13 = searchString && searchResults?.length === 0 && /* @__PURE__ */ jsx(MenuItem, { disabled: !0, text: labels.notFound }), t14 = searchResults && searchResults.map((user_0) => /* @__PURE__ */ jsx(MenuItem, { pressed: value.includes(user_0.id), onClick: () => handleSelect(value.indexOf(user_0.id) > -1, user_0), children: /* @__PURE__ */ jsxs(Flex, { align: "center", children: [
191
+ /* @__PURE__ */ jsx(UserAvatar, { user: user_0, size: 1 }),
192
+ /* @__PURE__ */ jsx(Box, { paddingX: 2, flex: 1, children: /* @__PURE__ */ jsx(Text, { children: user_0.displayName }) }),
193
+ user_0.isCurrentUser && /* @__PURE__ */ jsx(Badge, { fontSize: 1, tone: "positive", children: "Me" })
194
+ ] }) }, user_0.id));
195
+ let t15;
196
+ return $[34] !== T0 || $[35] !== style || $[36] !== t11 || $[37] !== t12 || $[38] !== t13 || $[39] !== t14 || $[40] !== t9 ? (t15 = /* @__PURE__ */ jsxs(T0, { style, children: [
197
+ t9,
198
+ t11,
199
+ t12,
200
+ t13,
201
+ t14
202
+ ] }), $[34] = T0, $[35] = style, $[36] = t11, $[37] = t12, $[38] = t13, $[39] = t14, $[40] = t9, $[41] = t15) : t15 = $[41], t15;
203
+ }
204
+ function _temp$1(u) {
205
+ return u.isCurrentUser;
206
+ }
207
+ function useImageUrlBuilder(clientOptions) {
208
+ const $ = c(2), client = useClient(clientOptions);
209
+ let t0;
210
+ return $[0] !== client ? (t0 = createImageUrlBuilder(client), $[0] = client, $[1] = t0) : t0 = $[1], t0;
211
+ }
212
+ function useImageUrlBuilderImage(source, clientOptions) {
213
+ const $ = c(3), builder = useImageUrlBuilder(clientOptions);
214
+ let t0;
215
+ return $[0] !== builder || $[1] !== source ? (t0 = source && builder ? builder.image(source) : null, $[0] = builder, $[1] = source, $[2] = t0) : t0 = $[2], t0;
216
+ }
217
+ const DEFAULT_PARAMS = {}, DEFAULT_OPTIONS = {
218
+ apiVersion: "v2023-05-01"
219
+ }, DEFAULT_INITIAL_VALUE = null;
220
+ function useParams(params) {
221
+ const $ = c(4);
222
+ let t0;
223
+ $[0] !== params ? (t0 = JSON.stringify(params || {}), $[0] = params, $[1] = t0) : t0 = $[1];
224
+ const stringifiedParams = t0;
225
+ let t1;
226
+ return $[2] !== stringifiedParams ? (t1 = JSON.parse(stringifiedParams), $[2] = stringifiedParams, $[3] = t1) : t1 = $[3], t1;
227
+ }
228
+ function useListeningQuery(query, t0) {
229
+ const $ = c(11), {
230
+ params: t1,
231
+ options: t2,
232
+ initialValue: t3
233
+ } = t0, params = t1 === void 0 ? DEFAULT_PARAMS : t1, options = t2 === void 0 ? DEFAULT_OPTIONS : t2, initialValue = t3 === void 0 ? DEFAULT_INITIAL_VALUE : t3, [loading, setLoading] = useState(!0), [error, setError] = useState(null), [data, setData] = useState(initialValue), memoParams = useParams(params), memoOptions = useParams(options), subscription = useRef(null), documentStore = useDocumentStore();
234
+ let t4, t5;
235
+ $[0] !== documentStore || $[1] !== error || $[2] !== memoOptions || $[3] !== memoParams || $[4] !== query ? (t4 = () => {
236
+ if (query && !error && !subscription.current)
237
+ try {
238
+ subscription.current = documentStore.listenQuery(query, memoParams, memoOptions).pipe(distinctUntilChanged(isEqual), catchError((err_0) => (console.error(err_0), setError(err_0), setLoading(!1), setData(null), err_0))).subscribe((documents) => {
239
+ setData((current) => isEqual(current, documents) ? current : documents), setLoading(!1), setError(null);
240
+ });
241
+ } catch (t62) {
242
+ const err = t62;
243
+ console.error(err), setLoading(!1), setError(err);
244
+ }
245
+ return error && subscription.current && subscription.current.unsubscribe(), () => {
246
+ subscription.current && (subscription?.current?.unsubscribe(), subscription.current = null);
247
+ };
248
+ }, t5 = [query, error, memoParams, memoOptions, documentStore], $[0] = documentStore, $[1] = error, $[2] = memoOptions, $[3] = memoParams, $[4] = query, $[5] = t4, $[6] = t5) : (t4 = $[5], t5 = $[6]), useEffect(t4, t5);
249
+ let t6;
250
+ return $[7] !== data || $[8] !== error || $[9] !== loading ? (t6 = {
251
+ data,
252
+ loading,
253
+ error
254
+ }, $[7] = data, $[8] = error, $[9] = loading, $[10] = t6) : t6 = $[10], t6;
255
+ }
256
+ function useOpenInNewPane(id, type) {
257
+ const $ = c(6), routerContext = useContext(RouterContext), {
258
+ routerPanesState,
259
+ groupIndex
260
+ } = usePaneRouter();
261
+ let t0;
262
+ return $[0] !== groupIndex || $[1] !== id || $[2] !== routerContext || $[3] !== routerPanesState || $[4] !== type ? (t0 = () => {
263
+ if (!routerContext || !id || !type)
264
+ return;
265
+ const panes = [...routerPanesState];
266
+ panes.splice(groupIndex + 1, 0, [{
267
+ id,
268
+ params: {
269
+ type
270
+ }
271
+ }]);
272
+ const href = routerContext.resolvePathFromState({
273
+ panes
274
+ });
275
+ routerContext.navigateUrl({
276
+ path: href
277
+ });
278
+ }, $[0] = groupIndex, $[1] = id, $[2] = routerContext, $[3] = routerPanesState, $[4] = type, $[5] = t0) : t0 = $[5], t0;
279
+ }
280
+ function chunkArray(array, size) {
281
+ const chunks = [];
282
+ for (let i = 0; i < array.length; i += size)
283
+ chunks.push(array.slice(i, i + size));
284
+ return chunks;
285
+ }
286
+ function useProjectUsers(t0) {
287
+ const $ = c(11), {
288
+ apiVersion
289
+ } = t0, {
290
+ currentUser
291
+ } = useWorkspace(), t1 = apiVersion ?? "2023-01-01";
292
+ let t2;
293
+ $[0] !== t1 ? (t2 = {
294
+ apiVersion: t1
295
+ }, $[0] = t1, $[1] = t2) : t2 = $[1];
296
+ const client = useClient(t2);
297
+ let t3;
298
+ $[2] === /* @__PURE__ */ Symbol.for("react.memo_cache_sentinel") ? (t3 = [], $[2] = t3) : t3 = $[2];
299
+ const [users, setUsers] = useState(t3);
300
+ let t4;
301
+ $[3] !== client || $[4] !== currentUser?.id || $[5] !== users.length ? (t4 = () => {
302
+ const {
303
+ projectId
304
+ } = client.config(), getUsersWithRoles = async function() {
305
+ try {
306
+ const aclData = await client.request({
307
+ url: `/projects/${projectId}/acl`
308
+ }), userIds = aclData.map(_temp), userIdChunks = chunkArray(userIds, 200), usersWithRoles = (await Promise.all(userIdChunks.map((chunk) => client.request({
309
+ url: `/projects/${projectId}/users/${chunk.join(",")}`
310
+ })))).flat().map((user_0) => {
311
+ const userRoles = aclData.find((aclUser) => aclUser.projectUserId === user_0.id)?.roles || [];
312
+ return Object.assign(user_0, {
313
+ isCurrentUser: user_0.id === currentUser?.id,
314
+ roles: userRoles
315
+ });
316
+ });
317
+ setUsers(usersWithRoles);
318
+ } catch (t52) {
319
+ console.error("Failed to fetch users:", t52);
320
+ }
321
+ };
322
+ users.length || getUsersWithRoles();
323
+ }, $[3] = client, $[4] = currentUser?.id, $[5] = users.length, $[6] = t4) : t4 = $[6];
324
+ const t5 = currentUser?.id;
325
+ let t6;
326
+ return $[7] !== client || $[8] !== t5 || $[9] !== users.length ? (t6 = [client, t5, users.length], $[7] = client, $[8] = t5, $[9] = users.length, $[10] = t6) : t6 = $[10], useEffect(t4, t6), users;
327
+ }
328
+ function _temp(user) {
329
+ return user.projectUserId;
330
+ }
331
+ export {
332
+ Cell,
333
+ Feedback,
334
+ Row,
335
+ Table,
336
+ UserSelectMenu,
337
+ useImageUrlBuilder,
338
+ useImageUrlBuilderImage,
339
+ useListeningQuery,
340
+ useOpenInNewPane,
341
+ useProjectUsers
342
+ };
343
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx","../src/hooks/useProjectUsers.tsx"],"sourcesContent":["import {Box, Card, Flex, Stack, Text, type CardTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackChildren = {\n children?: ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {\n ...DEFAULT_PROPS,\n ...props,\n }\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 gap={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 {Card, type CardProps} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\nimport {css, styled} from 'styled-components'\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 () => css`\n display: table;\n width: 100%;\n border-collapse: collapse;\n\n &:not([hidden]) {\n display: table;\n border-collapse: collapse;\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 () => 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 () => css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `,\n)\n\ntype TableCellProps = PropsWithChildren<\n CardProps & {\n colSpan?: number\n rowSpan?: number\n }\n>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {Badge, Box, Flex, Menu, MenuItem, Text, TextInput} from '@sanity/ui'\nimport {type ChangeEvent, useRef, useState} from 'react'\nimport {UserAvatar} from 'sanity'\n\nimport {type 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 Labels = {\n addMe?: string\n removeMe?: string\n clear?: string\n searchPlaceholder?: string\n notFound?: string\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: (userId: string) => void\n onRemove: (userId: string) => void\n onClear: () => void\n labels?: Labels\n style?: React.CSSProperties\n}\n\nconst LABELS: Labels = {\n addMe: 'Assign myself',\n removeMe: 'Unassign myself',\n clear: 'Clear assignees',\n searchPlaceholder: 'Search users',\n notFound: 'No users found',\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value, userList, onAdd, onRemove, onClear, style = {}} = props\n const labels = props?.labels ? {...LABELS, ...props.labels} : LABELS\n\n const [searchString, setSearchString] = useState('')\n const searchResults = searchUsers(userList || [], searchString)\n\n const me = userList.find((u) => u.isCurrentUser)\n const meAssigned = me && value.includes(me.id)\n\n // Focus input on open\n // TODO: Fix focus, it gets immediately taken away\n const input = useRef<HTMLInputElement>(null)\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }\n\n const handleSelect = (isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }\n\n const handleAssignMyself = () => {\n if (me && onAdd) onAdd(me.id)\n }\n\n const handleUnassignMyself = () => {\n if (me && onRemove) onRemove(me.id)\n }\n\n const handleClearAssigneesClick = () => {\n if (onClear) onClear()\n }\n\n return (\n <Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\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\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\nimport {useClient} from 'sanity'\n\nexport function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null {\n const client = useClient(clientOptions)\n const builder = useMemo(() => createImageUrlBuilder(client), [client])\n\n return builder\n}\n","import type {SanityImageSource} from '@sanity/asset-utils'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\n\nimport {useImageUrlBuilder} from './useImageUrlBuilder'\n\nexport function useImageUrlBuilderImage(\n source: SanityImageSource,\n clientOptions: SourceClientOptions,\n): ImageUrlBuilder | null {\n const builder = useImageUrlBuilder(clientOptions)\n const image = useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])\n\n return image\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport {Subscription} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, type ListenQueryParams, useDocumentStore} from 'sanity'\n\ninterface Config<V> {\n params?: ListenQueryParams\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: unknown\n data: V | null\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2023-05-01`}\nconst DEFAULT_INITIAL_VALUE = null\n\nfunction useParams(params?: null | ListenQueryParams | ListenQueryOptions): ListenQueryParams {\n const stringifiedParams = useMemo(() => JSON.stringify(params || {}), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\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<unknown>(null)\n const [data, setData] = useState<Return<V>['data']>(initialValue)\n const memoParams = useParams(params)\n const memoOptions = useParams(options)\n\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\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) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react-hooks-js/set-state-in-effect -- sync error handling for subscription setup\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }, [query, error, memoParams, memoOptions, documentStore])\n\n return {data, loading, error}\n}\n","import {useCallback, useContext} from 'react'\nimport {RouterContext} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {useEffect, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\n\ntype UserRole = {\n name: string\n title: string\n}\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 roles?: UserRole[]\n sanityUserId: string\n updatedAt: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n// Custom hook to fetch user details and roles in batches\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState<UserExtended[]>([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n"],"names":["DEFAULT_PROPS","tone","Feedback","props","$","_c","t0","title","description","icon","children","t1","t2","t3","t4","TableWrapper","undefined","StyledTable","styled","withConfig","displayName","componentId","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","users","searchString","filter","user","toLowerCase","startsWith","givenName","middleName","familyName","LABELS","addMe","removeMe","clear","searchPlaceholder","notFound","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","labels","setSearchString","useState","searchResults","me","find","_temp","includes","id","meAssigned","input","useRef","Symbol","for","event","target","handleSearchChange","t5","isChecked","handleSelect","t6","handleAssignMyself","t7","handleUnassignMyself","t8","handleClearAssigneesClick","T0","Menu","t9","RemoveCircleIcon","AddCircleIcon","t10","length","t11","RestoreIcon","t12","t13","t14","map","user_0","indexOf","isCurrentUser","t15","u","useImageUrlBuilder","clientOptions","client","useClient","createImageUrlBuilder","useImageUrlBuilderImage","source","builder","image","DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useParams","params","JSON","stringify","stringifiedParams","parse","useListeningQuery","query","options","initialValue","loading","setLoading","error","setError","data","setData","memoParams","memoOptions","subscription","documentStore","useDocumentStore","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err_0","console","err","subscribe","documents","unsubscribe","useEffect","useOpenInNewPane","type","routerContext","useContext","RouterContext","routerPanesState","groupIndex","usePaneRouter","panes","splice","href","resolvePathFromState","navigateUrl","path","chunkArray","array","size","chunks","i","push","slice","useProjectUsers","currentUser","useWorkspace","setUsers","projectId","config","getUsersWithRoles","aclData","request","url","userIds","userIdChunks","usersWithRoles","Promise","all","chunk","join","flat","userRoles","aclUser","projectUserId","roles","Object","assign"],"mappings":"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"}