@flexkit/studio 0.2.31 → 0.2.32
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/dist/{chat-page-JS5SJ4OG.js → chat-page-7UB3BMBF.js} +3 -3
- package/dist/{chat-page-JS5SJ4OG.js.map → chat-page-7UB3BMBF.js.map} +1 -1
- package/dist/{chunk-KVYQ3O4F.js → chunk-2NQ2RZ2M.js} +3 -3
- package/dist/{chunk-KVYQ3O4F.js.map → chunk-2NQ2RZ2M.js.map} +1 -1
- package/dist/{chunk-57X5WRMY.js → chunk-5AJXR47U.js} +2 -2
- package/dist/{chunk-57X5WRMY.js.map → chunk-5AJXR47U.js.map} +1 -1
- package/dist/{chunk-SZ3DX7XD.js → chunk-AY2RXJWS.js} +2 -2
- package/dist/{chunk-SZ3DX7XD.js.map → chunk-AY2RXJWS.js.map} +1 -1
- package/dist/{chunk-6GXNHR6H.js → chunk-GSGPULRL.js} +2 -2
- package/dist/{chunk-6GXNHR6H.js.map → chunk-GSGPULRL.js.map} +1 -1
- package/dist/{chunk-XLFAJBPN.js → chunk-HZOD2HOF.js} +3 -3
- package/dist/{chunk-XLFAJBPN.js.map → chunk-HZOD2HOF.js.map} +1 -1
- package/dist/{chunk-LF4B2TQI.js → chunk-JAPZBEBZ.js} +9 -9
- package/dist/chunk-JAPZBEBZ.js.map +1 -0
- package/dist/{chunk-W74OKBZG.js → chunk-JWJJZVP3.js} +2 -2
- package/dist/{chunk-W74OKBZG.js.map → chunk-JWJJZVP3.js.map} +1 -1
- package/dist/{chunk-D76P4TER.js → chunk-KR27GOH6.js} +3 -3
- package/dist/{chunk-D76P4TER.js.map → chunk-KR27GOH6.js.map} +1 -1
- package/dist/{chunk-GQTWNWT7.js → chunk-MRHZN4G4.js} +2 -2
- package/dist/{chunk-GQTWNWT7.js.map → chunk-MRHZN4G4.js.map} +1 -1
- package/dist/{chunk-5NQ47SWN.js → chunk-NNISUDZX.js} +3 -3
- package/dist/{chunk-5NQ47SWN.js.map → chunk-NNISUDZX.js.map} +1 -1
- package/dist/{chunk-T4SEZXGL.js → chunk-ONB3FWK5.js} +2 -2
- package/dist/{chunk-T4SEZXGL.js.map → chunk-ONB3FWK5.js.map} +1 -1
- package/dist/{chunk-OMYDXVWS.js → chunk-R2O4WC3H.js} +3 -3
- package/dist/{chunk-OMYDXVWS.js.map → chunk-R2O4WC3H.js.map} +1 -1
- package/dist/{chunk-GXQSNOGM.js → chunk-XV7U33XQ.js} +3 -3
- package/dist/{chunk-GXQSNOGM.js.map → chunk-XV7U33XQ.js.map} +1 -1
- package/dist/{entry-PFXS633U.js → entry-CA2QAEHN.js} +2 -2
- package/dist/{entry-PFXS633U.js.map → entry-CA2QAEHN.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{list-EWWRLK4I.js → list-Q2KAEJ26.js} +3 -3
- package/dist/{list-EWWRLK4I.js.map → list-Q2KAEJ26.js.map} +1 -1
- package/dist/{list-R7SJFXCX.js → list-UMMVRYVD.js} +2 -2
- package/dist/{list-R7SJFXCX.js.map → list-UMMVRYVD.js.map} +1 -1
- package/dist/pages-KZ66JVNU.js +5 -0
- package/dist/pages-KZ66JVNU.js.map +1 -0
- package/dist/{plugin-pages-X3V2VPAU.js → plugin-pages-SR2WSUKZ.js} +2 -2
- package/dist/{plugin-pages-X3V2VPAU.js.map → plugin-pages-SR2WSUKZ.js.map} +1 -1
- package/dist/record-links-3WZGSVFU.js +2 -0
- package/dist/{record-links-VH2TPCK4.js.map → record-links-3WZGSVFU.js.map} +1 -1
- package/dist/{root-OJ4UFMRX.js → root-2VBLPRG7.js} +2 -2
- package/dist/{root-OJ4UFMRX.js.map → root-2VBLPRG7.js.map} +1 -1
- package/dist/{root-HQQ4TNTR.js → root-6QTQUYK4.js} +2 -2
- package/dist/{root-HQQ4TNTR.js.map → root-6QTQUYK4.js.map} +1 -1
- package/dist/{root-NYAXP66A.js → root-7BUVDOMV.js} +3 -3
- package/dist/{root-NYAXP66A.js.map → root-7BUVDOMV.js.map} +1 -1
- package/dist/{root-7YXE6DEA.js → root-FZLKYL5W.js} +3 -3
- package/dist/{root-7YXE6DEA.js.map → root-FZLKYL5W.js.map} +1 -1
- package/dist/{root-4QRY7KAC.js → root-LFJ5BQSY.js} +3 -3
- package/dist/{root-4QRY7KAC.js.map → root-LFJ5BQSY.js.map} +1 -1
- package/dist/{root-FNXHGVQT.js → root-OXS3QQX6.js} +2 -2
- package/dist/{root-FNXHGVQT.js.map → root-OXS3QQX6.js.map} +1 -1
- package/dist/{search-LSIHN6OI.js → search-AZK3Q2KX.js} +2 -2
- package/dist/{search-LSIHN6OI.js.map → search-AZK3Q2KX.js.map} +1 -1
- package/dist/{skills-pages-W47HECK3.js → skills-pages-7IYBJ4QI.js} +2 -2
- package/dist/{skills-pages-W47HECK3.js.map → skills-pages-7IYBJ4QI.js.map} +1 -1
- package/dist/{source-3N7BQVYO.js → source-4BP5PJ2N.js} +2 -2
- package/dist/{source-3N7BQVYO.js.map → source-4BP5PJ2N.js.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-LF4B2TQI.js.map +0 -1
- package/dist/pages-UKJWXOMO.js +0 -5
- package/dist/pages-UKJWXOMO.js.map +0 -1
- package/dist/record-links-VH2TPCK4.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"yPAYO,SAASA,EAAmBC,CAAAA,CAAqE,CACtG,GAAM,CAAE,oBAAA,CAAsBC,CAAO,CAAA,CAAIC,CAAAA,GAEzC,OAAOC,WAAAA,CACJC,CAAAA,EAAkC,CAC5BH,CAAAA,EAILI,GAAAA,CAAwBC,CAAAA,CAAuBN,CAAAA,CAAoBC,CAAM,CAAA,CAAGG,CAAO,EACrF,CAAA,CACA,CAACJ,CAAAA,CAAoBC,CAAM,CAC7B,CACF,CClBO,IAAMM,CAAAA,CAAsB,CACjC,YAAA,CACA,YACA,YAAA,CACA,0BAAA,CACA,WAAA,CACA,WAAA,CACA,YAAA,CACA,eAAA,CACA,YAAA,CACA,YAAA,CACA,aACA,qBAAA,CACA,qBAAA,CACA,YAAA,CACA,WAAA,CACA,YAAA,CACA,WAAA,CACA,YAAA,CACA,YAAA,CACA,eACA,WAAA,CACA,iBAAA,CACA,WAAA,CACA,YAAA,CACA,YAAA,CACA,iBAAA,CACA,WAAA,CACA,YAAA,CACA,aACA,aAAA,CACA,6BAAA,CACA,iBAAA,CACA,8BAAA,CACA,0BAAA,CACA,sBAAA,CACA,iBAAA,CACA,oBAAA,CACA,0EACA,+BAAA,CACA,kBAAA,CACA,oBAAA,CACA,0BAAA,CACA,kBAAA,CACA,qBAAA,CACA,iBAAA,CACA,iDAAA,CACA,iDACA,yCAAA,CACA,iBAAA,CACA,+BAAA,CACA,2EAAA,CACA,qBAAA,CACA,mBAAA,CACA,uBAAA,CACA,uBAAA,CACA,2BACA,mEAAA,CACA,iBACF,CAAA,CAuCA,SAASC,CAAAA,CAAmBC,CAAAA,CAAYC,CAAAA,CAA0B,CAChE,GAAI,CAACD,CAAAA,CAAK,IAAA,CACR,OAAO,KAAA,CAGT,IAAME,CAAAA,CAAUD,CAAAA,CACZA,EACG,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAKE,CAAAA,EAAYA,CAAAA,CAAQ,IAAA,EAAM,EAC/B,MAAA,CAAO,OAAO,CAAA,CACjBL,CAAAA,CAEJ,OAAII,CAAAA,CAAQ,MAAA,GAAW,CAAA,CACd,KAGFA,CAAAA,CAAQ,IAAA,CAAMC,CAAAA,EACfA,CAAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,CAChBH,CAAAA,CAAK,KAAK,UAAA,CAAWG,CAAAA,CAAQ,KAAA,CAAM,CAAA,CAAG,EAAE,CAAC,CAAA,CAG3CH,CAAAA,CAAK,OAASG,CACtB,CACH,CAMA,eAAsBC,CAAAA,CAAgBJ,CAAAA,CAAYK,CAAAA,CAA6D,CAC7G,IAAMC,CAAAA,CAAS,IAAI,eAAA,CAAgB,CAAE,QAAA,CAAUN,CAAAA,CAAK,IAAK,CAAC,EACpDO,CAAAA,CAAW,MAAM,KAAA,CAAM,CAAA,EAAGC,CAAAA,CAASH,CAAS,CAAA,CAAE,MAAM,IAAIC,CAAAA,CAAO,QAAA,EAAU,CAAA,CAAA,CAAI,CACjF,MAAA,CAAQ,MAAA,CACR,OAAA,CAAS,CAAE,cAAA,CAAgBN,CAAAA,CAAK,IAAA,EAAQ,0BAA2B,CAAA,CACnE,IAAA,CAAMA,CACR,CAAC,EAED,GAAI,CAACO,CAAAA,CAAS,EAAA,CACZ,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqBP,EAAK,IAAI,CAAA,CAAE,CAAA,CAGlD,IAAMS,CAAAA,CAAQ,MAAMF,CAAAA,CAAS,IAAA,GACvBG,CAAAA,CAA2B,CAC/B,GAAA,CAAKD,CAAAA,CAAK,GAAA,CACV,IAAA,CAAMA,CAAAA,CAAK,IAAA,EAAQ,GACnB,gBAAA,CAAkBA,CAAAA,CAAK,gBAAA,EAAoBT,CAAAA,CAAK,IAAA,CAChD,IAAA,CAAMS,CAAAA,CAAK,IAAA,EAAQT,EAAK,IAAA,CACxB,QAAA,CAAUS,CAAAA,CAAK,QAAA,EAAYT,CAAAA,CAAK,IAAA,CAChC,IAAA,CAAMS,CAAAA,CAAK,MAAQ,EAAA,CACnB,KAAA,CAAOA,CAAAA,CAAK,KAAA,EAAS,CAAA,CACrB,MAAA,CAAQA,CAAAA,CAAK,MAAA,EAAU,CACzB,CAAA,CAEA,OAAO,CACL,QAAA,CAAUC,CAAAA,CAAM,IAAA,CAChB,IAAA,CAAMA,CAAAA,CAAM,MAAQ,MAAA,CACpB,gBAAA,CAAkBA,CAAAA,CAAM,gBAAA,CACxB,IAAA,CAAMA,CAAAA,CAAM,IAAA,CACZ,QAAA,CAAUA,EAAM,QAAA,CAChB,KAAA,CAAOA,CAAAA,CAAM,KAAA,EAAS,MAAA,CACtB,MAAA,CAAQA,CAAAA,CAAM,MAAA,EAAU,OACxB,GAAA,CAAKA,CAAAA,CAAM,GAAA,CACX,KAAA,CAAAA,CACF,CACF,CAEA,eAAeC,EACbC,CAAAA,CACAC,CAAAA,CACgC,CAChC,GAAM,CAAE,SAAA,CAAAR,CAAAA,CAAW,MAAA,CAAAJ,EAAQ,QAAA,CAAAa,CAAAA,CAAW,CAAA,CAAI,IAAA,CAAO,IAAA,CAAM,aAAA,CAAAC,CAAc,CAAA,CAAIF,EACnEG,CAAAA,CAAqB,EAAC,CAE5B,IAAA,IAAWhB,CAAAA,IAAQ,KAAA,CAAM,IAAA,CAAKY,CAAK,EAAG,CACpC,GAAIZ,CAAAA,CAAK,IAAA,CAAOc,CAAAA,CAAU,CACxBG,KAAAA,CAAM,KAAA,CAAM,2BAA2BH,CAAAA,EAAY,IAAA,CAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,KAAA,EAAQd,CAAAA,CAAK,IAAI,CAAA,CAAE,CAAA,CAE9F,QACF,CAEA,GAAI,CAACD,CAAAA,CAAmBC,CAAAA,CAAMC,CAAM,CAAA,CAAG,CACrCgB,KAAAA,CAAM,KAAA,CAAM,CAAA,uBAAA,EAA0BjB,CAAAA,CAAK,IAAI,CAAA,CAAE,EAEjD,QACF,CAEAgB,CAAAA,CAAW,IAAA,CAAKhB,CAAI,EACtB,CAEA,GAAIgB,EAAW,MAAA,GAAW,CAAA,CACxB,OAAO,EAAC,CAGVD,CAAAA,IAAgB,CAEhB,GAAI,CACF,IAAMG,CAAAA,CAAU,MAAM,OAAA,CAAQ,GAAA,CAAIF,CAAAA,CAAW,GAAA,CAAI,MAAOhB,GAASI,CAAAA,CAAgBJ,CAAAA,CAAMK,CAAS,CAAC,CAAC,CAAA,CAElG,OAAIa,CAAAA,CAAQ,OAAS,CAAA,EACnBD,KAAAA,CAAM,OAAA,CAAQ,CAAA,SAAA,EAAYC,CAAAA,CAAQ,MAAM,CAAA,KAAA,EAAQA,CAAAA,CAAQ,OAAS,CAAA,CAAI,GAAA,CAAM,EAAE,CAAA,CAAE,CAAA,CAG1EA,CACT,CAAA,MAASC,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAMA,CAAK,CAAA,CACnBF,KAAAA,CAAM,KAAA,CAAM,kCAAkC,CAAA,CAEvC,EACT,CACF,CAOA,eAAeG,CAAAA,CAAwBP,CAAAA,CAAyE,CAC9G,GAAM,CAAE,MAAA,CAAAZ,CAAAA,CAAQ,QAAA,CAAAoB,CAAAA,CAAW,IAAK,CAAA,CAAIR,CAAAA,CAC9BS,CAAAA,CAAQ,SAAS,aAAA,CAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,IAAA,CAAO,MAAA,CACbA,CAAAA,CAAM,MAAA,CAASrB,GAAUH,CAAAA,CAAoB,IAAA,CAAK,GAAG,CAAA,CACrDwB,CAAAA,CAAM,QAAA,CAAWD,CAAAA,CACjBC,CAAAA,CAAM,MAAM,OAAA,CAAU,MAAA,CACtB,QAAA,CAAS,IAAA,CAAK,WAAA,CAAYA,CAAK,CAAA,CAE/B,GAAI,CACF,IAAMV,CAAAA,CAAQ,MAAM,IAAI,OAAA,CAA0BW,CAAAA,EAAY,CAC5DD,CAAAA,CAAM,iBAAiB,QAAA,CAAU,IAAMC,CAAAA,CAAQD,CAAAA,CAAM,KAAK,CAAA,CAAG,CAAE,IAAA,CAAM,EAAK,CAAC,CAAA,CAC3EA,CAAAA,CAAM,gBAAA,CAAiB,QAAA,CAAU,IAAMC,CAAAA,CAAQ,IAAI,EAAG,CAAE,IAAA,CAAM,CAAA,CAAK,CAAC,CAAA,CACpED,CAAAA,CAAM,KAAA,GACR,CAAC,CAAA,CAED,OAAI,CAACV,CAAAA,EAASA,CAAAA,CAAM,MAAA,GAAW,CAAA,CACtB,GAGFD,CAAAA,CAAoBC,CAAAA,CAAOC,CAAO,CAC3C,CAAA,OAAE,CACA,QAAA,CAAS,IAAA,CAAK,YAAYS,CAAK,EACjC,CACF,CAEO,SAASE,CAAAA,EAA+F,CAC7G,IAAMC,EAAeC,eAAAA,EAAgB,CAErC,OAAOhC,WAAAA,CACL,MAAOmB,CAAAA,EAA4C,CACjD,IAAMK,EAAUL,CAAAA,CAAQ,KAAA,CACpB,MAAMF,CAAAA,CAAoBE,CAAAA,CAAQ,KAAA,CAAOA,CAAO,CAAA,CAChD,MAAMO,CAAAA,CAAwBP,CAAO,CAAA,CAEzC,OAAIK,CAAAA,CAAQ,MAAA,CAAS,CAAA,EAEnB,MAAMS,EAA0BF,CAAAA,CAAc,WAAW,CAAA,CAAE,KAAA,CAAON,CAAAA,EAAmB,CACnF,OAAA,CAAQ,KAAA,CAAM,6CAA8CA,CAAK,EACnE,CAAC,CAAA,CAGID,CACT,CAAA,CACA,CAACO,CAAY,CACf,CACF","file":"chunk-T4SEZXGL.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphql-client/use-patch-entity-list.ts","../src/core/upload.ts"],"names":["usePatchEntityList","entityNameOrPlural","schema","useConfig","useCallback","patches","scheduleEntityListPatch","getEntityListQueryName","ACCEPTED_MIME_TYPES","isAcceptedMimeType","file","accept","allowed","pattern","uploadAssetFile","projectId","params","response","apiPaths","data","asset","uploadSelectedFiles","files","options","maxBytes","onUploadStart","validFiles","toast","uploads","error","openFileDialogAndUpload","multiple","input","resolve","useUploadAssets","apolloClient","useApolloClient","scheduleEntityListRefetch"],"mappings":"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","file":"chunk-ONB3FWK5.js","sourcesContent":["import { useCallback } from 'react';\nimport { useConfig } from '../core/config/config-context';\nimport {\n getEntityListQueryName,\n scheduleEntityListPatch,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\n\n/**\n * Patch active list rows for an entity without a soft-refetch.\n * Prefer this after mutations that only change row fields (e.g. tag connect/disconnect).\n */\nexport function usePatchEntityList(entityNameOrPlural: string): (patches: EntityListRowPatch[]) => void {\n const { currentProjectSchema: schema } = useConfig();\n\n return useCallback(\n (patches: EntityListRowPatch[]) => {\n if (!schema) {\n return;\n }\n\n scheduleEntityListPatch(getEntityListQueryName(entityNameOrPlural, schema), patches);\n },\n [entityNameOrPlural, schema]\n );\n}\n","import { useCallback } from 'react';\nimport { toast } from 'sonner';\nimport { useApolloClient } from '@apollo/client/react';\nimport { apiPaths } from './api-paths';\nimport { scheduleEntityListRefetch } from '../graphql-client/refetch-entity-lists';\nimport type { OrderedAssetValue } from '../graphql-client/types';\n\nexport const ACCEPTED_MIME_TYPES = [\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n 'image/vnd.microsoft.icon',\n 'image/bmp',\n 'image/gif',\n 'image/tiff',\n 'image/svg+xml',\n 'image/avif',\n 'image/heic',\n 'image/heif',\n 'image/heic-sequence',\n 'image/heif-sequence',\n 'image/apng',\n 'audio/aac',\n 'audio/mpeg',\n 'audio/wav',\n 'audio/webm',\n 'audio/midi',\n 'audio/x-midi',\n 'audio/ogg',\n 'video/x-msvideo',\n 'video/mp4',\n 'video/mpeg',\n 'video/webm',\n 'video/quicktime',\n 'video/ogg',\n 'video/mp2t',\n 'video/3gpp',\n 'video/3gpp2',\n 'application/x-7z-compressed',\n 'application/zip',\n 'application/vnd.amazon.ebook',\n 'application/octet-stream',\n 'application/epub+zip',\n 'application/pdf',\n 'application/msword',\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n 'application/vnd.ms-fontobject',\n 'application/gzip',\n 'application/x-gzip',\n 'application/java-archive',\n 'application/json',\n 'application/ld+json',\n 'text/javascript',\n 'application/vnd.oasis.opendocument.presentation',\n 'application/vnd.oasis.opendocument.spreadsheet',\n 'application/vnd.oasis.opendocument.text',\n 'application/ogg',\n 'application/vnd.ms-powerpoint',\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\n 'application/vnd.rar',\n 'application/x-tar',\n 'application/vnd.visio',\n 'application/xhtml+xml',\n 'application/vnd.ms-excel',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/xml',\n];\n\nexport type UploadedFileResult = {\n pathname: string;\n lqip?: string;\n size: number;\n mimeType: string;\n originalFilename: string;\n width?: number;\n height?: number;\n};\n\nexport type UploadedAssetResult = UploadedFileResult & {\n asset: OrderedAssetValue;\n _id: string;\n};\n\ntype AssetUploadResponse = {\n _id: string;\n path: string | null;\n mimeType: string | null;\n originalFilename: string | null;\n size: number | null;\n width: number | null;\n height: number | null;\n lqip: string | null;\n sha256: string | null;\n deduped: boolean;\n};\n\nexport type OpenFileDialogAndUploadOptions = {\n projectId: string | undefined;\n accept?: string;\n files?: File[] | FileList;\n multiple?: boolean;\n maxBytes?: number;\n onUploadStart?: () => void;\n};\n\nfunction isAcceptedMimeType(file: File, accept?: string): boolean {\n if (!file.type) {\n return true;\n }\n\n const allowed = accept\n ? accept\n .split(',')\n .map((pattern) => pattern.trim())\n .filter(Boolean)\n : ACCEPTED_MIME_TYPES;\n\n if (allowed.length === 0) {\n return true;\n }\n\n return allowed.some((pattern) => {\n if (pattern.endsWith('/*')) {\n return file.type.startsWith(pattern.slice(0, -1));\n }\n\n return file.type === pattern;\n });\n}\n\n/**\n * Uploads a single file to the one-shot /assets endpoint, which stores the\n * blob and creates the _asset node in a single request.\n */\nexport async function uploadAssetFile(file: File, projectId: string | undefined): Promise<UploadedAssetResult> {\n const params = new URLSearchParams({ filename: file.name });\n const response = await fetch(`${apiPaths(projectId).assets}?${params.toString()}`, {\n method: 'POST',\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n body: file,\n });\n\n if (!response.ok) {\n throw new Error(`Upload failed for ${file.name}`);\n }\n\n const data = (await response.json()) as AssetUploadResponse;\n const asset: OrderedAssetValue = {\n _id: data._id,\n path: data.path ?? '',\n originalFilename: data.originalFilename ?? file.name,\n size: data.size ?? file.size,\n mimeType: data.mimeType ?? file.type,\n lqip: data.lqip ?? '',\n width: data.width ?? 0,\n height: data.height ?? 0,\n };\n\n return {\n pathname: asset.path,\n lqip: asset.lqip || undefined,\n originalFilename: asset.originalFilename,\n size: asset.size,\n mimeType: asset.mimeType,\n width: asset.width || undefined,\n height: asset.height || undefined,\n _id: asset._id,\n asset,\n };\n}\n\nasync function uploadSelectedFiles(\n files: File[] | FileList,\n options: OpenFileDialogAndUploadOptions\n): Promise<UploadedAssetResult[]> {\n const { projectId, accept, maxBytes = 4 * 1024 * 1024, onUploadStart } = options;\n const validFiles: File[] = [];\n\n for (const file of Array.from(files)) {\n if (file.size > maxBytes) {\n toast.error(`File size too big (max ${(maxBytes / (1024 * 1024)).toFixed(0)}MB): ${file.name}`);\n\n continue;\n }\n\n if (!isAcceptedMimeType(file, accept)) {\n toast.error(`Unsupported file type: ${file.name}`);\n\n continue;\n }\n\n validFiles.push(file);\n }\n\n if (validFiles.length === 0) {\n return [];\n }\n\n onUploadStart?.();\n\n try {\n const uploads = await Promise.all(validFiles.map(async (file) => uploadAssetFile(file, projectId)));\n\n if (uploads.length > 0) {\n toast.success(`Uploaded ${uploads.length} file${uploads.length > 1 ? 's' : ''}`);\n }\n\n return uploads;\n } catch (error) {\n console.error(error);\n toast.error('Upload failed. Please try again.');\n\n return [];\n }\n}\n\n/**\n * Opens a native file picker and uploads selected files to the Flexkit assets\n * endpoint, which also creates an asset node in the database.\n * Returns a list of uploaded file results. Skips files that exceed maxBytes.\n */\nasync function openFileDialogAndUpload(options: OpenFileDialogAndUploadOptions): Promise<UploadedAssetResult[]> {\n const { accept, multiple = true } = options;\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = accept ?? ACCEPTED_MIME_TYPES.join(',');\n input.multiple = multiple;\n input.style.display = 'none';\n document.body.appendChild(input);\n\n try {\n const files = await new Promise<FileList | null>((resolve) => {\n input.addEventListener('change', () => resolve(input.files), { once: true });\n input.addEventListener('cancel', () => resolve(null), { once: true });\n input.click();\n });\n\n if (!files || files.length === 0) {\n return [];\n }\n\n return uploadSelectedFiles(files, options);\n } finally {\n document.body.removeChild(input);\n }\n}\n\nexport function useUploadAssets(): (options: OpenFileDialogAndUploadOptions) => Promise<UploadedAssetResult[]> {\n const apolloClient = useApolloClient();\n\n return useCallback(\n async (options: OpenFileDialogAndUploadOptions) => {\n const uploads = options.files\n ? await uploadSelectedFiles(options.files, options)\n : await openFileDialogAndUpload(options);\n\n if (uploads.length > 0) {\n // Upload is outside Apollo; soft-refresh mounted asset lists via useEntityQuery.\n await scheduleEntityListRefetch(apolloClient, 'GetAssets').catch((error: unknown) => {\n console.error('Error refreshing asset lists after upload:', error);\n });\n }\n\n return uploads;\n },\n [apolloClient]\n );\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import'./index.css';import {f as f$1,e as e$2}from'./chunk-
|
|
1
|
+
import'./index.css';import {f as f$1,e as e$2}from'./chunk-NNISUDZX.js';import {p,o as o$1,h as h$1,i}from'./chunk-KR27GOH6.js';import {b}from'./chunk-V7C4EHK3.js';import {j}from'./chunk-XV7U33XQ.js';import {d,c}from'./chunk-XMOSCJOI.js';import {s}from'./chunk-7KLXWCDS.js';import {f}from'./chunk-HZOD2HOF.js';import {na}from'./chunk-DGIY4SKN.js';import {e,g,h,j as j$1,o,n,k}from'./chunk-SZEGGBOC.js';import {a,d as d$1,c as c$1,e as e$1,g as g$1}from'./chunk-HDOIOXMP.js';import {b as b$1}from'./chunk-6NRQMG26.js';import {PencilIcon,Trash2Icon,Ellipsis,Settings2,RefreshCw,Loader2,Trash2}from'lucide-react';import {jsxs,jsx}from'react/jsx-runtime';import {lazy,useState,Suspense}from'react';import {find,propEq}from'ramda';import {gql}from'@apollo/client';import {useApolloClient}from'@apollo/client/react';import {toast}from'sonner';function Be({entityName:e$1,entityNamePlural:a,row:c,options:i={canDelete:true,canEdit:true}}){let m=j(),N=b(),p=c.original._id,D=(i.canDelete??true)&&N,f=i.canEdit??true;function h$1(){m({type:"EditEntity",payload:{entityId:p,entityNamePlural:a}});}function d(){m({type:"DeleteEntity",payload:{entityId:p,entityName:e$1}});}return jsxs("div",{className:"fk:flex",children:[f&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:h$1,variant:"ghost",children:[jsx(PencilIcon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Edit"})]}),D&&!f&&jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1",onClick:d,variant:"ghost",children:[jsx(Trash2Icon,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Delete"})]}),f&&D&&jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:flex fk:h-7 fk:w-7 fk:p-0",variant:"ghost",children:[jsx(Ellipsis,{className:"fk:h-4 fk:w-4"}),jsx("span",{className:"fk:sr-only",children:"Additional actions"})]})}),jsxs(h,{align:"end",className:"w-[160px]",children:[jsxs(j$1,{onClick:h$1,children:[jsx(PencilIcon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Edit"]}),jsx(o,{}),jsxs(j$1,{className:"fk:text-destructive",onClick:d,children:[jsx(Trash2Icon,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete"]})]})]})]})}function Z({table:e$1}){return jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(b$1,{className:"fk:hidden fk:h-8 fk:lg:flex",size:"sm",variant:"outline",children:[jsx(Settings2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"View"]})}),jsxs(h,{align:"end",className:"fk:w-[150px]",children:[jsx(n,{children:"Toggle columns"}),jsx(o,{}),e$1.getAllColumns().filter(a=>typeof a.accessorFn<"u"&&a.getCanHide()).map(a=>jsx(k,{checked:a.getIsVisible(),className:"capitalize",onCheckedChange:c=>{a.toggleVisibility(!!c);},children:a.id},a.id))]})]})}var Ce=lazy(()=>import('./record-links-3WZGSVFU.js').then(e=>({default:e.EntityKnowledgeButton}))),ve=lazy(()=>import('./entry-CA2QAEHN.js').then(e=>({default:e.EntityGraphButton})));function at({entityName:e,isReloading:a$1=false,onReload:c$2,table:i$1}){let m=j(),N=d(),p$1=c(),D=useApolloClient(),{currentProject:f$2,currentProjectId:h}=f(),d$2=f$2?.schema??[],w=f$2?.scopes,[ae,ne,le]=f$1(),[b$2,P]=useState(false),y=b(),r=i$1.getSelectedRowModel().rows.map(t=>t.original._id);function se(){m({type:"AddEntity",payload:{entityName:e}});}function ie(t){N({type:"setScope",payload:{projectId:h,scope:t}});}async function re(t){if(t.length===0)return;let u=h$1(e,d$2,t);await new Promise((pe,fe)=>{ne(gql`
|
|
2
2
|
${u}
|
|
3
|
-
`),le({variables:{where:i(t)},update(x){for(let me of t)x.evict({id:me});},onCompleted:()=>{pe();},onError:x=>{fe(x);}}),ae(true);});}function ce(){let t=e==="_asset"?"asset":e.toLowerCase();m({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${r.length} ${t}${r.length>1?"s":""}`,dialogMessage:r.length>1?`Are you sure you want to delete the selected ${t}s? They will be deleted permanently.`:`Are you sure you want to delete the selected ${t}? The item will be deleted permanently.`,dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionSubmit:async()=>{P(true);try{let u=[...r];await re(u),i$1.resetRowSelection(),await p(D,o$1(e,d$2),u),toast.success(u.length>1?"Items successfully deleted.":"Item successfully deleted.");}catch{toast.error("Failed to delete selected items.");}finally{P(false);}},dialogActionCancel:()=>{}}}});}return jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[w&&w.length>0?jsxs(a,{defaultValue:p$1.scope,onValueChange:t=>{ie(t);},value:p$1.scope,children:[jsxs(d$1,{className:"fk:w-48!",id:"project",size:"sm",children:[jsx("span",{className:"fk:text-muted-foreground",children:"Scope:"}),jsx(c$1,{children:(find(propEq(p$1.scope??"","name"))(w)||null)?.label})]}),jsx(e$1,{children:w.map(t=>jsx(g$1,{value:t.name,children:t.label},t.name))})]}):null,jsx(Z,{table:i$1}),c$2?jsx(b$1,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$1,onClick:c$2,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$1?"fk:animate-spin":void 0})}):null,jsx(e$2,{table:i$1})]}),r.length>0?jsx(na,{disabled:!y,children:jsxs(b$1,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:b$2||!y,onClick:ce,size:"sm",variant:"destructive",children:[b$2?jsx(Loader2,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete (",r.length,")"]})}):null,e&&s(e)?jsx(Suspense,{fallback:null,children:jsx(Ce,{entityName:e})}):null,e?jsx(Suspense,{fallback:null,children:jsx(ve,{entityName:e,selectedIds:r})}):null,jsx(na,{disabled:!y,children:jsx(b$1,{className:"fk:h-8 fk:lg:flex",disabled:b$2||!y,onClick:se,size:"sm",variant:"default",children:"Create"})})]})}export{Be as a,Z as b,at as c};//# sourceMappingURL=chunk-
|
|
4
|
-
//# sourceMappingURL=chunk-
|
|
3
|
+
`),le({variables:{where:i(t)},update(x){for(let me of t)x.evict({id:me});},onCompleted:()=>{pe();},onError:x=>{fe(x);}}),ae(true);});}function ce(){let t=e==="_asset"?"asset":e.toLowerCase();m({type:"AlertDialog",payload:{options:{dialogTitle:`Delete ${r.length} ${t}${r.length>1?"s":""}`,dialogMessage:r.length>1?`Are you sure you want to delete the selected ${t}s? They will be deleted permanently.`:`Are you sure you want to delete the selected ${t}? The item will be deleted permanently.`,dialogCancelTitle:"Cancel",dialogActionLabel:"Delete",isDestructive:true,dialogActionSubmit:async()=>{P(true);try{let u=[...r];await re(u),i$1.resetRowSelection(),await p(D,o$1(e,d$2),u),toast.success(u.length>1?"Items successfully deleted.":"Item successfully deleted.");}catch{toast.error("Failed to delete selected items.");}finally{P(false);}},dialogActionCancel:()=>{}}}});}return jsxs("div",{className:"fk:flex fk:items-center fk:justify-between",children:[jsxs("div",{className:"fk:flex fk:flex-1 fk:items-center fk:space-x-2",children:[w&&w.length>0?jsxs(a,{defaultValue:p$1.scope,onValueChange:t=>{ie(t);},value:p$1.scope,children:[jsxs(d$1,{className:"fk:w-48!",id:"project",size:"sm",children:[jsx("span",{className:"fk:text-muted-foreground",children:"Scope:"}),jsx(c$1,{children:(find(propEq(p$1.scope??"","name"))(w)||null)?.label})]}),jsx(e$1,{children:w.map(t=>jsx(g$1,{value:t.name,children:t.label},t.name))})]}):null,jsx(Z,{table:i$1}),c$2?jsx(b$1,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$1,onClick:c$2,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$1?"fk:animate-spin":void 0})}):null,jsx(e$2,{table:i$1})]}),r.length>0?jsx(na,{disabled:!y,children:jsxs(b$1,{className:"fk:h-8 fk:mr-2 fk:lg:flex",disabled:b$2||!y,onClick:ce,size:"sm",variant:"destructive",children:[b$2?jsx(Loader2,{className:"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin"}):jsx(Trash2,{className:"fk:mr-2 fk:h-4 fk:w-4"}),"Delete (",r.length,")"]})}):null,e&&s(e)?jsx(Suspense,{fallback:null,children:jsx(Ce,{entityName:e})}):null,e?jsx(Suspense,{fallback:null,children:jsx(ve,{entityName:e,selectedIds:r})}):null,jsx(na,{disabled:!y,children:jsx(b$1,{className:"fk:h-8 fk:lg:flex",disabled:b$2||!y,onClick:se,size:"sm",variant:"default",children:"Create"})})]})}export{Be as a,Z as b,at as c};//# sourceMappingURL=chunk-R2O4WC3H.js.map
|
|
4
|
+
//# sourceMappingURL=chunk-R2O4WC3H.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","EntityKnowledgeButton","lazy","m","EntityGraphButton","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2","isKnowledgeLinkableEntity","Suspense"],"mappings":"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","file":"chunk-OMYDXVWS.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { lazy, Suspense, useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\nimport { isKnowledgeLinkableEntity } from '../apps/knowledge/knowledge';\n\n// Loaded on demand: the Knowledge module should only download when a list of\n// a linkable entity is in view, the way the record drawer loads its panel.\nconst EntityKnowledgeButton = lazy(() =>\n import('../apps/knowledge/record-links').then((m) => ({ default: m.EntityKnowledgeButton }))\n);\nconst EntityGraphButton = lazy(() => import('../apps/graph/entry').then((m) => ({ default: m.EntityGraphButton })));\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(apolloClient, getEntityListQueryName(entityName, schema), idsToDelete);\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n {entityName && isKnowledgeLinkableEntity(entityName) ? (\n <Suspense fallback={null}>\n <EntityKnowledgeButton entityName={entityName} />\n </Suspense>\n ) : null}\n {entityName ? (\n <Suspense fallback={null}>\n <EntityGraphButton entityName={entityName} selectedIds={selectedIds} />\n </Suspense>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data-grid/data-table-row-actions.tsx","../src/data-grid/data-table-view-options.tsx","../src/data-grid/data-table-toolbar.tsx"],"names":["DataTableRowActions","entityName","entityNamePlural","row","options","actionDispatch","useDispatch","canMutate","useCanMutate","entityId","canDelete","canEdit","handleEdit","handleDelete","jsxs","Button","jsx","PencilIcon","Trash2Icon","DropdownMenu","DropdownMenuTrigger","Ellipsis","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","DataTableViewOptions","table","Settings2","DropdownMenuLabel","column","DropdownMenuCheckboxItem","value","EntityKnowledgeButton","lazy","m","EntityGraphButton","DataTableToolbar","isReloading","onReload","appDispatch","useAppDispatch","appContext","useAppContext","apolloClient","useApolloClient","currentProject","currentProjectId","useConfig","schema","scopes","runMutation","setMutation","setOptions","useEntityMutation","isDeleting","setIsDeleting","useState","selectedIds","handleCreate","handleScopeChange","deleteSelected","ids","mutation","getEntityDeleteMutation","resolve","reject","gql","getEntityDeleteWhere","cache","id","error","handleBatchDelete","itemLabel","idsToDelete","scheduleEntityListRemoval","getEntityListQueryName","toast","Select","SelectTrigger","SelectValue","find","propEq","SelectContent","scopeItem","SelectItem","RefreshCw","DataTableSortedBy","PermissionTooltip","Loader2","Trash2","isKnowledgeLinkableEntity","Suspense"],"mappings":"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","file":"chunk-R2O4WC3H.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Ellipsis, PencilIcon, Trash2Icon } from 'lucide-react';\nimport type { Row } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\nimport { useDispatch } from '../entities/actions-context';\nimport { useCanMutate } from '../core/permissions';\n\ninterface DataTableRowActionsProps<TData> {\n entityName: string;\n entityNamePlural: string;\n row: Row<TData>;\n options?: {\n canDelete?: boolean;\n canEdit?: boolean;\n };\n}\n\nexport function DataTableRowActions<TData>({\n entityName,\n entityNamePlural,\n row,\n options = { canDelete: true, canEdit: true },\n}: DataTableRowActionsProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const canMutate = useCanMutate();\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const entityId = row.original._id;\n // Read-only roles keep the pencil (the drawer doubles as their read view)\n // but lose the delete affordance entirely.\n const canDelete = (options.canDelete ?? true) && canMutate;\n const canEdit = options.canEdit ?? true;\n\n function handleEdit(): void {\n actionDispatch({ type: 'EditEntity', payload: { entityId, entityNamePlural } });\n }\n\n function handleDelete(): void {\n actionDispatch({ type: 'DeleteEntity', payload: { entityId, entityName } });\n }\n\n return (\n <div className=\"fk:flex\">\n {canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleEdit} variant=\"ghost\">\n <PencilIcon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Edit</span>\n </Button>\n )}\n {canDelete && !canEdit && (\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0 fk:mr-1\" onClick={handleDelete} variant=\"ghost\">\n <Trash2Icon className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Delete</span>\n </Button>\n )}\n {canEdit && canDelete && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:flex fk:h-7 fk:w-7 fk:p-0\" variant=\"ghost\">\n <Ellipsis className=\"fk:h-4 fk:w-4\" />\n <span className=\"fk:sr-only\">Additional actions</span>\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"w-[160px]\">\n <DropdownMenuItem onClick={handleEdit}>\n <PencilIcon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Edit\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n <DropdownMenuItem className=\"fk:text-destructive\" onClick={handleDelete}>\n <Trash2Icon className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n Delete\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n );\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { Settings2 } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\nimport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableViewOptionsProps<TData> {\n table: Table<TData>;\n}\n\nexport function DataTableViewOptions<TData>({ table }: DataTableViewOptionsProps<TData>): JSX.Element {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button className=\"fk:hidden fk:h-8 fk:lg:flex\" size=\"sm\" variant=\"outline\">\n <Settings2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n View\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-[150px]\">\n <DropdownMenuLabel>Toggle columns</DropdownMenuLabel>\n <DropdownMenuSeparator />\n {table\n .getAllColumns()\n .filter((column) => typeof column.accessorFn !== 'undefined' && column.getCanHide())\n .map((column) => {\n return (\n <DropdownMenuCheckboxItem\n checked={column.getIsVisible()}\n className=\"capitalize\"\n key={column.id}\n onCheckedChange={(value) => {\n column.toggleVisibility(Boolean(value));\n }}\n >\n {column.id}\n </DropdownMenuCheckboxItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","'use client';\n\nimport { lazy, Suspense, useState } from 'react';\nimport type { JSX } from 'react';\nimport { find, propEq } from 'ramda';\nimport type { Table } from '@tanstack/react-table';\nimport { Loader2, RefreshCw, Trash2 } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { toast } from 'sonner';\nimport { Button } from '../ui/primitives/button';\nimport { PermissionTooltip } from '../ui/components/permission-tooltip';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../ui/primitives/select';\nimport { useDispatch } from '../entities/actions-context';\nimport { useAppContext, useAppDispatch } from '../core/app-context';\nimport { useCanMutate } from '../core/permissions';\nimport { useConfig } from '../core/config/config-context';\nimport { DataTableViewOptions } from './data-table-view-options';\nimport { DataTableSortedBy } from './data-table-sorted-by';\nimport { useEntityMutation } from '../graphql-client/use-entity-mutation';\nimport { getEntityDeleteMutation, getEntityDeleteWhere } from '../graphql-client/queries';\nimport { getEntityListQueryName, scheduleEntityListRemoval } from '../graphql-client/refetch-entity-lists';\nimport { isKnowledgeLinkableEntity } from '../apps/knowledge/knowledge';\n\n// Loaded on demand: the Knowledge module should only download when a list of\n// a linkable entity is in view, the way the record drawer loads its panel.\nconst EntityKnowledgeButton = lazy(() =>\n import('../apps/knowledge/record-links').then((m) => ({ default: m.EntityKnowledgeButton }))\n);\nconst EntityGraphButton = lazy(() => import('../apps/graph/entry').then((m) => ({ default: m.EntityGraphButton })));\n\ninterface DataTableToolbarProps<TData> {\n entityName: string;\n isReloading?: boolean;\n onReload?: () => void;\n table: Table<TData>;\n}\n\nexport function DataTableToolbar<TData>({\n entityName,\n isReloading = false,\n onReload,\n table,\n}: DataTableToolbarProps<TData>): JSX.Element {\n const actionDispatch = useDispatch();\n const appDispatch = useAppDispatch();\n const appContext = useAppContext();\n const apolloClient = useApolloClient();\n const { currentProject, currentProjectId } = useConfig();\n const schema = currentProject?.schema ?? [];\n const scopes = currentProject?.scopes;\n const [runMutation, setMutation, setOptions] = useEntityMutation();\n const [isDeleting, setIsDeleting] = useState(false);\n const canMutate = useCanMutate();\n\n // Collect selected entity ids from the table\n // @ts-expect-error -- the DataGrid's original type doesn't know about the _id property\n const selectedIds: string[] = table.getSelectedRowModel().rows.map((row) => row.original._id as string);\n\n function handleCreate(): void {\n actionDispatch({ type: 'AddEntity', payload: { entityName } });\n }\n\n function handleScopeChange(value: string): void {\n appDispatch({ type: 'setScope', payload: { projectId: currentProjectId, scope: value } });\n }\n\n async function deleteSelected(ids: string[]): Promise<void> {\n if (ids.length === 0) {\n return;\n }\n\n const mutation = getEntityDeleteMutation(entityName, schema, ids);\n\n await new Promise<void>((resolve, reject) => {\n setMutation(gql`\n ${mutation}\n `);\n\n setOptions({\n variables: { where: getEntityDeleteWhere(ids) },\n update(cache: { evict: (arg0: { id: string }) => void }) {\n for (const id of ids) {\n cache.evict({ id });\n }\n },\n onCompleted: () => {\n resolve();\n },\n onError: (error: Error) => {\n reject(error);\n },\n });\n\n runMutation(true);\n });\n }\n\n function handleBatchDelete(): void {\n const itemLabel = entityName === '_asset' ? 'asset' : entityName.toLowerCase();\n\n actionDispatch({\n type: 'AlertDialog',\n payload: {\n options: {\n dialogTitle: `Delete ${selectedIds.length} ${itemLabel}${selectedIds.length > 1 ? 's' : ''}`,\n dialogMessage:\n selectedIds.length > 1\n ? `Are you sure you want to delete the selected ${itemLabel}s? They will be deleted permanently.`\n : `Are you sure you want to delete the selected ${itemLabel}? The item will be deleted permanently.`,\n dialogCancelTitle: 'Cancel',\n dialogActionLabel: 'Delete',\n isDestructive: true,\n dialogActionSubmit: async () => {\n setIsDeleting(true);\n\n try {\n const idsToDelete = [...selectedIds];\n\n await deleteSelected(idsToDelete);\n\n table.resetRowSelection();\n // Drop rows immediately, then soft-refetch counts/pages.\n await scheduleEntityListRemoval(apolloClient, getEntityListQueryName(entityName, schema), idsToDelete);\n toast.success(idsToDelete.length > 1 ? 'Items successfully deleted.' : 'Item successfully deleted.');\n } catch {\n toast.error('Failed to delete selected items.');\n } finally {\n setIsDeleting(false);\n }\n },\n dialogActionCancel: () => {\n // no-op\n },\n },\n },\n });\n }\n\n return (\n <div className=\"fk:flex fk:items-center fk:justify-between\">\n <div className=\"fk:flex fk:flex-1 fk:items-center fk:space-x-2\">\n {scopes && scopes.length > 0 ? (\n <Select\n defaultValue={appContext.scope}\n onValueChange={(value) => {\n handleScopeChange(value);\n }}\n value={appContext.scope}\n >\n <SelectTrigger className=\"fk:w-48!\" id=\"project\" size=\"sm\">\n <span className=\"fk:text-muted-foreground\">Scope:</span>\n <SelectValue>\n {\n ((find(propEq(appContext.scope ?? '', 'name'))(scopes) as { name: string; label: string }) || null)\n ?.label\n }\n </SelectValue>\n </SelectTrigger>\n <SelectContent>\n {scopes.map((scopeItem) => (\n <SelectItem key={scopeItem.name} value={scopeItem.name}>\n {scopeItem.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n ) : null}\n <DataTableViewOptions table={table} />\n {onReload ? (\n <Button\n aria-label=\"Reload\"\n className=\"fk:h-8\"\n disabled={isDeleting || isReloading}\n onClick={onReload}\n size=\"icon-sm\"\n variant=\"outline\"\n >\n <RefreshCw className={isReloading ? 'fk:animate-spin' : undefined} />\n </Button>\n ) : null}\n <DataTableSortedBy table={table} />\n </div>\n {selectedIds.length > 0 ? (\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:mr-2 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleBatchDelete}\n size=\"sm\"\n variant=\"destructive\"\n >\n {isDeleting ? (\n <Loader2 className=\"fk:mr-2 fk:h-4 fk:w-4 fk:animate-spin\" />\n ) : (\n <Trash2 className=\"fk:mr-2 fk:h-4 fk:w-4\" />\n )}\n Delete ({selectedIds.length})\n </Button>\n </PermissionTooltip>\n ) : null}\n {entityName && isKnowledgeLinkableEntity(entityName) ? (\n <Suspense fallback={null}>\n <EntityKnowledgeButton entityName={entityName} />\n </Suspense>\n ) : null}\n {entityName ? (\n <Suspense fallback={null}>\n <EntityGraphButton entityName={entityName} selectedIds={selectedIds} />\n </Suspense>\n ) : null}\n <PermissionTooltip disabled={!canMutate}>\n <Button\n className=\"fk:h-8 fk:lg:flex\"\n disabled={isDeleting || !canMutate}\n onClick={handleCreate}\n size=\"sm\"\n variant=\"default\"\n >\n Create\n </Button>\n </PermissionTooltip>\n </div>\n );\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import'./index.css';import {f as f$1}from'./chunk-
|
|
2
|
-
`)}function er(r,e){return r?C(r).some(t=>t.includes(`Cannot query field "${e}"`)):false}function C(r){if(CombinedGraphQLErrors.is(r))return r.errors.filter(y).map(({message:o})=>o);let e=L(r);if(e&&a(e))return [e];let t=f(r);if(t?.statusCode!==400)return [];let n=d(t.bodyText)??P(t)??b(r);return n?Array.isArray(n.errors)?n.errors.filter(y).map(o=>o.message):typeof n.message=="string"&&a(n.message)?[n.message]:typeof n.error=="string"&&a(n.error)?[n.error]:[]:[]}function P(r){let{result:e}=r;return !e||typeof e!="object"?null:e}function b(r){if(!A(r))return null;let{cause:e}=r,t=L(e);if(t&&a(t))return {message:t};if(!e||typeof e!="object")return null;let{result:n}=e;return n&&typeof n=="object"?n:null}function y(r){if(!r||typeof r!="object")return false;let{extensions:e,message:t}=r;return e?.code==="GRAPHQL_VALIDATION_FAILED"&&typeof t=="string"?true:typeof t=="string"&&a(t)}function a(r){return r.startsWith("Cannot query field ")||r.startsWith("Unknown type ")||r.startsWith('Cannot query field "')||r.includes("GRAPHQL_VALIDATION_FAILED")}function I(r){return /Cannot query field "[_A-Za-z][_0-9A-Za-z]*Total" on type "Query"/.test(r)}var U=ApolloProvider,v=createContext(void 0);function pr(){let r=useContext(v);if(!r)throw new Error("useGraphQLError must be used within GraphQLProvider");return r}var fr={userQuery:true};function H(r){return new ErrorLink(({error:e,operation:t})=>{if(t.getContext().userQuery===true)return;let n=k(e);if(n){r(n);return}CombinedGraphQLErrors.is(e)?e.errors.forEach(({message:s,locations:i,path:c})=>{console.warn(`[GraphQL error]: Message: ${s}, Location: ${i}, Path: ${c}`);}):CombinedProtocolErrors.is(e)&&e.errors.forEach(({message:s,extensions:i})=>{console.warn(`[Protocol error]: Message: ${s}, Extensions: ${JSON.stringify(i)}`);});let o=f(e);if(o?.statusCode===400){let s=d(o.bodyText),i=null;if(s&&typeof s=="object"){let{error:c,errors:g,message:E}=s;if(typeof E=="string")i=E;else if(Array.isArray(g)){let[p]=g;if(p&&typeof p.message=="string"){let{message:D}=p;i=D;}}else typeof c=="string"?i=c:i=JSON.stringify(s);}else i=o.bodyText;r(i??"There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.");}if(o){console.warn(`[Network error]: ${o.message}`);return}e&&console.warn(`[Network error]: ${e.message}`);})}function z(r,e){return from([H(e),new HttpLink({uri:`/api/flexkit/${r}/graphql`})])}function Z(r,e){return new ApolloClient({link:z(r??"",e),cache:new InMemoryCache({dataIdFromObject:t=>t._id?t._id:defaultDataIdFromObject(t)})})}function dr({children:r}){let{currentProjectId:e}=f$1(),[t,n]=useState(null),o=useMemo(()=>({schemaErrorMessage:t,setSchemaErrorMessage:n}),[t]),s=useMemo(()=>Z(e,n),[e]);return jsx(v.Provider,{value:o,children:jsx(U,{client:s,children:r})})}var G=createContext([]),M=createContext(()=>{});function K(r,e){let t=e.type;switch(e._id||(e._id=Date.now().toString()),t){case "DeleteEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "AddEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "EditEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "EditRelationship":return uniqBy(props(["type","_id"]),[...r,e]);case "AlertDialog":return uniqBy(props(["type","_id"]),[...r,e]);case "Dismiss":return r.filter(n=>n._id!==e._id);default:throw Error(`Unknown action: ${t}`)}}function yr({children:r}){let[e,t]=useReducer(K,[]);return jsx(G.Provider,{value:e,children:jsx(M.Provider,{value:t,children:r})})}function Ar(){return useContext(G)}function Lr(){return useContext(M)}export{f as a,d as b,k as c,er as d,pr as e,fr as f,dr as g,yr as h,Ar as i,Lr as j};//# sourceMappingURL=chunk-
|
|
3
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {f as f$1}from'./chunk-HZOD2HOF.js';import {ApolloClient,InMemoryCache,defaultDataIdFromObject,from,HttpLink}from'@apollo/client';import {ApolloProvider}from'@apollo/client/react';import {ErrorLink}from'@apollo/client/link/error';import {ServerError,CombinedGraphQLErrors,CombinedProtocolErrors}from'@apollo/client/errors';import {createContext,useContext,useState,useMemo,useReducer}from'react';import {jsx}from'react/jsx-runtime';import {uniqBy,props}from'ramda';function A(r){return r?"cause"in r:false}function f(r){if(!r)return null;if(ServerError.is(r))return r;if(A(r)){let e=r.cause;if(ServerError.is(e))return e}return null}function L(r){if(!r||typeof r!="object")return null;let{message:e}=r;return typeof e=="string"?e:null}function d(r){if(!r)return null;try{return JSON.parse(r)}catch{return null}}function k(r){if(!r)return null;let e=C(r).filter(t=>!I(t));return e.length===0?null:["The deployed schema is out of sync with your local Flexkit schema.","Run `flexkit deploy` using the CLI to apply your latest schema changes.",...e.map(t=>`- ${t}`)].join(`
|
|
2
|
+
`)}function er(r,e){return r?C(r).some(t=>t.includes(`Cannot query field "${e}"`)):false}function C(r){if(CombinedGraphQLErrors.is(r))return r.errors.filter(y).map(({message:o})=>o);let e=L(r);if(e&&a(e))return [e];let t=f(r);if(t?.statusCode!==400)return [];let n=d(t.bodyText)??P(t)??b(r);return n?Array.isArray(n.errors)?n.errors.filter(y).map(o=>o.message):typeof n.message=="string"&&a(n.message)?[n.message]:typeof n.error=="string"&&a(n.error)?[n.error]:[]:[]}function P(r){let{result:e}=r;return !e||typeof e!="object"?null:e}function b(r){if(!A(r))return null;let{cause:e}=r,t=L(e);if(t&&a(t))return {message:t};if(!e||typeof e!="object")return null;let{result:n}=e;return n&&typeof n=="object"?n:null}function y(r){if(!r||typeof r!="object")return false;let{extensions:e,message:t}=r;return e?.code==="GRAPHQL_VALIDATION_FAILED"&&typeof t=="string"?true:typeof t=="string"&&a(t)}function a(r){return r.startsWith("Cannot query field ")||r.startsWith("Unknown type ")||r.startsWith('Cannot query field "')||r.includes("GRAPHQL_VALIDATION_FAILED")}function I(r){return /Cannot query field "[_A-Za-z][_0-9A-Za-z]*Total" on type "Query"/.test(r)}var U=ApolloProvider,v=createContext(void 0);function pr(){let r=useContext(v);if(!r)throw new Error("useGraphQLError must be used within GraphQLProvider");return r}var fr={userQuery:true};function H(r){return new ErrorLink(({error:e,operation:t})=>{if(t.getContext().userQuery===true)return;let n=k(e);if(n){r(n);return}CombinedGraphQLErrors.is(e)?e.errors.forEach(({message:s,locations:i,path:c})=>{console.warn(`[GraphQL error]: Message: ${s}, Location: ${i}, Path: ${c}`);}):CombinedProtocolErrors.is(e)&&e.errors.forEach(({message:s,extensions:i})=>{console.warn(`[Protocol error]: Message: ${s}, Extensions: ${JSON.stringify(i)}`);});let o=f(e);if(o?.statusCode===400){let s=d(o.bodyText),i=null;if(s&&typeof s=="object"){let{error:c,errors:g,message:E}=s;if(typeof E=="string")i=E;else if(Array.isArray(g)){let[p]=g;if(p&&typeof p.message=="string"){let{message:D}=p;i=D;}}else typeof c=="string"?i=c:i=JSON.stringify(s);}else i=o.bodyText;r(i??"There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.");}if(o){console.warn(`[Network error]: ${o.message}`);return}e&&console.warn(`[Network error]: ${e.message}`);})}function z(r,e){return from([H(e),new HttpLink({uri:`/api/flexkit/${r}/graphql`})])}function Z(r,e){return new ApolloClient({link:z(r??"",e),cache:new InMemoryCache({dataIdFromObject:t=>t._id?t._id:defaultDataIdFromObject(t)})})}function dr({children:r}){let{currentProjectId:e}=f$1(),[t,n]=useState(null),o=useMemo(()=>({schemaErrorMessage:t,setSchemaErrorMessage:n}),[t]),s=useMemo(()=>Z(e,n),[e]);return jsx(v.Provider,{value:o,children:jsx(U,{client:s,children:r})})}var G=createContext([]),M=createContext(()=>{});function K(r,e){let t=e.type;switch(e._id||(e._id=Date.now().toString()),t){case "DeleteEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "AddEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "EditEntity":return uniqBy(props(["type","_id"]),[...r,e]);case "EditRelationship":return uniqBy(props(["type","_id"]),[...r,e]);case "AlertDialog":return uniqBy(props(["type","_id"]),[...r,e]);case "Dismiss":return r.filter(n=>n._id!==e._id);default:throw Error(`Unknown action: ${t}`)}}function yr({children:r}){let[e,t]=useReducer(K,[]);return jsx(G.Provider,{value:e,children:jsx(M.Provider,{value:t,children:r})})}function Ar(){return useContext(G)}function Lr(){return useContext(M)}export{f as a,d as b,k as c,er as d,pr as e,fr as f,dr as g,yr as h,Ar as i,Lr as j};//# sourceMappingURL=chunk-XV7U33XQ.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-XV7U33XQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphql-client/error-utils.ts","../src/graphql-client/graphql-context.tsx","../src/entities/actions-context.tsx"],"names":["hasCause","error","getServerError","ServerError","possibleServerError","getErrorMessage","message","parseErrorBody","bodyText","getGraphQLSchemaMismatchMessage","messages","getGraphQLValidationMessages","isMissingCountStoreFieldMessage","isMissingGraphQLFieldError","fieldName","CombinedGraphQLErrors","isSchemaValidationError","directMessage","isSchemaValidationMessage","serverError","responseBody","getServerErrorResult","getErrorCauseResponse","item","result","cause","causeMessage","extensions","ApolloProviderCompat","ApolloProvider","GraphQLErrorContext","createContext","useGraphQLError","ctx","useContext","USER_QUERY_CONTEXT","createErrorLink","setSchemaErrorMessage","ErrorLink","operation","schemaMismatchMessage","locations","path","CombinedProtocolErrors","responseError","errors","responseMessage","firstError","firstErrorMessage","additiveLink","currentProjectId","from","HttpLink","client","ApolloClient","InMemoryCache","responseObject","defaultDataIdFromObject","GraphQLProvider","children","useConfig","schemaErrorMessage","useState","useMemo","apolloClient","jsx","ActionsContext","EntityDispatchContext","actionsReducer","actions","action","actionType","uniqBy","props","ActionsProvider","entityActions","dispatchEntityActions","useReducer","useActions","useDispatch"],"mappings":"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","file":"chunk-GXQSNOGM.js","sourcesContent":["import type { ErrorLike } from '@apollo/client';\nimport { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\n\ntype ErrorWithCause = ErrorLike & { cause?: unknown };\ntype ErrorWithMessage = {\n message?: unknown;\n};\ntype ServerErrorWithResult = ServerError & {\n result?: unknown;\n};\ntype GraphQLErrorResponse = {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n};\ntype GraphQLErrorItem = {\n extensions?: {\n code?: unknown;\n };\n message?: unknown;\n};\n\nfunction hasCause(error: ErrorLike): error is ErrorWithCause {\n if (!error) {\n return false;\n }\n\n return 'cause' in (error as ErrorWithCause);\n}\n\nexport function getServerError(error?: ErrorLike): ServerError | null {\n if (!error) {\n return null;\n }\n\n if (ServerError.is(error)) {\n return error;\n }\n\n if (hasCause(error)) {\n const possibleServerError = error.cause;\n\n if (ServerError.is(possibleServerError)) {\n return possibleServerError;\n }\n }\n\n return null;\n}\n\nfunction getErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const { message } = error as ErrorWithMessage;\n\n return typeof message === 'string' ? message : null;\n}\n\nexport function parseErrorBody<T>(bodyText: string | undefined): T | null {\n if (!bodyText) {\n return null;\n }\n\n try {\n return JSON.parse(bodyText) as T;\n } catch {\n return null;\n }\n}\n\nexport function getGraphQLSchemaMismatchMessage(error?: ErrorLike): string | null {\n if (!error) {\n return null;\n }\n\n const messages = getGraphQLValidationMessages(error).filter((message) => !isMissingCountStoreFieldMessage(message));\n\n if (messages.length === 0) {\n return null;\n }\n\n return [\n 'The deployed schema is out of sync with your local Flexkit schema.',\n 'Run `flexkit deploy` using the CLI to apply your latest schema changes.',\n ...messages.map((message) => `- ${message}`),\n ].join('\\n');\n}\n\nexport function isMissingGraphQLFieldError(error: ErrorLike | undefined, fieldName: string): boolean {\n if (!error) {\n return false;\n }\n\n return getGraphQLValidationMessages(error).some((message) => {\n return message.includes(`Cannot query field \"${fieldName}\"`);\n });\n}\n\nfunction getGraphQLValidationMessages(error: ErrorLike): string[] {\n if (CombinedGraphQLErrors.is(error)) {\n return error.errors.filter(isSchemaValidationError).map(({ message }) => message);\n }\n\n const directMessage = getErrorMessage(error);\n\n if (directMessage && isSchemaValidationMessage(directMessage)) {\n return [directMessage];\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode !== 400) {\n return [];\n }\n\n const responseBody =\n parseErrorBody<GraphQLErrorResponse>(serverError.bodyText) ??\n getServerErrorResult(serverError) ??\n getErrorCauseResponse(error);\n\n if (!responseBody) {\n return [];\n }\n\n if (Array.isArray(responseBody.errors)) {\n return responseBody.errors.filter(isSchemaValidationError).map((item) => item.message);\n }\n\n if (typeof responseBody.message === 'string' && isSchemaValidationMessage(responseBody.message)) {\n return [responseBody.message];\n }\n\n if (typeof responseBody.error === 'string' && isSchemaValidationMessage(responseBody.error)) {\n return [responseBody.error];\n }\n\n return [];\n}\n\nfunction getServerErrorResult(serverError: ServerError): GraphQLErrorResponse | null {\n const { result } = serverError as ServerErrorWithResult;\n\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return result as GraphQLErrorResponse;\n}\n\nfunction getErrorCauseResponse(error: ErrorLike): GraphQLErrorResponse | null {\n if (!hasCause(error)) {\n return null;\n }\n\n const { cause } = error;\n const causeMessage = getErrorMessage(cause);\n\n if (causeMessage && isSchemaValidationMessage(causeMessage)) {\n return { message: causeMessage };\n }\n\n if (!cause || typeof cause !== 'object') {\n return null;\n }\n\n const { result } = cause as { result?: unknown };\n\n if (result && typeof result === 'object') {\n return result as GraphQLErrorResponse;\n }\n\n return null;\n}\n\nfunction isSchemaValidationError(error: unknown): error is GraphQLErrorItem & { message: string } {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { extensions, message } = error as GraphQLErrorItem;\n const code = extensions?.code;\n\n if (code === 'GRAPHQL_VALIDATION_FAILED' && typeof message === 'string') {\n return true;\n }\n\n return typeof message === 'string' && isSchemaValidationMessage(message);\n}\n\nfunction isSchemaValidationMessage(message: string): boolean {\n return (\n message.startsWith('Cannot query field ') ||\n message.startsWith('Unknown type ') ||\n message.startsWith('Cannot query field \"') ||\n message.includes('GRAPHQL_VALIDATION_FAILED')\n );\n}\n\nfunction isMissingCountStoreFieldMessage(message: string): boolean {\n return /Cannot query field \"[_A-Za-z][_0-9A-Za-z]*Total\" on type \"Query\"/.test(message);\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ApolloClient, InMemoryCache, defaultDataIdFromObject, from, HttpLink } from '@apollo/client';\nimport type { ApolloLink } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors, CombinedProtocolErrors } from '@apollo/client/errors';\nimport { getGraphQLSchemaMismatchMessage, getServerError, parseErrorBody } from './error-utils';\nimport { useConfig } from '../core/config/config-context';\nimport React, { createContext, useContext, useMemo, useState } from 'react';\n\nconst ApolloProviderCompat = ApolloProvider as unknown as React.ComponentType<{\n children?: React.ReactNode;\n client: ApolloClient;\n}>;\n\ntype GraphQLErrorContextValue = {\n schemaErrorMessage: string | null;\n setSchemaErrorMessage: React.Dispatch<React.SetStateAction<string | null>>;\n};\n\nconst GraphQLErrorContext = createContext<GraphQLErrorContextValue | undefined>(undefined);\n\nfunction useGraphQLError(): GraphQLErrorContextValue {\n const ctx = useContext(GraphQLErrorContext);\n\n if (!ctx) {\n throw new Error('useGraphQLError must be used within GraphQLProvider');\n }\n\n return ctx;\n}\n\n/**\n * Context flag for operations the user writes themselves (the Graph app's\n * Query view): any error there, a mismatch or a 400, is a typo, not a\n * deployment that drifted from the local schema, so it must not raise the\n * schema banner. The caller shows the error itself.\n */\nexport const USER_QUERY_CONTEXT = { userQuery: true } as const;\n\nfunction createErrorLink(setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return new ErrorLink(({ error, operation }) => {\n if (operation.getContext().userQuery === true) {\n return;\n }\n\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(error);\n\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }) => {\n console.warn(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`);\n });\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }) => {\n console.warn(`[Protocol error]: Message: ${message}, Extensions: ${JSON.stringify(extensions)}`);\n });\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode === 400) {\n const responseBody = parseErrorBody<Record<string, unknown>>(serverError.bodyText);\n let message: string | null = null;\n\n if (responseBody && typeof responseBody === 'object') {\n const {\n error: responseError,\n errors,\n message: responseMessage,\n } = responseBody as {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n };\n\n if (typeof responseMessage === 'string') {\n message = responseMessage;\n } else if (Array.isArray(errors)) {\n const [firstError] = errors as { message?: unknown }[];\n\n if (firstError && typeof firstError.message === 'string') {\n const { message: firstErrorMessage } = firstError;\n message = firstErrorMessage;\n }\n } else if (typeof responseError === 'string') {\n message = responseError;\n } else {\n message = JSON.stringify(responseBody);\n }\n } else {\n message = serverError.bodyText;\n }\n\n setSchemaErrorMessage(\n message ?? 'There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.'\n );\n }\n\n if (serverError) {\n console.warn(`[Network error]: ${serverError.message}`);\n\n return;\n }\n\n if (error) {\n console.warn(`[Network error]: ${error.message}`);\n }\n });\n}\n\nfunction additiveLink(currentProjectId: string, setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return from([\n createErrorLink(setSchemaErrorMessage),\n new HttpLink({ uri: `/api/flexkit/${currentProjectId}/graphql` }),\n ]);\n}\n\nfunction client(\n currentProjectId: string | undefined,\n setSchemaErrorMessage: (msg: string | null) => void\n): ApolloClient {\n return new ApolloClient({\n link: additiveLink(currentProjectId ?? '', setSchemaErrorMessage),\n cache: new InMemoryCache({\n dataIdFromObject: (responseObject) => {\n return responseObject._id ? (responseObject._id as string) : defaultDataIdFromObject(responseObject);\n },\n }),\n });\n}\n\nexport function GraphQLProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const { currentProjectId } = useConfig();\n const [schemaErrorMessage, setSchemaErrorMessage] = useState<string | null>(null);\n const ctx = useMemo(() => ({ schemaErrorMessage, setSchemaErrorMessage }), [schemaErrorMessage]);\n const apolloClient = useMemo(() => client(currentProjectId, setSchemaErrorMessage), [currentProjectId]);\n\n return (\n <GraphQLErrorContext.Provider value={ctx}>\n <ApolloProviderCompat client={apolloClient}>{children}</ApolloProviderCompat>\n </GraphQLErrorContext.Provider>\n );\n}\n\nexport { useGraphQLError };\n","'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport { props, uniqBy } from 'ramda';\nimport type {\n Action,\n ActionAddEntity,\n ActionAlertDialog,\n ActionDeleteEntity,\n ActionEditEntity,\n ActionEditRelationship,\n} from './types';\n\nconst ActionsContext = createContext<Action[] | []>([]);\nconst EntityDispatchContext = createContext<Dispatch<Action>>(() => undefined);\n\nfunction actionsReducer(actions: Action[], action: Action): Action[] {\n const actionType = action.type;\n\n if (!action._id) {\n action._id = Date.now().toString();\n }\n\n switch (actionType) {\n case 'DeleteEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionDeleteEntity[]), action]);\n }\n case 'AddEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAddEntity[]), action]);\n }\n case 'EditEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditEntity[]), action]);\n }\n case 'EditRelationship': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditRelationship[]), action]);\n }\n case 'AlertDialog': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAlertDialog[]), action]);\n }\n case 'Dismiss': {\n return actions.filter((item) => item._id !== action._id);\n }\n default: {\n throw Error(`Unknown action: ${actionType as string}`);\n }\n }\n}\n\nfunction ActionsProvider({ children }: { children: ReactNode }): JSX.Element {\n const [entityActions, dispatchEntityActions] = useReducer(actionsReducer, []);\n\n return (\n <ActionsContext.Provider value={entityActions}>\n <EntityDispatchContext.Provider value={dispatchEntityActions}>{children}</EntityDispatchContext.Provider>\n </ActionsContext.Provider>\n );\n}\n\nfunction useActions(): Action[] {\n return useContext(ActionsContext);\n}\n\nfunction useDispatch(): Dispatch<Action> {\n return useContext(EntityDispatchContext);\n}\n\nexport { ActionsProvider, useActions, useDispatch };\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphql-client/error-utils.ts","../src/graphql-client/graphql-context.tsx","../src/entities/actions-context.tsx"],"names":["hasCause","error","getServerError","ServerError","possibleServerError","getErrorMessage","message","parseErrorBody","bodyText","getGraphQLSchemaMismatchMessage","messages","getGraphQLValidationMessages","isMissingCountStoreFieldMessage","isMissingGraphQLFieldError","fieldName","CombinedGraphQLErrors","isSchemaValidationError","directMessage","isSchemaValidationMessage","serverError","responseBody","getServerErrorResult","getErrorCauseResponse","item","result","cause","causeMessage","extensions","ApolloProviderCompat","ApolloProvider","GraphQLErrorContext","createContext","useGraphQLError","ctx","useContext","USER_QUERY_CONTEXT","createErrorLink","setSchemaErrorMessage","ErrorLink","operation","schemaMismatchMessage","locations","path","CombinedProtocolErrors","responseError","errors","responseMessage","firstError","firstErrorMessage","additiveLink","currentProjectId","from","HttpLink","client","ApolloClient","InMemoryCache","responseObject","defaultDataIdFromObject","GraphQLProvider","children","useConfig","schemaErrorMessage","useState","useMemo","apolloClient","jsx","ActionsContext","EntityDispatchContext","actionsReducer","actions","action","actionType","uniqBy","props","ActionsProvider","entityActions","dispatchEntityActions","useReducer","useActions","useDispatch"],"mappings":"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","file":"chunk-XV7U33XQ.js","sourcesContent":["import type { ErrorLike } from '@apollo/client';\nimport { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\n\ntype ErrorWithCause = ErrorLike & { cause?: unknown };\ntype ErrorWithMessage = {\n message?: unknown;\n};\ntype ServerErrorWithResult = ServerError & {\n result?: unknown;\n};\ntype GraphQLErrorResponse = {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n};\ntype GraphQLErrorItem = {\n extensions?: {\n code?: unknown;\n };\n message?: unknown;\n};\n\nfunction hasCause(error: ErrorLike): error is ErrorWithCause {\n if (!error) {\n return false;\n }\n\n return 'cause' in (error as ErrorWithCause);\n}\n\nexport function getServerError(error?: ErrorLike): ServerError | null {\n if (!error) {\n return null;\n }\n\n if (ServerError.is(error)) {\n return error;\n }\n\n if (hasCause(error)) {\n const possibleServerError = error.cause;\n\n if (ServerError.is(possibleServerError)) {\n return possibleServerError;\n }\n }\n\n return null;\n}\n\nfunction getErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const { message } = error as ErrorWithMessage;\n\n return typeof message === 'string' ? message : null;\n}\n\nexport function parseErrorBody<T>(bodyText: string | undefined): T | null {\n if (!bodyText) {\n return null;\n }\n\n try {\n return JSON.parse(bodyText) as T;\n } catch {\n return null;\n }\n}\n\nexport function getGraphQLSchemaMismatchMessage(error?: ErrorLike): string | null {\n if (!error) {\n return null;\n }\n\n const messages = getGraphQLValidationMessages(error).filter((message) => !isMissingCountStoreFieldMessage(message));\n\n if (messages.length === 0) {\n return null;\n }\n\n return [\n 'The deployed schema is out of sync with your local Flexkit schema.',\n 'Run `flexkit deploy` using the CLI to apply your latest schema changes.',\n ...messages.map((message) => `- ${message}`),\n ].join('\\n');\n}\n\nexport function isMissingGraphQLFieldError(error: ErrorLike | undefined, fieldName: string): boolean {\n if (!error) {\n return false;\n }\n\n return getGraphQLValidationMessages(error).some((message) => {\n return message.includes(`Cannot query field \"${fieldName}\"`);\n });\n}\n\nfunction getGraphQLValidationMessages(error: ErrorLike): string[] {\n if (CombinedGraphQLErrors.is(error)) {\n return error.errors.filter(isSchemaValidationError).map(({ message }) => message);\n }\n\n const directMessage = getErrorMessage(error);\n\n if (directMessage && isSchemaValidationMessage(directMessage)) {\n return [directMessage];\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode !== 400) {\n return [];\n }\n\n const responseBody =\n parseErrorBody<GraphQLErrorResponse>(serverError.bodyText) ??\n getServerErrorResult(serverError) ??\n getErrorCauseResponse(error);\n\n if (!responseBody) {\n return [];\n }\n\n if (Array.isArray(responseBody.errors)) {\n return responseBody.errors.filter(isSchemaValidationError).map((item) => item.message);\n }\n\n if (typeof responseBody.message === 'string' && isSchemaValidationMessage(responseBody.message)) {\n return [responseBody.message];\n }\n\n if (typeof responseBody.error === 'string' && isSchemaValidationMessage(responseBody.error)) {\n return [responseBody.error];\n }\n\n return [];\n}\n\nfunction getServerErrorResult(serverError: ServerError): GraphQLErrorResponse | null {\n const { result } = serverError as ServerErrorWithResult;\n\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return result as GraphQLErrorResponse;\n}\n\nfunction getErrorCauseResponse(error: ErrorLike): GraphQLErrorResponse | null {\n if (!hasCause(error)) {\n return null;\n }\n\n const { cause } = error;\n const causeMessage = getErrorMessage(cause);\n\n if (causeMessage && isSchemaValidationMessage(causeMessage)) {\n return { message: causeMessage };\n }\n\n if (!cause || typeof cause !== 'object') {\n return null;\n }\n\n const { result } = cause as { result?: unknown };\n\n if (result && typeof result === 'object') {\n return result as GraphQLErrorResponse;\n }\n\n return null;\n}\n\nfunction isSchemaValidationError(error: unknown): error is GraphQLErrorItem & { message: string } {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { extensions, message } = error as GraphQLErrorItem;\n const code = extensions?.code;\n\n if (code === 'GRAPHQL_VALIDATION_FAILED' && typeof message === 'string') {\n return true;\n }\n\n return typeof message === 'string' && isSchemaValidationMessage(message);\n}\n\nfunction isSchemaValidationMessage(message: string): boolean {\n return (\n message.startsWith('Cannot query field ') ||\n message.startsWith('Unknown type ') ||\n message.startsWith('Cannot query field \"') ||\n message.includes('GRAPHQL_VALIDATION_FAILED')\n );\n}\n\nfunction isMissingCountStoreFieldMessage(message: string): boolean {\n return /Cannot query field \"[_A-Za-z][_0-9A-Za-z]*Total\" on type \"Query\"/.test(message);\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ApolloClient, InMemoryCache, defaultDataIdFromObject, from, HttpLink } from '@apollo/client';\nimport type { ApolloLink } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors, CombinedProtocolErrors } from '@apollo/client/errors';\nimport { getGraphQLSchemaMismatchMessage, getServerError, parseErrorBody } from './error-utils';\nimport { useConfig } from '../core/config/config-context';\nimport React, { createContext, useContext, useMemo, useState } from 'react';\n\nconst ApolloProviderCompat = ApolloProvider as unknown as React.ComponentType<{\n children?: React.ReactNode;\n client: ApolloClient;\n}>;\n\ntype GraphQLErrorContextValue = {\n schemaErrorMessage: string | null;\n setSchemaErrorMessage: React.Dispatch<React.SetStateAction<string | null>>;\n};\n\nconst GraphQLErrorContext = createContext<GraphQLErrorContextValue | undefined>(undefined);\n\nfunction useGraphQLError(): GraphQLErrorContextValue {\n const ctx = useContext(GraphQLErrorContext);\n\n if (!ctx) {\n throw new Error('useGraphQLError must be used within GraphQLProvider');\n }\n\n return ctx;\n}\n\n/**\n * Context flag for operations the user writes themselves (the Graph app's\n * Query view): any error there, a mismatch or a 400, is a typo, not a\n * deployment that drifted from the local schema, so it must not raise the\n * schema banner. The caller shows the error itself.\n */\nexport const USER_QUERY_CONTEXT = { userQuery: true } as const;\n\nfunction createErrorLink(setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return new ErrorLink(({ error, operation }) => {\n if (operation.getContext().userQuery === true) {\n return;\n }\n\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(error);\n\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }) => {\n console.warn(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`);\n });\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }) => {\n console.warn(`[Protocol error]: Message: ${message}, Extensions: ${JSON.stringify(extensions)}`);\n });\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode === 400) {\n const responseBody = parseErrorBody<Record<string, unknown>>(serverError.bodyText);\n let message: string | null = null;\n\n if (responseBody && typeof responseBody === 'object') {\n const {\n error: responseError,\n errors,\n message: responseMessage,\n } = responseBody as {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n };\n\n if (typeof responseMessage === 'string') {\n message = responseMessage;\n } else if (Array.isArray(errors)) {\n const [firstError] = errors as { message?: unknown }[];\n\n if (firstError && typeof firstError.message === 'string') {\n const { message: firstErrorMessage } = firstError;\n message = firstErrorMessage;\n }\n } else if (typeof responseError === 'string') {\n message = responseError;\n } else {\n message = JSON.stringify(responseBody);\n }\n } else {\n message = serverError.bodyText;\n }\n\n setSchemaErrorMessage(\n message ?? 'There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.'\n );\n }\n\n if (serverError) {\n console.warn(`[Network error]: ${serverError.message}`);\n\n return;\n }\n\n if (error) {\n console.warn(`[Network error]: ${error.message}`);\n }\n });\n}\n\nfunction additiveLink(currentProjectId: string, setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return from([\n createErrorLink(setSchemaErrorMessage),\n new HttpLink({ uri: `/api/flexkit/${currentProjectId}/graphql` }),\n ]);\n}\n\nfunction client(\n currentProjectId: string | undefined,\n setSchemaErrorMessage: (msg: string | null) => void\n): ApolloClient {\n return new ApolloClient({\n link: additiveLink(currentProjectId ?? '', setSchemaErrorMessage),\n cache: new InMemoryCache({\n dataIdFromObject: (responseObject) => {\n return responseObject._id ? (responseObject._id as string) : defaultDataIdFromObject(responseObject);\n },\n }),\n });\n}\n\nexport function GraphQLProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const { currentProjectId } = useConfig();\n const [schemaErrorMessage, setSchemaErrorMessage] = useState<string | null>(null);\n const ctx = useMemo(() => ({ schemaErrorMessage, setSchemaErrorMessage }), [schemaErrorMessage]);\n const apolloClient = useMemo(() => client(currentProjectId, setSchemaErrorMessage), [currentProjectId]);\n\n return (\n <GraphQLErrorContext.Provider value={ctx}>\n <ApolloProviderCompat client={apolloClient}>{children}</ApolloProviderCompat>\n </GraphQLErrorContext.Provider>\n );\n}\n\nexport { useGraphQLError };\n","'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport { props, uniqBy } from 'ramda';\nimport type {\n Action,\n ActionAddEntity,\n ActionAlertDialog,\n ActionDeleteEntity,\n ActionEditEntity,\n ActionEditRelationship,\n} from './types';\n\nconst ActionsContext = createContext<Action[] | []>([]);\nconst EntityDispatchContext = createContext<Dispatch<Action>>(() => undefined);\n\nfunction actionsReducer(actions: Action[], action: Action): Action[] {\n const actionType = action.type;\n\n if (!action._id) {\n action._id = Date.now().toString();\n }\n\n switch (actionType) {\n case 'DeleteEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionDeleteEntity[]), action]);\n }\n case 'AddEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAddEntity[]), action]);\n }\n case 'EditEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditEntity[]), action]);\n }\n case 'EditRelationship': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditRelationship[]), action]);\n }\n case 'AlertDialog': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAlertDialog[]), action]);\n }\n case 'Dismiss': {\n return actions.filter((item) => item._id !== action._id);\n }\n default: {\n throw Error(`Unknown action: ${actionType as string}`);\n }\n }\n}\n\nfunction ActionsProvider({ children }: { children: ReactNode }): JSX.Element {\n const [entityActions, dispatchEntityActions] = useReducer(actionsReducer, []);\n\n return (\n <ActionsContext.Provider value={entityActions}>\n <EntityDispatchContext.Provider value={dispatchEntityActions}>{children}</EntityDispatchContext.Provider>\n </ActionsContext.Provider>\n );\n}\n\nfunction useActions(): Action[] {\n return useContext(ActionsContext);\n}\n\nfunction useDispatch(): Dispatch<Action> {\n return useContext(EntityDispatchContext);\n}\n\nexport { ActionsProvider, useActions, useDispatch };\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {g,e,x}from'./chunk-4PUMSUJL.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import {f}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=entry-
|
|
1
|
+
import'./index.css';import {g,e,x}from'./chunk-4PUMSUJL.js';import'./chunk-YDVO6XWD.js';import'./chunk-ERDARDGB.js';import {f}from'./chunk-HZOD2HOF.js';import'./chunk-WPCPL2TQ.js';import'./chunk-5CVDMZUI.js';import'./chunk-DGIY4SKN.js';import'./chunk-SZEGGBOC.js';import'./chunk-32ZU4MLE.js';import'./chunk-U45E5X3H.js';import'./chunk-HDOIOXMP.js';import {b,c,e as e$1,a}from'./chunk-USNXQOMJ.js';import {b as b$1}from'./chunk-6NRQMG26.js';import'./chunk-O2QMYUPS.js';import {Waypoints}from'lucide-react';import {useNavigate}from'react-router-dom';import {jsxs,jsx}from'react/jsx-runtime';function S({entityName:n,selectedIds:t}){let{currentProjectId:i,currentProjectSchema:r}=f(),l=useNavigate(),e$2=g(r,n);if(!i||!e$2||e(e$2).length===0)return null;let a=t.length>0?`Open ${t.length} in Graph`:"Open in Graph";return jsxs(b,{children:[jsx(c,{asChild:true,children:jsxs(b$1,{"aria-label":a,className:"fk:mr-2 fk:h-8",onClick:()=>l(x(i,{entity:n,ids:t})),size:"sm",variant:"outline",children:[jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5}),t.length>0?`Graph (${t.length})`:"Graph"]})}),jsx(e$1,{children:t.length>0?"Show the selected records and their relationships":"Explore these records as a graph"})]})}function B({entityName:n,recordId:t,onNavigate:i}){let{currentProjectId:r,currentProjectSchema:l}=f(),e$2=useNavigate(),a$1=g(l,n);return !r||!a$1||!t||e(a$1).length===0?null:jsx(a,{children:jsxs(b,{children:[jsx(c,{asChild:true,children:jsx(b$1,{"aria-label":"View in Graph",className:"fk:h-9 fk:w-9",onClick:()=>{e$2(x(r,{entity:n,ids:[t]})),i?.();},size:"icon",variant:"outline",children:jsx(Waypoints,{className:"fk:size-4",strokeWidth:1.5})})}),jsx(e$1,{children:"View in Graph"})]})})}export{S as EntityGraphButton,B as RecordGraphButton};//# sourceMappingURL=entry-CA2QAEHN.js.map
|
|
2
|
+
//# sourceMappingURL=entry-CA2QAEHN.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/graph/entry.tsx"],"names":["EntityGraphButton","entityName","selectedIds","currentProjectId","currentProjectSchema","useConfig","navigate","useNavigate","entity","getEntity","getRelationshipAttributes","label","jsxs","Tooltip","jsx","TooltipTrigger","Button","graphPath","WaypointsIcon","TooltipContent","RecordGraphButton","recordId","onNavigate","TooltipProvider"],"mappings":"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","file":"entry-
|
|
1
|
+
{"version":3,"sources":["../src/apps/graph/entry.tsx"],"names":["EntityGraphButton","entityName","selectedIds","currentProjectId","currentProjectSchema","useConfig","navigate","useNavigate","entity","getEntity","getRelationshipAttributes","label","jsxs","Tooltip","jsx","TooltipTrigger","Button","graphPath","WaypointsIcon","TooltipContent","RecordGraphButton","recordId","onNavigate","TooltipProvider"],"mappings":"6kBAaO,SAASA,CAAAA,CAAkB,CAAE,UAAA,CAAAC,CAAAA,CAAY,WAAA,CAAAC,CAAY,CAAA,CAAsE,CAChI,GAAM,CAAE,gBAAA,CAAAC,CAAAA,CAAkB,oBAAA,CAAAC,CAAqB,CAAA,CAAIC,CAAAA,EAAU,CACvDC,CAAAA,CAAWC,WAAAA,EAAY,CACvBC,IAASC,CAAAA,CAAUL,CAAAA,CAAsBH,CAAU,CAAA,CAEzD,GAAI,CAACE,GAAoB,CAACK,GAAAA,EAAUE,CAAAA,CAA0BF,GAAM,CAAA,CAAE,MAAA,GAAW,CAAA,CAC/E,OAAO,IAAA,CAGT,IAAMG,CAAAA,CAAQT,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAI,QAAQA,CAAAA,CAAY,MAAM,CAAA,SAAA,CAAA,CAAc,eAAA,CAE/E,OACEU,IAAAA,CAACC,EAAA,CACC,QAAA,CAAA,CAAAC,GAAAA,CAACC,CAAAA,CAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAAH,IAAAA,CAACI,GAAAA,CAAA,CACC,YAAA,CAAYL,CAAAA,CACZ,SAAA,CAAU,gBAAA,CACV,OAAA,CAAS,IAAML,CAAAA,CAASW,CAAAA,CAAUd,CAAAA,CAAkB,CAAE,OAAQF,CAAAA,CAAY,GAAA,CAAKC,CAAY,CAAC,CAAC,CAAA,CAC7F,KAAK,IAAA,CACL,OAAA,CAAQ,SAAA,CAER,QAAA,CAAA,CAAAY,GAAAA,CAACI,SAAAA,CAAA,CAAc,SAAA,CAAU,WAAA,CAAY,WAAA,CAAa,GAAA,CAAK,CAAA,CACtDhB,CAAAA,CAAY,MAAA,CAAS,CAAA,CAAI,CAAA,OAAA,EAAUA,CAAAA,CAAY,MAAM,CAAA,CAAA,CAAA,CAAM,OAAA,CAAA,CAC9D,CAAA,CACF,EACAY,GAAAA,CAACK,GAAAA,CAAA,CACE,QAAA,CAAAjB,CAAAA,CAAY,MAAA,CAAS,EAAI,mDAAA,CAAsD,kCAAA,CAClF,CAAA,CAAA,CACF,CAEJ,CAMO,SAASkB,EAAkB,CAChC,UAAA,CAAAnB,CAAAA,CACA,QAAA,CAAAoB,CAAAA,CACA,UAAA,CAAAC,CACF,CAAA,CAIuB,CACrB,GAAM,CAAE,gBAAA,CAAAnB,CAAAA,CAAkB,oBAAA,CAAAC,CAAqB,CAAA,CAAIC,CAAAA,EAAU,CACvDC,GAAAA,CAAWC,WAAAA,EAAY,CACvBC,IAASC,CAAAA,CAAUL,CAAAA,CAAsBH,CAAU,CAAA,CAEzD,OAAI,CAACE,GAAoB,CAACK,GAAAA,EAAU,CAACa,CAAAA,EAAYX,CAAAA,CAA0BF,GAAM,CAAA,CAAE,MAAA,GAAW,CAAA,CACrF,IAAA,CAIPM,GAAAA,CAACS,CAAAA,CAAA,CACC,QAAA,CAAAX,KAACC,CAAAA,CAAA,CACC,QAAA,CAAA,CAAAC,GAAAA,CAACC,CAAAA,CAAA,CAAe,QAAO,IAAA,CACrB,QAAA,CAAAD,GAAAA,CAACE,GAAAA,CAAA,CACC,YAAA,CAAW,gBACX,SAAA,CAAU,eAAA,CACV,OAAA,CAAS,IAAM,CACbV,GAAAA,CAASW,CAAAA,CAAUd,CAAAA,CAAkB,CAAE,MAAA,CAAQF,CAAAA,CAAY,GAAA,CAAK,CAACoB,CAAQ,CAAE,CAAC,CAAC,CAAA,CAC7EC,CAAAA,KACF,CAAA,CACA,IAAA,CAAK,MAAA,CACL,OAAA,CAAQ,SAAA,CAER,QAAA,CAAAR,GAAAA,CAACI,SAAAA,CAAA,CAAc,UAAU,WAAA,CAAY,WAAA,CAAa,GAAA,CAAK,CAAA,CACzD,CAAA,CACF,CAAA,CACAJ,GAAAA,CAACK,GAAAA,CAAA,CAAe,QAAA,CAAA,eAAA,CAAa,CAAA,CAAA,CAC/B,CAAA,CACF,CAEJ","file":"entry-CA2QAEHN.js","sourcesContent":["'use client';\n\nimport type { JSX } from 'react';\nimport { Waypoints as WaypointsIcon } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useConfig } from '../../core/config/config-context';\nimport { Button, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui';\nimport { getEntity, getRelationshipAttributes, graphPath } from './graph';\n\n/**\n * \"Open in Graph\" for a Desk list: the selected records, or a sample of the\n * entity when nothing is selected. Hidden for entities without relationships.\n */\nexport function EntityGraphButton({ entityName, selectedIds }: { entityName: string; selectedIds: string[] }): JSX.Element | null {\n const { currentProjectId, currentProjectSchema } = useConfig();\n const navigate = useNavigate();\n const entity = getEntity(currentProjectSchema, entityName);\n\n if (!currentProjectId || !entity || getRelationshipAttributes(entity).length === 0) {\n return null;\n }\n\n const label = selectedIds.length > 0 ? `Open ${selectedIds.length} in Graph` : 'Open in Graph';\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label={label}\n className=\"fk:mr-2 fk:h-8\"\n onClick={() => navigate(graphPath(currentProjectId, { entity: entityName, ids: selectedIds }))}\n size=\"sm\"\n variant=\"outline\"\n >\n <WaypointsIcon className=\"fk:size-4\" strokeWidth={1.5} />\n {selectedIds.length > 0 ? `Graph (${selectedIds.length})` : 'Graph'}\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n {selectedIds.length > 0 ? 'Show the selected records and their relationships' : 'Explore these records as a graph'}\n </TooltipContent>\n </Tooltip>\n );\n}\n\n/**\n * \"View in Graph\" in a record drawer: the record expanded one hop. The drawer\n * is mounted outside any app, so the tooltip brings its own provider.\n */\nexport function RecordGraphButton({\n entityName,\n recordId,\n onNavigate,\n}: {\n entityName: string;\n recordId: string;\n onNavigate?: () => void;\n}): JSX.Element | null {\n const { currentProjectId, currentProjectSchema } = useConfig();\n const navigate = useNavigate();\n const entity = getEntity(currentProjectSchema, entityName);\n\n if (!currentProjectId || !entity || !recordId || getRelationshipAttributes(entity).length === 0) {\n return null;\n }\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n aria-label=\"View in Graph\"\n className=\"fk:h-9 fk:w-9\"\n onClick={() => {\n navigate(graphPath(currentProjectId, { entity: entityName, ids: [recordId] }));\n onNavigate?.();\n }}\n size=\"icon\"\n variant=\"outline\"\n >\n <WaypointsIcon className=\"fk:size-4\" strokeWidth={1.5} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>View in Graph</TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"]}
|