import{u as e}from"./useToast-CS8pZhce.js";var t=class extends Error{constructor(e=`Отказано в доступе: запись принадлежит другому тенанту или доступ ограничен`){super(e),this.name=`TenantAccessDeniedError`}},n=class extends Error{constructor(e=`Запрашиваемый ресурс не найден`){super(e),this.name=`NotFoundError`}},r=`tenant_main`,i=[`owner`],a=r;function o(){if(typeof window<`u`){let e=localStorage.getItem(`krona_tenant_id`);if(e)return e}return a}function s(e){a=e,typeof window<`u`&&localStorage.setItem(`krona_tenant_id`,e)}function c(t){return{tenantId:t?.tenantId||o(),actorId:t?.actorId||`usr_default`,roleIds:t?.roleIds||[...i],correlationId:t?.correlationId||e()}}var l=(e,t)=>t.some(t=>e instanceof t),u,d;function f(){return u||=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]}function p(){return d||=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey]}var m=new WeakMap,h=new WeakMap,g=new WeakMap;function _(e){let t=new Promise((t,n)=>{let r=()=>{e.removeEventListener(`success`,i),e.removeEventListener(`error`,a)},i=()=>{t(C(e.result)),r()},a=()=>{n(e.error),r()};e.addEventListener(`success`,i),e.addEventListener(`error`,a)});return g.set(t,e),t}function v(e){if(m.has(e))return;let t=new Promise((t,n)=>{let r=()=>{e.removeEventListener(`complete`,i),e.removeEventListener(`error`,a),e.removeEventListener(`abort`,a)},i=()=>{t(),r()},a=()=>{n(e.error||new DOMException(`AbortError`,`AbortError`)),r()};e.addEventListener(`complete`,i),e.addEventListener(`error`,a),e.addEventListener(`abort`,a)});m.set(e,t)}var y={get(e,t,n){if(e instanceof IDBTransaction){if(t===`done`)return m.get(e);if(t===`store`)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return C(e[t])},set(e,t,n){return e[t]=n,!0},has(e,t){return e instanceof IDBTransaction&&(t===`done`||t===`store`)||t in e}};function b(e){y=e(y)}function x(e){return p().includes(e)?function(...t){return e.apply(w(this),t),C(this.request)}:function(...t){return C(e.apply(w(this),t))}}function S(e){return typeof e==`function`?x(e):(e instanceof IDBTransaction&&v(e),l(e,f())?new Proxy(e,y):e)}function C(e){if(e instanceof IDBRequest)return _(e);if(h.has(e))return h.get(e);let t=S(e);return t!==e&&(h.set(e,t),g.set(t,e)),t}var w=e=>g.get(e);function T(e,t,{blocked:n,upgrade:r,blocking:i,terminated:a}={}){let o=indexedDB.open(e,t),s=C(o);return r&&o.addEventListener(`upgradeneeded`,e=>{r(C(o.result),e.oldVersion,e.newVersion,C(o.transaction),e)}),n&&o.addEventListener(`blocked`,e=>n(e.oldVersion,e.newVersion,e)),s.then(e=>{a&&e.addEventListener(`close`,()=>a()),i&&e.addEventListener(`versionchange`,e=>i(e.oldVersion,e.newVersion,e))}).catch(()=>{}),s}var E=[`get`,`getKey`,`getAll`,`getAllKeys`,`count`],D=[`put`,`add`,`delete`,`clear`],O=new Map;function k(e,t){if(!(e instanceof IDBDatabase&&!(t in e)&&typeof t==`string`))return;if(O.get(t))return O.get(t);let n=t.replace(/FromIndex$/,``),r=t!==n,i=D.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!(i||E.includes(n)))return;let a=async function(e,...t){let a=this.transaction(e,i?`readwrite`:`readonly`),o=a.store;return r&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),i&&a.done]))[0]};return O.set(t,a),a}b(e=>({...e,get:(t,n,r)=>k(t,n)||e.get(t,n,r),has:(t,n)=>!!k(t,n)||e.has(t,n)}));var A=[`continue`,`continuePrimaryKey`,`advance`],j={},M=new WeakMap,N=new WeakMap,P={get(e,t){if(!A.includes(t))return e[t];let n=j[t];return n||=j[t]=function(...e){M.set(this,N.get(this)[t](...e))},n}};async function*F(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;t=t;let n=new Proxy(t,P);for(N.set(n,t),g.set(n,w(t));t;)yield n,t=await(M.get(n)||t.continue()),M.delete(n)}function I(e,t){return t===Symbol.asyncIterator&&l(e,[IDBIndex,IDBObjectStore,IDBCursor])||t===`iterate`&&l(e,[IDBIndex,IDBObjectStore])}b(e=>({...e,get(t,n,r){return I(t,n)?F:e.get(t,n,r)},has(t,n){return I(t,n)||e.has(t,n)}}));var L=new class{listeners=new Map;subscribe(e,t){return this.listeners.has(e)||this.listeners.set(e,new Set),this.listeners.get(e).add(t),()=>{this.listeners.get(e)?.delete(t)}}emit(e,t){let n={...t,event:e},r=this.listeners.get(e);r&&r.forEach(t=>{try{t(n)}catch(t){console.error(`[StorageEventBus] Error in event listener for ${e}:`,t)}})}clear(){this.listeners.clear()}},R=`krona_business_os_db`,z=[`entities_meta`,`fields_meta`,`layouts_meta`,`views_meta`,`records_data`,`audit_log`,`settings`],B=null;function V(){return B||=T(R,2,{upgrade(e,t){if(t<2){let t=Array.from(e.objectStoreNames);for(let n of t)z.includes(n)||e.deleteObjectStore(n)}if(e.objectStoreNames.contains(`entities_meta`)||e.createObjectStore(`entities_meta`,{keyPath:`id`}).createIndex(`by_code`,`code`,{unique:!0}),e.objectStoreNames.contains(`fields_meta`)||e.createObjectStore(`fields_meta`,{keyPath:`id`}).createIndex(`by_entity`,`entityCode`,{unique:!1}),e.objectStoreNames.contains(`layouts_meta`)||e.createObjectStore(`layouts_meta`,{keyPath:`id`}).createIndex(`by_entity`,`entityCode`,{unique:!1}),e.objectStoreNames.contains(`views_meta`)||e.createObjectStore(`views_meta`,{keyPath:`id`}).createIndex(`by_entity`,`entityCode`,{unique:!1}),!e.objectStoreNames.contains(`records_data`)){let t=e.createObjectStore(`records_data`,{keyPath:`id`});t.createIndex(`by_entity_type`,`entityType`,{unique:!1}),t.createIndex(`by_updated_at`,`updatedAt`,{unique:!1})}if(!e.objectStoreNames.contains(`audit_log`)){let t=e.createObjectStore(`audit_log`,{keyPath:`id`});t.createIndex(`by_entity_type`,`entityType`,{unique:!1}),t.createIndex(`by_entity_id`,`entityId`,{unique:!1}),t.createIndex(`by_timestamp`,`timestamp`,{unique:!1})}e.objectStoreNames.contains(`settings`)||e.createObjectStore(`settings`,{keyPath:`key`})}}),B}async function H(e,n){let r=await(await V()).get(`records_data`,e);if(!r)return null;let i=r,a=n||o();if(a&&i.tenant_id&&i.tenant_id!==a)throw new t(`Отказано в доступе: запись «${e}» принадлежит тенанту «${i.tenant_id}», текущий: «${a}»`);return r}async function U(e,t){let n=await V(),r=e.tenant_id||t||o()||`tenant_main`,i={...e,tenant_id:r,updatedAt:e.updatedAt||new Date().toISOString()};return await n.put(`records_data`,i),L.emit(`records:changed`,{storeName:`records_data`,entityType:i.entityType,id:i.id,action:`update`,data:i}),i}async function W(e,n,r){let i=await V(),a=await i.get(`records_data`,e);if(!a)return!1;let s=a,c=r||o();if(c&&s.tenant_id&&s.tenant_id!==c)throw new t(`Отказано в доступе: запись «${e}» принадлежит тенанту «${s.tenant_id}», текущий: «${c}»`);return await i.delete(`records_data`,e),L.emit(`records:changed`,{storeName:`records_data`,entityType:n||a.entityType,id:e,action:`delete`}),!0}async function G(e,t){let n=await(await V()).transaction(`records_data`,`readonly`).store.index(`by_entity_type`).getAll(e),r=t?.tenantId===void 0?o():t.tenantId;if(r&&(n=n.filter(e=>(e.tenant_id||`tenant_main`)===r)),t?.filter&&(n=n.filter(e=>{let n=e;for(let[e,r]of Object.entries(t.filter)){if(r==null||r===``)continue;let t=n[e];if(Array.isArray(t)){if(!t.includes(r))return!1}else if(t!==r)return!1}return!0})),t?.search&&t.search.trim()!==``){let e=t.search.trim().toLowerCase();n=n.filter(t=>Object.values(t).some(t=>typeof t==`string`?t.toLowerCase().includes(e):typeof t==`number`&&String(t).includes(e)))}if(t?.sort?.field){let{field:e,order:r}=t.sort;n.sort((t,n)=>{let i=t[e],a=n[e];if(i===a)return 0;if(i==null)return 1;if(a==null)return-1;let o=i>a?1:-1;return r===`desc`?-o:o})}let i=n.length,a=Math.max(1,t?.page||1),s=t?.pageSize||50,c=Math.ceil(i/s)||1,l=(a-1)*s;return{items:n.slice(l,l+s),total:i,page:a,pageSize:s,totalPages:c}}async function K(e,t){let n=t===void 0?o():t;if(e)return(await G(e,{tenantId:n})).total;let r=await V();return n?(await r.getAll(`records_data`)).filter(e=>(e.tenant_id||`tenant_main`)===n).length:r.count(`records_data`)}async function q(e,t){return await(await V()).get(e,t)||null}async function J(e,t,n){let r=await V(),i=n||o()||`tenant_main`,a=typeof t==`object`&&t?{...t,tenant_id:t.tenant_id||i}:t;await r.put(e,a),L.emit(`entity:changed`,{storeName:e,data:a,action:`update`})}async function Y(e,t){await(await V()).delete(e,t),L.emit(`entity:changed`,{storeName:e,id:t,action:`delete`})}async function X(e,t){let n=await(await V()).getAll(e);return t?e===`entities_meta`||e===`layouts_meta`||e===`views_meta`?n.filter(e=>!e.tenant_id||e.tenant_id===`system`||e.tenant_id===t):e===`audit_log`||e===`records_data`?n.filter(e=>(e.tenant_id||`tenant_main`)===t):n:n}async function Z(e){await(await V()).clear(e)}async function Q(e){let t=await V(),n=await t.getAll(`entities_meta`),r=await t.getAll(`fields_meta`),i=await t.getAll(`layouts_meta`),a=await t.getAll(`views_meta`),o=await t.getAll(`records_data`),s=await t.getAll(`audit_log`),c=await t.getAll(`settings`);return e&&(o=o.filter(t=>(t.tenant_id||`tenant_main`)===e),s=s.filter(t=>(t.tenant_id||`tenant_main`)===e),n=n.filter(t=>!t.tenant_id||t.tenant_id===`system`||t.tenant_id===e),i=i.filter(t=>!t.tenant_id||t.tenant_id===`system`||t.tenant_id===e),a=a.filter(t=>!t.tenant_id||t.tenant_id===`system`||t.tenant_id===e),c=c.filter(t=>!t.tenant_id||t.tenant_id===e)),{version:1,schemaVersion:2,exportedAt:new Date().toISOString(),system:`Krona Universal Business OS`,tenantId:e||`all`,stores:{entities_meta:n,fields_meta:r,layouts_meta:i,views_meta:a,records_data:o,audit_log:s,settings:c},metadata:{totalRecords:o.length,entitiesCount:n.length,auditLogsCount:s.length}}}async function $(t,n){if(!t||typeof t!=`object`)throw Error(`Некорректный формат снимка базы данных (snapshot).`);if(!t.stores||typeof t.stores!=`object`)throw Error(`Снимок не содержит данных таблиц (stores).`);let r=(await V()).transaction(z,`readwrite`);if(n){let i=r.objectStore(`records_data`),a=await i.getAll();for(let e of a)(e.tenant_id||`tenant_main`)===n&&await i.delete(e.id);let o=t.stores.records_data||[],s=new Map;for(let r of o){let o=!!(n&&t.tenantId&&n!==t.tenantId),c=a.some(e=>e.id===r.id&&(e.tenant_id||`tenant_main`)!==n),l=o||c?e():r.id;s.set(r.id,l),await i.put({...r,id:l,tenant_id:n})}let c=r.objectStore(`audit_log`),l=await c.getAll();for(let e of l)(e.tenant_id||`tenant_main`)===n&&await c.delete(String(e.id));let u=t.stores.audit_log||[];for(let r of u){let i=r.entityId&&s.get(String(r.entityId))||r.entityId,a=n&&t.tenantId&&n!==t.tenantId?e():r.id;await c.put({...r,id:a,entityId:i,tenant_id:n})}for(let i of[`entities_meta`,`fields_meta`,`layouts_meta`,`views_meta`,`settings`]){let a=r.objectStore(i),o=t.stores[i]||[];for(let r of o)if(!r.tenant_id||r.tenant_id===`system`)await a.put(r);else{let i=n&&t.tenantId&&n!==t.tenantId&&r.id?e():r.id;await a.put({...r,id:i,tenant_id:n})}}}else for(let e of z){let n=r.objectStore(e);await n.clear();let i=t.stores[e]||[];for(let e of i)await n.put(e)}await r.done,L.emit(`snapshot:imported`,{action:`import`,data:t.metadata})}async function ee(e){let t=await V();if(e){let n=t.transaction([`records_data`,`audit_log`],`readwrite`),r=n.objectStore(`records_data`),i=await r.getAll();for(let t of i)(t.tenant_id||`tenant_main`)===e&&await r.delete(t.id);let a=n.objectStore(`audit_log`),o=await a.getAll();for(let t of o)(t.tenant_id||`tenant_main`)===e&&await a.delete(String(t.id));await n.done}else{let e=t.transaction(z,`readwrite`);for(let t of z)await e.objectStore(t).clear();await e.done}L.emit(`storage:reset`,{action:`reset`})}export{n as _,Q as a,o as b,H as c,$ as d,U as f,r as g,L as h,Y as i,G as l,ee as m,K as n,X as o,J as p,W as r,V as s,Z as t,q as u,t as v,s as x,c as y};