directus-extension-sql-query-panel 1.0.6 → 1.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -57,7 +57,7 @@ emitter.onFilter('sql-query:request', async ({ variables, query }, req) => {
57
57
  })
58
58
  ```
59
59
 
60
-
61
60
  ## Contributing
62
61
 
63
- PRs are welcome!
62
+ PRs are welcome!
63
+
package/dist/api.js CHANGED
@@ -1 +1 @@
1
- var e=(e=>(e.REQUEST="sql-query.request",e.RESPONSE="sql-query.response",e))(e||{});const r=[],a=[{name:"insights",config:(r,{database:a,services:t,emitter:s})=>{const{PanelsService:n}=t;async function i(e,r){if(new RegExp(["delete","update","insert","execute","kill","drop"].map((e=>`\\b${e}\\b`)).join("|")).test(e.toLowerCase()))throw new Error("SQL query is blacklisted");const t=e.match(/{{\w+}}/g);if(t)throw new Error(`Missing query param: ${t.join(", ").replace(/{{|}}/g,"")}`);return(e=>{let r=[],a=[];if(e.rows&&e.fields)r=e.rows,a=e.fields.map((e=>e.name));else if(Array.isArray(e)){const[t,s]=e;r=2===t.length&&Array.isArray(t[0])?t.at(0):t,a=(2===s.length&&Array.isArray(s[0])?s.at(0):s).map((e=>e.name))}else void 0!==e.length&&e.columns?(r=e,r.length>0&&(a=Object.keys(r[0]))):e.recordset&&(r=e.recordset,a=e.recordset.columns?Object.keys(e.recordset.columns):[]);return{items:r,headers:a}})(await a.raw(e,r))}r.get("/query/:panelId",(async function(r,a){var t;try{const{query:o,variables:l,panel:c}=await async function(r){var a;const t=r.params.panelId;if(!t)throw new Error("Missing panelId");const i=new n({accountability:r.accountability,schema:r.schema}),o=await i.readOne(t);let{variables:l,query:c}=await s.emitFilter(e.REQUEST,{variables:Object.assign({dashboard:o.dashboard},null!=(a=r.query)?a:{}),query:o.options.sql},r);for(const e in l){if(!e.match(/^[a-zA-Z0-9_]+$/))throw new Error(`Invalid variable name: ${e}`);c=c.replace(new RegExp(`{{${e}}}`,"g"),`:${e}`)}return{query:c,variables:l,panel:o}}(r);let u=await i(o,l);u=await s.emitFilter(e.RESPONSE,u,r);let y=Number(null!=(t=c.options.cache)?t:300);return y=y>0?y:300,a.set(`Cache-control', 'public, max-age=${y}`),a.json(u)}catch(e){return a.status(400).json({error:e.message})}}))}}],t=[];export{a as endpoints,r as hooks,t as operations};
1
+ var e=(e=>(e.REQUEST="sql-query.request",e.RESPONSE="sql-query.response",e))(e||{});const r=[],a=[{name:"insights",config:(r,{database:a,services:t,emitter:s})=>{const{PanelsService:n}=t;async function i(e,r){if(new RegExp(["delete","update","insert","execute","kill","drop"].map((e=>`\\b${e}\\b`)).join("|")).test(e.toLowerCase()))throw new Error("SQL query is blacklisted");const t=e.match(/{{\w+}}/g);if(t)throw new Error(`Missing query param: ${t.join(", ").replace(/{{|}}/g,"")}`);return(e=>{let r=[],a=[];if(e.rows&&e.fields)r=e.rows,a=e.fields.map((e=>e.name));else if(Array.isArray(e)){const[t,s]=e;r=2===t.length&&Array.isArray(t[0])?t.at(0):t,a=(2===s.length&&Array.isArray(s[0])?s.at(0):s).map((e=>e.name))}else void 0!==e.length&&e.columns?(r=e,r.length>0&&(a=Object.keys(r[0]))):e.recordset&&(r=e.recordset,a=e.recordset.columns?Object.keys(e.recordset.columns):[]);return{items:r,headers:a}})(await a.raw(e,r))}r.get("/query/:panelId",(async(r,a)=>{var t;try{const{query:o,variables:l,panel:c}=await async function(r){var a;const t=r.params.panelId;if(!t)throw new Error("Missing panelId");const i=new n({accountability:r.accountability,schema:r.schema}),o=await i.readOne(t);let{variables:l,query:c}=await s.emitFilter(e.REQUEST,{variables:Object.assign({dashboard:o.dashboard},null!=(a=r.query)?a:{}),query:o.options.sql},r);for(const e in l){if(!e.match(/^[a-zA-Z0-9_]+$/))throw new Error(`Invalid variable name: ${e}`);c=c.replace(new RegExp(`{{${e}}}`,"g"),`:${e}`)}return{query:c,variables:l,panel:o}}(r);let u=await i(o,l);u=await s.emitFilter(e.RESPONSE,u,r);let y=Number(null!=(t=c.options.cache)?t:300);return y=y>0?y:300,a.set("Cache-control",`public, max-age=${y}`),a.json(u)}catch(e){return a.status(400).json({error:e.message})}}))}}],t=[];export{a as endpoints,r as hooks,t as operations};
package/dist/app.js CHANGED
@@ -1 +1 @@
1
- import{useApi as e,useStores as t,definePanel as a}from"@directus/extensions-sdk";import{ref as n,computed as o,resolveComponent as r,resolveDirective as l,openBlock as i,createElementBlock as s,createElementVNode as c,normalizeClass as u,createVNode as d,withCtx as f,createCommentVNode as v,Fragment as m,renderList as p,normalizeStyle as h,createTextVNode as b,toDisplayString as g,createBlock as y,unref as w,renderSlot as k,withModifiers as x,withDirectives as _,pushScopeId as q,popScopeId as S,toRefs as j,nextTick as A,watch as C,createSlots as $}from"vue";import{useRouter as E}from"vue-router";import{useI18n as L}from"vue-i18n";var O="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function T(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var D=NaN,N="[object Symbol]",I=/^\s+|\s+$/g,B=/^[-+]0x[0-9a-f]+$/i,W=/^0b[01]+$/i,M=/^0o[0-7]+$/i,U=parseInt,H="object"==typeof O&&O&&O.Object===Object&&O,R="object"==typeof self&&self&&self.Object===Object&&self,F=H||R||Function("return this")(),Q=Object.prototype.toString,V=Math.max,z=Math.min,P=function(){return F.Date.now()};function Y(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function Z(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&Q.call(e)==N}(e))return D;if(Y(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=Y(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(I,"");var a=W.test(e);return a||M.test(e)?U(e.slice(2),a?2:8):B.test(e)?D:+e}var G=T((function(e,t,a){var n,o,r,l,i,s,c=0,u=!1,d=!1,f=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function v(t){var a=n,r=o;return n=o=void 0,c=t,l=e.apply(r,a)}function m(e){var a=e-s;return void 0===s||a>=t||a<0||d&&e-c>=r}function p(){var e=P();if(m(e))return h(e);i=setTimeout(p,function(e){var a=t-(e-s);return d?z(a,r-(e-c)):a}(e))}function h(e){return i=void 0,f&&n?v(e):(n=o=void 0,l)}function b(){var e=P(),a=m(e);if(n=arguments,o=this,s=e,a){if(void 0===i)return function(e){return c=e,i=setTimeout(p,t),u?v(e):l}(s);if(d)return i=setTimeout(p,t),v(s)}return void 0===i&&(i=setTimeout(p,t)),l}return t=Z(t)||0,Y(a)&&(u=!!a.leading,r=(d="maxWait"in a)?V(Z(a.maxWait)||0,t):r,f="trailing"in a?!!a.trailing:f),b.cancel=function(){void 0!==i&&clearTimeout(i),c=0,n=s=o=i=void 0},b.flush=function(){return void 0===i?l:h(P())},b}));const J={sum:"Σ",avg:"μ",count:"#",count_unique:"#!"},K={sum:(e,t)=>e.reduce(((e,a)=>e+Number.parseInt(a[t])),0),avg:(e,t)=>Math.round(K.sum(e,t)/e.length),count:e=>e.length,count_unique:(e,t)=>new Set(e.map((e=>e[t]))).size,count_groups:(e,t)=>e.reduce(((e,a)=>{const n=a[t];return e[n]=(e[n]||0)+1,e}),{})};var X=[],ee=[];function te(e,t){if(e&&"undefined"!=typeof document){var a,n=!0===t.prepend?"prepend":"append",o=!0===t.singleTag,r="string"==typeof t.container?document.querySelector(t.container):document.getElementsByTagName("head")[0];if(o){var l=X.indexOf(r);-1===l&&(l=X.push(r)-1,ee[l]={}),a=ee[l]&&ee[l][n]?ee[l][n]:ee[l][n]=i()}else a=i();65279===e.charCodeAt(0)&&(e=e.substring(1)),a.styleSheet?a.styleSheet.cssText+=e:a.appendChild(document.createTextNode(e))}function i(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),t.attributes)for(var a=Object.keys(t.attributes),o=0;o<a.length;o++)e.setAttribute(a[o],t.attributes[a[o]]);var l="prepend"===n?"afterbegin":"beforeend";return r.insertAdjacentElement(l,e),e}}te("\nbody {\n --v-table-color: var(--v-input-color);\n --v-table-background-color: var(--v-input-background-color);\n}\n.sql-query-table[data-v-fcaf817c] {\n position: relative;\n height: var(--v-table-height);\n overflow-y: auto;\n\n --sqt-head--background: var(--background-normal, var(--theme--background));\n --sqt-head--color: color: var(--foreground-normal, var(--theme--foreground));\n\n --sqt-foot--background: var(--background-normal, var(--theme--background));\n --sqt-foot--color: color: var(--foreground-normal, var(--theme--foreground));\n}\ntable[data-v-fcaf817c] {\n min-width: 100%;\n min-height: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n background-color: var(--v-table-background-color);\n color: var(--v-table-color);\n}\ntable thead[data-v-fcaf817c] {\n background-color: var(--sqt-head--background);\n color: var(--sqt-head--color);\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable thead.fixed[data-v-fcaf817c] {\n position: sticky;\n top: 0;\n z-index: 3;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\ntable thead tr.headers th[data-v-fcaf817c] {\n padding: 8px;\n font-weight: bold;\n min-width: 3rem;\n background-color: var(--sqt-head--background);\n color: var(--sqt-head--color);\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable tr.search th[data-v-fcaf817c] {\n padding: 0;\n}\ntable tr.search th .search-input.v-input[data-v-fcaf817c] {\n margin: 0;\n border: none;\n}\ntable th .sort-icon[data-v-fcaf817c] {\n opacity: 0;\n}\ntable th:hover .sort-icon[data-v-fcaf817c] {\n opacity: 0.5;\n}\ntable th .sort-icon.show[data-v-fcaf817c] {\n opacity: 1;\n}\ntable th.select[data-v-fcaf817c] {\n width: 2rem;\n}\ntable td[data-v-fcaf817c] {\n padding: 8px;\n align: middle;\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable tbody[data-v-fcaf817c] {\n display: contents;\n}\ntable tfoot tr[data-v-fcaf817c] {\n position: sticky;\n bottom: 0;\n background-color: var(--sqt-foot--background);\n color: var(--sqt-foot--color);\n box-shadow: var(--card-shadow);\n}\ntable tfoot tr td[data-v-fcaf817c] {\n padding: 8px;\n height: 44px;\n font-weight: bold;\n background-color: var(--sqt-foot--background);\n color: var(--sqt-foot--color);\n}\n",{});var ae=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a};const ne=e=>(q("data-v-fcaf817c"),e=e(),S(),e),oe={class:"sql-query-table"},re={key:0,class:"search"},le={colspan:"80%"},ie={class:"headers"},se=["onClick","align"],ce={key:0},ue={key:1},de=["colspan"],fe={key:0},ve={colspan:"100%"},me={key:1},pe=["onClick"],he=ne((()=>c("tr",null,[c("td",{style:{height:"100%"}})],-1))),be={key:2},ge={key:0,class:"v-text-overflow"},ye={__name:"FastTable",props:{loading:Boolean,headers:{type:Array,validator:e=>e.every((e=>e.value&&e.text)),required:!0},items:{type:Array,required:!0},sort:String,sortDesc:Boolean,fixedHeader:Boolean},emits:["update:sort","update:sortDesc","click:row"],setup(e,{emit:t}){const{t:a}=L(),q=e,S=n(""),j=o((()=>q.headers.filter((e=>e.searchable)))),A=o((()=>{const e=S.value?S.value.toLowerCase().trim():"";return e?q.items.filter((t=>j.value.some((a=>t[a.value]&&t[a.value].toLowerCase().includes(e))))):q.items})),C=o((()=>{const e=function(e,t){if(!t.some((e=>!!e.summarise)))return null;const a={};for(const n of t){if(!n.summarise)continue;const t=K[n.summarise];if(!t)throw new Error(`Summariser function for ${n.summarise} not found.`);const o=t(e,n.value);if("count_groups"===n.summarise){let e=JSON.stringify(o,null,1).replace("{\n","").replace("\n}","").replace(/[",]/g,"");a[n.value]=e}else a[n.value]=`${J[n.summarise]} ${o}`}return a}(A.value,q.headers);return e})),$=t;return(t,n)=>{const o=r("v-icon"),E=r("v-input"),L=r("v-progress-linear"),O=r("v-card-title"),T=r("v-card"),D=l("tooltip");return i(),s("div",oe,[c("table",null,[c("thead",{class:u(["table-header",{fixed:e.fixedHeader}])},[j.value.length&&e.items.length>10?(i(),s("tr",re,[c("th",le,[d(E,{modelValue:S.value,"onUpdate:modelValue":n[0]||(n[0]=e=>S.value=e),small:"",trim:"",class:"search-input",rounded:"",placeholder:"Search"},{prepend:f((()=>[d(o,{name:"search"})])),_:1},8,["modelValue"])])])):v("v-if",!0),c("tr",ie,[(i(!0),s(m,null,p(e.headers,(a=>(i(),s("th",{style:h({minWidth:`${a.width||t.auto}ch`}),key:a.value,onClick:e=>function(e){e.sortable&&($("update:sort",e.value),$("update:sortDesc",!q.sortDesc))}(a),align:a.align||"left"},[b(g(a.text)+" ",1),a.sortable?(i(),y(o,{key:0,name:"sort",small:"",class:u(["sort-icon",{show:e.sort===a.value}]),style:h(`transform: ${e.sortDesc?"rotateZ(0deg) rotateY(0deg)":"rotateZ(180deg) rotateY(180deg)"}; transition: .2s all ease`)},null,8,["class","style"])):v("v-if",!0)],12,se)))),128)),t.$slots["item-append"]?(i(),s("th",ce,"#")):v("v-if",!0)]),e.loading?(i(),s("tr",ue,[c("td",{colspan:e.headers.length+1},[d(L,{indeterminate:""})],8,de)])):v("v-if",!0)],2),e.loading||e.items.length?(i(),s("tbody",me,[k(t.$slots,"default",{items:A.value},(()=>[(i(!0),s(m,null,p(A.value,(a=>(i(),s("tr",{onClick:e=>$("click:row",{item:a,event:e})},[(i(!0),s(m,null,p(e.headers,(e=>(i(),s("td",{key:e.value,class:u(`align-${e.align}`)},g(a[e.value]),3)))),128)),t.$slots["item-append"]?(i(),s("td",{key:0,onClick:n[1]||(n[1]=x((()=>{}),["stop"]))},[k(t.$slots,"item-append",{item:a},void 0,!0)])):v("v-if",!0)],8,pe)))),256))]),!0),v(" This is to fill up any remaining height in the table "),he])):(i(),s("tbody",fe,[c("tr",null,[c("td",ve,[d(T,{style:{padding:"2rem","--v-card-max-width":"100%",margin:"2rem auto"}},{default:f((()=>[d(O,null,{default:f((()=>[d(o,{name:"info",style:{"margin-right":"2rem"}}),b(" "+g(w(a)("no_items")),1)])),_:1})])),_:1})])])])),C.value?(i(),s("tfoot",be,[c("tr",null,[(i(!0),s(m,null,p(e.headers,(e=>_((i(),s("td",{key:e.value},[C.value[e.value]?(i(),s("code",ge,g(C.value[e.value]),1)):v("v-if",!0)])),[[D,e.summarise]]))),128))])])):v("v-if",!0)])])}}};var we=ae(ye,[["__scopeId","data-v-fcaf817c"],["__file","FastTable.vue"]]);te("\n.sql-panel-container {\n width: 100%;\n height: 100%;\n --v-table-height: 100%;\n}\n.sql-panel-container .v-text-overflow {\n user-select: text;\n white-space: pre-wrap;\n}\n.sql-panel-container .center {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n.export-csv-button {\n position: absolute;\n right: 0;\n bottom: 0;\n z-index: 2;\n opacity: 0.8;\n}\n.export-csv-button .button {\n border-radius: var(--border-radius) 0 0 0 !important;\n}\n",{});const ke={key:0,class:"center"},xe={key:0},_e={__name:"panel",props:{id:String,showHeader:{type:Boolean,default:!1},columns:Array,download:{type:Boolean,default:!0},is_static:{type:Boolean,default:!1},actions:Array},setup(a){const c=E(),h=a,{id:k,showHeader:x,download:q,is_static:S}=j(h),L=n(!1),O=n(""),T=n(""),D=n(null),N=n(null),I=e(),{useInsightsStore:B}=t(),W=B(),M=n(new Set),U=o((()=>{const e={},t=[];return M.value.forEach((a=>{void 0===W.variables[a]||null===W.variables[a]?t.push(a):e[a]=W.variables[a]})),t.length?t:e}));if(S.value)A(Q);else{const e=G(Q,1e3);C(U,(()=>{Array.isArray(U.value)?T.value=`Please specify: ${U.value.join(" & ")}`:(T.value="",N.value||(L.value=!0),e())}),{immediate:!0})}const H=o((()=>h.columns?.length>0?h.columns.map((e=>({...e,text:e.text||e.value}))):D.value)),R=n({by:null,desc:!1});let F;async function Q(){if(!Array.isArray(U.value)){L.value=!0,O.value="",D.value=null,N.value=null;try{const e={};F=e;const{data:t}=await I.get(`insights/query/${k.value}`,{params:U.value});if(F!==e)return;if(t.error&&(O.value=t.error),t.headers&&t.items){const e=t.items.length>2;D.value=t.headers.map((function(t,a){const n=t.replace(/_/g," ").replace(/(?:^|\s)\S/g,(function(e){return e.toUpperCase()}));return{text:n,value:t,width:n.length+1,sortable:e}}));const a=h.columns&&h.columns.filter((e=>e.isNumber));N.value=a?t.items.map((e=>(a.forEach((t=>{e[t.value]=""!==e[t.value]?1*e[t.value]:null})),e))):t.items}}catch(e){const t=e.response?.data?.error||e.message;t.includes("Missing query param")?(T.value=t.replace("Missing query param","Please specify"),t.split(": ")[1].split(", ").forEach((e=>M.value.add(e)))):O.value=t}L.value=!1}}function V(){if(H.value&&N.value){let e=Object.values(H.value).map((e=>e.text)).join(",");e+="\r\n",e+=function(){let e="";return N.value.forEach((t=>{for(let a in t)/[, ]/.test(t[a])?e+=`"${t[a].replace(/"/g,'\\"')}",`:e+=t[a]+",";e+="\r\n"})),e}();const t=(new Date).toISOString()+".csv"||"export.csv",a=new Blob([e],{type:"text/csv;charset=utf-8;"});if(navigator.msSaveBlob)navigator.msSaveBlob(a,t);else{const e=document.createElement("a");if(void 0!==e.download){const n=URL.createObjectURL(a);e.setAttribute("href",n),e.setAttribute("download",t),e.style.visibility="hidden",document.body.appendChild(e),e.click(),document.body.removeChild(e)}}}}function z(e,t){let a=e;for(let e in t)a=a.replace(new RegExp(`%${e}%`,"g"),t[e]);return a}function P({item:e}){const t=h.actions?.find((e=>e.row));t&&c.push(z(t.link,e))}return C(R,(({by:e,desc:t})=>{e&&(N.value=N.value.sort(((a,n)=>a[e]<n[e]?t?1:-1:a[e]>n[e]?t?-1:1:0)))}),{deep:!0}),(e,t)=>{const n=r("v-progress-circular"),o=r("v-notice"),c=r("v-icon"),h=r("v-button"),k=l("tooltip");return i(),s("div",{class:u(["sql-panel-container",{"has-header":w(x)}])},[L.value||O.value||T.value?(i(),s("div",ke,[L.value?(i(),y(n,{key:0,indeterminate:""})):T.value?(i(),y(o,{key:1,type:"info",center:""},{default:f((()=>[b(g(T.value),1)])),_:1})):(i(),y(o,{key:2,type:"danger",center:""},{default:f((()=>[b(g(O.value),1)])),_:1}))])):H.value&&N.value?(i(),s(m,{key:1},[w(q)?(i(),y(h,{key:0,onClick:V,icon:"",secondary:"",class:"export-csv-button"},{default:f((()=>[d(c,{name:"download-file"})])),_:1})):v("v-if",!0),d(we,{headers:H.value,items:N.value,"onClick:row":P,sort:R.value.by,"onUpdate:sort":t[0]||(t[0]=e=>R.value.by=e),sortDesc:R.value.desc,"onUpdate:sortDesc":t[1]||(t[1]=e=>R.value.desc=e),"fixed-header":""},$({_:2},[a.actions?.find((e=>!e.row))?{name:"item-append",fn:f((({item:e})=>[(i(!0),s(m,null,p(a.actions.filter((e=>!e.row)),(t=>_((i(),y(h,{outlined:"",to:z(t.link,e),icon:!t.show_label,"x-small":""},{default:f((()=>[d(c,{name:t.icon},null,8,["name"]),t.show_label?(i(),s("span",xe,g(t.label),1)):v("v-if",!0)])),_:2},1032,["to","icon"])),[[k,t.label]]))),256))])),key:"0"}:void 0]),1032,["headers","items","sort","sortDesc"])],64)):v("v-if",!0)],2)}}};const qe=[],Se=[],je=[],Ae=[],Ce=[a({id:"sql-query",name:"SQL Query panel",icon:"view_list",description:"Show result of a stored SQL query as a table",component:ae(_e,[["__file","panel.vue"]]),options:[{field:"sql",name:"SQL query",type:"string",meta:{note:"Supports variables in the format of {{variable_name}}. Don't quote string variables. Example: SELECT * FROM tasks WHERE list = {{list}} AND status IN ({{status}})",interface:"input-code",width:"full",options:{language:"sql"}}},{field:"columns",name:"Columns",type:"json",special:"cast-json",meta:{width:"full",interface:"list",options:{addLabel:"Add column",label:"{{name}} - {{width}}",fields:[{field:"value",name:"Column Name",type:"string",note:"As returned by query",meta:{required:!0,width:"half",interface:"input",options:{trim:!0,softLength:100}}},{field:"text",name:"Label",type:"string",note:"What to display in the column header (Default is same as name)",meta:{width:"half",interface:"input",options:{trim:!0,softLength:100}}},{field:"width",name:"Width",type:"integer",meta:{required:!0,width:"half",interface:"input",options:{min:1,max:300},note:"Width of the column in ch (character width). Default is 10."},schema:{default_value:10}},{field:"isNumber",name:"Is Numberic",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"sortable",name:"Sortable",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"searchable",name:"Searchable",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"summarise",name:"Summarise",type:"string",meta:{width:"half",interface:"select-dropdown",options:{choices:[{text:"Sum",value:"sum"},{text:"Average",value:"avg"},{text:"Count",value:"count"},{text:"Count Unique",value:"count_unique"},{text:"Count Groups",value:"count_groups"}]}}}]}}},{field:"actions",name:"Actions",type:"json",special:"cast-json",meta:{width:"full",interface:"list",options:{addLabel:"Add action",label:"{{{label}}",fields:[{field:"label",name:"Label",type:"string",meta:{required:!0,width:"half",interface:"input",options:{trim:!0,softLength:50}}},{field:"link",name:"Link",type:"string",meta:{required:!0,note:"Variables per row can be inserted as such %column_name%",width:"half",interface:"input",options:{trim:!0}}},{field:"row",name:"Activate on row click",type:"boolean",meta:{note:"If you don't want to show the action button, but want to activate the link on row click, check this box.",width:"full",interface:"boolean"}},{field:"icon",name:"Icon",type:"string",meta:{note:"Leave blank to not show an icon",width:"half",interface:"select-icon"}},{field:"show_label",name:"Show label",type:"boolean",meta:{width:"half",interface:"boolean"}}]}}},{field:"download",name:"Download button",type:"boolean",meta:{width:"half",interface:"boolean",options:{label:"Show"}},schema:{default_value:!0}},{field:"is_static",name:"Is static",type:"boolean",meta:{width:"half",interface:"boolean",options:{label:"Yes"},note:"If the result will not be affect when variables are changed, you can check this box to improve performance."},schema:{default_value:!1}},{field:"cache",name:"Cache Response",type:"integer",meta:{width:"half",interface:"input",options:{min:10,max:3600},note:"Tells the browser how long to cache results for. Default is 30 seconds."},schema:{default_value:300}}],minWidth:10,minHeight:10})],$e=[];export{Se as displays,qe as interfaces,je as layouts,Ae as modules,$e as operations,Ce as panels};
1
+ import{useApi as e,useStores as t,definePanel as a}from"@directus/extensions-sdk";import{ref as n,computed as o,resolveComponent as r,resolveDirective as l,openBlock as i,createElementBlock as s,createElementVNode as u,normalizeClass as c,createVNode as d,withCtx as v,createCommentVNode as b,Fragment as f,renderList as m,normalizeStyle as p,createTextVNode as h,toDisplayString as g,createBlock as y,unref as w,renderSlot as k,withModifiers as x,withDirectives as _,pushScopeId as q,popScopeId as S,defineComponent as C,toRefs as j,nextTick as A,watch as E,createSlots as $}from"vue";import{useRouter as L}from"vue-router";import{useI18n as O}from"vue-i18n";var T="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function D(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var N=NaN,B="[object Symbol]",I=/^\s+|\s+$/g,W=/^[-+]0x[0-9a-f]+$/i,M=/^0b[01]+$/i,U=/^0o[0-7]+$/i,V=parseInt,H="object"==typeof T&&T&&T.Object===Object&&T,R="object"==typeof self&&self&&self.Object===Object&&self,F=H||R||Function("return this")(),Q=Object.prototype.toString,z=Math.max,P=Math.min,Y=function(){return F.Date.now()};function G(e){var t=typeof e;return!!e&&("object"==t||"function"==t)}function Z(e){if("number"==typeof e)return e;if(function(e){return"symbol"==typeof e||function(e){return!!e&&"object"==typeof e}(e)&&Q.call(e)==B}(e))return N;if(G(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=G(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(I,"");var a=M.test(e);return a||U.test(e)?V(e.slice(2),a?2:8):W.test(e)?N:+e}var J=D((function(e,t,a){var n,o,r,l,i,s,u=0,c=!1,d=!1,v=!0;if("function"!=typeof e)throw new TypeError("Expected a function");function b(t){var a=n,r=o;return n=o=void 0,u=t,l=e.apply(r,a)}function f(e){var a=e-s;return void 0===s||a>=t||a<0||d&&e-u>=r}function m(){var e=Y();if(f(e))return p(e);i=setTimeout(m,function(e){var a=t-(e-s);return d?P(a,r-(e-u)):a}(e))}function p(e){return i=void 0,v&&n?b(e):(n=o=void 0,l)}function h(){var e=Y(),a=f(e);if(n=arguments,o=this,s=e,a){if(void 0===i)return function(e){return u=e,i=setTimeout(m,t),c?b(e):l}(s);if(d)return i=setTimeout(m,t),b(s)}return void 0===i&&(i=setTimeout(m,t)),l}return t=Z(t)||0,G(a)&&(c=!!a.leading,r=(d="maxWait"in a)?z(Z(a.maxWait)||0,t):r,v="trailing"in a?!!a.trailing:v),h.cancel=function(){void 0!==i&&clearTimeout(i),u=0,n=s=o=i=void 0},h.flush=function(){return void 0===i?l:p(Y())},h}));const K={sum:"Σ",avg:"μ",count:"#",count_unique:"#!"},X={sum:(e,t)=>e.reduce(((e,a)=>e+Number.parseInt(a[t])),0),avg:(e,t)=>Math.round(X.sum(e,t)/e.length),count:e=>e.length,count_unique:(e,t)=>new Set(e.map((e=>e[t]))).size,count_groups:(e,t)=>e.reduce(((e,a)=>{const n=a[t];return e[n]=(e[n]||0)+1,e}),{})};var ee=[],te=[];function ae(e,t){if(e&&"undefined"!=typeof document){var a,n=!0===t.prepend?"prepend":"append",o=!0===t.singleTag,r="string"==typeof t.container?document.querySelector(t.container):document.getElementsByTagName("head")[0];if(o){var l=ee.indexOf(r);-1===l&&(l=ee.push(r)-1,te[l]={}),a=te[l]&&te[l][n]?te[l][n]:te[l][n]=i()}else a=i();65279===e.charCodeAt(0)&&(e=e.substring(1)),a.styleSheet?a.styleSheet.cssText+=e:a.appendChild(document.createTextNode(e))}function i(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),t.attributes)for(var a=Object.keys(t.attributes),o=0;o<a.length;o++)e.setAttribute(a[o],t.attributes[a[o]]);var l="prepend"===n?"afterbegin":"beforeend";return r.insertAdjacentElement(l,e),e}}ae("\nbody {\n --v-table-color: var(--v-input-color);\n --v-table-background-color: var(--v-input-background-color);\n}\n.sql-query-table[data-v-b55bbc9b] {\n position: relative;\n height: var(--v-table-height);\n overflow-y: auto;\n\n --sqt-head--background: var(--background-normal, var(--theme--background));\n --sqt-head--color: color: var(--foreground-normal, var(--theme--foreground));\n\n --sqt-foot--background: var(--background-normal, var(--theme--background));\n --sqt-foot--color: color: var(--foreground-normal, var(--theme--foreground));\n}\ntable[data-v-b55bbc9b] {\n min-width: 100%;\n min-height: 100%;\n border-collapse: collapse;\n border-spacing: 0;\n background-color: var(--v-table-background-color);\n color: var(--v-table-color);\n}\ntable thead[data-v-b55bbc9b] {\n background-color: var(--sqt-head--background);\n color: var(--sqt-head--color);\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable thead.fixed[data-v-b55bbc9b] {\n position: sticky;\n top: 0;\n z-index: 3;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.04);\n}\ntable thead tr.headers th[data-v-b55bbc9b] {\n padding: 8px;\n font-weight: bold;\n min-width: 3rem;\n background-color: var(--sqt-head--background);\n color: var(--sqt-head--color);\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable tr.search th[data-v-b55bbc9b] {\n padding: 0;\n}\ntable tr.search th .search-input.v-input[data-v-b55bbc9b] {\n margin: 0;\n border: none;\n}\ntable th .sort-icon[data-v-b55bbc9b] {\n opacity: 0;\n}\ntable th:hover .sort-icon[data-v-b55bbc9b] {\n opacity: 0.5;\n}\ntable th .sort-icon.show[data-v-b55bbc9b] {\n opacity: 1;\n}\ntable th.select[data-v-b55bbc9b] {\n width: 2rem;\n}\ntable td[data-v-b55bbc9b] {\n padding: 8px;\n align: middle;\n border-bottom: var(--border-width) solid var(--v-input-border-color);\n}\ntable tr.clickable[data-v-b55bbc9b]:hover {\n background-color: var(--theme--background-subdued);\n cursor: pointer\n}\ntable tbody[data-v-b55bbc9b] {\n display: contents;\n}\ntable tfoot tr[data-v-b55bbc9b] {\n position: sticky;\n bottom: 0;\n background-color: var(--sqt-foot--background);\n color: var(--sqt-foot--color);\n box-shadow: var(--card-shadow);\n}\ntable tfoot tr td[data-v-b55bbc9b] {\n padding: 8px;\n height: 44px;\n font-weight: bold;\n background-color: var(--sqt-foot--background);\n color: var(--sqt-foot--color);\n}\n",{});var ne=(e,t)=>{const a=e.__vccOpts||e;for(const[e,n]of t)a[e]=n;return a};const oe=e=>(q("data-v-b55bbc9b"),e=e(),S(),e),re={class:"sql-query-table"},le={key:0,class:"search"},ie={colspan:"80%"},se={class:"headers"},ue=["onClick","align"],ce={key:0},de={key:1},ve=["colspan"],be={key:0},fe={colspan:"100%"},me={key:1},pe=["onClick"],he=oe((()=>u("tr",null,[u("td",{style:{height:"100%"}})],-1))),ge={key:2},ye={key:0,class:"v-text-overflow"},we={__name:"FastTable",props:{loading:Boolean,headers:{type:Array,validator:e=>e.every((e=>e.value&&e.text)),required:!0},items:{type:Array,required:!0},sort:String,sortDesc:Boolean,fixedHeader:Boolean,rowClickable:Boolean},emits:["update:sort","update:sortDesc","click:row"],setup(e,{emit:t}){const{t:a}=O(),q=e,S=n(""),C=o((()=>q.headers.filter((e=>e.searchable)))),j=o((()=>{const e=S.value?S.value.toLowerCase().trim():"";return e?q.items.filter((t=>C.value.some((a=>t[a.value]&&t[a.value].toLowerCase().includes(e))))):q.items})),A=o((()=>{const e=function(e,t){if(!t.some((e=>!!e.summarise)))return null;const a={};for(const n of t){if(!n.summarise)continue;const t=X[n.summarise];if(!t)throw new Error(`Summariser function for ${n.summarise} not found.`);const o=t(e,n.value);if("count_groups"===n.summarise){let e=JSON.stringify(o,null,1).replace("{\n","").replace("\n}","").replace(/[",]/g,"");a[n.value]=e}else a[n.value]=`${K[n.summarise]} ${o}`}return a}(j.value,q.headers);return e})),E=t;return(t,n)=>{const o=r("v-icon"),$=r("v-input"),L=r("v-progress-linear"),O=r("v-card-title"),T=r("v-card"),D=l("tooltip");return i(),s("div",re,[u("table",null,[u("thead",{class:c(["table-header",{fixed:e.fixedHeader}])},[C.value.length&&e.items.length>10?(i(),s("tr",le,[u("th",ie,[d($,{modelValue:S.value,"onUpdate:modelValue":n[0]||(n[0]=e=>S.value=e),small:"",trim:"",class:"search-input",rounded:"",placeholder:"Search"},{prepend:v((()=>[d(o,{name:"search"})])),_:1},8,["modelValue"])])])):b("v-if",!0),u("tr",se,[(i(!0),s(f,null,m(e.headers,(a=>(i(),s("th",{style:p({minWidth:`${a.width||t.auto}ch`}),key:a.value,onClick:e=>function(e){e.sortable&&(E("update:sort",e.value),E("update:sortDesc",!q.sortDesc))}(a),align:a.align||"left"},[h(g(a.text)+" ",1),a.sortable?(i(),y(o,{key:0,name:"sort",small:"",class:c(["sort-icon",{show:e.sort===a.value}]),style:p(`transform: ${e.sortDesc?"rotateZ(0deg) rotateY(0deg)":"rotateZ(180deg) rotateY(180deg)"}; transition: .2s all ease`)},null,8,["class","style"])):b("v-if",!0)],12,ue)))),128)),t.$slots["item-append"]?(i(),s("th",ce,"#")):b("v-if",!0)]),e.loading?(i(),s("tr",de,[u("td",{colspan:e.headers.length+1},[d(L,{indeterminate:""})],8,ve)])):b("v-if",!0)],2),e.loading||e.items.length?(i(),s("tbody",me,[k(t.$slots,"default",{items:j.value},(()=>[(i(!0),s(f,null,m(j.value,(a=>(i(),s("tr",{onClick:e=>E("click:row",{item:a,event:e}),class:c({clickable:e.rowClickable})},[(i(!0),s(f,null,m(e.headers,(e=>(i(),s("td",{key:e.value,class:c(`align-${e.align}`)},g(a[e.value]),3)))),128)),t.$slots["item-append"]?(i(),s("td",{key:0,onClick:n[1]||(n[1]=x((()=>{}),["stop"]))},[k(t.$slots,"item-append",{item:a},void 0,!0)])):b("v-if",!0)],10,pe)))),256))]),!0),b(" This is to fill up any remaining height in the table "),he])):(i(),s("tbody",be,[u("tr",null,[u("td",fe,[d(T,{style:{padding:"2rem","--v-card-max-width":"100%",margin:"2rem auto"}},{default:v((()=>[d(O,null,{default:v((()=>[d(o,{name:"info",style:{"margin-right":"2rem"}}),h(" "+g(w(a)("no_items")),1)])),_:1})])),_:1})])])])),A.value?(i(),s("tfoot",ge,[u("tr",null,[(i(!0),s(f,null,m(e.headers,(e=>_((i(),s("td",{key:e.value},[A.value[e.value]?(i(),s("code",ye,g(A.value[e.value]),1)):b("v-if",!0)])),[[D,e.summarise]]))),128))])])):b("v-if",!0)])])}}};var ke=ne(we,[["__scopeId","data-v-b55bbc9b"],["__file","FastTable.vue"]]);const xe={key:0,class:"center"},_e={key:0};var qe=C({__name:"panel",props:{id:{},showHeader:{type:Boolean},columns:{},download:{type:Boolean,default:!0},is_static:{type:Boolean},actions:{}},setup(a){const u=L(),p=a,{id:k,showHeader:x,download:q,is_static:S}=j(p),C=n(!1),O=n(""),T=n(""),D=n(null),N=n(null),B=e(),{useInsightsStore:I}=t(),W=I(),M=n(new Set),U=o((()=>{const e={},t=[];return M.value.forEach((a=>{const n=W.getVariable(a);null==n?t.push(a):e[a]=n})),t.length?t:e}));if(S.value)A(F);else{const e=J(F,1e3);E(U,(()=>{Array.isArray(U.value)?T.value=`Please specify: ${U.value.join(" & ")}`:(T.value="",N.value||(C.value=!0),e())}),{immediate:!0})}const V=o((()=>{var e;return(null==(e=p.columns)?void 0:e.length)>0?p.columns.map((e=>({...e,text:e.text||e.value}))):D.value})),H=n({by:null,desc:!1});let R;async function F(){var e,t;if(!Array.isArray(U.value)){C.value=!0,O.value="",D.value=null,N.value=null;try{const e={};R=e;const{data:t}=await B.get(`insights/query/${k.value}`,{params:U.value});if(R!==e)return;if(t.error&&(O.value=t.error),t.headers&&t.items){const e=t.items.length>2;D.value=t.headers.map((function(t,a){const n=t.replace(/_/g," ").replace(/(?:^|\s)\S/g,(function(e){return e.toUpperCase()}));return{text:n,value:t,width:n.length+1,sortable:e}}));const a=p.columns&&p.columns.filter((e=>e.isNumber));N.value=a?t.items.map((e=>(a.forEach((t=>{e[t.value]=""!==e[t.value]?1*e[t.value]:null})),e))):t.items}}catch(a){const n=(null==(t=null==(e=a.response)?void 0:e.data)?void 0:t.error)||a.message;n.includes("Missing query param")?(T.value=n.replace("Missing query param","Please specify"),n.split(": ")[1].split(", ").forEach((e=>M.value.add(e)))):O.value=n}C.value=!1}}E(H,(({by:e,desc:t})=>{e&&N.value&&(N.value=N.value.sort(((a,n)=>a[e]<n[e]?t?1:-1:a[e]>n[e]?t?-1:1:0)))}),{deep:!0});const Q=o((()=>{var e;return null==(e=p.actions)?void 0:e.find((e=>e.row))}));function z(){if(V.value&&N.value){let e=Object.values(V.value).map((e=>e.text)).join(",");e+="\r\n",e+=function(){if(!N.value)return;let e="";return N.value.forEach((t=>{for(let a in t)/[, ]/.test(t[a])?e+=`"${t[a].replace(/"/g,'\\"')}",`:e+=t[a]+",";e+="\r\n"})),e}();const t=(new Date).toISOString()+".csv",a=new Blob([e],{type:"text/csv;charset=utf-8;"});if(navigator.msSaveBlob)navigator.msSaveBlob(a,t);else{const e=document.createElement("a");if(void 0!==e.download){const n=URL.createObjectURL(a);e.setAttribute("href",n),e.setAttribute("download",t),e.style.visibility="hidden",document.body.appendChild(e),e.click(),document.body.removeChild(e)}}}}function P({item:e}){Q.value&&Y(Q.value,e)}function Y(e,t){e.filter&&e.filter.forEach((({variable:e,value:t})=>{W.setVariable(e,t)})),e.link&&u.push(function(e,t){let a=e;for(let e in t)a=a.replace(new RegExp(`%${e}%`,"g"),t[e]);return a}(e.link,t))}return(e,t)=>{var a;const n=r("v-progress-circular"),o=r("v-notice"),u=r("v-icon"),p=r("v-button"),k=l("tooltip");return i(),s("div",{class:c(["sql-panel-container",{"has-header":w(x)}])},[C.value||O.value||T.value?(i(),s("div",xe,[C.value?(i(),y(n,{key:0,indeterminate:""})):T.value?(i(),y(o,{key:1,type:"info",center:""},{default:v((()=>[h(g(T.value),1)])),_:1})):(i(),y(o,{key:2,type:"danger",center:""},{default:v((()=>[h(g(O.value),1)])),_:1}))])):V.value&&N.value?(i(),s(f,{key:1},[w(q)?(i(),y(p,{key:0,onClick:z,icon:"",secondary:"",class:"export-csv-button"},{default:v((()=>[d(u,{name:"download-file"})])),_:1})):b("v-if",!0),d(ke,{headers:V.value,items:N.value,"onClick:row":P,sort:H.value.by,"onUpdate:sort":t[0]||(t[0]=e=>H.value.by=e),sortDesc:H.value.desc,"onUpdate:sortDesc":t[1]||(t[1]=e=>H.value.desc=e),rowClickable:!!Q.value,"fixed-header":""},$({_:2},[(null==(a=e.actions)?void 0:a.find((e=>!e.row)))?{name:"item-append",fn:v((({item:t})=>[(i(!0),s(f,null,m(e.actions.filter((e=>!e.row)),(e=>_((i(),y(p,{outlined:"",onClick:a=>Y(e,t),icon:!e.show_label,"x-small":""},{default:v((()=>[d(u,{name:e.icon},null,8,["name"]),e.show_label?(i(),s("span",_e,g(e.label),1)):b("v-if",!0)])),_:2},1032,["onClick","icon"])),[[k,e.label]]))),256))])),key:"0"}:void 0]),1032,["headers","items","sort","sortDesc","rowClickable"])],64)):b("v-if",!0)],2)}}});ae("\n.sql-panel-container {\n width: 100%;\n height: 100%;\n --v-table-height: 100%;\n}\n.sql-panel-container .v-text-overflow {\n user-select: text;\n white-space: pre-wrap;\n}\n.sql-panel-container .center {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 100%;\n}\n.export-csv-button {\n position: absolute;\n right: 0;\n bottom: 0;\n z-index: 2;\n opacity: 0.8;\n}\n.export-csv-button .button {\n border-radius: var(--border-radius) 0 0 0 !important;\n}\n",{});const Se=[],Ce=[],je=[],Ae=[],Ee=[a({id:"sql-query",name:"SQL Query panel",icon:"view_list",description:"Show result of a stored SQL query as a table",component:ne(qe,[["__file","panel.vue"]]),options:[{field:"sql",name:"SQL query",type:"string",meta:{note:"Supports variables in the format of {{variable_name}}. Don't quote string variables. Example: SELECT * FROM tasks WHERE list = {{list}} AND status IN ({{status}})",interface:"input-code",width:"full",options:{language:"sql"}}},{field:"columns",name:"Columns",type:"json",special:"cast-json",meta:{width:"full",interface:"list",options:{addLabel:"Add column",label:"{{name}} - {{width}}",fields:[{field:"value",name:"Column Name",type:"string",note:"As returned by query",meta:{required:!0,width:"half",interface:"input",options:{trim:!0,softLength:100}}},{field:"text",name:"Label",type:"string",note:"What to display in the column header (Default is same as name)",meta:{width:"half",interface:"input",options:{trim:!0,softLength:100}}},{field:"width",name:"Width",type:"integer",meta:{required:!0,width:"half",interface:"input",options:{min:1,max:300},note:"Width of the column in ch (character width). Default is 10."},schema:{default_value:10}},{field:"isNumber",name:"Is Numberic",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"sortable",name:"Sortable",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"searchable",name:"Searchable",type:"boolean",meta:{width:"half",interface:"boolean"}},{field:"summarise",name:"Summarise",type:"string",meta:{width:"half",interface:"select-dropdown",options:{choices:[{text:"Sum",value:"sum"},{text:"Average",value:"avg"},{text:"Count",value:"count"},{text:"Count Unique",value:"count_unique"},{text:"Count Groups",value:"count_groups"}]}}}]}}},{field:"actions",name:"Actions",type:"json",special:"cast-json",meta:{width:"full",interface:"list",options:{addLabel:"Add action",label:"{{{label}}",fields:[{field:"label",name:"Label",type:"string",meta:{required:!0,width:"half",interface:"input",options:{trim:!0,softLength:50}}},{field:"row",name:"Activate on row click",type:"boolean",meta:{note:"If you don't want to show the action button, but want to activate the action on row click",width:"half",interface:"boolean"}},{field:"link",name:"Goto Link",type:"string",meta:{note:"Variables per row can be inserted as such %column_name%",width:"half",interface:"input",options:{trim:!0}}},{field:"filter",name:"Set Variables",type:"json",meta:{note:"Change dashboard variables based on the values of an item",width:"half",interface:"list",options:{fields:[{field:"variable",name:"variable",type:"string",meta:{type:"string",field:"variable",width:"half",display:"formatted-value",options:{trim:!0},required:!0,interface:"input"}},{field:"value",name:"value",type:"string",meta:{note:"A raw value or use %column_name% to use values from the row",type:"string",field:"value",width:"half",options:{trim:!0},required:!0,interface:"input"}}]}}},{field:"icon",name:"Icon",type:"string",meta:{note:"Leave blank to not show an icon",width:"half",interface:"select-icon"}},{field:"show_label",name:"Show label",type:"boolean",meta:{width:"half",interface:"boolean"}}]}}},{field:"download",name:"Download button",type:"boolean",meta:{width:"half",interface:"boolean",options:{label:"Show"}},schema:{default_value:!0}},{field:"is_static",name:"Is static",type:"boolean",meta:{width:"half",interface:"boolean",options:{label:"Yes"},note:"If the result will not be affect when variables are changed, you can check this box to improve performance."},schema:{default_value:!1}},{field:"cache",name:"Cache Response",type:"integer",meta:{width:"half",interface:"input",options:{min:10,max:3600},note:"Tells the browser how long to cache results for. Default is 30 seconds."},schema:{default_value:300}}],minWidth:10,minHeight:10})],$e=[];export{Ce as displays,Se as interfaces,je as layouts,Ae as modules,$e as operations,Ee as panels};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "directus-extension-sql-query-panel",
3
- "version": "1.0.6",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "description": "Insights Panel for viewing results for dynamic sql queries",
6
6
  "icon": "extension",
@@ -39,7 +39,6 @@
39
39
  "directus-custom-bundle"
40
40
  ],
41
41
  "scripts": {
42
- "start": "vite --port 8080 --host",
43
42
  "build": "directus-extension build",
44
43
  "dev": "directus-extension build -w --no-minify",
45
44
  "link": "directus-extension link",
package/types.d.ts CHANGED
@@ -1,3 +1,9 @@
1
+ declare module '*.vue' {
2
+ import { DefineComponent } from 'vue';
3
+ const component: DefineComponent<{}, {}, any>;
4
+ export default component;
5
+ }
6
+
1
7
  export enum sqpFilterEvents {
2
8
  REQUEST = 'sql-query.request',
3
9
  RESPONSE = 'sql-query.response',