@flexkit/studio 0.2.37 → 0.2.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +76 -7
- package/dist/{chat-page-XYQOQPMW.js → chat-page-2ES466GO.js} +3 -3
- package/dist/{chat-page-XYQOQPMW.js.map → chat-page-2ES466GO.js.map} +1 -1
- package/dist/{chunk-6NRMVVU4.js → chunk-7FYOLFHG.js} +3 -3
- package/dist/{chunk-6NRMVVU4.js.map → chunk-7FYOLFHG.js.map} +1 -1
- package/dist/{chunk-PNGPE7QM.js → chunk-CESG6WQB.js} +3 -3
- package/dist/{chunk-PNGPE7QM.js.map → chunk-CESG6WQB.js.map} +1 -1
- package/dist/{chunk-OWY5BQER.js → chunk-DQ2OVNOB.js} +2 -2
- package/dist/{chunk-OWY5BQER.js.map → chunk-DQ2OVNOB.js.map} +1 -1
- package/dist/{chunk-KOM7G7WT.js → chunk-DR36N2JC.js} +2 -2
- package/dist/{chunk-KOM7G7WT.js.map → chunk-DR36N2JC.js.map} +1 -1
- package/dist/{chunk-36YXPN42.js → chunk-DUS2CRB3.js} +2 -2
- package/dist/{chunk-36YXPN42.js.map → chunk-DUS2CRB3.js.map} +1 -1
- package/dist/{chunk-ND2RTUMM.js → chunk-JJFOUJMQ.js} +3 -3
- package/dist/{chunk-ND2RTUMM.js.map → chunk-JJFOUJMQ.js.map} +1 -1
- package/dist/chunk-KWE3LHFM.js +10 -0
- package/dist/chunk-KWE3LHFM.js.map +1 -0
- package/dist/{chunk-CRTUZ22E.js → chunk-MGCXYA2S.js} +3 -3
- package/dist/{chunk-CRTUZ22E.js.map → chunk-MGCXYA2S.js.map} +1 -1
- package/dist/{chunk-337GX2BR.js → chunk-PR3MTHFM.js} +2 -2
- package/dist/{chunk-337GX2BR.js.map → chunk-PR3MTHFM.js.map} +1 -1
- package/dist/{chunk-RX6QUDLZ.js → chunk-R7EOMV6C.js} +3 -3
- package/dist/{chunk-RX6QUDLZ.js.map → chunk-R7EOMV6C.js.map} +1 -1
- package/dist/{chunk-DO32GATF.js → chunk-SAVZBVP5.js} +3 -3
- package/dist/{chunk-DO32GATF.js.map → chunk-SAVZBVP5.js.map} +1 -1
- package/dist/{chunk-RGISZNQ2.js → chunk-SGQMQZIW.js} +2 -2
- package/dist/{chunk-RGISZNQ2.js.map → chunk-SGQMQZIW.js.map} +1 -1
- package/dist/{chunk-AQSL5HBZ.js → chunk-TOISBMRE.js} +2 -2
- package/dist/{chunk-AQSL5HBZ.js.map → chunk-TOISBMRE.js.map} +1 -1
- package/dist/{chunk-CC2U7ASG.js → chunk-TP6QGIJH.js} +3 -3
- package/dist/{chunk-CC2U7ASG.js.map → chunk-TP6QGIJH.js.map} +1 -1
- package/dist/{chunk-U4DUXPZV.js → chunk-U3PTPLSE.js} +2 -2
- package/dist/{chunk-U4DUXPZV.js.map → chunk-U3PTPLSE.js.map} +1 -1
- package/dist/{chunk-UULPCFWK.js → chunk-VR3LFFJ3.js} +3 -3
- package/dist/{chunk-UULPCFWK.js.map → chunk-VR3LFFJ3.js.map} +1 -1
- package/dist/{chunk-BHHLWGZ4.js → chunk-WSXNYZQC.js} +2 -2
- package/dist/{chunk-BHHLWGZ4.js.map → chunk-WSXNYZQC.js.map} +1 -1
- package/dist/{chunk-XV4QJKOJ.js → chunk-Z7JAN2UW.js} +2 -2
- package/dist/{chunk-XV4QJKOJ.js.map → chunk-Z7JAN2UW.js.map} +1 -1
- package/dist/{entry-6EWYXIS5.js → entry-ZYSQFFEW.js} +2 -2
- package/dist/{entry-6EWYXIS5.js.map → entry-ZYSQFFEW.js.map} +1 -1
- package/dist/index.js +2 -2
- package/dist/{list-GBM53HFN.js → list-4EXGXJZA.js} +2 -2
- package/dist/{list-GBM53HFN.js.map → list-4EXGXJZA.js.map} +1 -1
- package/dist/{list-N5W7G3LD.js → list-XTC2OYA6.js} +3 -3
- package/dist/{list-N5W7G3LD.js.map → list-XTC2OYA6.js.map} +1 -1
- package/dist/{pages-HPR3UHT7.js → pages-HW4OCENA.js} +3 -3
- package/dist/{pages-HPR3UHT7.js.map → pages-HW4OCENA.js.map} +1 -1
- package/dist/{plugin-pages-VDRT7RLY.js → plugin-pages-CUTCB6NU.js} +2 -2
- package/dist/{plugin-pages-VDRT7RLY.js.map → plugin-pages-CUTCB6NU.js.map} +1 -1
- package/dist/{project-selector-RRG52TSX.js → project-selector-Z4Q6G6GM.js} +2 -2
- package/dist/{project-selector-RRG52TSX.js.map → project-selector-Z4Q6G6GM.js.map} +1 -1
- package/dist/record-links-DBU5G6ZH.js +2 -0
- package/dist/{record-links-CI4OJPWW.js.map → record-links-DBU5G6ZH.js.map} +1 -1
- package/dist/{root-IXK2ESCS.js → root-3Q44ISGQ.js} +3 -3
- package/dist/{root-IXK2ESCS.js.map → root-3Q44ISGQ.js.map} +1 -1
- package/dist/{root-DF2BNGOF.js → root-422O7YX5.js} +3 -3
- package/dist/{root-DF2BNGOF.js.map → root-422O7YX5.js.map} +1 -1
- package/dist/{root-KF6EFGM6.js → root-7FYWXLI6.js} +3 -3
- package/dist/{root-KF6EFGM6.js.map → root-7FYWXLI6.js.map} +1 -1
- package/dist/{root-LUWJS7SQ.js → root-7NZPP7IC.js} +2 -2
- package/dist/{root-LUWJS7SQ.js.map → root-7NZPP7IC.js.map} +1 -1
- package/dist/{root-RGAV2YAF.js → root-Q6SHODPG.js} +2 -2
- package/dist/{root-RGAV2YAF.js.map → root-Q6SHODPG.js.map} +1 -1
- package/dist/{root-JFYE2JRJ.js → root-SYRZ3UBN.js} +2 -2
- package/dist/{root-JFYE2JRJ.js.map → root-SYRZ3UBN.js.map} +1 -1
- package/dist/{search-DQLC3XDJ.js → search-X7F5JZOU.js} +2 -2
- package/dist/{search-DQLC3XDJ.js.map → search-X7F5JZOU.js.map} +1 -1
- package/dist/{skills-pages-Q4YUDTC2.js → skills-pages-X3DVZXY5.js} +2 -2
- package/dist/{skills-pages-Q4YUDTC2.js.map → skills-pages-X3DVZXY5.js.map} +1 -1
- package/dist/{source-J3ZCTEWZ.js → source-43PHAELP.js} +2 -2
- package/dist/{source-J3ZCTEWZ.js.map → source-43PHAELP.js.map} +1 -1
- package/package.json +6 -6
- package/dist/chunk-ZV7I5RUM.js +0 -10
- package/dist/chunk-ZV7I5RUM.js.map +0 -1
- package/dist/record-links-CI4OJPWW.js +0 -2
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import'./index.css';import {f,a,b,g}from'./chunk-
|
|
1
|
+
import'./index.css';import {f,a,b,g}from'./chunk-SAVZBVP5.js';import {find,propEq}from'ramda';var I=25,K=25,B=2e3,N=12,x=new Set(["_asset"]),P={light:["#2a78d6","#eb6834","#1baf7a","#eda100","#e87ba4","#008300","#6250d6","#e34948","#0e9aa7","#6b8e23","#9c27b0","#a05a2c"],dark:["#3987e5","#d95926","#199e70","#c98500","#d55181","#008300","#9085e9","#e66767","#1a9fb0","#6f8a28","#c058d6","#a35226"]};function $(t,n){return `${t}:${n}`}function l(t){return t.attributes.filter(n=>a(n)==="relationship"&&n.relationship!==void 0&&!x.has(n.relationship.entity))}function V(t){return t.filter(n=>!x.has(n.name)&&l(n).length>0)}function _(t,n){return find(propEq(n,"name"))(t)}function J(t){return t.menu?.label??t.plural}function W(t,n){let e=P[n];return Object.fromEntries(t.filter(r=>!x.has(r.name)).map((r,i)=>[r.name,e[i%e.length]]))}function S(t,n,e=f){let r=b(t);if(!r)return "";let i=a(r);return i==="global"?r.name:i==="local"?`${r.name} { ${D(n,e)} }`:""}function D(t,n=f){let e=g(n);return t===n?e:`${e} ${t}`}function T(t,n,e,r,i){let o=_(n,t.relationship?.entity??"");return `${t.name}${r} { _id ${S(o,e,i)} }`}function q(t){return `${t.name}Connection { aggregate { count { nodes } } }`}var Y=5;function z({defaultScope:t,entity:n,schema:e,scope:r,expand:i}){let o=i?l(n).map(s=>T(s,e,r,`(limit: ${I})`,t)):[];return `query GraphRecords($where: ${n.name}Where, $limit: Int) {
|
|
2
2
|
${n.plural}(where: $where, limit: $limit) {
|
|
3
3
|
_id
|
|
4
4
|
${S(n,r,t)}
|
|
@@ -26,5 +26,5 @@ import'./index.css';import {f,a,b,g}from'./chunk-DO32GATF.js';import {find,propE
|
|
|
26
26
|
}`}function O(t){return t.filter(n=>(n.spaces?.length??0)===0)}function nt(t){return `query GraphTotals {
|
|
27
27
|
${O(t).map(n=>`${n.plural}Total`).join(`
|
|
28
28
|
`)}
|
|
29
|
-
}`}function j(t,n){if(t==null)return "";if(Array.isArray(t)){let[e]=t;return j(e?.[n]??e?.default,n)}return typeof t=="object"?JSON.stringify(t):String(t)}function G(t,n,e){let r=b(n),i=r?t[r.name]:void 0;if(typeof i=="string"||typeof i=="number")return String(i);if(Array.isArray(i)){let[o]=i,s=o?.[e]??o?.default;if(typeof s=="string"||typeof s=="number")return String(s)}return t._id}function M(t,n,e){let r=e.name,i=e.relationship?.field??e.name,[o]=[t.key,n.key].sort(),s=o===t.key?r:i,d=o===t.key?n.key:t.key;return {key:`${o}|${d}|${s}`,source:t.key,target:n.key,sourceAttribute:r,targetAttribute:i}}function et({records:t,entity:n,schema:e,scope:r}){let i=new Map,o=new Map,s={},d=l(n);return t.forEach(p=>{let a={key:$(n.name,p._id),entity:n.name,id:p._id,label:G(p,n,r)};i.set(a.key,a),d.forEach(u=>{let y=u.relationship?.entity??"",C=_(e,y),A=p[u.name],k=p[`${u.name}Connection`]?.aggregate?.count?.nodes;typeof k=="number"&&(s[a.key]={...s[a.key],[u.name]:k}),Array.isArray(A)&&A.forEach(f=>{let c={key:$(y,f._id),entity:y,id:f._id,label:G(f,C,r)};if(i.has(c.key)||i.set(c.key,c),c.key!==a.key){let h=M(a,c,u);o.has(h.key)||o.set(h.key,h);}});});}),{nodes:[...i.values()],edges:[...o.values()],counts:s}}function rt(t,n){let e={};return t.forEach(r=>{l(n).forEach(i=>{let o=r[i.name];if(Array.isArray(o)){let s=$(n.name,r._id);e[s]={...e[s],[i.name]:o.length};}});}),e}function it(t,{entity:n,ids:e}){let r=new URLSearchParams({entity:n});return e&&e.length>0&&r.set("ids",e.join(",")),`/${t}/graph?${r.toString()}`}function ot(t){let n=new URLSearchParams(t),e=n.get("entity");if(!e)return null;let r=(n.get("ids")??"").split(",").map(i=>i.trim()).filter(Boolean);return {entity:e,ids:r}}export{I as a,K as b,B as c,$ as d,l as e,V as f,_ as g,J as h,W as i,S as j,Y as k,z as l,Z as m,v as n,L as o,tt as p,O as q,nt as r,j as s,G as t,M as u,et as v,rt as w,it as x,ot as y};//# sourceMappingURL=chunk-
|
|
30
|
-
//# sourceMappingURL=chunk-
|
|
29
|
+
}`}function j(t,n){if(t==null)return "";if(Array.isArray(t)){let[e]=t;return j(e?.[n]??e?.default,n)}return typeof t=="object"?JSON.stringify(t):String(t)}function G(t,n,e){let r=b(n),i=r?t[r.name]:void 0;if(typeof i=="string"||typeof i=="number")return String(i);if(Array.isArray(i)){let[o]=i,s=o?.[e]??o?.default;if(typeof s=="string"||typeof s=="number")return String(s)}return t._id}function M(t,n,e){let r=e.name,i=e.relationship?.field??e.name,[o]=[t.key,n.key].sort(),s=o===t.key?r:i,d=o===t.key?n.key:t.key;return {key:`${o}|${d}|${s}`,source:t.key,target:n.key,sourceAttribute:r,targetAttribute:i}}function et({records:t,entity:n,schema:e,scope:r}){let i=new Map,o=new Map,s={},d=l(n);return t.forEach(p=>{let a={key:$(n.name,p._id),entity:n.name,id:p._id,label:G(p,n,r)};i.set(a.key,a),d.forEach(u=>{let y=u.relationship?.entity??"",C=_(e,y),A=p[u.name],k=p[`${u.name}Connection`]?.aggregate?.count?.nodes;typeof k=="number"&&(s[a.key]={...s[a.key],[u.name]:k}),Array.isArray(A)&&A.forEach(f=>{let c={key:$(y,f._id),entity:y,id:f._id,label:G(f,C,r)};if(i.has(c.key)||i.set(c.key,c),c.key!==a.key){let h=M(a,c,u);o.has(h.key)||o.set(h.key,h);}});});}),{nodes:[...i.values()],edges:[...o.values()],counts:s}}function rt(t,n){let e={};return t.forEach(r=>{l(n).forEach(i=>{let o=r[i.name];if(Array.isArray(o)){let s=$(n.name,r._id);e[s]={...e[s],[i.name]:o.length};}});}),e}function it(t,{entity:n,ids:e}){let r=new URLSearchParams({entity:n});return e&&e.length>0&&r.set("ids",e.join(",")),`/${t}/graph?${r.toString()}`}function ot(t){let n=new URLSearchParams(t),e=n.get("entity");if(!e)return null;let r=(n.get("ids")??"").split(",").map(i=>i.trim()).filter(Boolean);return {entity:e,ids:r}}export{I as a,K as b,B as c,$ as d,l as e,V as f,_ as g,J as h,W as i,S as j,Y as k,z as l,Z as m,v as n,L as o,tt as p,O as q,nt as r,j as s,G as t,M as u,et as v,rt as w,it as x,ot as y};//# sourceMappingURL=chunk-7FYOLFHG.js.map
|
|
30
|
+
//# sourceMappingURL=chunk-7FYOLFHG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/apps/graph/graph.ts"],"names":["EXPAND_PAGE","SAMPLE_LIMIT","MAX_NODES","DETAIL_ATTRIBUTE_LIMIT","HIDDEN_ENTITIES","GRAPH_PALETTE","nodeKey","entity","id","getRelationshipAttributes","attribute","getAttributeScope","getGraphEntities","schema","getEntity","name","find","propEq","getEntityLabel","getEntityColors","theme","palette","index","getDisplaySelection","scope","defaultScope","DEFAULT_SCOPE_KEY","display","getDisplayAttribute","scopeType","getScopeFields","fallback","defaultValueSelection","getRelatedSelection","args","relatedEntity","getCountSelection","EXPAND_HOP_MAX_RECORDS","buildRecordsQuery","expand","relationships","buildExpandQuery","buildCountsQuery","getDetailAttributes","buildDetailsQuery","fields","getTotalEntities","entities","buildTotalsQuery","formatDetailValue","value","first","captionOf","record","scoped","edgeOf","source","target","sourceAttribute","targetAttribute","left","leftAttribute","right","graphFromRecords","records","nodes","edges","counts","relatedEntityName","relatedRecords","total","relatedRecord","edge","fetchedFromRecords","fetched","related","key","graphPath","projectId","ids","params","parseGraphParams","search"],"mappings":"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","file":"chunk-6NRMVVU4.js","sourcesContent":["import { find, propEq } from 'ramda';\nimport { DEFAULT_SCOPE_KEY, defaultValueSelection } from '../../graphql-client/queries';\nimport { getAttributeScope } from '../../core/attribute-scope';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport type { Attribute, Entity } from '../../core/types';\n\n/**\n * Pure helpers of the Graph app: the GraphQL queries that fetch records with\n * their relationships, and the mapping of their results to the nodes and\n * edges the canvas draws. No React, no sigma, so the rules are unit-testable.\n */\n\n/** Related records fetched per relationship attribute in one go. */\nexport const EXPAND_PAGE = 25;\n/** Records loaded when starting from an entity. */\nexport const SAMPLE_LIMIT = 25;\n/** Nodes a canvas holds at most; later additions are dropped with a notice. */\nexport const MAX_NODES = 2000;\n/** Attributes shown in the inspector at most. */\nexport const DETAIL_ATTRIBUTE_LIMIT = 12;\n\n/** Entities whose nodes are never drawn: assets are media, not records. */\nconst HIDDEN_ENTITIES = new Set(['_asset']);\n\n/**\n * Categorical palette, one hue per entity in schema order (light and dark\n * surfaces step the same hues). The first eight are the validated dataviz\n * palette; the next four were checked with its script so adjacent pairs\n * stay apart under colour-blindness simulation and no pair on either\n * surface comes closer than the reference palette's own closest pair.\n * Projects with more entities than hues reuse them.\n */\nexport const GRAPH_PALETTE = {\n light: [\n '#2a78d6',\n '#eb6834',\n '#1baf7a',\n '#eda100',\n '#e87ba4',\n '#008300',\n '#6250d6',\n '#e34948',\n '#0e9aa7',\n '#6b8e23',\n '#9c27b0',\n '#a05a2c',\n ],\n dark: [\n '#3987e5',\n '#d95926',\n '#199e70',\n '#c98500',\n '#d55181',\n '#008300',\n '#9085e9',\n '#e66767',\n '#1a9fb0',\n '#6f8a28',\n '#c058d6',\n '#a35226',\n ],\n} as const;\n\nexport interface GraphNode {\n key: string;\n entity: string;\n id: string;\n label: string;\n}\n\nexport interface GraphEdge {\n key: string;\n source: string;\n target: string;\n /** The relationship attribute on the source node's entity. */\n sourceAttribute: string;\n /** The mirror attribute on the target node's entity. */\n targetAttribute: string;\n}\n\n/** Related records per relationship attribute, keyed by node, as the API counted them. */\nexport type GraphCounts = { [nodeKey: string]: { [attribute: string]: number } };\n\nexport interface GraphData {\n nodes: GraphNode[];\n edges: GraphEdge[];\n counts: GraphCounts;\n}\n\nexport type GraphRecord = { _id: string; [key: string]: unknown };\n\ntype ConnectionCount = { aggregate?: { count?: { nodes?: number } } };\n\nexport function nodeKey(entity: string, id: string): string {\n return `${entity}:${id}`;\n}\n\n/** Relationship attributes of an entity that point at drawable entities. */\nexport function getRelationshipAttributes(entity: Entity): Attribute[] {\n return entity.attributes.filter(\n (attribute) =>\n getAttributeScope(attribute) === 'relationship' &&\n attribute.relationship !== undefined &&\n !HIDDEN_ENTITIES.has(attribute.relationship.entity)\n );\n}\n\n/** Entities worth starting from: at least one drawable relationship. */\nexport function getGraphEntities(schema: Entity[]): Entity[] {\n return schema.filter((entity) => !HIDDEN_ENTITIES.has(entity.name) && getRelationshipAttributes(entity).length > 0);\n}\n\nexport function getEntity(schema: Entity[], name: string): Entity | undefined {\n return find<Entity>(propEq(name, 'name'))(schema);\n}\n\nexport function getEntityLabel(entity: Entity): string {\n return entity.menu?.label ?? entity.plural;\n}\n\n/** Colour per entity name, assigned in schema order and never re-cycled on filter. */\nexport function getEntityColors(schema: Entity[], theme: 'light' | 'dark'): { [entity: string]: string } {\n const palette = GRAPH_PALETTE[theme];\n\n return Object.fromEntries(\n schema.filter((entity) => !HIDDEN_ENTITIES.has(entity.name)).map((entity, index) => [entity.name, palette[index % palette.length]])\n );\n}\n\n/**\n * Selection of the display attribute: a scalar for global attributes, the\n * current scope's value for local ones. Relationship display attributes fall\n * back to the id.\n */\nexport function getDisplaySelection(\n entity: Entity | undefined,\n scope: string,\n defaultScope = DEFAULT_SCOPE_KEY\n): string {\n const display = getDisplayAttribute(entity);\n\n if (!display) {\n return '';\n }\n\n const scopeType = getAttributeScope(display);\n\n if (scopeType === 'global') {\n return display.name;\n }\n\n if (scopeType === 'local') {\n return `${display.name} { ${getScopeFields(scope, defaultScope)} }`;\n }\n\n return '';\n}\n\n/**\n * The scope value and the default one to fall back on, as the Desk queries\n * select them: the default scope's value always comes back as `default`,\n * whatever the project named that scope.\n */\nexport function getScopeFields(scope: string, defaultScope = DEFAULT_SCOPE_KEY): string {\n const fallback = defaultValueSelection(defaultScope);\n\n return scope === defaultScope ? fallback : `${fallback} ${scope}`;\n}\n\nfunction getRelatedSelection(\n attribute: Attribute,\n schema: Entity[],\n scope: string,\n args: string,\n defaultScope?: string\n): string {\n const relatedEntity = getEntity(schema, attribute.relationship?.entity ?? '');\n\n return `${attribute.name}${args} { _id ${getDisplaySelection(relatedEntity, scope, defaultScope)} }`;\n}\n\nfunction getCountSelection(attribute: Attribute): string {\n return `${attribute.name}Connection { aggregate { count { nodes } } }`;\n}\n\n/** Records a one-hop load covers at most; more records come without their relationships. */\nexport const EXPAND_HOP_MAX_RECORDS = 5;\n\n/**\n * Records by id or a sample of them; with `expand`, each comes with the first\n * page of every drawable relationship. Totals are left to the inspector:\n * counting every relationship of every record is what makes a load slow.\n */\nexport function buildRecordsQuery({\n defaultScope,\n entity,\n schema,\n scope,\n expand,\n}: {\n defaultScope?: string;\n entity: Entity;\n schema: Entity[];\n scope: string;\n expand: boolean;\n}): string {\n const relationships = expand\n ? getRelationshipAttributes(entity).map((attribute) =>\n getRelatedSelection(attribute, schema, scope, `(limit: ${EXPAND_PAGE})`, defaultScope)\n )\n : [];\n\n return `query GraphRecords($where: ${entity.name}Where, $limit: Int) {\n ${entity.plural}(where: $where, limit: $limit) {\n _id\n ${getDisplaySelection(entity, scope, defaultScope)}\n ${relationships.join('\\n ')}\n }\n}`;\n}\n\n/** One more page of a single relationship of one record. */\nexport function buildExpandQuery({\n defaultScope,\n entity,\n schema,\n scope,\n attribute,\n}: {\n defaultScope?: string;\n entity: Entity;\n schema: Entity[];\n scope: string;\n attribute: Attribute;\n}): string {\n return `query GraphExpand($id: ID!, $offset: Int, $limit: Int) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n ${getRelatedSelection(attribute, schema, scope, '(limit: $limit, offset: $offset)', defaultScope)}\n }\n}`;\n}\n\n/** The total per drawable relationship of one record. */\nexport function buildCountsQuery({ entity }: { entity: Entity }): string {\n return `query GraphCounts($id: ID!) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n ${getRelationshipAttributes(entity).map(getCountSelection).join('\\n ')}\n }\n}`;\n}\n\n/** Attributes the inspector lists: visible scalars, global or in the current scope; rich text is skipped. */\nexport function getDetailAttributes(entity: Entity): Attribute[] {\n return entity.attributes\n .filter((attribute) => {\n const scopeType = getAttributeScope(attribute);\n\n return (\n !attribute.hidden &&\n attribute.dataType !== 'asset' &&\n attribute.inputType !== 'editor' &&\n (scopeType === 'global' || scopeType === 'local')\n );\n })\n .slice(0, DETAIL_ATTRIBUTE_LIMIT);\n}\n\n/** The scalar values of one record for the inspector. */\nexport function buildDetailsQuery({\n defaultScope,\n entity,\n scope,\n}: {\n defaultScope?: string;\n entity: Entity;\n scope: string;\n}): string {\n const fields = getDetailAttributes(entity).map((attribute) =>\n getAttributeScope(attribute) === 'local'\n ? `${attribute.name} { ${getScopeFields(scope, defaultScope)} }`\n : attribute.name\n );\n\n return `query GraphDetails($id: ID!) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n _updatedAt\n ${fields.join('\\n ')}\n }\n}`;\n}\n\n/** Entities whose count-store total the API exposes (not space-bound). */\nexport function getTotalEntities(entities: Entity[]): Entity[] {\n return entities.filter((entity) => (entity.spaces?.length ?? 0) === 0);\n}\n\nexport function buildTotalsQuery(entities: Entity[]): string {\n return `query GraphTotals {\\n ${getTotalEntities(entities)\n .map((entity) => `${entity.plural}Total`)\n .join('\\n ')}\\n}`;\n}\n\n/** A scalar as the inspector shows it: the scope value of a local attribute, else the value itself. */\nexport function formatDetailValue(value: unknown, scope: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n const [first] = value as { [key: string]: unknown }[];\n\n return formatDetailValue(first?.[scope] ?? first?.default, scope);\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/** The caption of a record: its display value in the scope, else in the default scope, else its id. */\nexport function captionOf(record: GraphRecord, entity: Entity | undefined, scope: string): string {\n const display = getDisplayAttribute(entity);\n const value = display ? record[display.name] : undefined;\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const [first] = value as { [key: string]: unknown }[];\n const scoped = first?.[scope] ?? first?.default;\n\n if (typeof scoped === 'string' || typeof scoped === 'number') {\n return String(scoped);\n }\n }\n\n return record._id;\n}\n\n/**\n * The edge between two nodes for a relationship: one Neo4j relationship per\n * entity pair, so the key is the same whichever side it was fetched from.\n */\nexport function edgeOf(source: GraphNode, target: GraphNode, attribute: Attribute): GraphEdge {\n const sourceAttribute = attribute.name;\n const targetAttribute = attribute.relationship?.field ?? attribute.name;\n const [left] = [source.key, target.key].sort();\n const leftAttribute = left === source.key ? sourceAttribute : targetAttribute;\n const right = left === source.key ? target.key : source.key;\n\n return { key: `${left}|${right}|${leftAttribute}`, source: source.key, target: target.key, sourceAttribute, targetAttribute };\n}\n\n/**\n * Nodes and edges from records of an entity; the related records under each\n * relationship attribute become nodes too, and `xConnection` aggregates\n * become counts.\n */\nexport function graphFromRecords({\n records,\n entity,\n schema,\n scope,\n}: {\n records: GraphRecord[];\n entity: Entity;\n schema: Entity[];\n scope: string;\n}): GraphData {\n const nodes = new Map<string, GraphNode>();\n const edges = new Map<string, GraphEdge>();\n const counts: GraphCounts = {};\n const relationships = getRelationshipAttributes(entity);\n\n records.forEach((record) => {\n const source: GraphNode = {\n key: nodeKey(entity.name, record._id),\n entity: entity.name,\n id: record._id,\n label: captionOf(record, entity, scope),\n };\n nodes.set(source.key, source);\n\n relationships.forEach((attribute) => {\n const relatedEntityName = attribute.relationship?.entity ?? '';\n const relatedEntity = getEntity(schema, relatedEntityName);\n const relatedRecords = record[attribute.name];\n const connection = record[`${attribute.name}Connection`] as ConnectionCount | undefined;\n const total = connection?.aggregate?.count?.nodes;\n\n if (typeof total === 'number') {\n counts[source.key] = { ...counts[source.key], [attribute.name]: total };\n }\n\n if (!Array.isArray(relatedRecords)) {\n return;\n }\n\n (relatedRecords as GraphRecord[]).forEach((relatedRecord) => {\n const target: GraphNode = {\n key: nodeKey(relatedEntityName, relatedRecord._id),\n entity: relatedEntityName,\n id: relatedRecord._id,\n label: captionOf(relatedRecord, relatedEntity, scope),\n };\n\n if (!nodes.has(target.key)) {\n nodes.set(target.key, target);\n }\n\n if (target.key !== source.key) {\n const edge = edgeOf(source, target, attribute);\n\n if (!edges.has(edge.key)) {\n edges.set(edge.key, edge);\n }\n }\n });\n });\n });\n\n return { nodes: [...nodes.values()], edges: [...edges.values()], counts };\n}\n\n/** How many related records each record carries per relationship, to continue paging from. */\nexport function fetchedFromRecords(records: GraphRecord[], entity: Entity): GraphCounts {\n const fetched: GraphCounts = {};\n\n records.forEach((record) => {\n getRelationshipAttributes(entity).forEach((attribute) => {\n const related = record[attribute.name];\n\n if (Array.isArray(related)) {\n const key = nodeKey(entity.name, record._id);\n fetched[key] = { ...fetched[key], [attribute.name]: related.length };\n }\n });\n });\n\n return fetched;\n}\n\n/** The Graph app route for an entity, optionally for given records. */\nexport function graphPath(projectId: string, { entity, ids }: { entity: string; ids?: string[] }): string {\n const params = new URLSearchParams({ entity });\n\n if (ids && ids.length > 0) {\n params.set('ids', ids.join(','));\n }\n\n return `/${projectId}/graph?${params.toString()}`;\n}\n\nexport function parseGraphParams(search: string): { entity: string; ids: string[] } | null {\n const params = new URLSearchParams(search);\n const entity = params.get('entity');\n\n if (!entity) {\n return null;\n }\n\n const ids = (params.get('ids') ?? '')\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean);\n\n return { entity, ids };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/apps/graph/graph.ts"],"names":["EXPAND_PAGE","SAMPLE_LIMIT","MAX_NODES","DETAIL_ATTRIBUTE_LIMIT","HIDDEN_ENTITIES","GRAPH_PALETTE","nodeKey","entity","id","getRelationshipAttributes","attribute","getAttributeScope","getGraphEntities","schema","getEntity","name","find","propEq","getEntityLabel","getEntityColors","theme","palette","index","getDisplaySelection","scope","defaultScope","DEFAULT_SCOPE_KEY","display","getDisplayAttribute","scopeType","getScopeFields","fallback","defaultValueSelection","getRelatedSelection","args","relatedEntity","getCountSelection","EXPAND_HOP_MAX_RECORDS","buildRecordsQuery","expand","relationships","buildExpandQuery","buildCountsQuery","getDetailAttributes","buildDetailsQuery","fields","getTotalEntities","entities","buildTotalsQuery","formatDetailValue","value","first","captionOf","record","scoped","edgeOf","source","target","sourceAttribute","targetAttribute","left","leftAttribute","right","graphFromRecords","records","nodes","edges","counts","relatedEntityName","relatedRecords","total","relatedRecord","edge","fetchedFromRecords","fetched","related","key","graphPath","projectId","ids","params","parseGraphParams","search"],"mappings":"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","file":"chunk-7FYOLFHG.js","sourcesContent":["import { find, propEq } from 'ramda';\nimport { DEFAULT_SCOPE_KEY, defaultValueSelection } from '../../graphql-client/queries';\nimport { getAttributeScope } from '../../core/attribute-scope';\nimport { getDisplayAttribute } from '../../core/get-display-attribute';\nimport type { Attribute, Entity } from '../../core/types';\n\n/**\n * Pure helpers of the Graph app: the GraphQL queries that fetch records with\n * their relationships, and the mapping of their results to the nodes and\n * edges the canvas draws. No React, no sigma, so the rules are unit-testable.\n */\n\n/** Related records fetched per relationship attribute in one go. */\nexport const EXPAND_PAGE = 25;\n/** Records loaded when starting from an entity. */\nexport const SAMPLE_LIMIT = 25;\n/** Nodes a canvas holds at most; later additions are dropped with a notice. */\nexport const MAX_NODES = 2000;\n/** Attributes shown in the inspector at most. */\nexport const DETAIL_ATTRIBUTE_LIMIT = 12;\n\n/** Entities whose nodes are never drawn: assets are media, not records. */\nconst HIDDEN_ENTITIES = new Set(['_asset']);\n\n/**\n * Categorical palette, one hue per entity in schema order (light and dark\n * surfaces step the same hues). The first eight are the validated dataviz\n * palette; the next four were checked with its script so adjacent pairs\n * stay apart under colour-blindness simulation and no pair on either\n * surface comes closer than the reference palette's own closest pair.\n * Projects with more entities than hues reuse them.\n */\nexport const GRAPH_PALETTE = {\n light: [\n '#2a78d6',\n '#eb6834',\n '#1baf7a',\n '#eda100',\n '#e87ba4',\n '#008300',\n '#6250d6',\n '#e34948',\n '#0e9aa7',\n '#6b8e23',\n '#9c27b0',\n '#a05a2c',\n ],\n dark: [\n '#3987e5',\n '#d95926',\n '#199e70',\n '#c98500',\n '#d55181',\n '#008300',\n '#9085e9',\n '#e66767',\n '#1a9fb0',\n '#6f8a28',\n '#c058d6',\n '#a35226',\n ],\n} as const;\n\nexport interface GraphNode {\n key: string;\n entity: string;\n id: string;\n label: string;\n}\n\nexport interface GraphEdge {\n key: string;\n source: string;\n target: string;\n /** The relationship attribute on the source node's entity. */\n sourceAttribute: string;\n /** The mirror attribute on the target node's entity. */\n targetAttribute: string;\n}\n\n/** Related records per relationship attribute, keyed by node, as the API counted them. */\nexport type GraphCounts = { [nodeKey: string]: { [attribute: string]: number } };\n\nexport interface GraphData {\n nodes: GraphNode[];\n edges: GraphEdge[];\n counts: GraphCounts;\n}\n\nexport type GraphRecord = { _id: string; [key: string]: unknown };\n\ntype ConnectionCount = { aggregate?: { count?: { nodes?: number } } };\n\nexport function nodeKey(entity: string, id: string): string {\n return `${entity}:${id}`;\n}\n\n/** Relationship attributes of an entity that point at drawable entities. */\nexport function getRelationshipAttributes(entity: Entity): Attribute[] {\n return entity.attributes.filter(\n (attribute) =>\n getAttributeScope(attribute) === 'relationship' &&\n attribute.relationship !== undefined &&\n !HIDDEN_ENTITIES.has(attribute.relationship.entity)\n );\n}\n\n/** Entities worth starting from: at least one drawable relationship. */\nexport function getGraphEntities(schema: Entity[]): Entity[] {\n return schema.filter((entity) => !HIDDEN_ENTITIES.has(entity.name) && getRelationshipAttributes(entity).length > 0);\n}\n\nexport function getEntity(schema: Entity[], name: string): Entity | undefined {\n return find<Entity>(propEq(name, 'name'))(schema);\n}\n\nexport function getEntityLabel(entity: Entity): string {\n return entity.menu?.label ?? entity.plural;\n}\n\n/** Colour per entity name, assigned in schema order and never re-cycled on filter. */\nexport function getEntityColors(schema: Entity[], theme: 'light' | 'dark'): { [entity: string]: string } {\n const palette = GRAPH_PALETTE[theme];\n\n return Object.fromEntries(\n schema.filter((entity) => !HIDDEN_ENTITIES.has(entity.name)).map((entity, index) => [entity.name, palette[index % palette.length]])\n );\n}\n\n/**\n * Selection of the display attribute: a scalar for global attributes, the\n * current scope's value for local ones. Relationship display attributes fall\n * back to the id.\n */\nexport function getDisplaySelection(\n entity: Entity | undefined,\n scope: string,\n defaultScope = DEFAULT_SCOPE_KEY\n): string {\n const display = getDisplayAttribute(entity);\n\n if (!display) {\n return '';\n }\n\n const scopeType = getAttributeScope(display);\n\n if (scopeType === 'global') {\n return display.name;\n }\n\n if (scopeType === 'local') {\n return `${display.name} { ${getScopeFields(scope, defaultScope)} }`;\n }\n\n return '';\n}\n\n/**\n * The scope value and the default one to fall back on, as the Desk queries\n * select them: the default scope's value always comes back as `default`,\n * whatever the project named that scope.\n */\nexport function getScopeFields(scope: string, defaultScope = DEFAULT_SCOPE_KEY): string {\n const fallback = defaultValueSelection(defaultScope);\n\n return scope === defaultScope ? fallback : `${fallback} ${scope}`;\n}\n\nfunction getRelatedSelection(\n attribute: Attribute,\n schema: Entity[],\n scope: string,\n args: string,\n defaultScope?: string\n): string {\n const relatedEntity = getEntity(schema, attribute.relationship?.entity ?? '');\n\n return `${attribute.name}${args} { _id ${getDisplaySelection(relatedEntity, scope, defaultScope)} }`;\n}\n\nfunction getCountSelection(attribute: Attribute): string {\n return `${attribute.name}Connection { aggregate { count { nodes } } }`;\n}\n\n/** Records a one-hop load covers at most; more records come without their relationships. */\nexport const EXPAND_HOP_MAX_RECORDS = 5;\n\n/**\n * Records by id or a sample of them; with `expand`, each comes with the first\n * page of every drawable relationship. Totals are left to the inspector:\n * counting every relationship of every record is what makes a load slow.\n */\nexport function buildRecordsQuery({\n defaultScope,\n entity,\n schema,\n scope,\n expand,\n}: {\n defaultScope?: string;\n entity: Entity;\n schema: Entity[];\n scope: string;\n expand: boolean;\n}): string {\n const relationships = expand\n ? getRelationshipAttributes(entity).map((attribute) =>\n getRelatedSelection(attribute, schema, scope, `(limit: ${EXPAND_PAGE})`, defaultScope)\n )\n : [];\n\n return `query GraphRecords($where: ${entity.name}Where, $limit: Int) {\n ${entity.plural}(where: $where, limit: $limit) {\n _id\n ${getDisplaySelection(entity, scope, defaultScope)}\n ${relationships.join('\\n ')}\n }\n}`;\n}\n\n/** One more page of a single relationship of one record. */\nexport function buildExpandQuery({\n defaultScope,\n entity,\n schema,\n scope,\n attribute,\n}: {\n defaultScope?: string;\n entity: Entity;\n schema: Entity[];\n scope: string;\n attribute: Attribute;\n}): string {\n return `query GraphExpand($id: ID!, $offset: Int, $limit: Int) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n ${getRelatedSelection(attribute, schema, scope, '(limit: $limit, offset: $offset)', defaultScope)}\n }\n}`;\n}\n\n/** The total per drawable relationship of one record. */\nexport function buildCountsQuery({ entity }: { entity: Entity }): string {\n return `query GraphCounts($id: ID!) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n ${getRelationshipAttributes(entity).map(getCountSelection).join('\\n ')}\n }\n}`;\n}\n\n/** Attributes the inspector lists: visible scalars, global or in the current scope; rich text is skipped. */\nexport function getDetailAttributes(entity: Entity): Attribute[] {\n return entity.attributes\n .filter((attribute) => {\n const scopeType = getAttributeScope(attribute);\n\n return (\n !attribute.hidden &&\n attribute.dataType !== 'asset' &&\n attribute.inputType !== 'editor' &&\n (scopeType === 'global' || scopeType === 'local')\n );\n })\n .slice(0, DETAIL_ATTRIBUTE_LIMIT);\n}\n\n/** The scalar values of one record for the inspector. */\nexport function buildDetailsQuery({\n defaultScope,\n entity,\n scope,\n}: {\n defaultScope?: string;\n entity: Entity;\n scope: string;\n}): string {\n const fields = getDetailAttributes(entity).map((attribute) =>\n getAttributeScope(attribute) === 'local'\n ? `${attribute.name} { ${getScopeFields(scope, defaultScope)} }`\n : attribute.name\n );\n\n return `query GraphDetails($id: ID!) {\n ${entity.plural}(where: { _id: { eq: $id } }) {\n _id\n _updatedAt\n ${fields.join('\\n ')}\n }\n}`;\n}\n\n/** Entities whose count-store total the API exposes (not space-bound). */\nexport function getTotalEntities(entities: Entity[]): Entity[] {\n return entities.filter((entity) => (entity.spaces?.length ?? 0) === 0);\n}\n\nexport function buildTotalsQuery(entities: Entity[]): string {\n return `query GraphTotals {\\n ${getTotalEntities(entities)\n .map((entity) => `${entity.plural}Total`)\n .join('\\n ')}\\n}`;\n}\n\n/** A scalar as the inspector shows it: the scope value of a local attribute, else the value itself. */\nexport function formatDetailValue(value: unknown, scope: string): string {\n if (value === null || value === undefined) {\n return '';\n }\n\n if (Array.isArray(value)) {\n const [first] = value as { [key: string]: unknown }[];\n\n return formatDetailValue(first?.[scope] ?? first?.default, scope);\n }\n\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n\n return String(value);\n}\n\n/** The caption of a record: its display value in the scope, else in the default scope, else its id. */\nexport function captionOf(record: GraphRecord, entity: Entity | undefined, scope: string): string {\n const display = getDisplayAttribute(entity);\n const value = display ? record[display.name] : undefined;\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const [first] = value as { [key: string]: unknown }[];\n const scoped = first?.[scope] ?? first?.default;\n\n if (typeof scoped === 'string' || typeof scoped === 'number') {\n return String(scoped);\n }\n }\n\n return record._id;\n}\n\n/**\n * The edge between two nodes for a relationship: one Neo4j relationship per\n * entity pair, so the key is the same whichever side it was fetched from.\n */\nexport function edgeOf(source: GraphNode, target: GraphNode, attribute: Attribute): GraphEdge {\n const sourceAttribute = attribute.name;\n const targetAttribute = attribute.relationship?.field ?? attribute.name;\n const [left] = [source.key, target.key].sort();\n const leftAttribute = left === source.key ? sourceAttribute : targetAttribute;\n const right = left === source.key ? target.key : source.key;\n\n return { key: `${left}|${right}|${leftAttribute}`, source: source.key, target: target.key, sourceAttribute, targetAttribute };\n}\n\n/**\n * Nodes and edges from records of an entity; the related records under each\n * relationship attribute become nodes too, and `xConnection` aggregates\n * become counts.\n */\nexport function graphFromRecords({\n records,\n entity,\n schema,\n scope,\n}: {\n records: GraphRecord[];\n entity: Entity;\n schema: Entity[];\n scope: string;\n}): GraphData {\n const nodes = new Map<string, GraphNode>();\n const edges = new Map<string, GraphEdge>();\n const counts: GraphCounts = {};\n const relationships = getRelationshipAttributes(entity);\n\n records.forEach((record) => {\n const source: GraphNode = {\n key: nodeKey(entity.name, record._id),\n entity: entity.name,\n id: record._id,\n label: captionOf(record, entity, scope),\n };\n nodes.set(source.key, source);\n\n relationships.forEach((attribute) => {\n const relatedEntityName = attribute.relationship?.entity ?? '';\n const relatedEntity = getEntity(schema, relatedEntityName);\n const relatedRecords = record[attribute.name];\n const connection = record[`${attribute.name}Connection`] as ConnectionCount | undefined;\n const total = connection?.aggregate?.count?.nodes;\n\n if (typeof total === 'number') {\n counts[source.key] = { ...counts[source.key], [attribute.name]: total };\n }\n\n if (!Array.isArray(relatedRecords)) {\n return;\n }\n\n (relatedRecords as GraphRecord[]).forEach((relatedRecord) => {\n const target: GraphNode = {\n key: nodeKey(relatedEntityName, relatedRecord._id),\n entity: relatedEntityName,\n id: relatedRecord._id,\n label: captionOf(relatedRecord, relatedEntity, scope),\n };\n\n if (!nodes.has(target.key)) {\n nodes.set(target.key, target);\n }\n\n if (target.key !== source.key) {\n const edge = edgeOf(source, target, attribute);\n\n if (!edges.has(edge.key)) {\n edges.set(edge.key, edge);\n }\n }\n });\n });\n });\n\n return { nodes: [...nodes.values()], edges: [...edges.values()], counts };\n}\n\n/** How many related records each record carries per relationship, to continue paging from. */\nexport function fetchedFromRecords(records: GraphRecord[], entity: Entity): GraphCounts {\n const fetched: GraphCounts = {};\n\n records.forEach((record) => {\n getRelationshipAttributes(entity).forEach((attribute) => {\n const related = record[attribute.name];\n\n if (Array.isArray(related)) {\n const key = nodeKey(entity.name, record._id);\n fetched[key] = { ...fetched[key], [attribute.name]: related.length };\n }\n });\n });\n\n return fetched;\n}\n\n/** The Graph app route for an entity, optionally for given records. */\nexport function graphPath(projectId: string, { entity, ids }: { entity: string; ids?: string[] }): string {\n const params = new URLSearchParams({ entity });\n\n if (ids && ids.length > 0) {\n params.set('ids', ids.join(','));\n }\n\n return `/${projectId}/graph?${params.toString()}`;\n}\n\nexport function parseGraphParams(search: string): { entity: string; ids: string[] } | null {\n const params = new URLSearchParams(search);\n const entity = params.get('entity');\n\n if (!entity) {\n return null;\n }\n\n const ids = (params.get('ids') ?? '')\n .split(',')\n .map((id) => id.trim())\n .filter(Boolean);\n\n return { entity, ids };\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-MGCXYA2S.js';import {b as b$1,a as a$1}from'./chunk-PR3MTHFM.js';import {b}from'./chunk-DSLPTDZX.js';import {j}from'./chunk-VR3LFFJ3.js';import {d,c as c$1}from'./chunk-DQ2OVNOB.js';import {s}from'./chunk-7KLXWCDS.js';import {m,n as n$1}from'./chunk-SAVZBVP5.js';import {f}from'./chunk-TP6QGIJH.js';import {ja}from'./chunk-RULCANNM.js';import {e,g,h,j as j$1,o,n,k}from'./chunk-A4DPLZZF.js';import {a,d as d$1,c as c$2,e as e$1,g as g$1}from'./chunk-S7Z6KKIN.js';import {c}from'./chunk-X3SHNHHM.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$1,options:i={canDelete:true,canEdit:true}}){let m=j(),N=b(),p=c$1.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(c,{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(c,{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(c,{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(c,{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-DBU5G6ZH.js').then(e=>({default:e.EntityKnowledgeButton}))),ve=lazy(()=>import('./entry-ZYSQFFEW.js').then(e=>({default:e.EntityGraphButton})));function at({entityName:e,isReloading:a$2=false,onReload:c$3,table:i}){let m$1=j(),N=d(),p=c$1(),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.getSelectedRowModel().rows.map(t=>t.original._id);function se(){m$1({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=m(e,d$2,t);await new Promise((pe,fe)=>{ne(gql`
|
|
2
2
|
${u}
|
|
3
|
-
`),le({variables:{where:n$1(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$1({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.resetRowSelection(),await b$1(D,a$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.scope,onValueChange:t=>{ie(t);},value:p.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$2,{children:(find(propEq(p.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}),c$3?jsx(c,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$2,onClick:c$3,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$2?"fk:animate-spin":void 0})}):null,jsx(e$2,{table:i})]}),r.length>0?jsx(ja,{disabled:!y,children:jsxs(c,{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(ja,{disabled:!y,children:jsx(c,{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:n$1(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$1({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.resetRowSelection(),await b$1(D,a$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.scope,onValueChange:t=>{ie(t);},value:p.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$2,{children:(find(propEq(p.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}),c$3?jsx(c,{"aria-label":"Reload",className:"fk:h-8",disabled:b$2||a$2,onClick:c$3,size:"icon-sm",variant:"outline",children:jsx(RefreshCw,{className:a$2?"fk:animate-spin":void 0})}):null,jsx(e$2,{table:i})]}),r.length>0?jsx(ja,{disabled:!y,children:jsxs(c,{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(ja,{disabled:!y,children:jsx(c,{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-CESG6WQB.js.map
|
|
4
|
+
//# sourceMappingURL=chunk-CESG6WQB.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-PNGPE7QM.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-CESG6WQB.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,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {f as f$1}from'./chunk-
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {f as f$1}from'./chunk-SAVZBVP5.js';import {f as f$2}from'./chunk-TP6QGIJH.js';import {createContext,useReducer,useContext}from'react';import {jsx}from'react/jsx-runtime';var d="core.context.scope:",a={breadcrumbs:[],isRouteLoading:false,pageTitle:"",scope:"",relationships:{}},u=createContext(a),l=createContext(()=>{});function f(e,t){let{type:n,payload:o}=t;switch(n){case "setScope":return typeof localStorage<"u"&&o.projectId&&localStorage.setItem(`${d}${o.projectId}`,o.scope),{...e,scope:o.scope};case "setRelationship":return {...e,relationships:{...e.relationships,...o}};default:throw Error(`Unknown action: ${n}`)}}function x({children:e}){let[t,n]=useReducer(f,a);return jsx(u.Provider,{value:t,children:jsx(l.Provider,{value:n,children:e})})}function m(){return useContext(u)}function C(){return useContext(l)}function A(e){return e?.find(t=>t.isDefault)?.name??e?.[0]?.name??f$1}function E(){let{currentProject:e}=f$2();return A(e?.scopes)}export{d as a,x as b,m as c,C as d,A as e,E as f};//# sourceMappingURL=chunk-DQ2OVNOB.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-DQ2OVNOB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/app-context.tsx","../src/core/default-scope.ts"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch","defaultScopeName","scopes","scope","DEFAULT_SCOPE_KEY","useDefaultScope","currentProject","useConfig"],"mappings":"sMAMO,IAAMA,CAAAA,CAAoB,sBAE3BC,CAAAA,CAAe,CACnB,YAAa,EAAC,CACd,eAAgB,KAAA,CAChB,SAAA,CAAW,GACX,KAAA,CAAO,EAAA,CACP,cAAe,EACjB,EAEMC,CAAAA,CAAaC,aAAAA,CAA8BF,CAAY,CAAA,CAEvDG,CAAAA,CAAqBD,cAAgE,IAAM,CAEjG,CAAC,EAED,SAASE,EAAQC,CAAAA,CAAuBC,CAAAA,CAAgE,CACtG,GAAM,CAAE,KAAAC,CAAAA,CAAM,OAAA,CAAAC,CAAQ,CAAA,CAAIF,CAAAA,CAE1B,OAAQC,CAAAA,EACN,KAAK,UAAA,CACH,OAAI,OAAO,YAAA,CAAiB,GAAA,EAAeC,EAAQ,SAAA,EACjD,YAAA,CAAa,QAAQ,CAAA,EAAGT,CAAiB,GAAGS,CAAAA,CAAQ,SAAS,GAAIA,CAAAA,CAAQ,KAAK,EAGzE,CACL,GAAGH,EACH,KAAA,CAAOG,CAAAA,CAAQ,KACjB,CAAA,CACF,KAAK,kBACH,OAAO,CACL,GAAGH,CAAAA,CACH,aAAA,CAAe,CAAE,GAAGA,CAAAA,CAAM,cAAe,GAAGG,CAAQ,CACtD,CAAA,CACF,QACE,MAAM,KAAA,CAAM,CAAA,gBAAA,EAAmBD,CAAc,CAAA,CAAE,CACnD,CACF,CAEO,SAASE,EAAY,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAyC,CAC9E,GAAM,CAACL,CAAAA,CAAOM,CAAQ,CAAA,CAAIC,UAAAA,CAAWR,EAASJ,CAAY,CAAA,CAE1D,OACEa,GAAAA,CAACZ,CAAAA,CAAW,SAAX,CAAoB,KAAA,CAAOI,EAC1B,QAAA,CAAAQ,GAAAA,CAACV,EAAmB,QAAA,CAAnB,CAA4B,MAAOQ,CAAAA,CAAW,QAAA,CAAAD,EAAS,CAAA,CAC1D,CAEJ,CAEO,SAASI,CAAAA,EAAgC,CAC9C,OAAOC,UAAAA,CAAWd,CAAU,CAC9B,CAEO,SAASe,CAAAA,EAAmE,CACjF,OAAOD,UAAAA,CAAWZ,CAAkB,CACtC,CCpDO,SAASc,EAAiBC,CAAAA,CAAyD,CACxF,OAAOA,CAAAA,EAAQ,IAAA,CAAMC,GAAUA,CAAAA,CAAM,SAAS,GAAG,IAAA,EAAQD,CAAAA,GAAS,CAAC,CAAA,EAAG,IAAA,EAAQE,GAChF,CAGO,SAASC,GAA0B,CACxC,GAAM,CAAE,cAAA,CAAAC,CAAe,EAAIC,GAAAA,EAAU,CAErC,OAAON,CAAAA,CAAiBK,CAAAA,EAAgB,MAAM,CAChD","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/core/app-context.tsx","../src/core/default-scope.ts"],"names":["SCOPE_STORAGE_KEY","initialState","AppContext","createContext","AppDispatchContext","reducer","state","action","type","payload","AppProvider","children","dispatch","useReducer","jsx","useAppContext","useContext","useAppDispatch","defaultScopeName","scopes","scope","DEFAULT_SCOPE_KEY","useDefaultScope","currentProject","useConfig"],"mappings":"sMAMO,IAAMA,CAAAA,CAAoB,sBAE3BC,CAAAA,CAAe,CACnB,YAAa,EAAC,CACd,eAAgB,KAAA,CAChB,SAAA,CAAW,GACX,KAAA,CAAO,EAAA,CACP,cAAe,EACjB,EAEMC,CAAAA,CAAaC,aAAAA,CAA8BF,CAAY,CAAA,CAEvDG,CAAAA,CAAqBD,cAAgE,IAAM,CAEjG,CAAC,EAED,SAASE,EAAQC,CAAAA,CAAuBC,CAAAA,CAAgE,CACtG,GAAM,CAAE,KAAAC,CAAAA,CAAM,OAAA,CAAAC,CAAQ,CAAA,CAAIF,CAAAA,CAE1B,OAAQC,CAAAA,EACN,KAAK,UAAA,CACH,OAAI,OAAO,YAAA,CAAiB,GAAA,EAAeC,EAAQ,SAAA,EACjD,YAAA,CAAa,QAAQ,CAAA,EAAGT,CAAiB,GAAGS,CAAAA,CAAQ,SAAS,GAAIA,CAAAA,CAAQ,KAAK,EAGzE,CACL,GAAGH,EACH,KAAA,CAAOG,CAAAA,CAAQ,KACjB,CAAA,CACF,KAAK,kBACH,OAAO,CACL,GAAGH,CAAAA,CACH,aAAA,CAAe,CAAE,GAAGA,CAAAA,CAAM,cAAe,GAAGG,CAAQ,CACtD,CAAA,CACF,QACE,MAAM,KAAA,CAAM,CAAA,gBAAA,EAAmBD,CAAc,CAAA,CAAE,CACnD,CACF,CAEO,SAASE,EAAY,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAyC,CAC9E,GAAM,CAACL,CAAAA,CAAOM,CAAQ,CAAA,CAAIC,UAAAA,CAAWR,EAASJ,CAAY,CAAA,CAE1D,OACEa,GAAAA,CAACZ,CAAAA,CAAW,SAAX,CAAoB,KAAA,CAAOI,EAC1B,QAAA,CAAAQ,GAAAA,CAACV,EAAmB,QAAA,CAAnB,CAA4B,MAAOQ,CAAAA,CAAW,QAAA,CAAAD,EAAS,CAAA,CAC1D,CAEJ,CAEO,SAASI,CAAAA,EAAgC,CAC9C,OAAOC,UAAAA,CAAWd,CAAU,CAC9B,CAEO,SAASe,CAAAA,EAAmE,CACjF,OAAOD,UAAAA,CAAWZ,CAAkB,CACtC,CCpDO,SAASc,EAAiBC,CAAAA,CAAyD,CACxF,OAAOA,CAAAA,EAAQ,IAAA,CAAMC,GAAUA,CAAAA,CAAM,SAAS,GAAG,IAAA,EAAQD,CAAAA,GAAS,CAAC,CAAA,EAAG,IAAA,EAAQE,GAChF,CAGO,SAASC,GAA0B,CACxC,GAAM,CAAE,cAAA,CAAAC,CAAe,EAAIC,GAAAA,EAAU,CAErC,OAAON,CAAAA,CAAiBK,CAAAA,EAAgB,MAAM,CAChD","file":"chunk-DQ2OVNOB.js","sourcesContent":["'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport type { ActionSetRelationship, ActionSetScope, AppContextType } from './types';\n\nexport const SCOPE_STORAGE_KEY = 'core.context.scope:';\n\nconst initialState = {\n breadcrumbs: [],\n isRouteLoading: false,\n pageTitle: '',\n scope: '',\n relationships: {},\n};\n\nconst AppContext = createContext<AppContextType>(initialState);\n\nconst AppDispatchContext = createContext<Dispatch<ActionSetRelationship | ActionSetScope>>(() => {\n /* void */\n});\n\nfunction reducer(state: AppContextType, action: ActionSetRelationship | ActionSetScope): AppContextType {\n const { type, payload } = action;\n\n switch (type) {\n case 'setScope':\n if (typeof localStorage !== 'undefined' && payload.projectId) {\n localStorage.setItem(`${SCOPE_STORAGE_KEY}${payload.projectId}`, payload.scope);\n }\n\n return {\n ...state,\n scope: payload.scope,\n };\n case 'setRelationship':\n return {\n ...state,\n relationships: { ...state.relationships, ...payload },\n };\n default:\n throw Error(`Unknown action: ${type as string}`);\n }\n}\n\nexport function AppProvider({ children }: { children: ReactNode }): JSX.Element {\n const [state, dispatch] = useReducer(reducer, initialState);\n\n return (\n <AppContext.Provider value={state}>\n <AppDispatchContext.Provider value={dispatch}>{children}</AppDispatchContext.Provider>\n </AppContext.Provider>\n );\n}\n\nexport function useAppContext(): AppContextType {\n return useContext(AppContext);\n}\n\nexport function useAppDispatch(): Dispatch<ActionSetRelationship | ActionSetScope> {\n return useContext(AppDispatchContext);\n}\n","import { DEFAULT_SCOPE_KEY } from '../graphql-client/queries';\nimport { useConfig } from './config/config-context';\n\ntype ScopeLike = { name: string; isDefault?: boolean };\n\n/**\n * The scope local values fall back to: the one marked `isDefault`, whatever\n * its name. A project without scopes has a single scope named `default`.\n */\nexport function defaultScopeName(scopes: readonly ScopeLike[] | null | undefined): string {\n return scopes?.find((scope) => scope.isDefault)?.name ?? scopes?.[0]?.name ?? DEFAULT_SCOPE_KEY;\n}\n\n/** The current project's default scope. */\nexport function useDefaultScope(): string {\n const { currentProject } = useConfig();\n\n return defaultScopeName(currentProject?.scopes);\n}\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import'./index.css';import {a}from'./chunk-QSTWBKPN.js';import {a as a$1,d}from'./chunk-L5Z56DDM.js';import {f,d as d$2}from'./chunk-PLCI2RJA.js';import {f as f$1}from'./chunk-CC2U7ASG.js';import {M,ea,fa,ga,ma,o,p,q as q$1}from'./chunk-RULCANNM.js';import {e,g,h,i,j,t,d as d$1,a as a$2,b as b$3,c as c$2,o as o$1}from'./chunk-A4DPLZZF.js';import {e as e$2,g as g$1,b as b$2}from'./chunk-G5N6HEPW.js';import {m,b as b$1}from'./chunk-5JUG4BEF.js';import {b,c as c$1,e as e$1}from'./chunk-N33S7BSG.js';import {c}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useRef,useEffect}from'react';import {useNavigate,useLocation,useParams,Link}from'react-router-dom';import q,{useSWRConfig}from'swr';import {Plug,ArrowLeft,ExternalLink,RefreshCw,ChevronLeft,ChevronRight,Plus,CheckIcon,XIcon,MoreHorizontal,TriangleAlert}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function Re(n){let a;try{a=new URL(n);}catch{return null}return a.protocol!=="https:"||a.username!==""||a.password!==""?null:a.href}function xe(){let{currentProjectId:n}=f$1();return {api:useMemo(()=>n?d$2(n):null,[n]),base:n?`/api/flexkit/${n}`:null}}function Ee(n){return n.length===2?"Project & Personal":n[0]==="project"?"Project":"Personal"}function ze(n){return n.length===2?"fk:bg-indigo-100 fk:text-indigo-800 fk:dark:bg-indigo-950 fk:dark:text-indigo-300":n[0]==="project"?"fk:bg-sky-100 fk:text-sky-800 fk:dark:bg-sky-950 fk:dark:text-sky-300":"fk:bg-teal-100 fk:text-teal-800 fk:dark:bg-teal-950 fk:dark:text-teal-300"}function T(n){return n.connections.length>0}function Ie(n){return n==="project"?"Project":"Personal"}function z(n,a,t){return t==="personal"?n.allowPersonal:a}function he(n,a){return n.connections.filter(t=>t.scope===a).sort((t,s)=>Number(s.isPrimary)-Number(t.isPrimary)||t.createdAt.localeCompare(s.createdAt))}function $e(n){let a=n.connections.filter(t=>t.isPrimary&&t.status==="connected");return a.find(t=>t.scope==="personal")??a.find(t=>t.scope==="project")??null}function je({busy:n,canManage:a,plugin:t,onConnect:s}){let i$1=t.scopes.filter(k=>he(t,k).length===0),[f]=i$1;if(!f)return null;if(t.scopes.length===1)return jsxs(c,{disabled:n||!t.enabled||!z(t,a,f),size:"sm",type:"button",onClick:()=>s(f),children:[jsx(Plug,{}),"Connect"]});let m=i$1.some(k=>z(t,a,k));return jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(c,{disabled:n||!t.enabled||!m,size:"sm",type:"button",children:[jsx(Plug,{}),"Connect"]})}),jsx(h,{align:"end",className:"fk:w-72",children:jsx(i,{children:i$1.map(k=>jsx(j,{disabled:!z(t,a,k),onSelect:()=>s(k),children:jsxs("span",{className:"fk:flex fk:flex-col fk:gap-0.5",children:[jsx("span",{children:Ie(k)}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:k==="personal"?"Only you can use this connection in this project.":"Shared with project members who can use this plugin."})]})},k))})})]})}function S(n,a){let t=/^(.*\/ai)(?:\/|$)/.exec(n);return t?`${t[1]}/${a}`:a}function H(n){return n.split(/[\s_-]+/).filter(Boolean).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}function Be(n){let a={};for(let t of n){let s=a[t.category];if(s){s.push(t);continue}a[t.category]=[t];}return Object.entries(a).sort(([t],[s])=>H(t).localeCompare(H(s))).map(([t,s])=>({category:t,plugins:s}))}var ce=[{id:"first",rows:[{descriptionWidth:"fk:w-44",id:"first-a",nameWidth:"fk:w-24"},{descriptionWidth:"fk:w-52",id:"first-b",nameWidth:"fk:w-16"},{descriptionWidth:"fk:w-40",id:"first-c",nameWidth:"fk:w-28"},{descriptionWidth:"fk:w-48",id:"first-d",nameWidth:"fk:w-20"}]},{id:"second",rows:[{descriptionWidth:"fk:w-36",id:"second-a",nameWidth:"fk:w-32"},{descriptionWidth:"fk:w-56",id:"second-b",nameWidth:"fk:w-24"}]}];function ke({action:n,row:a}){return jsxs("div",{className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:px-3 fk:py-2",children:[jsx(t,{className:"fk:size-10 fk:shrink-0 fk:rounded-lg"}),jsxs("span",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5",children:[jsx(t,{className:`fk:h-4 ${a.nameWidth}`}),jsx(t,{className:`fk:h-4 ${a.descriptionWidth}`})]}),n?jsx(t,{className:"fk:size-4 fk:shrink-0"}):null]})}var K="fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2";function We({grouped:n=true}){let a=ce.flatMap(t=>t.rows);return n?jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-8",children:[jsx("span",{className:"fk:sr-only",children:"Loading plugins"}),ce.map(t$1=>jsxs("section",{children:[jsx(t,{className:"fk:mb-1 fk:h-4 fk:w-28"}),jsx("div",{className:K,children:t$1.rows.map(s=>jsx(ke,{action:true,row:s},s.id))})]},t$1.id))]}):jsxs("div",{"aria-busy":"true",className:K,children:[jsx("span",{className:"fk:sr-only",children:"Loading plugins"}),a.map(t=>jsx(ke,{action:true,row:t},t.id))]})}function Ue(){let n=useNavigate(),{pathname:a}=useLocation(),t=/\/ai\/plugins\/?$/.test(a),s=a.includes("/ai/skills");return jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(ea,{value:s?"skills":"plugins",onValueChange:f=>{let m=f==="skills"?"skills":"plugins";(f==="skills"?s:t)||n(S(a,m));},children:jsxs(fa,{children:[jsx(ga,{value:"plugins",onClick:()=>{t||n(S(a,"plugins"));},children:"Plugins"}),jsx(ga,{value:"skills",children:"Skills"})]})})]})}function Xe({onOpen:n,plugin:a$1}){let t=T(a$1),s=a$1.connections.filter(f=>f.status==="needs_auth").length,i=s===1?"An account needs to be reconnected":`${s.toString()} accounts need to be reconnected`;return jsxs("button",{type:"button",onClick:n,className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-3 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:corner-squircle",children:[jsx(a,{className:"fk:size-10 fk:rounded-lg",src:a$1.logoUrl}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a$1.name}),jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:text-muted-foreground",children:a$1.description})]}),s>0?jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsxs("span",{className:"fk:flex fk:shrink-0",children:[jsx(TriangleAlert,{"aria-hidden":true,className:"fk:size-4 fk:text-destructive"}),jsx("span",{className:"fk:sr-only",children:i})]})}),jsx(e$1,{children:i})]}):t?jsx(CheckIcon,{className:"fk:size-4 fk:shrink-0 fk:text-success"}):jsx(Plus,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"})]})}function ue({onOpen:n,plugins:a}){return jsx("div",{className:K,children:a.map(t=>jsx(Xe,{plugin:t,onOpen:()=>n(t.id)},t.id))})}function be({installedOnly:n=false}){let{base:a}=xe(),{data:t$1,error:s,isLoading:i}=q(a?`${a}/plugins`:null,f),[f$1,m$1]=useState(""),k=useNavigate(),{pathname:p}=useLocation(),x=f$1.trim().toLowerCase(),l=(t$1?.plugins??[]).filter(c=>(!n||T(c))&&`${c.name} ${c.description}`.toLowerCase().includes(x)),b=(t$1?.plugins??[]).filter(T),u=n?[]:Be(l),g="Plugins are being prepared. Check back soon.";n&&!x?g="No plugins installed yet.":(t$1?.catalogSha||n)&&(g="No plugins match your search.");function M(c){k(S(p,`plugins/${c}`));}let r=jsx("div",{className:"fk:flex fk:flex-col fk:gap-8",children:u.map(c=>jsxs("section",{children:[jsx("h3",{className:"fk:mb-1 fk:text-sm fk:font-medium",children:H(c.category)}),jsx(ue,{plugins:c.plugins,onOpen:M})]},c.category))});return n&&(r=jsx(ue,{plugins:l,onOpen:M})),(i||s||l.length===0)&&(r=null),jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsx(Ue,{}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsxs("div",{children:[jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:"Plugins"}),jsx("p",{className:"fk:mt-2 fk:text-muted-foreground",children:"Connect the tools you use and add skills to your workflows."})]}),jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:[jsx(b$2,{"aria-label":"Search plugins",className:"fk:mr-auto fk:w-full fk:max-w-xs",placeholder:"Search plugins\u2026",value:f$1,onChange:c=>m$1(c.target.value)}),!n&&i?jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx("div",{className:"fk:flex fk:-space-x-2",children:["installed-a","installed-b","installed-c"].map(c=>jsx(t,{className:"fk:size-8 fk:rounded-md fk:ring-2 fk:ring-background"},c))}),jsx(t,{className:"fk:h-4 fk:w-20"})]}):null,!n&&!i&&b.length>0?jsx(d$1,{children:b.slice(0,9).map(c=>jsxs(a$2,{className:"fk:rounded-md",children:[jsx(b$3,{src:c.logoUrl,alt:""}),jsx(c$2,{children:c.name.charAt(0)})]},c.id))}):null,n?jsxs(Link,{to:S(p,"plugins"),className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:hover:text-foreground",children:[jsx(ChevronLeft,{className:"fk:size-4"}),"Show all"]}):null,!n&&!i?jsxs(Link,{to:S(p,"plugins/installed"),className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:hover:text-foreground",children:[b.length," installed",jsx(ChevronRight,{className:"fk:size-4"})]}):null]}),s?jsx(e$2,{variant:"destructive",children:jsx(g$1,{children:"Unable to load plugins. Please try again."})}):null,i?jsx(We,{grouped:!n}):null,!i&&!s&&l.length===0?jsx(e$2,{children:jsx(g$1,{children:g})}):null,r]})})]})}function on(){return jsx(be,{})}function sn(){return jsx(be,{installedOnly:true})}function Je({base:n,connectionId:a}){let{data:t$1,error:s}=q(`${n}/plugin-connections/${a}/tools`,f);return s?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Unable to discover tools. Reconnect or try again."}):t$1?jsx("div",{className:"fk:flex fk:flex-col fk:gap-3",children:t$1.servers.map(i=>jsxs("section",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("h4",{className:"fk:font-medium",children:i.name}),i.error?jsx("p",{children:i.error}):null,i.tools.length>0?jsxs(o,{className:"fk:group",children:[jsxs(p,{className:"fk:flex fk:w-fit fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground",children:[jsx(ChevronRight,{className:"fk:size-4 fk:transition-transform fk:group-data-[state=open]:rotate-90"}),_e(i.tools.length)]}),jsx(q$1,{children:jsx("ul",{className:"fk:mt-2 fk:flex fk:flex-col fk:gap-2",children:i.tools.map(f=>jsxs("li",{children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:f.name}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:f.description})]},f.name))})})]}):null]},i.name))}):jsx(t,{className:"fk:h-12 fk:w-full"})}function _e(n){return n===1?"1 tool":`${n.toString()} tools`}function Ge(n){return n.accountName&&n.accountName!==n.displayName?n.accountName:n.scope==="project"?"Shared with this project":"Only you can use this account"}function Fe({actionable:n,actions:a,busy:t,connection:s,pluginEnabled:i$1}){let[f,m]=useState(false),[k,p]=useState(""),x=useRef(null),l=s.status==="needs_auth",b=async()=>{let u=k.trim();await a.onRename(s,u||null),m(false);};return useEffect(()=>{if(!f)return;let u=window.setTimeout(()=>x.current?.focus(),0);return ()=>window.clearTimeout(u)},[f]),jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:py-2",children:[jsx(a$2,{className:"fk:size-8",children:jsx(c$2,{children:s.displayName.charAt(0).toUpperCase()})}),f?jsxs("form",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2",onSubmit:u=>{u.preventDefault(),b();},children:[jsx(b$2,{"aria-label":"Account name",ref:x,className:"fk:h-8 fk:max-w-xs",disabled:t,placeholder:s.accountName??"Account name",value:k,onChange:u=>p(u.target.value),onKeyDown:u=>{u.key==="Escape"&&m(false);}}),jsx(c,{"aria-label":"Save name",disabled:t,size:"icon",type:"submit",variant:"ghost",children:jsx(CheckIcon,{})}),jsx(c,{"aria-label":"Cancel rename",size:"icon",type:"button",variant:"ghost",onClick:()=>m(false),children:jsx(XIcon,{})})]}):jsxs("span",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col",children:[jsxs("span",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx("span",{className:"fk:truncate fk:text-sm fk:font-medium",children:s.displayName}),s.isPrimary?jsx(b$1,{variant:"secondary",children:"Primary"}):null,l?jsx(b$1,{variant:"destructive",children:"Needs reconnect"}):null]}),jsx("span",{className:"fk:truncate fk:text-sm fk:text-muted-foreground",children:Ge(s)})]}),n&&!f?jsxs(e,{children:[jsx(g,{asChild:true,children:jsx(c,{"aria-label":`Manage ${s.displayName}`,disabled:t,size:"icon",variant:"ghost",children:jsx(MoreHorizontal,{})})}),jsxs(h,{align:"end",children:[jsxs(i,{children:[!s.isPrimary&&!l?jsx(j,{onSelect:()=>a.onMakePrimary(s),children:"Make primary"}):null,jsx(j,{onSelect:()=>{p(s.label??""),m(true);},children:"Rename"}),jsx(j,{disabled:!i$1,onSelect:()=>a.onReconnect(s),children:"Reconnect"})]}),jsx(o$1,{}),jsx(j,{variant:"destructive",onSelect:()=>a.onDisconnect(s),children:"Disconnect"})]})]}):null]})}function He({actions:n,busy:a,canManage:t,onConnect:s,plugin:i}){let f=i.scopes.length>1;return jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Connected accounts"}),i.scopes.map(m=>{let k=he(i,m),p=z(i,t,m),x=m==="personal"||t;return k.length===0&&!p?null:jsxs("div",{className:"fk:flex fk:flex-col",children:[f?jsx("h3",{className:"fk:text-sm fk:font-medium fk:text-muted-foreground",children:m==="project"?"Project accounts":"Your accounts"}):null,jsxs("ul",{className:"fk:flex fk:flex-col fk:divide-y",children:[k.map(l=>jsx(Fe,{actionable:x,actions:n,busy:a,connection:l,pluginEnabled:i.enabled},l.id)),p?jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:items-center fk:gap-3 fk:py-2 fk:text-left fk:text-sm fk:text-muted-foreground fk:transition-colors fk:hover:text-foreground fk:disabled:pointer-events-none fk:disabled:opacity-50",disabled:a||!i.enabled,type:"button",onClick:()=>s(m),children:[jsx("span",{className:"fk:flex fk:size-8 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-full fk:border fk:border-dashed",children:jsx(Plus,{className:"fk:size-4"})}),k.length>0?"Connect another account":"Connect an account"]})}):null]})]},m)})]})}function ln(){let{pluginId:n}=useParams(),{api:a$2,base:t$1}=xe(),{data:s,error:i,mutate:f$1}=q(t$1&&n?`${t$1}/plugins/${n}`:null,f),{mutate:m$1}=useSWRConfig(),k=useNavigate(),[p,x]=useState(false),l=s?.plugin,b$2=l?Re(l.sourceUrl):null,u=async r=>{x(true);try{await r(),await f$1();}catch(c){if(c instanceof a$1){ma.error('You signed in with a different account. Use "Connect another account" to add it.');return}ma.error(c instanceof Error?c.message:"Unable to complete this action.");}finally{x(false);}};if(i)return jsx("div",{className:"fk:p-6",children:jsx(e$2,{variant:"destructive",children:jsx(g$1,{children:"Unable to load this plugin."})})});if(!l||!s||!a$2||!t$1)return jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsxs(c,{variant:"ghost",size:"sm",onClick:()=>k("..",{relative:"path"}),children:[jsx(ArrowLeft,{}),"Plugins"]})]}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{"aria-busy":"true",className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading plugin"}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-4",children:[jsx(t,{className:"fk:size-14 fk:shrink-0 fk:rounded-lg"}),jsx(t,{className:"fk:h-7 fk:w-40"}),jsx(t,{className:"fk:ml-auto fk:h-9 fk:w-28"})]}),jsx(t,{className:"fk:h-4 fk:w-full"}),jsx(t,{className:"fk:h-4 fk:w-2/3"}),jsx(t,{className:"fk:h-6 fk:w-24 fk:rounded-full"})]})]})})]});let g=$e(l),M$1={onDisconnect:r=>{u(()=>a$2.disconnectPlugin(r.id));},onMakePrimary:r=>{u(()=>a$2.updatePluginConnection(r.id,{primary:!0}));},onReconnect:r=>{u(()=>d(a$2,l,r.scope,{connectionId:r.id}));},onRename:(r,c)=>u(()=>a$2.updatePluginConnection(r.id,{label:c}))};return jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsxs(c,{variant:"ghost",size:"sm",onClick:()=>k("..",{relative:"path"}),children:[jsx(ArrowLeft,{}),"Plugins"]})]}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-4",children:[jsx(a,{className:"fk:size-14 fk:rounded-lg",src:l.logoUrl}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-col fk:gap-0.5",children:[jsx("h1",{className:"fk:text-xl fk:font-semibold",children:l.name}),b$2?jsxs("a",{href:b$2,target:"_blank",rel:"noopener noreferrer",className:"fk:inline-flex fk:w-fit fk:items-center fk:gap-1 fk:text-sm fk:hover:underline fk:text-muted-foreground",children:["View source",jsx(ExternalLink,{className:"fk:size-3"})]}):null]}),jsx("div",{className:"fk:ml-auto fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-end fk:gap-2",children:T(l)?null:jsx(je,{busy:p,canManage:s.canManage,plugin:l,onConnect:r=>{u(()=>d(a$2,l,r));}})})]}),jsx("p",{className:"fk:text-muted-foreground",children:l.description}),jsx("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:jsx(b$1,{className:`fk:border-0 fk:text-[0.625rem] fk:leading-4.5 fk:font-normal fk:py-0 fk:px-2 ${ze(l.scopes)}`,variant:"default",children:Ee(l.scopes)})}),l.scopes.map(r=>(r==="personal"?l.allowPersonal:s.canManage)?null:jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:r==="project"?"Ask an owner or developer to connect.":"Personal connections are disabled by project policy."},r))]}),l.enabled?null:jsx(e$2,{children:jsx(g$1,{children:"This plugin is disabled by project policy."})}),T(l)?jsx(He,{actions:M$1,busy:p,canManage:s.canManage,plugin:l,onConnect:r=>{u(()=>d(a$2,l,r));}}):null,jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Included tools"}),l.capabilities.agentTools&&g?jsxs(c,{className:"fk:ml-auto",disabled:p,size:"sm",variant:"ghost",onClick:()=>{u(async()=>{await a$2.refreshPluginTools(g.id),await m$1(`${t$1}/plugin-connections/${g.id}/tools`);});},children:[jsx(RefreshCw,{}),"Refresh"]}):null]}),l.capabilities.automationDelivery?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Automation delivery to selected channels. This plugin does not expose MCP messaging tools."}):null,l.capabilities.agentTools&&!g?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Connect to discover available tools."}):null,l.capabilities.agentTools&&g?jsxs(Fragment,{children:[jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["Tools \xB7 via ",g.displayName]}),jsx(Je,{base:t$1,connectionId:g.id},g.id)]}):null]}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Included skills"}),s.skills.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"This plugin includes no skills."}):s.skills.map(r=>jsxs("div",{children:[jsx("h3",{className:"fk:font-medium",children:r.name}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:r.description})]},r.key))]}),jsxs("section",{className:"fk:space-y-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Used by"}),l.usedBy.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"No automations visible to you use this plugin yet."}):jsx("ul",{children:l.usedBy.map(r=>jsx("li",{children:jsx(c,{className:"fk:pl-0!",variant:"link",onClick:()=>k(`../../automations/${r.id}`,{relative:"path"}),children:r.name})},r.id))})]})]})})]})}export{je as a,Ue as b,on as c,sn as d,ln as e};//# sourceMappingURL=chunk-KOM7G7WT.js.map
|
|
2
|
-
//# sourceMappingURL=chunk-
|
|
1
|
+
import'./index.css';import {a}from'./chunk-QSTWBKPN.js';import {a as a$1,d}from'./chunk-L5Z56DDM.js';import {f,d as d$2}from'./chunk-PLCI2RJA.js';import {f as f$1}from'./chunk-TP6QGIJH.js';import {M,ea,fa,ga,ma,o,p,q as q$1}from'./chunk-RULCANNM.js';import {e,g,h,i,j,t,d as d$1,a as a$2,b as b$3,c as c$2,o as o$1}from'./chunk-A4DPLZZF.js';import {e as e$2,g as g$1,b as b$2}from'./chunk-G5N6HEPW.js';import {m,b as b$1}from'./chunk-5JUG4BEF.js';import {b,c as c$1,e as e$1}from'./chunk-N33S7BSG.js';import {c}from'./chunk-X3SHNHHM.js';import {useState,useMemo,useRef,useEffect}from'react';import {useNavigate,useLocation,useParams,Link}from'react-router-dom';import q,{useSWRConfig}from'swr';import {Plug,ArrowLeft,ExternalLink,RefreshCw,ChevronLeft,ChevronRight,Plus,CheckIcon,XIcon,MoreHorizontal,TriangleAlert}from'lucide-react';import {jsxs,jsx,Fragment}from'react/jsx-runtime';function Re(n){let a;try{a=new URL(n);}catch{return null}return a.protocol!=="https:"||a.username!==""||a.password!==""?null:a.href}function xe(){let{currentProjectId:n}=f$1();return {api:useMemo(()=>n?d$2(n):null,[n]),base:n?`/api/flexkit/${n}`:null}}function Ee(n){return n.length===2?"Project & Personal":n[0]==="project"?"Project":"Personal"}function ze(n){return n.length===2?"fk:bg-indigo-100 fk:text-indigo-800 fk:dark:bg-indigo-950 fk:dark:text-indigo-300":n[0]==="project"?"fk:bg-sky-100 fk:text-sky-800 fk:dark:bg-sky-950 fk:dark:text-sky-300":"fk:bg-teal-100 fk:text-teal-800 fk:dark:bg-teal-950 fk:dark:text-teal-300"}function T(n){return n.connections.length>0}function Ie(n){return n==="project"?"Project":"Personal"}function z(n,a,t){return t==="personal"?n.allowPersonal:a}function he(n,a){return n.connections.filter(t=>t.scope===a).sort((t,s)=>Number(s.isPrimary)-Number(t.isPrimary)||t.createdAt.localeCompare(s.createdAt))}function $e(n){let a=n.connections.filter(t=>t.isPrimary&&t.status==="connected");return a.find(t=>t.scope==="personal")??a.find(t=>t.scope==="project")??null}function je({busy:n,canManage:a,plugin:t,onConnect:s}){let i$1=t.scopes.filter(k=>he(t,k).length===0),[f]=i$1;if(!f)return null;if(t.scopes.length===1)return jsxs(c,{disabled:n||!t.enabled||!z(t,a,f),size:"sm",type:"button",onClick:()=>s(f),children:[jsx(Plug,{}),"Connect"]});let m=i$1.some(k=>z(t,a,k));return jsxs(e,{children:[jsx(g,{asChild:true,children:jsxs(c,{disabled:n||!t.enabled||!m,size:"sm",type:"button",children:[jsx(Plug,{}),"Connect"]})}),jsx(h,{align:"end",className:"fk:w-72",children:jsx(i,{children:i$1.map(k=>jsx(j,{disabled:!z(t,a,k),onSelect:()=>s(k),children:jsxs("span",{className:"fk:flex fk:flex-col fk:gap-0.5",children:[jsx("span",{children:Ie(k)}),jsx("span",{className:"fk:text-xs fk:text-muted-foreground",children:k==="personal"?"Only you can use this connection in this project.":"Shared with project members who can use this plugin."})]})},k))})})]})}function S(n,a){let t=/^(.*\/ai)(?:\/|$)/.exec(n);return t?`${t[1]}/${a}`:a}function H(n){return n.split(/[\s_-]+/).filter(Boolean).map(a=>a.charAt(0).toUpperCase()+a.slice(1)).join(" ")}function Be(n){let a={};for(let t of n){let s=a[t.category];if(s){s.push(t);continue}a[t.category]=[t];}return Object.entries(a).sort(([t],[s])=>H(t).localeCompare(H(s))).map(([t,s])=>({category:t,plugins:s}))}var ce=[{id:"first",rows:[{descriptionWidth:"fk:w-44",id:"first-a",nameWidth:"fk:w-24"},{descriptionWidth:"fk:w-52",id:"first-b",nameWidth:"fk:w-16"},{descriptionWidth:"fk:w-40",id:"first-c",nameWidth:"fk:w-28"},{descriptionWidth:"fk:w-48",id:"first-d",nameWidth:"fk:w-20"}]},{id:"second",rows:[{descriptionWidth:"fk:w-36",id:"second-a",nameWidth:"fk:w-32"},{descriptionWidth:"fk:w-56",id:"second-b",nameWidth:"fk:w-24"}]}];function ke({action:n,row:a}){return jsxs("div",{className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:px-3 fk:py-2",children:[jsx(t,{className:"fk:size-10 fk:shrink-0 fk:rounded-lg"}),jsxs("span",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col fk:gap-1.5",children:[jsx(t,{className:`fk:h-4 ${a.nameWidth}`}),jsx(t,{className:`fk:h-4 ${a.descriptionWidth}`})]}),n?jsx(t,{className:"fk:size-4 fk:shrink-0"}):null]})}var K="fk:grid fk:grid-cols-1 fk:gap-x-16 fk:gap-y-1 fk:lg:grid-cols-2";function We({grouped:n=true}){let a=ce.flatMap(t=>t.rows);return n?jsxs("div",{"aria-busy":"true",className:"fk:flex fk:flex-col fk:gap-8",children:[jsx("span",{className:"fk:sr-only",children:"Loading plugins"}),ce.map(t$1=>jsxs("section",{children:[jsx(t,{className:"fk:mb-1 fk:h-4 fk:w-28"}),jsx("div",{className:K,children:t$1.rows.map(s=>jsx(ke,{action:true,row:s},s.id))})]},t$1.id))]}):jsxs("div",{"aria-busy":"true",className:K,children:[jsx("span",{className:"fk:sr-only",children:"Loading plugins"}),a.map(t=>jsx(ke,{action:true,row:t},t.id))]})}function Ue(){let n=useNavigate(),{pathname:a}=useLocation(),t=/\/ai\/plugins\/?$/.test(a),s=a.includes("/ai/skills");return jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsx(ea,{value:s?"skills":"plugins",onValueChange:f=>{let m=f==="skills"?"skills":"plugins";(f==="skills"?s:t)||n(S(a,m));},children:jsxs(fa,{children:[jsx(ga,{value:"plugins",onClick:()=>{t||n(S(a,"plugins"));},children:"Plugins"}),jsx(ga,{value:"skills",children:"Skills"})]})})]})}function Xe({onOpen:n,plugin:a$1}){let t=T(a$1),s=a$1.connections.filter(f=>f.status==="needs_auth").length,i=s===1?"An account needs to be reconnected":`${s.toString()} accounts need to be reconnected`;return jsxs("button",{type:"button",onClick:n,className:"fk:-mx-3 fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:rounded-lg fk:px-3 fk:py-2 fk:text-left fk:transition-colors fk:hover:bg-accent fk:focus-visible:bg-accent fk:focus-visible:outline-none fk:corner-squircle",children:[jsx(a,{className:"fk:size-10 fk:rounded-lg",src:a$1.logoUrl}),jsxs("span",{className:"fk:min-w-0 fk:flex-1",children:[jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:font-medium",children:a$1.name}),jsx("span",{className:"fk:block fk:truncate fk:text-sm fk:text-muted-foreground",children:a$1.description})]}),s>0?jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsxs("span",{className:"fk:flex fk:shrink-0",children:[jsx(TriangleAlert,{"aria-hidden":true,className:"fk:size-4 fk:text-destructive"}),jsx("span",{className:"fk:sr-only",children:i})]})}),jsx(e$1,{children:i})]}):t?jsx(CheckIcon,{className:"fk:size-4 fk:shrink-0 fk:text-success"}):jsx(Plus,{className:"fk:size-4 fk:shrink-0 fk:text-muted-foreground"})]})}function ue({onOpen:n,plugins:a}){return jsx("div",{className:K,children:a.map(t=>jsx(Xe,{plugin:t,onOpen:()=>n(t.id)},t.id))})}function be({installedOnly:n=false}){let{base:a}=xe(),{data:t$1,error:s,isLoading:i}=q(a?`${a}/plugins`:null,f),[f$1,m$1]=useState(""),k=useNavigate(),{pathname:p}=useLocation(),x=f$1.trim().toLowerCase(),l=(t$1?.plugins??[]).filter(c=>(!n||T(c))&&`${c.name} ${c.description}`.toLowerCase().includes(x)),b=(t$1?.plugins??[]).filter(T),u=n?[]:Be(l),g="Plugins are being prepared. Check back soon.";n&&!x?g="No plugins installed yet.":(t$1?.catalogSha||n)&&(g="No plugins match your search.");function M(c){k(S(p,`plugins/${c}`));}let r=jsx("div",{className:"fk:flex fk:flex-col fk:gap-8",children:u.map(c=>jsxs("section",{children:[jsx("h3",{className:"fk:mb-1 fk:text-sm fk:font-medium",children:H(c.category)}),jsx(ue,{plugins:c.plugins,onOpen:M})]},c.category))});return n&&(r=jsx(ue,{plugins:l,onOpen:M})),(i||s||l.length===0)&&(r=null),jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsx(Ue,{}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsxs("div",{children:[jsx("h2",{className:"fk:text-2xl fk:font-semibold",children:"Plugins"}),jsx("p",{className:"fk:mt-2 fk:text-muted-foreground",children:"Connect the tools you use and add skills to your workflows."})]}),jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:[jsx(b$2,{"aria-label":"Search plugins",className:"fk:mr-auto fk:w-full fk:max-w-xs",placeholder:"Search plugins\u2026",value:f$1,onChange:c=>m$1(c.target.value)}),!n&&i?jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx("div",{className:"fk:flex fk:-space-x-2",children:["installed-a","installed-b","installed-c"].map(c=>jsx(t,{className:"fk:size-8 fk:rounded-md fk:ring-2 fk:ring-background"},c))}),jsx(t,{className:"fk:h-4 fk:w-20"})]}):null,!n&&!i&&b.length>0?jsx(d$1,{children:b.slice(0,9).map(c=>jsxs(a$2,{className:"fk:rounded-md",children:[jsx(b$3,{src:c.logoUrl,alt:""}),jsx(c$2,{children:c.name.charAt(0)})]},c.id))}):null,n?jsxs(Link,{to:S(p,"plugins"),className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:hover:text-foreground",children:[jsx(ChevronLeft,{className:"fk:size-4"}),"Show all"]}):null,!n&&!i?jsxs(Link,{to:S(p,"plugins/installed"),className:"fk:inline-flex fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground fk:hover:text-foreground",children:[b.length," installed",jsx(ChevronRight,{className:"fk:size-4"})]}):null]}),s?jsx(e$2,{variant:"destructive",children:jsx(g$1,{children:"Unable to load plugins. Please try again."})}):null,i?jsx(We,{grouped:!n}):null,!i&&!s&&l.length===0?jsx(e$2,{children:jsx(g$1,{children:g})}):null,r]})})]})}function on(){return jsx(be,{})}function sn(){return jsx(be,{installedOnly:true})}function Je({base:n,connectionId:a}){let{data:t$1,error:s}=q(`${n}/plugin-connections/${a}/tools`,f);return s?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Unable to discover tools. Reconnect or try again."}):t$1?jsx("div",{className:"fk:flex fk:flex-col fk:gap-3",children:t$1.servers.map(i=>jsxs("section",{className:"fk:flex fk:flex-col fk:gap-2",children:[jsx("h4",{className:"fk:font-medium",children:i.name}),i.error?jsx("p",{children:i.error}):null,i.tools.length>0?jsxs(o,{className:"fk:group",children:[jsxs(p,{className:"fk:flex fk:w-fit fk:items-center fk:gap-1 fk:text-sm fk:text-muted-foreground",children:[jsx(ChevronRight,{className:"fk:size-4 fk:transition-transform fk:group-data-[state=open]:rotate-90"}),_e(i.tools.length)]}),jsx(q$1,{children:jsx("ul",{className:"fk:mt-2 fk:flex fk:flex-col fk:gap-2",children:i.tools.map(f=>jsxs("li",{children:[jsx("span",{className:"fk:text-sm fk:font-medium",children:f.name}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:f.description})]},f.name))})})]}):null]},i.name))}):jsx(t,{className:"fk:h-12 fk:w-full"})}function _e(n){return n===1?"1 tool":`${n.toString()} tools`}function Ge(n){return n.accountName&&n.accountName!==n.displayName?n.accountName:n.scope==="project"?"Shared with this project":"Only you can use this account"}function Fe({actionable:n,actions:a,busy:t,connection:s,pluginEnabled:i$1}){let[f,m]=useState(false),[k,p]=useState(""),x=useRef(null),l=s.status==="needs_auth",b=async()=>{let u=k.trim();await a.onRename(s,u||null),m(false);};return useEffect(()=>{if(!f)return;let u=window.setTimeout(()=>x.current?.focus(),0);return ()=>window.clearTimeout(u)},[f]),jsxs("li",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-3 fk:py-2",children:[jsx(a$2,{className:"fk:size-8",children:jsx(c$2,{children:s.displayName.charAt(0).toUpperCase()})}),f?jsxs("form",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:items-center fk:gap-2",onSubmit:u=>{u.preventDefault(),b();},children:[jsx(b$2,{"aria-label":"Account name",ref:x,className:"fk:h-8 fk:max-w-xs",disabled:t,placeholder:s.accountName??"Account name",value:k,onChange:u=>p(u.target.value),onKeyDown:u=>{u.key==="Escape"&&m(false);}}),jsx(c,{"aria-label":"Save name",disabled:t,size:"icon",type:"submit",variant:"ghost",children:jsx(CheckIcon,{})}),jsx(c,{"aria-label":"Cancel rename",size:"icon",type:"button",variant:"ghost",onClick:()=>m(false),children:jsx(XIcon,{})})]}):jsxs("span",{className:"fk:flex fk:min-w-0 fk:flex-1 fk:flex-col",children:[jsxs("span",{className:"fk:flex fk:min-w-0 fk:items-center fk:gap-2",children:[jsx("span",{className:"fk:truncate fk:text-sm fk:font-medium",children:s.displayName}),s.isPrimary?jsx(b$1,{variant:"secondary",children:"Primary"}):null,l?jsx(b$1,{variant:"destructive",children:"Needs reconnect"}):null]}),jsx("span",{className:"fk:truncate fk:text-sm fk:text-muted-foreground",children:Ge(s)})]}),n&&!f?jsxs(e,{children:[jsx(g,{asChild:true,children:jsx(c,{"aria-label":`Manage ${s.displayName}`,disabled:t,size:"icon",variant:"ghost",children:jsx(MoreHorizontal,{})})}),jsxs(h,{align:"end",children:[jsxs(i,{children:[!s.isPrimary&&!l?jsx(j,{onSelect:()=>a.onMakePrimary(s),children:"Make primary"}):null,jsx(j,{onSelect:()=>{p(s.label??""),m(true);},children:"Rename"}),jsx(j,{disabled:!i$1,onSelect:()=>a.onReconnect(s),children:"Reconnect"})]}),jsx(o$1,{}),jsx(j,{variant:"destructive",onSelect:()=>a.onDisconnect(s),children:"Disconnect"})]})]}):null]})}function He({actions:n,busy:a,canManage:t,onConnect:s,plugin:i}){let f=i.scopes.length>1;return jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Connected accounts"}),i.scopes.map(m=>{let k=he(i,m),p=z(i,t,m),x=m==="personal"||t;return k.length===0&&!p?null:jsxs("div",{className:"fk:flex fk:flex-col",children:[f?jsx("h3",{className:"fk:text-sm fk:font-medium fk:text-muted-foreground",children:m==="project"?"Project accounts":"Your accounts"}):null,jsxs("ul",{className:"fk:flex fk:flex-col fk:divide-y",children:[k.map(l=>jsx(Fe,{actionable:x,actions:n,busy:a,connection:l,pluginEnabled:i.enabled},l.id)),p?jsx("li",{children:jsxs("button",{className:"fk:flex fk:w-full fk:items-center fk:gap-3 fk:py-2 fk:text-left fk:text-sm fk:text-muted-foreground fk:transition-colors fk:hover:text-foreground fk:disabled:pointer-events-none fk:disabled:opacity-50",disabled:a||!i.enabled,type:"button",onClick:()=>s(m),children:[jsx("span",{className:"fk:flex fk:size-8 fk:shrink-0 fk:items-center fk:justify-center fk:rounded-full fk:border fk:border-dashed",children:jsx(Plus,{className:"fk:size-4"})}),k.length>0?"Connect another account":"Connect an account"]})}):null]})]},m)})]})}function ln(){let{pluginId:n}=useParams(),{api:a$2,base:t$1}=xe(),{data:s,error:i,mutate:f$1}=q(t$1&&n?`${t$1}/plugins/${n}`:null,f),{mutate:m$1}=useSWRConfig(),k=useNavigate(),[p,x]=useState(false),l=s?.plugin,b$2=l?Re(l.sourceUrl):null,u=async r=>{x(true);try{await r(),await f$1();}catch(c){if(c instanceof a$1){ma.error('You signed in with a different account. Use "Connect another account" to add it.');return}ma.error(c instanceof Error?c.message:"Unable to complete this action.");}finally{x(false);}};if(i)return jsx("div",{className:"fk:p-6",children:jsx(e$2,{variant:"destructive",children:jsx(g$1,{children:"Unable to load this plugin."})})});if(!l||!s||!a$2||!t$1)return jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsxs(c,{variant:"ghost",size:"sm",onClick:()=>k("..",{relative:"path"}),children:[jsx(ArrowLeft,{}),"Plugins"]})]}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{"aria-busy":"true",className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsx("span",{className:"fk:sr-only",children:"Loading plugin"}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-4",children:[jsx(t,{className:"fk:size-14 fk:shrink-0 fk:rounded-lg"}),jsx(t,{className:"fk:h-7 fk:w-40"}),jsx(t,{className:"fk:ml-auto fk:h-9 fk:w-28"})]}),jsx(t,{className:"fk:h-4 fk:w-full"}),jsx(t,{className:"fk:h-4 fk:w-2/3"}),jsx(t,{className:"fk:h-6 fk:w-24 fk:rounded-full"})]})]})})]});let g=$e(l),M$1={onDisconnect:r=>{u(()=>a$2.disconnectPlugin(r.id));},onMakePrimary:r=>{u(()=>a$2.updatePluginConnection(r.id,{primary:!0}));},onReconnect:r=>{u(()=>d(a$2,l,r.scope,{connectionId:r.id}));},onRename:(r,c)=>u(()=>a$2.updatePluginConnection(r.id,{label:c}))};return jsxs("main",{className:"fk:flex fk:min-h-0 fk:flex-1 fk:flex-col",children:[jsxs("div",{className:"fk:mb-2 fk:flex fk:shrink-0 fk:items-center fk:gap-2",children:[jsxs(b,{children:[jsx(c$1,{asChild:true,children:jsx(M,{className:"fk:-ml-1 fk:h-4 fk:w-4"})}),jsx(e$1,{children:"Toggle Sidebar"})]}),jsxs(c,{variant:"ghost",size:"sm",onClick:()=>k("..",{relative:"path"}),children:[jsx(ArrowLeft,{}),"Plugins"]})]}),jsx(m,{className:"fk:h-0 fk:min-h-0 fk:flex-1",children:jsxs("div",{className:"fk:mx-auto fk:flex fk:w-full fk:max-w-4xl fk:flex-col fk:gap-8 fk:py-6 fk:pl-4 fk:pr-6",children:[jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-4",children:[jsx(a,{className:"fk:size-14 fk:rounded-lg",src:l.logoUrl}),jsxs("div",{className:"fk:flex fk:min-w-0 fk:flex-col fk:gap-0.5",children:[jsx("h1",{className:"fk:text-xl fk:font-semibold",children:l.name}),b$2?jsxs("a",{href:b$2,target:"_blank",rel:"noopener noreferrer",className:"fk:inline-flex fk:w-fit fk:items-center fk:gap-1 fk:text-sm fk:hover:underline fk:text-muted-foreground",children:["View source",jsx(ExternalLink,{className:"fk:size-3"})]}):null]}),jsx("div",{className:"fk:ml-auto fk:flex fk:shrink-0 fk:flex-wrap fk:items-center fk:justify-end fk:gap-2",children:T(l)?null:jsx(je,{busy:p,canManage:s.canManage,plugin:l,onConnect:r=>{u(()=>d(a$2,l,r));}})})]}),jsx("p",{className:"fk:text-muted-foreground",children:l.description}),jsx("div",{className:"fk:flex fk:flex-wrap fk:items-center fk:gap-3",children:jsx(b$1,{className:`fk:border-0 fk:text-[0.625rem] fk:leading-4.5 fk:font-normal fk:py-0 fk:px-2 ${ze(l.scopes)}`,variant:"default",children:Ee(l.scopes)})}),l.scopes.map(r=>(r==="personal"?l.allowPersonal:s.canManage)?null:jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:r==="project"?"Ask an owner or developer to connect.":"Personal connections are disabled by project policy."},r))]}),l.enabled?null:jsx(e$2,{children:jsx(g$1,{children:"This plugin is disabled by project policy."})}),T(l)?jsx(He,{actions:M$1,busy:p,canManage:s.canManage,plugin:l,onConnect:r=>{u(()=>d(a$2,l,r));}}):null,jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsxs("div",{className:"fk:flex fk:items-center fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Included tools"}),l.capabilities.agentTools&&g?jsxs(c,{className:"fk:ml-auto",disabled:p,size:"sm",variant:"ghost",onClick:()=>{u(async()=>{await a$2.refreshPluginTools(g.id),await m$1(`${t$1}/plugin-connections/${g.id}/tools`);});},children:[jsx(RefreshCw,{}),"Refresh"]}):null]}),l.capabilities.automationDelivery?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Automation delivery to selected channels. This plugin does not expose MCP messaging tools."}):null,l.capabilities.agentTools&&!g?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"Connect to discover available tools."}):null,l.capabilities.agentTools&&g?jsxs(Fragment,{children:[jsxs("p",{className:"fk:text-sm fk:text-muted-foreground",children:["Tools \xB7 via ",g.displayName]}),jsx(Je,{base:t$1,connectionId:g.id},g.id)]}):null]}),jsxs("section",{className:"fk:flex fk:flex-col fk:gap-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Included skills"}),s.skills.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"This plugin includes no skills."}):s.skills.map(r=>jsxs("div",{children:[jsx("h3",{className:"fk:font-medium",children:r.name}),jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:r.description})]},r.key))]}),jsxs("section",{className:"fk:space-y-3",children:[jsx("h2",{className:"fk:text-xl fk:font-semibold",children:"Used by"}),l.usedBy.length===0?jsx("p",{className:"fk:text-sm fk:text-muted-foreground",children:"No automations visible to you use this plugin yet."}):jsx("ul",{children:l.usedBy.map(r=>jsx("li",{children:jsx(c,{className:"fk:pl-0!",variant:"link",onClick:()=>k(`../../automations/${r.id}`,{relative:"path"}),children:r.name})},r.id))})]})]})})]})}export{je as a,Ue as b,on as c,sn as d,ln as e};//# sourceMappingURL=chunk-DR36N2JC.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-DR36N2JC.js.map
|