UNPKG

directus-module-export

Version:

Directus module for importing and exporting collection data between servers

2 lines (1 loc) 29.1 kB
import{useApi as e,defineModule as t}from"@directus/extensions-sdk";import{defineComponent as s,ref as a,onMounted as o,watch as n,resolveComponent as i,createBlock as r,openBlock as l,withCtx as c,createElementVNode as d,createElementBlock as u,createCommentVNode as m,createVNode as p,resolveDynamicComponent as f,createTextVNode as g,normalizeClass as h,toDisplayString as y,Fragment as v,renderList as _}from"vue";var b="/",k=(e,t,s)=>{let a=e.pathname===b?t:((e,t)=>(e.endsWith(b)&&(e=e.slice(0,-1)),t.startsWith(b)||(t=b+t),e+t))(e.pathname,t),o=new globalThis.URL(a,e);if(s)for(let[e,t]of Object.entries(x(s)))if(t&&"object"==typeof t&&!Array.isArray(t))for(let[s,a]of Object.entries(t))o.searchParams.set(`${e}[${s}]`,String(a));else o.searchParams.set(e,t);return o};var w=e=>t=>{let s=e??null;return{getToken:async()=>s,async setToken(e){s=e}}},I={fetch:globalThis.fetch,WebSocket:globalThis.WebSocket,URL:globalThis.URL,logger:globalThis.console},S=(e,t={})=>{let s=t.globals?{...I,...t.globals}:I;return{globals:s,url:new s.URL(e),with(e){return{...this,...e(this)}}}};var x=e=>{let t={};Array.isArray(e.fields)&&e.fields.length>0&&(t.fields=(e=>{let t=(e,s=[])=>{if("object"==typeof e){let a=[];for(let o in e){let n=e[o]??[];if(Array.isArray(n))for(let e of n)a.push(t(e,[...s,o]));else if("object"==typeof n)for(let e of Object.keys(n)){let i=n[e];for(let n of i)a.push(t(n,[...s,`${o}:${e}`]))}}return a.flatMap(e=>e)}return[...s,String(e)].join(".")};return e.flatMap(e=>t(e))})(e.fields).join(",")),e.filter&&Object.keys(e.filter).length>0&&(t.filter=JSON.stringify(e.filter)),e.search&&(t.search=e.search),"sort"in e&&e.sort&&(t.sort="string"==typeof e.sort?e.sort:e.sort.join(",")),"number"==typeof e.limit&&e.limit>=-1&&(t.limit=String(e.limit)),"number"==typeof e.offset&&e.offset>=0&&(t.offset=String(e.offset)),"number"==typeof e.page&&e.page>=1&&(t.page=String(e.page)),e.deep&&Object.keys(e.deep).length>0&&(t.deep=JSON.stringify(e.deep)),e.alias&&Object.keys(e.alias).length>0&&(t.alias=JSON.stringify(e.alias)),e.aggregate&&Object.keys(e.aggregate).length>0&&(t.aggregate=JSON.stringify(e.aggregate)),e.groupBy&&e.groupBy.length>0&&(t.groupBy=e.groupBy.join(","));for(let[s,a]of Object.entries(e))s in t||(t[s]="string"==typeof a||"number"==typeof a||"boolean"==typeof a?String(a):JSON.stringify(a));return t},T=(e,t)=>()=>(((e,t)=>{if(0===e.length)throw new Error(t)})(String(e),"Collection cannot be empty"),((e,t)=>{if(function(e){return["directus_access","directus_activity","directus_collections","directus_comments","directus_fields","directus_files","directus_folders","directus_migrations","directus_permissions","directus_policies","directus_presets","directus_relations","directus_revisions","directus_roles","directus_sessions","directus_settings","directus_users","directus_webhooks","directus_dashboards","directus_panels","directus_notifications","directus_shares","directus_flows","directus_operations","directus_translations","directus_versions","directus_extensions"].includes(e)}(String(e)))throw new Error(t)})(e,"Cannot use readItems for core collections"),{path:`/items/${e}`,params:t??{},method:"GET"}),$={},C=(e={})=>t=>{let s={...$,...e};return{async request(a){let o=a();if(o.headers||(o.headers={}),"Content-Type"in o.headers?"multipart/form-data"===o.headers["Content-Type"]&&delete o.headers["Content-Type"]:o.headers["Content-Type"]="application/json","getToken"in this&&!("Authorization"in o.headers)){let e=await this.getToken();e&&(o.headers.Authorization=`Bearer ${e}`)}let n=k(t.url,o.path,o.params),i={method:o.method??"GET",headers:o.headers??{}};"credentials"in s&&(i.credentials=s.credentials),o.body&&(i.body=o.body),o.onRequest&&(i=await o.onRequest(i)),s.onRequest&&(i=await s.onRequest(i));let r=await(async(e,t,s=globalThis.fetch)=>(t.headers="object"!=typeof t.headers||Array.isArray(t.headers)?{}:t.headers,s(e,t).then(e=>async function(e){if("object"==typeof e&&e){if(function(e){return!("object"!=typeof e||!e)&&"headers"in e&&"ok"in e&&"json"in e&&"function"==typeof e.json&&"text"in e&&"function"==typeof e.json}(e)){let t=e.headers.get("Content-Type")?.toLowerCase();if(t?.startsWith("application/json")||t?.startsWith("application/health+json")){let t=await e.json();if(!e.ok||"errors"in t)throw t;return"data"in t?t.data:t}if(t?.startsWith("text/html")||t?.startsWith("text/plain")){let t=await e.text();if(!e.ok)throw t;return t}return 204===e.status?null:e}if("errors"in e)throw e;return"data"in e?e.data:e}}(e).catch(t=>{let s={message:"",errors:t&&"object"==typeof t&&"errors"in t?t.errors:t,response:e};return t&&"object"==typeof t&&"data"in t&&(s.data=t.data),Array.isArray(s.errors)&&s.errors[0]?.message&&(s.message=s.errors[0].message),Promise.reject(s)}))))(n.toString(),i,t.globals.fetch);return"onResponse"in o&&(r=await o.onResponse(r,i)),"onResponse"in e&&(r=await e.onResponse(r,i)),r}}};async function A(e,t,s){try{console.log("Testing collection access:",{domain:e,collection:s,hasToken:!!t,tokenPrefix:t.substring(0,10)+"..."});const a=t.replace(/^Bearer\s+/i,""),o=S(e).with(w(a)).with(C());console.log("Making API request to:",`${e}/items/${s}?limit=1`);try{const e=await o.request(T(s,{limit:1}));return console.log("Collection access test successful (SDK method):",{collection:s,resultType:typeof e,isArray:Array.isArray(e),length:Array.isArray(e)?e.length:"N/A"}),{success:!0,message:`Successfully accessed collection '${s}'`}}catch(e){console.log("SDK method failed, trying alternative approach:",e.message);try{const t=await o.request(T("directus_collections",{limit:-1}));return Array.isArray(t)&&t.some(e=>e.collection===s)?{success:!1,message:`Collection '${s}' exists but you don't have permission to access it`,error:{message:e.message,status:e.response?.status||403,details:e.response?.data}}:{success:!1,message:`Collection '${s}' does not exist on the server`,error:{message:"Collection not found",status:404}}}catch(e){return{success:!1,message:`Cannot access collections list: ${e.message}`,error:{message:e.message,status:e.response?.status,details:e.response?.data}}}}}catch(t){return console.error("Collection access test failed:",{collectionName:s,error:t.message,status:t.response?.status,details:t.response?.data,url:e,fullError:t}),{success:!1,message:`Failed to access collection '${s}': ${t.message}`,error:{message:t.message,status:t.response?.status,details:t.response?.data}}}}async function j(e,t,s){const a=[],o=(e,t)=>{const s={timestamp:(new Date).toISOString(),step:e,details:t};a.push(s),console.log(`[${e}]`,t)};try{if(o("request_received",{selectedDomain:e,hasToken:!!t}),!e||!t){return o("validation_error",{hasSelectedDomain:!!e,hasAdminToken:!!t}),{success:!1,message:"Missing required parameters: selectedDomain and adminToken",error:{validationLog:a}}}const n=t.replace(/^Bearer\s+/i,""),i=s||S(e).with(w(n)).with(C());o("token_validation_start",{});try{const e=await i.request(T("directus_users",{limit:1}));return o("token_validation_success",{hasAccess:!0,collectionCount:e?.length||0}),{success:!0,message:"Token validation successful",serverInfo:void 0}}catch(e){return o("token_validation_failed",{error:e.message,status:e.response?.status,details:e.response?.data}),{success:!1,message:"Invalid admin token or insufficient permissions",error:{message:e.message,status:e.response?.status,details:e.response?.data,validationLog:a}}}}catch(e){return o("fatal_error",{message:e.message,stack:e.stack}),{success:!1,message:`Token validation failed: ${e.message}`,error:{message:e.message,status:e.response?.status,details:e.response?.data,validationLog:a}}}}async function M(e,t,s,a,o){const n=[],i=(e,t)=>{const s={timestamp:(new Date).toISOString(),step:e,details:t};n.push(s),console.log(`[${e}]`,t)};try{i("import_start",{sourceUrl:e,collectionName:s,hasToken:!!t});const r=await j(e,t,a);if(!r.success)return i("token_validation_failed",r.error),{success:!1,message:"Token validation failed",error:r.error,importLog:n};i("token_validation_success",{serverInfo:r.serverInfo});const l=t.replace(/^Bearer\s+/i,""),c=S(e).with(w(l)).with(C()),d=s;let u=null;try{const e=await a.get("/folders",{params:{limit:1,filter:{name:{_eq:d}}}}),t=e?.data?.data?.[0];if(t?.id)u=t.id;else{const e=await a.post("/folders",{name:d,parent:null});u=e?.data?.data?.id||null}i("target_folder_ready",{name:d,id:u})}catch(e){i("target_folder_error",{name:d,error:e.message})}const m=async e=>{try{const t=await a.get("/items/directus_sync_id_map",{params:{limit:1,filter:{table:{_eq:s},sync_id:{_eq:String(e)}}}}),o=t?.data?.data?.[0];return o?.local_id?String(o.local_id):null}catch(e){return null}},p=async(e,t)=>{try{const o=await a.get("/items/directus_sync_id_map",{params:{limit:1,filter:{table:{_eq:s},sync_id:{_eq:String(e)}}}}),n=o?.data?.data?.[0];n?.id?n.local_id!==String(t)&&await a.patch(`/items/directus_sync_id_map/${n.id}`,{local_id:String(t)}):await a.post("/items/directus_sync_id_map",{table:s,sync_id:String(e),local_id:String(t)})}catch(e){}};i("fetch_data_start",{collectionName:s});const f="number"==typeof o&&o>0?o:-1,g=await c.request(T(s,{limit:f})),h=Array.isArray(g)?g:[];if(i("fetch_data_success",{itemCount:h.length,collectionName:s}),0===h.length)return i("collection_empty",{collectionName:s}),{success:!0,message:`Collection '${s}' is empty on the source server`,importedItems:[],importLog:n};const y=new Map,v=async t=>{const s=await fetch(`${e}/files/${t}`,{headers:{Authorization:`Bearer ${l}`}});if(!s.ok)throw new Error(`Source file metadata not accessible (status ${s.status})`);const a=await s.json();return a?.data||{}},_=async e=>{const t=await a.get(`/files/${e}`);return t?.data?.data||{}},b=(e,t)=>!(!e||!t)&&(!(!e.checksum||!t.checksum||e.checksum!==t.checksum)||"number"==typeof e.filesize&&"number"==typeof t.filesize&&e.filesize===t.filesize&&(!e.type||!t.type||e.type===t.type)),k=async(t,s)=>{if(y.has(t))return y.get(t);try{const o=await v(t),n=await fetch(`${e}/assets/${t}`,{headers:{Authorization:`Bearer ${l}`}});if(!n.ok)throw new Error(`Source file binary not accessible (status ${n.status})`);const i=await n.blob(),r=o.filename_download||o.filename||`${t}`,c=new FormData;c.append("file",i,r);const d=s&&String(s).trim()||o.title&&String(o.title).trim()||"";d&&c.append("title",d),u&&c.append("folder",u),o.filename_download&&c.append("filename_download",o.filename_download);const m=await a.post("/files",c),p=m?.data?.data?.id;if(!p)throw new Error("Target upload did not return an ID");return y.set(t,String(p)),String(p)}catch(e){throw new Error(`File copy failed for ${t}: ${e.message}`)}};i("import_items_start",{itemCount:h.length,collectionName:s});const I=[];let x=0,$=0;const A="number"==typeof o&&o>0?h.slice(0,o):h,M=e=>{if(e&&"string"==typeof e.title&&e.title.trim().length>0)return e.title.trim();const t=e?.translations;if(Array.isArray(t))for(const e of t){if(!e)continue;const t="string"==typeof e.title?e.title:e.title&&"object"==typeof e.title&&"string"==typeof e.title.value?e.title.value:"";if(t&&t.trim().length>0)return t.trim()}return null};for(const t of A)try{const{id:o,date_created:n,date_updated:r,user_created:c,user_updated:d,...f}=t,g=M(t),h=await m(o);let y=null;if(h)try{const e=await a.get(`/items/${s}/${h}`);y=e?.data?.data||null}catch(e){y=null}const w=new Map,S=new Set,T=new Map;for(const t of Object.keys(f))try{const s=f[t];if(!s)continue;if(Array.isArray(s)){i("file_copy_skip",{reason:"array_not_supported",field:t,itemId:o});continue}const n="string"==typeof s?s:"object"==typeof s&&s.id?s.id:null;if(!n||"string"!=typeof n)continue;if(w.has(n)){const e=w.get(n);f[t]=e,i("file_reused_in_item",{field:t,sourceFileId:n,reusedFileId:e,itemId:o});continue}if(!(await fetch(`${e}/files/${n}`,{method:"GET",headers:{Authorization:`Bearer ${l}`}})).ok)continue;if(y){const e=y[t],s="string"==typeof e?e:e&&"object"==typeof e&&e.id?e.id:null;if(s)try{const e=T.has(n)?T.get(n):await v(n);T.set(n,e);const r=await _(s);if(b(e,r)){const e={},l=g&&g.trim()||void 0;l&&r.title!==l&&(e.title=l),u&&r.folder!==u&&(e.folder=u),Object.keys(e).length>0&&!S.has(s)?(await a.patch(`/files/${s}`,e),S.add(s),i("file_reused_and_patched",{field:t,fileId:s,itemId:o,patch:e})):i("file_reused",{field:t,fileId:s,itemId:o}),f[t]=s,w.set(n,s);continue}}catch(e){}}i("file_copy_start",{field:t,sourceFileId:n,itemId:o,title:g||null});const r=await k(n,g||void 0);f[t]=r,i("file_copy_success",{field:t,sourceFileId:n,newFileId:r,itemId:o,title:g||null}),w.set(n,r)}catch(e){i("file_copy_error",{field:t,itemId:o,error:e.message})}let $=null,C="created";if(h){i("item_update_start",{sourceId:o,localId:h,collectionName:s});try{$=await a.patch(`/items/${s}/${h}`,f),C="updated"}catch(e){i("item_update_failed_fallback_create",{sourceId:o,localId:h,error:e?.message}),$=await a.post(`/items/${s}`,f),C="created"}}else $=await a.post(`/items/${s}`,f),C="created";I.push({originalId:o,newId:$.data?.data?.id,status:"success",action:C,data:$.data?.data}),x++,i("updated"===C?"item_updated":"item_imported",{originalId:o,newId:$.data?.data?.id,collectionName:s}),await p(o,$.data?.data?.id)}catch(e){$++,I.push({originalId:t.id,status:"error",error:{message:e.message,status:e.response?.status,details:e.response?.data}}),i("item_import_failed",{originalId:t.id,error:e.message,collectionName:s})}return i("import_complete",{totalItems:h.length,successCount:x,errorCount:$,collectionName:s}),{success:!0,message:`Successfully imported ${x} items from ${s} (${$} failed)`,importedItems:I,importLog:n}}catch(e){return i("fatal_error",{message:e.message,stack:e.stack}),{success:!1,message:`Import failed: ${e.message}`,error:{message:e.message,status:e.response?.status,details:e.response?.data},importLog:n}}}var L=Object.freeze({__proto__:null,importFromDirectus:M,testCollectionAccess:A,testMultipleCollections:async function(e,t){const s=["news","client","invoice","page"],a={};for(const o of s){console.log(`Testing collection: ${o}`);const s=await A(e,t,o);a[o]=s,await new Promise(e=>setTimeout(e,100))}const o=Object.values(a).filter(e=>e.success).length;return{success:o>0,results:a}},validateDirectusToken:j}),O=s({name:"ImportPushCollections",setup(){const t=e(),s=a([]),i=a({import:!1,push:!1,token_validation:!1,test_collections:!1}),r=a(localStorage.getItem("selectedDomain")||""),l=a(localStorage.getItem("adminToken")||""),c=localStorage.getItem("importLimit"),d=a(c&&Number(c)||null),u=a([]),m=a([]),p=a(localStorage.getItem("domainInputMode")||"select"),f=a(localStorage.getItem("tokenInputMode")||"select"),g=a(!1),h=a(null);o(async()=>{const e=localStorage.getItem("domainHistory"),t=localStorage.getItem("tokenHistory");if(e)try{u.value=JSON.parse(e)}catch(e){console.warn("Failed to parse domain history, starting fresh"),u.value=[]}if(t)try{m.value=JSON.parse(t)}catch(e){console.warn("Failed to parse token history, starting fresh"),m.value=[]}console.log("Initial selectedDomain from localStorage:",localStorage.getItem("selectedDomain")),console.log("Current selectedDomain ref value:",r.value),await v()});n([r,l],([e,t])=>{console.log("Saving credentials to localStorage"),localStorage.setItem("selectedDomain",e),e&&!u.value.includes(e)&&(u.value.unshift(e),u.value.length>10&&u.value.pop(),localStorage.setItem("domainHistory",JSON.stringify(u.value))),t?(localStorage.setItem("adminToken",t),l.value=t,"select"!==f.value||m.value.includes(t)||(m.value.unshift(t),m.value.length>5&&m.value.pop(),localStorage.setItem("tokenHistory",JSON.stringify(m.value)))):localStorage.removeItem("adminToken")}),n(d,e=>{e&&e>0?localStorage.setItem("importLimit",String(e)):localStorage.removeItem("importLimit")}),n(g,e=>{if(e)try{window.location.reload()}catch(e){console.warn("Could not reload page automatically:",e),h.value={status:200,message:"Changes applied. Please refresh the page manually if needed.",type:"info"}}});const y=(e,t,s)=>{i.value[e]=s,t&&(i.value[`${e}_${t}`]=s)},v=async()=>{try{const e=await t.get("/collections");console.log("All collections:",e.data.data);const a=["_translations","_languages","_extensions","_operations","_shares","_fields","_migrations","_versions","_notifications","_sessions","_sync_id"],o=e.data.data.filter(e=>{const t=a.some(t=>e.collection.includes(t)),s=e.meta?.is_folder;return console.log("Collection:",e.collection,{isExcluded:t,isFolder:s,meta:e.meta}),!t&&!s});console.log("Filtered collections:",o),s.value=o}catch(e){console.error("Error fetching collections:",e)}};return{api:t,collections:s,loadingStates:i,selectedDomain:r,adminToken:l,importLimit:d,domainHistory:u,tokenHistory:m,domainInputMode:p,tokenInputMode:f,needsReload:g,operationStatus:h,customFilter:(e,t)=>{const s=e.toLowerCase(),a=t.toLowerCase();return s.indexOf(a)>-1},handleDomainSelect:e=>{e&&!u.value.includes(e)&&(u.value.unshift(e),u.value.length>10&&u.value.pop(),localStorage.setItem("domainHistory",JSON.stringify(u.value)))},handleTokenSelect:e=>{e&&(m.value.includes(e)||(m.value.unshift(e),m.value.length>5&&m.value.pop(),localStorage.setItem("tokenHistory",JSON.stringify(m.value))),l.value=e)},clearDomainHistory:()=>{u.value=[],localStorage.removeItem("domainHistory")},clearTokenHistory:()=>{m.value=[],localStorage.removeItem("tokenHistory")},toggleDomainInputMode:()=>{p.value="select"===p.value?"input":"select",localStorage.setItem("domainInputMode",p.value)},toggleTokenInputMode:()=>{f.value="select"===f.value?"input":"select",localStorage.setItem("tokenInputMode",f.value)},validateToken:async()=>{if(!r.value||!l.value)return alert("Please enter both server URL and admin token"),!1;try{y("token_validation","",!0),h.value=null;const e=l.value,t=await j(r.value,e);return t.success?(h.value={status:200,message:`Token validated successfully! Server Info: Version: ${t.serverInfo?.version||"Unknown"}, Project: ${t.serverInfo?.project||"Unknown"}`,type:"success"},!0):(h.value={status:400,message:t.message||"Token validation failed",type:"error"},!1)}catch(e){return console.error("Token validation error:",e),h.value={status:500,message:e.message||"Token validation failed",type:"error"},!1}finally{y("token_validation","",!1)}},testCollections:async()=>{if(r.value&&l.value)try{y("test_collections","",!0),h.value=null;const e=l.value,{testMultipleCollections:t}=await Promise.resolve().then(function(){return L}),s=await t(r.value,e),a=Object.entries(s.results).filter(([e,t])=>t.success).map(([e,t])=>e),o=Object.entries(s.results).filter(([e,t])=>!t.success).map(([e,t])=>`${e}: ${t.message}`);let n="";a.length>0&&(n+=`✅ Working collections: ${a.join(", ")}\n\n`),o.length>0&&(n+=`❌ Failed collections:\n${o.join("\n")}`),h.value={status:s.success?200:400,message:n||"No collections tested",type:s.success?"success":"warning"},console.log("Collection test results:",s.results)}catch(e){console.error("Collection test error:",e),h.value={status:500,message:e.message||"Collection test failed",type:"error"}}finally{y("test_collections","",!1)}else alert("Please enter both server URL and admin token")},importFromLive:async e=>{if(!r.value||!l.value)return console.error("API URL and admin token are required for external API access"),void(h.value={status:400,message:"API URL and admin token are required for external API access",type:"error"});try{y("import",e,!0),h.value=null;const s=l.value;try{const{testCollectionAccess:t}=await Promise.resolve().then(function(){return L}),a=await t(r.value,s,e);if(!a.success)return h.value={status:a.error?.status||403,message:a.message,type:"error"},void alert(a.message+"\n\nTip: Ensure the token role has READ permission on the collection.")}catch(e){console.warn("Preflight access test failed; proceeding to import",e?.message)}const a=await M(r.value,s,e,t,d.value??void 0);if(a.success){const t=a.importedItems||[],s=t.filter(e=>"error"!==e.status).length,o=t.filter(e=>"error"===e.status).length;if(a.message?.includes("empty")?h.value={status:200,message:a.message,type:"info"}:h.value={status:200,message:`Successfully imported ${s} items from ${e} (${o} failed)`,type:o>0?"warning":"success"},o>0){const e=t.filter(e=>"error"===e.status);console.warn("Some items failed to import:",e)}return void console.log("Import result:",a)}const o=a.message||`Failed to import ${e}`,n=a.error?.details||"No additional details available",i=a.importLog||[];console.error("Import failed:",{message:o,details:n,importLog:i});const c=i.find(e=>"fatal_error"===e.step||"error"===e.step),u=c?`${o} - ${JSON.stringify(c.details)}`:o;h.value={status:500,message:u,type:"error"},alert(`Import failed for ${e}:\n\nError: ${o}\nDetails: ${n}\n\nPlease check:\n1. The server URL is correct\n2. The collection exists on the source server\n3. The admin token has proper permissions\n4. The source server is accessible`)}catch(t){console.error("Error importing from live server:",t);const s=t.message||"Unknown error occurred";h.value={status:500,message:s,type:"error"},alert(`Import failed for ${e}:\n\nError: ${s}\n\nPlease check:\n1. The server URL is correct\n2. The collection exists on the source server\n3. The admin token has proper permissions\n4. The source server is accessible`)}finally{y("import",e,!1)}},setLoading:y}}}),D=[],N=[];!function(e,t){if(e&&"undefined"!=typeof document){var s,a=!0===t.prepend?"prepend":"append",o=!0===t.singleTag,n="string"==typeof t.container?document.querySelector(t.container):document.getElementsByTagName("head")[0];if(o){var i=D.indexOf(n);-1===i&&(i=D.push(n)-1,N[i]={}),s=N[i]&&N[i][a]?N[i][a]:N[i][a]=r()}else s=r();65279===e.charCodeAt(0)&&(e=e.substring(1)),s.styleSheet?s.styleSheet.cssText+=e:s.appendChild(document.createTextNode(e))}function r(){var e=document.createElement("style");if(e.setAttribute("type","text/css"),t.attributes)for(var s=Object.keys(t.attributes),o=0;o<s.length;o++)e.setAttribute(s[o],t.attributes[s[o]]);var i="prepend"===a?"afterbegin":"beforeend";return n.insertAdjacentElement(i,e),e}}("\n.uppercase[data-v-c8bedbe4]::first-letter {\n text-transform: uppercase;\n}\n.content-wrapper[data-v-c8bedbe4] {\n padding-left: 40px;\n padding-right: 20px;\n}\n.v-notice[data-v-c8bedbe4] {\n margin-top: 4px;\n margin-bottom: 4px;\n}\np[data-v-c8bedbe4] {\n margin-bottom: 20px;\n font-size: 16px;\n line-height: 1.5;\n}\n.v-button[data-v-c8bedbe4] {\n margin-right: 4px;\n margin-bottom: 4px;\n margin-top: 4px;\n text-align: center;\n}\n.api-inputs[data-v-c8bedbe4] {\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: stretch;\n}\n.input-group[data-v-c8bedbe4] {\n display: flex;\n flex-direction: row;\n gap: 8px;\n align-items: stretch;\n}\n.api-inputs[data-v-c8bedbe4]>* {\n flex: 1;\n}\n.api-buttons[data-v-c8bedbe4] {\n display: flex;\n flex-direction: row;\n gap: 8px;\n margin-bottom: 20px;\n}\n.collection-buttons[data-v-c8bedbe4] {\n display: flex;\n flex-direction: row;\n gap: 8px;\n}\n.api-url-input[data-v-c8bedbe4] {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 12px;\n}\n.api-url-input .v-input[data-v-c8bedbe4] {\n flex: 1;\n}\n.domain-input[data-v-c8bedbe4] {\n flex: 1;\n margin-bottom: 12px;\n}\n.token-input[data-v-c8bedbe4] {\n flex: 1;\n margin-bottom: 12px;\n}\n.limit-input[data-v-c8bedbe4] {\n flex: 1;\n margin-bottom: 12px;\n}\n.domain-selector[data-v-c8bedbe4] {\n margin-bottom: 20px;\n}\n.token-info[data-v-c8bedbe4] {\n margin-top: 8px;\n font-size: 14px;\n}\n@media (max-width: 768px) {\n.content-wrapper[data-v-c8bedbe4] {\n padding: 15px;\n}\np[data-v-c8bedbe4] {\n font-size: 14px;\n}\n.v-button[data-v-c8bedbe4] {\n width: 100%;\n margin-right: 0;\n}\n.api-inputs[data-v-c8bedbe4] {\n flex-direction: column;\n}\n.api-url-input .v-input[data-v-c8bedbe4],\n .domain-input[data-v-c8bedbe4],\n .token-input[data-v-c8bedbe4] {\n width: 100%;\n}\n.collection-buttons[data-v-c8bedbe4] {\n flex-direction: column;\n}\n}\n.status-display[data-v-c8bedbe4] {\n margin: 12px 0;\n}\n.status-display.success[data-v-c8bedbe4] {\n color: var(--success);\n}\n.status-display.error[data-v-c8bedbe4] {\n color: var(--danger);\n}\n.status-display.warning[data-v-c8bedbe4] {\n color: var(--warning);\n}\n.status-display.info[data-v-c8bedbe4] {\n color: var(--primary);\n}\n",{});const E={class:"content-wrapper"},H={class:"domain-selector"},P={class:"api-inputs"},R={class:"input-group"},q={class:"input-group"},F={class:"input-group"},U={key:0,class:"history-buttons"},z={class:"title type-title uppercase"},V={class:"collection-buttons"};const B=t({id:"module-export",name:"Export & import collections",icon:"file_download",routes:[{path:"",component:((e,t)=>{const s=e.__vccOpts||e;for(const[e,a]of t)s[e]=a;return s})(O,[["render",function(e,t,s,a,o,n){const b=i("sidebar-detail"),k=i("v-icon"),w=i("v-button"),I=i("v-input"),S=i("v-notice"),x=i("private-view");return l(),r(x,{title:"Import/Push Collection Data"},{sidebar:c(()=>[p(b,{icon:"info",title:"Information",close:""},{default:c(()=>t[4]||(t[4]=[d("div",{class:"page-description"},null,-1)])),_:1,__:[4]})]),default:c(()=>[d("div",E,[t[12]||(t[12]=d("p",null,"This module allows you to import and push collection data to/from another server.",-1)),d("div",null,[d("div",H,[d("div",P,[d("div",R,[(l(),r(f("select"===e.domainInputMode?"v-select":"v-input"),{modelValue:e.selectedDomain,"onUpdate:modelValue":[t[0]||(t[0]=t=>e.selectedDomain=t),e.handleDomainSelect],items:"select"===e.domainInputMode?e.domainHistory:void 0,filter:"select"===e.domainInputMode?e.customFilter:void 0,placeholder:"Enter server API URL",disabled:e.loadingStates.import,class:"domain-input",searchable:"select"===e.domainInputMode,"allow-input":"select"===e.domainInputMode},null,8,["modelValue","items","filter","disabled","searchable","allow-input","onUpdate:modelValue"])),p(w,{small:"",secondary:"",icon:"true",onClick:e.toggleDomainInputMode},{default:c(()=>[p(k,{name:"select"===e.domainInputMode?"edit":"list"},null,8,["name"])]),_:1},8,["onClick"])]),d("div",q,[(l(),r(f("select"===e.tokenInputMode?"v-select":"v-input"),{modelValue:e.adminToken,"onUpdate:modelValue":[t[1]||(t[1]=t=>e.adminToken=t),e.handleTokenSelect],items:"select"===e.tokenInputMode?e.tokenHistory:void 0,filter:"select"===e.tokenInputMode?e.customFilter:void 0,placeholder:"Enter admin token",type:"text",disabled:e.loadingStates.import,class:"token-input",searchable:"select"===e.tokenInputMode,"allow-input":"select"===e.tokenInputMode},null,8,["modelValue","items","filter","disabled","searchable","allow-input","onUpdate:modelValue"])),p(w,{small:"",secondary:"",icon:"true",onClick:e.toggleTokenInputMode},{default:c(()=>[p(k,{name:"select"===e.tokenInputMode?"edit":"list"},null,8,["name"])]),_:1},8,["onClick"])]),d("div",F,[p(I,{modelValue:e.importLimit,"onUpdate:modelValue":t[2]||(t[2]=t=>e.importLimit=t),modelModifiers:{number:!0},type:"number",min:"1",placeholder:"Max items to import (optional)",disabled:e.loadingStates.import,class:"limit-input"},null,8,["modelValue","disabled"]),p(w,{small:"",secondary:"",icon:"true",onClick:t[3]||(t[3]=t=>e.importLimit=null)},{default:c(()=>[p(k,{name:"close"})]),_:1})])]),p(w,{small:"",secondary:"",loading:e.loadingStates.token_validation,onClick:e.validateToken},{default:c(()=>[p(k,{name:"verified_user",left:""}),t[5]||(t[5]=g(" Validate Token "))]),_:1,__:[5]},8,["loading","onClick"]),p(w,{small:"",secondary:"",loading:e.loadingStates.test_collections,onClick:e.testCollections},{default:c(()=>[p(k,{name:"bug_report",left:""}),t[6]||(t[6]=g(" Test Collections "))]),_:1,__:[6]},8,["loading","onClick"]),e.domainHistory.length>0||e.tokenHistory.length>0?(l(),u("div",U,[e.domainHistory.length>0?(l(),r(w,{key:0,small:"",secondary:"",onClick:e.clearDomainHistory},{default:c(()=>[p(k,{name:"delete",left:""}),t[7]||(t[7]=g(" Clear Domain History "))]),_:1,__:[7]},8,["onClick"])):m("v-if",!0),e.tokenHistory.length>0?(l(),r(w,{key:1,small:"",secondary:"",onClick:e.clearTokenHistory},{default:c(()=>[p(k,{name:"delete",left:""}),t[8]||(t[8]=g(" Clear Token History "))]),_:1,__:[8]},8,["onClick"])):m("v-if",!0)])):m("v-if",!0),e.adminToken?(l(),r(S,{key:1,type:"info",class:"token-info"},{default:c(()=>t[9]||(t[9]=[g(" Make sure your admin token has read/write permissions for the target collections ")])),_:1,__:[9]})):m("v-if",!0)]),e.operationStatus?(l(),u("div",{key:0,class:h(["status-display",e.operationStatus.type])},[p(S,{type:e.operationStatus.type},{default:c(()=>[g(" Status: "+y(e.operationStatus.status)+" - "+y(e.operationStatus.message),1)]),_:1},8,["type"])],2)):m("v-if",!0),(l(!0),u(v,null,_(e.collections,s=>(l(),u("div",{key:s.collection,class:"api-buttons"},[d("h2",z,y(s.collection),1),t[11]||(t[11]=d("div",null,null,-1)),d("div",V,[p(w,{small:"",warning:"true",loading:e.loadingStates[`import_${s.collection}`],disabled:!e.selectedDomain||!e.adminToken,onClick:t=>e.importFromLive(s.collection)},{default:c(()=>[p(k,{name:"cloud_download",left:""}),t[10]||(t[10]=g(" Import from another Directus "))]),_:2,__:[10]},1032,["loading","disabled","onClick"])])]))),128))])])]),_:1})}],["__scopeId","data-v-c8bedbe4"]])}]});export{B as default,B as moduleExport};