@rentman/rm-core 66.8.0 → 66.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/rm-core.js +1 -1
- package/dist/rm-core.js.map +1 -1
- package/package.json +1 -1
package/dist/rm-core.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import*as e from"@rentman/backend-types";import*as t from"@angular/core";import*as s from"moment";var n={d:(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},r={};n.d(r,{lp:()=>i,Gy:()=>de,Zd:()=>tt,PC:()=>J,ZN:()=>c,xV:()=>ee,M$:()=>te,yt:()=>ai,p5:()=>Ht,J0:()=>jt,s6:()=>At,mX:()=>oi,vT:()=>Ut,iZ:()=>Vt,Hj:()=>Ot,zn:()=>Qt,LQ:()=>o,KV:()=>lt,sY:()=>h,Z4:()=>se,Ez:()=>Rt,ho:()=>vt,iz:()=>Ii,yd:()=>ne,qc:()=>Et,tV:()=>m,Gp:()=>Bt,Lf:()=>f,Ry:()=>ci,Vd:()=>re,kj:()=>ie,sm:()=>li,hA:()=>oe,xB:()=>ae,Pw:()=>ui,fB:()=>le,BM:()=>di,Tk:()=>he,OC:()=>me,QU:()=>pe,Yo:()=>Lt,hn:()=>js,QI:()=>Ge,bb:()=>_i,Z5:()=>Ci,GQ:()=>fe,kI:()=>mi,M:()=>Pt,vK:()=>Mt,nL:()=>kt,Ec:()=>u,X1:()=>ye,r:()=>at,ZS:()=>vi,R8:()=>rt,y$:()=>p,mD:()=>d,AX:()=>pi,Lu:()=>ge,aA:()=>dn,Dr:()=>v,tO:()=>wn,FQ:()=>Ce,n4:()=>nt,K7:()=>Gs,ep:()=>zs,sW:()=>Js,Xt:()=>tn,f8:()=>nn,X$:()=>Te,Tz:()=>yi,a7:()=>C,_C:()=>St,v4:()=>tr,H7:()=>mr,zw:()=>ze,bu:()=>Ye,Mf:()=>Ke,Fs:()=>Ee,O$:()=>Xe,cq:()=>Ze,aw:()=>wt,Tf:()=>bt,vo:()=>Ft,Pr:()=>Je,Fe:()=>gi,ni:()=>ue,B5:()=>hi,JR:()=>Ei,GE:()=>wi,qy:()=>st,Gc:()=>ut,J$:()=>ct,Eq:()=>qt,TV:()=>et,M_:()=>Or,Bj:()=>T,ZM:()=>Dt,GH:()=>pn,BF:()=>mt,p$:()=>fi,hw:()=>yt,r4:()=>dt,Jt:()=>Ie,Qn:()=>ft,r2:()=>Ti,rU:()=>It,Qg:()=>Ct,lC:()=>Nt,C:()=>X,AO:()=>q,P$:()=>_t,aI:()=>K,ox:()=>L,wX:()=>ot,SL:()=>R,$A:()=>_,Yn:()=>F,GT:()=>S,D_:()=>Si,RV:()=>b,NN:()=>pt,cy:()=>A,I0:()=>M,Lm:()=>$,$P:()=>Q,O9:()=>Y,vq:()=>G,Tn:()=>j,Et:()=>B,Gv:()=>x,$X:()=>H,gd:()=>W,Kg:()=>P,l6:()=>z,h1:()=>D,s0:()=>w,c4:()=>U,LV:()=>N,dq:()=>V,oy:()=>ii,jF:()=>E,zr:()=>O,A2:()=>ht});const i=7,o=">";const a=(e=>{var t={};return n.d(t,e),t})({ApiEnumApiType:()=>e.ApiEnumApiType,ApiFieldsOnDeleteRule:()=>e.ApiFieldsOnDeleteRule,TempItemTypeWithoutFixedIds:()=>e.TempItemTypeWithoutFixedIds});var c;!function(e){e.ITEMTABLE="itemtable",e.DIRECT="direct"}(c||(c={}));const l=(e=>{var t={};return n.d(t,e),t})({computed:()=>t.computed,effect:()=>t.effect,signal:()=>t.signal,untracked:()=>t.untracked});class u{itemType;columns;static currentId=0;id=++u.currentId;isLockableSignal=(0,l.signal)(!0);isLocalSignal=(0,l.signal)(!0);outdated=!1;get itemId(){return this._itemId}_itemId;constructor(e,t,s){this.itemType=e,this.columns=s,this.updateId(t)}updateId(e){this._itemId=e,this.isLockableSignal.set(this.isLockable()),this.isLocalSignal.set(this.isLocal())}isOutdated(){return this.outdated}markOutdated(){this.outdated=!0}markUpToDate(){this.outdated=!1}isLocal(){return ge.isLocalId(this.itemId)}isLockable(){if(this.isLocal())return!1;switch(this.itemType){case"Project":case"Materiaal":case"Contact":case"Medewerker":case"Voertuig":case"Template":case"Inhuur":return!0;default:return!1}}toJSON(){return{id:this.id,columns:this.columns}}}class d{factory;entry;transaction;_isNew;columns;fields;initial;fieldSignals;itemType;children;aggregatedChangesListeners=[];derivedFieldSignals={};__computedFunctions=new WeakMap;constructor(e,t,s,n,r=null){this.factory=e,this.entry=t,this.transaction=s,this._isNew=n,this.columns=t.columns.response[t.columns.itemType],this.itemType=this.entry.itemType,this.initial=s.itemHandler.constructInitialProxy(t),this.fields=s.itemHandler.constructFieldsProxy(t),this.fieldSignals=s.itemHandler.constructSignalFieldsProxy(t),this.onConstruct(),null===r||r.aborted||r.addEventListener("abort",(()=>this.clearResource()))}onConstruct(){}computedSignal(e){if(this.__computedFunctions.has(e))return this.__computedFunctions.get(e);const t=(0,l.computed)((()=>e(this)));return this.__computedFunctions.set(e,t),t}getAggregatedChangesListeners(e=new Set){for(const t of this.aggregatedChangesListeners)e.add(t);return e}clearResource(){this.clearChildCollections(),this.transaction.itemHandler.clearItemResource(this)}deregisterChangesListener(e){const t=this.aggregatedChangesListeners.indexOf(e);-1!==t&&this.aggregatedChangesListeners.splice(t,1)}registerChangesListener(e){return this.aggregatedChangesListeners.push(e),()=>{this.deregisterChangesListener(e)}}setChildCollectionResources(e){if(void 0!==e){this.children=e;for(const t in e){e[t].setParentItem(this)}}}collectFields(){return this.transaction.itemHandler.collectFields(this.entry)}setFields(e,t=!1){const s=this.columns;for(const t in e){void 0===s[t]&&this.factory.errorHandler.logWarning(`setFields: no column found for ${t}`)}const n=this.transaction.createChangesDelta();return n.setItemUpdated(this.entry,e),this.transaction.applyChangesDelta(n,t).then((()=>this))}copyFields(e={},t){for(const s of this.entry.columns.main){const n=s.id;void 0!==e[n]||void 0!==t&&!t.includes(n)||(e[n]=J.clone(s.apiColumn.type,this.transaction.itemHandler.lookUpItemField(this.entry,n)))}return e}getParent(e){return this.transaction.getParent(this.entry,e)}compareItemField(e,t){const s=this.columns[e];if(void 0===s)throw new Error("Missing column in ItemResource.compareItemField");return J.compareFields(s.type,this.fields[e],t[e])}hasChanges(){return this.transaction.itemHandler.detectEntryChanges(this.entry.id)}setTransactionParameters(e){q(this.transaction.tabRequestParameters,[this.entry.itemType,this.entry.itemId],[{},e])}isNew(){return this._isNew}isLocal(){return this.entry.isLocal()}toJSON(){const e=[];for(const t in this.columns)e.push(t);return{columns:e,fields:this.fields,entry:this.entry}}getDerivedSignal(e,t){let s,n;if("string"==typeof e?(n=e.split(o),s=e):(n=e,s=e.join(o)),void 0!==this.derivedFieldSignals[s])return this.derivedFieldSignals[s];return this.derivedFieldSignals[s]=(0,l.computed)((()=>{let e=this.entry;for(let s=0;s<n.length;s++){const r=n[s];if(s===n.length-1){return this.transaction.itemHandler.getItemFieldSignal(e,r)()}const i=this.transaction.core.columnCache.getColumn(e.itemType,r);if(void 0===i)throw new Error(`getDerivedSignal: column ${r} not found for itemtype ${e.itemType}`);if(!he.isItemColumn(i))throw new Error(`getDerivedSignal: column ${r} for itemtype ${e.itemType} is not an item type`);const o=this.transaction.itemHandler.getItemFieldSignal(e,r)();if(null===o)return t;e=this.transaction.getLocalItemEntryByItemId(i.itemType,o)}throw new Error(`getDerivedSignal: could not traverse path ${s} for itemtype ${e.itemType}`)}))}getDerivedValue(e,t){return this.transaction.itemHandler.getDerivedValue(this.entry,e,t)}getDerivedValues(e){return this.transaction.itemHandler.getDerivedValues(this.entry,e)}clearChildCollections(){if(null!==this.children)for(const e in this.children)this.children[e].clearResource()}}class h{itemType;query;queryGraph;items;requestColumnsTuple;promise;creation=new Date;deferred;outdated=!1;constructor(e,t,s,n,r){this.itemType=e,this.query=t,this.queryGraph=s,this.items=n,this.requestColumnsTuple=r,this.deferred=N(),this.promise=this.deferred.promise}isOutdated(){return this.outdated}markOutdated(){this.outdated=!0}markUpToDate(){this.outdated=!1}itemsResolved(){return null===this.deferred}resolve(){null!==this.deferred&&(this.deferred.resolve(this),this.deferred=null)}reject(e){null!==this.deferred&&(this.deferred.reject(e),this.deferred=null)}handleMatchedItemEntries(e,t){const s=new Set(e);if(s.size>0){for(const e of this.items)s.delete(e);for(const e of s)this.items.push(e)}if(void 0===t)return;const n=[];for(const e of this.items)t.has(e)||n.push(e);this.items=n}}class m{queryService;options;query;columns;static currentId=0;id=m.currentId++;itemType;parent=null;promise;constructor(e,t,s,n){this.queryService=e,this.options=t,this.query=s,this.columns=n,this.itemType=n.itemType,this.parent=t.parent??null}isLocal(){const e=this.parent;return null===e?this.queryService.containsLocalId(this.query.object):ge.isLocalId(e.itemId)}expandColumns(e){this.columns=e.run(this.columns).merged,this.options.columns=this.columns.request}}class p extends Error{constructor(e,t){super("number"==typeof e?`Item with item entry ID ${e} does not exist`:`Item with type '${e}' and item ID ${t} does not exist`)}}class f{factory;options;transaction;queryGraph;parentCollection;itemType;entry;columns;items=[];itemsSignal=(0,l.signal)(this.items);parentItem;itemEntryIdMap={};onChangeCallbacks=[];onAddCallbacks=[];onRemoveCallbacks=[];aggregatedChangesListeners=[];constructor(e,t,s,n,r,i,o){this.factory=e,this.options=t,this.transaction=s,this.queryGraph=n,this.parentCollection=o,this.columns=i.response,this.itemType=i.itemType,this.entry=new m(this.factory.queryService,t,r,i),this.registerOptionsChangesListeners(),this.onConstruct();const a=this.options.abortSignal;void 0===a||a.aborted||a.addEventListener("abort",(()=>this.clearResource()))}setParentItem(e){this.parentItem=e}initializeItems(e,t){const s=this.addItemResources(e,t);!0===this.options.callOnAddWithInitialItems&&this.triggerCollectionChangesListeners({addedItems:s,removedItems:[]},null,void 0,!1,!0,null)}onConstruct(){}clearCachedQueryOnTransaction(e){const t=e.cachedQueryHandler.getCachedQueryItem(this.entry.itemType,this.entry.query.string);if(t?.markOutdated(),null!==this.options.children)for(const t of this.items)for(const s in t.children)t.children[s].clearCachedQueryOnTransaction(e)}async refresh(){const e=this.transaction.getTransactionChain(!0);for(const t of e)this.clearCachedQueryOnTransaction(t);const t=await this.fetchCachedQuery(),s=new Set;for(const e of this.items){void 0===t.items.find((t=>t.itemId===e.entry.itemId))&&s.add(e.entry)}const n=await this.updateItemsProperty([],s,!0);return this.itemsSignal.set([...this.items]),this.triggerCollectionChangesListeners(n,null,void 0,!1,!1,null),t}deregisterChangesListener(e){const t=this.aggregatedChangesListeners.indexOf(e);-1!==t&&this.aggregatedChangesListeners.splice(t,1)}registerChangesListener(e){return this.aggregatedChangesListeners.push(e),()=>{this.deregisterChangesListener(e)}}onAdd(e){return this.__registerCallback(this.onAddCallbacks,e)}onChange(e){return this.__registerCallback(this.onChangeCallbacks,e)}onRemove(e){return this.__registerCallback(this.onRemoveCallbacks,e)}getIdArray(){return this.items.map((e=>e.entry.itemId))}getItemById(e){try{const t=this.transaction.getLocalItemEntryByItemId(this.itemType,e);return this.itemEntryIdMap[t.id]}catch(e){if(e instanceof p)return;throw e}}triggerCollectionChangesListeners({addedItems:e,changedItems:t,removedItems:s},n,r,i,o,a){if(this.onAddCallbacks.length>0&&e.length>0)try{for(const t of this.onAddCallbacks)t({itemResources:e,collectionResource:this,isInitialCall:o,isCalledAfterSocketUpdate:i})}catch(e){this.factory.errorHandler.logError(e)}if(this.onRemoveCallbacks.length>0&&s.length>0){const e=s.map((e=>e.entry));try{for(const t of this.onRemoveCallbacks)t({itemEntries:e,itemResources:s,collectionResource:this,isCalledAfterSocketUpdate:i})}catch(e){this.factory.errorHandler.logError(e)}}const c=this.getAggregatedChangesListeners(),l=[];if((this.onChangeCallbacks.length>0||c.size>0)&&void 0!==t&&t.length>0){for(const e of t){const t=e.entry.id;if(void 0!==n.created[t])continue;const s=n.updated[t].previous;null!==s&&l.push(new Bt(this,e,i,s,r))}try{for(const e of this.onChangeCallbacks)for(const t of l)e(t)}catch(e){this.factory.errorHandler.logError(e)}}if(0===c.size||0===e.length&&0===s.length&&0===l.length)return;const u={addedItems:e,changedItems:l,removedItems:s,collectionResource:this};if(null!==a)for(const e of c){let t=a.get(e);void 0===t&&a.set(e,t={item:{},collection:{}}),t.collection[this.itemType]??=[],t.collection[this.itemType].push(u)}else for(const e of c)e({[this.itemType]:[u]},{},i)}forEach(e){const t=this.items;for(const s of t)e(s)}filter(e){const t=this.items,s=[];for(const n of t)e(n)&&s.push(n);return s}first(e){const t=this.items;for(const s of t)if(e(s))return s;return null}some(e){return null!==this.first(e)}groupBy(e){const t=this.items,s={};if("string"==typeof e)for(const n of t){if(void 0===n.entry.columns.response[this.entry.itemType][e])throw new Error(`Trying to group on a column not in one of the items in this collection! (column '${e}', item ${n.entry.itemType}:${n.entry.itemId})`);const t=n.fields[e];void 0===s[t]&&(s[t]=[]),s[t].push(n)}if("function"==typeof e)for(const n of t){const t=e(n);null!==t&&(void 0===s[t]&&(s[t]=[]),s[t].push(n))}return s}map(e){const t=this.items,s=t.length,n=new Array(s);if("string"==typeof e)for(let r=0;r<s;r++)n[r]=t[r].fields[e];if("function"==typeof e)for(let r=0;r<s;r++)n[r]=e(t[r]);return n}reduce(e,t){const s=this.items;for(const n of s)t=e(n,t);return t}clearResource(){if(this.aggregatedChangesListeners=[],this.onAddCallbacks=[],this.onRemoveCallbacks=[],this.onChangeCallbacks=[],null!==this.options.children)for(const e of this.items)e.clearChildCollections();this.transaction.cachedQueryHandler.clearCollectionResource(this)}async handleMatchedItemEntries(e,t,s){const{itemEntriesToBeAdded:n,itemEntriesToBeRemovedSet:r,changedItemResources:i}=this.getCollectionItemEntryChanges(e,t),o=await this.updateItemsProperty(n,r,s);return{collectionResource:this,addedItems:o.addedItems,removedItems:o.removedItems,changedItems:i}}getAggregatedChangesListeners(e=new Set){for(const t of this.aggregatedChangesListeners)e.add(t);return this.parentCollection?.getAggregatedChangesListeners(e),this.parentItem?.getAggregatedChangesListeners(e),e}getCollectionItemEntryChanges(e,t){const s=[],n=new Set,r=[];for(const t of e){const e=this.itemEntryIdMap[t.id];void 0===e?s.push(t):r.push(e)}if(void 0!==t)for(const e of t)void 0!==this.itemEntryIdMap[e.id]&&n.add(e);return{itemEntriesToBeAdded:s,itemEntriesToBeRemovedSet:n,changedItemResources:r}}removeItemResources(e,t){if(0===e.size)return[];const s=[],n=[];for(const r of this.items){const i=r.entry;e.has(i)?(n.push(r),delete this.itemEntryIdMap[i.id],t&&r.clearChildCollections()):s.push(r)}this.items.length=s.length;for(let e=0;e<s.length;e++)this.items[e]=s[e];return n}async updateItemsProperty(e,t,s){if(void 0===this.options.children||0===e.length)return{addedItems:this.addItemResources(e,{}),removedItems:this.removeItemResources(t,s)};const n=await this.transaction.cachedQueryHandler.__fetchChildCachedQueryItems(this.entry.itemType,e.map((e=>e.itemId)),this.options.children),r=new Map;for(const t of e)void 0===this.itemEntryIdMap[t.id]&&r.set(t.itemId,t);let i;if(r.size===e.length)i=n;else{i=[];for(const e of n){const t=[];for(const s of e.cachedQueryItemTuples)r.has(s.options.parent.itemId)&&t.push(s);i.push({itemType:e.itemType,cachedQueryItemTuples:t})}}return{addedItems:this.addItemResources([...r.values()],this.factory.constructChildCollectionResources(i,this,this.transaction)),removedItems:this.removeItemResources(t,s)}}addItemResources(e,t){const s=this.transaction.createItemResources(e,t,void 0,this.options.abortSignal);for(const e of s)this.items.push(e),this.itemEntryIdMap[e.entry.id]=e;return s}async fetchCachedQuery(e=this.options){const t=this.transaction.cachedQueryHandler;return(await t.__fetchParentItemEntriesByQueryData(this.itemType,e,this.factory.requestColumnsOperationsCacheFactory.construct(this.itemType,this.options.columns),this.entry.query)).cachedQueryItem}registerOptionsChangesListeners(){const{onAdd:e,onRemove:t,onChange:s,changesListener:n}=this.options;void 0!==e&&this.onAddCallbacks.push((t=>{e(t.itemResources,t.collectionResource,t.isInitialCall,t.isCalledAfterSocketUpdate)})),void 0!==t&&this.onRemoveCallbacks.push((e=>{t(e.itemEntries,e.collectionResource,e.isCalledAfterSocketUpdate,e.itemResources)})),void 0!==s&&this.onChangeCallbacks.push(s),void 0!==n&&this.aggregatedChangesListeners.push(n)}__registerCallback(e,t){return e.push(t),()=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)}}}const y=(e,t)=>Number(e)-Number(t),g=(e,t)=>e.localeCompare(t);function I(e){switch(e){case a.ApiEnumApiType.TYPE_NUMBER:case a.ApiEnumApiType.TYPE_DATETIME:case a.ApiEnumApiType.TYPE_TIMESTAMP:case a.ApiEnumApiType.TYPE_TIMESTAMP_MS:case a.ApiEnumApiType.TYPE_DATE:case a.ApiEnumApiType.TYPE_DURATION:case a.ApiEnumApiType.TYPE_VOLUME:case a.ApiEnumApiType.TYPE_WEIGHT:case a.ApiEnumApiType.TYPE_DIMENSION:case a.ApiEnumApiType.TYPE_PRICE:case a.ApiEnumApiType.TYPE_DOUBLE:case a.ApiEnumApiType.TYPE_INT:case a.ApiEnumApiType.TYPE_CURRENT:case a.ApiEnumApiType.TYPE_POWER:case a.ApiEnumApiType.TYPE_DISTANCE:case a.ApiEnumApiType.TYPE_ORDER:return y;case a.ApiEnumApiType.TYPE_TEXT:case a.ApiEnumApiType.TYPE_LONGTEXT:case a.ApiEnumApiType.TYPE_HTML:case a.ApiEnumApiType.TYPE_TIME:return g;default:throw new Error(`ApiType ${e} does not have a sort function`)}}class C extends f{initializeItems(e,t){const s=this.addItemResources(e,t);this.sortItemResources(),!0===this.options.callOnAddWithInitialItems&&this.triggerCollectionChangesListeners({addedItems:s,removedItems:[]},null,void 0,!1,!0,null)}async updateItemsProperty(e,t,s){const n=await super.updateItemsProperty(e,t,s);return this.sortItemResources(),n}getSortCompareTuple(){const e=this.options.order;return{compareFunction:I(this.columns[this.itemType][e.field].type),isDescending:void 0===e.order||"desc"===e.order}}sortItemResources(){const{compareFunction:e,isDescending:t}=this.getSortCompareTuple(),s=this.options.order.field;this.items.sort(((n,r)=>{let i=e(n.fields[s],r.fields[s]);return 0===i&&(i=n.fields.id-r.fields.id),t?-i:i}))}sortItemEntries(e){const{compareFunction:t,isDescending:s}=this.getSortCompareTuple(),n=this.options.order.field,r=this.transaction.itemHandler;return e.sort(((e,i)=>{let o=t(r.lookUpItemField(e,n),r.lookUpItemField(i,n));return 0===o&&(o=e.itemId-i.itemId),s?-o:o}))}}class v extends C{async setLimit(e){const t=this.options.order.limit;this.options.order.limit=e;let s=[],n=new Set;e>t?s=await this.increaseItemEntriesToBeAdded(s,n,t):({itemEntriesToBeAdded:s,itemEntriesToBeRemovedSet:n}=this.limitItemEntriesToBeAdded(s,n));const r=await this.updateItemsProperty(s,n,!0);this.itemsSignal.set([...this.items]),this.triggerCollectionChangesListeners(r,null,void 0,!1,!1,null)}async handleMatchedItemEntries(e,t,s){const n=this.getCollectionItemEntryChanges(e,t);let{itemEntriesToBeAdded:r,itemEntriesToBeRemovedSet:i}=n;({itemEntriesToBeAdded:r,itemEntriesToBeRemovedSet:i}=this.limitItemEntriesToBeAdded(r,i)),r=await this.increaseItemEntriesToBeAdded(r,i);const o=await this.updateItemsProperty(r,i,s);return{collectionResource:this,addedItems:o.addedItems,removedItems:o.removedItems,changedItems:n.changedItemResources}}applyAddedRemovedItemEntries(e,t,s){const n=t.slice();for(const t of e)s.has(t)||n.push(t);return this.sortItemEntries(n)}limitItemEntriesToBeAdded(e,t){const s=this.items.length+(e.length-t.size),n=this.options.order.limit;if(s<=n)return{itemEntriesToBeAdded:e,itemEntriesToBeRemovedSet:t};const r=this.applyAddedRemovedItemEntries(this.items.map((e=>e.entry)),e,t).slice(n),i=e.slice(),o=new Set([...t]);for(const e of r){const t=i.indexOf(e);-1===t?o.add(e):i.splice(t,1)}return{itemEntriesToBeAdded:i,itemEntriesToBeRemovedSet:o}}async increaseItemEntriesToBeAdded(e,t,s=this.options.order.limit){const n=this.items.length+(e.length-t.size),r=this.options.order.limit;if(n>=r||this.items.length<s)return e;const i=this.transaction.itemHandler,o=this.options.order,a=await this.fetchCachedQuery({...this.options,order:{order:o.order,field:o.field,limit:r+t.size+i.getDeletedItemsAmount(this.itemType)}}),c=this.applyAddedRemovedItemEntries(a.items,e,t),l=[],u=r-(this.items.length-t.size);for(let t=0;t<c.length&&l.length<u;t++){const s=c[t];void 0!==this.itemEntryIdMap[s.id]||i.itemIsDeleted(s)&&!e.includes(s)||l.push(s)}return l}}class T{itemType;response;columnSetFactory;itemEntryService;additionalResponseColumns;responseColumns;constructor(e,t,s,n,r){this.itemType=e,this.response=t,this.columnSetFactory=s,this.itemEntryService=n,this.additionalResponseColumns=r,this.responseColumns=he.mergeResponseColumns(t.fetchColumnsObject(),r).merged}getFields(e=this.itemType,t=this.response.links[e][0]){const s=this.response.fetchObject(e,t);if(void 0===s)throw new Error(`Template.getFields: itemType ${e} with itemId ${t} not found in ApiResponseProcessor.`);const n=this.additionalResponseColumns[this.itemType];for(const e in n){const t=this.additionalResponseColumns[this.itemType][e];void 0===s[t.id]&&(J.isExpensiveFormat(t.type)?te.addLazyFormattingFunction(t.id,t.type,t.default,s):s[t.id]=J.formatResponseValue(t.type,t.default))}return{...s,...this.itemEntryService.getLocalDefaultValues()}}getMainColumnSet(){return this.getColumnSet(this.itemType)}getColumnSet(e){return this.columnSetFactory.constructFromResponse(e,!1,this.responseColumns)}}function R(e,t){for(let s=0;s<e.length;s++)if(t(e[s]))return s;return-1}function E(e,t){if(void 0===e)return t;const s={};for(const n in t)s[n]=void 0===e[n]?t[n]:e[n];return s}function S(e){for(const t in e)return!0;return!1}function _(e){if("object"!=typeof e)return null;for(const t in e)return t;return null}function b(e,t){for(const s of t)if(e==s)return!0;return!1}function w(e,t){if(void 0===e)return!1;for(const s of t){if(void 0===e[s])return!1;e=e[s]}return!0}function q(e,t,s,n=!1){for(let r=0;r<t.length;r++){const i=t[r];(void 0===e[i]||n&&r===t.length-1)&&(e[i]=s[r]),e=e[i]}return e}function F(e,t,s=!1){if(void 0!==e){for(const n of t)if(void 0===(e=e[n])&&!s)return;return e}}function k(e,t,s){for(let n=0,r=t.length;n<r;++n){const r=t[n];if(!x(r)&&!j(r))continue;const i=Object.keys(r);for(let t=0,n=i.length;t<n;t++){const n=i[t],o=r[n];s&&x(o)?Q(o)?e[n]=new Date(o.valueOf()):W(o)?e[n]=new RegExp(o):o.nodeName?e[n]=o.cloneNode(!0):G(o)?e[n]=o.clone():(x(e[n])||(e[n]=A(o)?[]:{}),k(e[n],[o],!0)):e[n]=o}}return e}function L(e,...t){return k(e,t,!1)}function D(e,...t){return k(e,t,!0)}function x(e){return null!==e&&"object"==typeof e}function M(e){return null!==e&&"object"==typeof e&&!Object.getPrototypeOf(e)}function P(e){return"string"==typeof e}function B(e){return"number"==typeof e}function Q(e){return"[object Date]"===toString.call(e)}const A=Array.isArray;function j(e){return"function"==typeof e}function H(e){return e&&j(e.then)}function U(e){const t=[],s=[];for(const n in e)t.push(n),s.push(e[n]);return Promise.all(s).then((e=>{const s={};for(let n=0;n<t.length;n++)s[t[n]]=e[n];return s}))}const O=Symbol("Timeout promise symbol");function V(e){const t={};return t.promise=new Promise((s=>{const n=()=>window.setTimeout((()=>{s(O)}),e);let r=n(),i=0;t.pauseTimeout=async e=>{window.clearTimeout(r),i++;try{return await e}finally{i--,0===i&&(r=n())}}})),t}function N(){const e={};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e}function W(e){return"[object RegExp]"===toString.call(e)}function $(e){return"boolean"==typeof e}function G(e){return!(!e||!(e.nodeName||e.prop&&e.attr&&e.find))}function z(e){return e&&e.window===e}function Y(e){return void 0!==e}function K(e,t){if(e===t)return!0;if(null===e||null===t)return!1;if(e!=e&&t!=t)return!0;const s=typeof e;let n,r,i;if(s===typeof t&&"object"===s){if(!A(e)){if(Q(e))return!!Q(t)&&(o=e.getTime(),a=t.getTime(),o===a||o!=o&&a!=a);if(W(e))return!!W(t)&&e.toString()===t.toString();if(z(e)||z(t)||A(t)||Q(t)||W(t))return!1;for(r in i=Object.create(null),e)if(!j(e[r])){if(!K(e[r],t[r]))return!1;i[r]=!0}for(r in t)if(!(r in i)&&Y(t[r])&&!j(t[r]))return!1;return!0}if(!A(t))return!1;if(n=e.length,e.length===t.length){for(r=0;r<n;r++)if(!K(e[r],t[r]))return!1;return!0}}var o,a;return!1}function X(e,t,s){const n=[],r=[];if(s=function(e){return B(e)&&e>0}(s)?s:NaN,t){if(e===t)throw new Error("Can't copy! Source and destination are identical.");if(A(t))t.length=0;else for(const e in t)delete t[e];return n.push(e),r.push(t),i(e,t,s)}return o(e,s);function i(e,t,s){if(--s<0)return"...";if(A(e))for(let n=0,r=e.length;n<r;n++)t.push(o(e[n],s));else if(M(e))for(const n in e)t[n]=o(e[n],s);else if(e&&"function"==typeof e.hasOwnProperty)for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=o(e[n],s));else for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=o(e[n],s));return t}function o(e,t=5){if(!x(e))return e;const s=n.indexOf(e);if(-1!==s)return r[s];if(z(e))throw new Error("Can't copy! Making copies of Window instances is not supported.");let a=!1,c=function(e){switch(toString.call(e)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new e.constructor(o(e.buffer),e.byteOffset,e.length);case"[object ArrayBuffer]":if(!e.slice){const t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(new Uint8Array(e)),t}return e.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new e.constructor(e.valueOf());case"[object RegExp]":{const t=new RegExp(e._source,e.toString().match(/[^/]*$/)[0]);return t.lastIndex=e.lastIndex,t}case"[object Blob]":return new e.constructor([e],{type:e.type})}if(j(e.cloneNode))return e.cloneNode(!0)}(e);return void 0===c&&(c=A(e)?[]:Object.create(Object.getPrototypeOf(e)),a=!0),n.push(e),r.push(c),a?i(e,c,t):c}}const Z=(e=>{var t={};return n.d(t,e),t})({default:()=>s.default});class J{static SERVER_DATETIME_FORMAT="YYYY-MM-DD[T]HH:mm:ssZ";static SERVER_DATE_FORMAT="YYYY-MM-DD";static isExpensiveFormat(e){switch(e){case"date":case"datetime":case"duration":case"timestamp":case"timestamp_ms":return!0;default:return!1}}static formatRequestLocal(e,t){const s={};for(const n of t){const t=n.id,r=n.apiColumn;r.readOnly||void 0===e[t]||(s[t]=this.formatRequestValue(r.type,e[t]))}return s}static copyFields(e,t,s){for(const n of s){const s=n.path;Object.prototype.hasOwnProperty.call(e,s)&&(this.isExpensiveFormat(n.apiColumn.type)||void 0!==e[s])&&(t[s]=this.clone(n.apiColumn.type,e[s]))}return t}static shallowCopyFields(e,t,s,n){for(const r in e){const i=s[r];if(void 0!==i){if(this.isExpensiveFormat(i.type)){const s=Object.getOwnPropertyDescriptor(e,r);if(void 0!==s&&void 0!==s.get){Object.defineProperty(t,r,s);continue}}t[r]=e[r]}else n?.(r)}return t}static setDefaultValues(e,t){for(const s of t)e[s.id]=J.formatResponseValue(s.apiColumn.type,s.apiColumn.default);return e}static compareFields(e,t,s){if(void 0===t)return void 0===s;if(void 0===s)return!1;switch(e){case"date":case"datetime":case"timestamp":case"timestamp_ms":return this.compareMomentObjects(t,s);case"duration":return this.compareDurations(t,s);case"id":case"item":case"link":case"child":case"sibling":case"numeric_externalid":case"alphanumeric_externalid":return t==s;case"current":case"dimension":case"distance":case"power":case"volume":case"weight":case"coordinate":case"price":case"percentage":return this.compareFloats(t,s);case"double":return this.compareFloats(t,s,"double");case"quantity":case"number":case"filesize":case"int":case"bool":case"enum":case"email":case"phone":case"url":case"text":case"longtext":case"color":case"order":case"time":return t===s;default:return K(t,s)}}static compareFloats(e,t,s="float"){const n=Math.abs(e),r=Math.abs(t),i=Math.abs(e-t),o="float"===s?119e-9:1e-14;return e===t||(0===e||0===t||i<Number.MIN_VALUE?i<o*Number.MIN_VALUE:i/Math.min(n+r,Number.MAX_VALUE)<o)}static compareMomentObjects(e,t){return e.isValid()?!!t.isValid()&&e.isSame(t):!t.isValid()}static compareDurations(e,t){return e.asMilliseconds()===t.asMilliseconds()}static formatResponseValue(e,t){switch(e){case"datetime":case"date":case"timestamp":case"timestamp_ms":return this.formatResponseDate(t);case"color":return this.formatResponseColor(t);case"duration":return this.formatResponseDuration(t);case"json":return"string"==typeof t&&""!==t?JSON.parse(t):t;case"number":return 0===t?null:t;case"filesize":return t/1e6;default:return t}}static formatRequestValue(e,t){switch(e){case"datetime":return this.formatRequestDateTime(t);case"date":return this.formatRequestDate(t);case"color":return this.formatRequestColor(t);case"duration":return this.formatRequestDuration(t);case"number":return 0===t?null:t;default:return t}}static formatResponseDate(e){return null===e?Z.default.invalid():(0,Z.default)(e,Z.default.ISO_8601)}static formatResponseDuration(e){return Z.default.duration(null===e?0:e,"seconds")}static formatResponseColor(e){return null===e||e.startsWith("#")?e:"#"+e}static formatRequestDateTime(e){return e.isValid()?e.format(this.SERVER_DATETIME_FORMAT):null}static formatRequestDate(e){return e.isValid()?e.format(this.SERVER_DATE_FORMAT):null}static formatRequestDuration(e){return e.asSeconds()}static formatRequestColor(e){return null===e?e:e.startsWith("#")?e.substring(1):e}static getDefaultValue(e){switch(e){case"int":case"double":case"percentage":case"price":case"order":return 0;case"item":case"link":case"child":case"sibling":return null;case"bool":return!1;case"enum":return"0";case"date":case"datetime":case"timestamp":case"timestamp_ms":return Z.default.invalid();case"duration":return Z.default.duration();case"text":case"longtext":default:return"";case"time":return"00:00";case"color":return"#000000"}}static hasValue(e,t){if(null==t)return!1;switch(e){case"int":case"double":case"percentage":case"price":case"order":return!isNaN(t);case"item":case"link":case"child":case"sibling":case"enum":return null!==t;case"bool":return!0;case"date":case"datetime":case"timestamp":case"timestamp_ms":return Z.default.isMoment(t)&&t.isValid();case"duration":return Z.default.isDuration(t)&&t.asMilliseconds()>0;case"text":case"longtext":return""!==t;case"color":return"#"!==t;default:return!!t}}static isDefaultValue(e,t){return this.compareFields(e,t,this.getDefaultValue(e))}static clone(e,t){switch(e){case"duration":return this.cloneDuration(t);case"date":case"datetime":case"timestamp":case"timestamp_ms":return(0,Z.default)(t);case"json":return X(t);default:return t}}static getCloneFunction(e){switch(e){case"duration":return this.cloneDuration;case"date":case"datetime":case"timestamp":case"timestamp_ms":return this.cloneDate;default:return this.identity}}static cloneDuration(e){return Z.default.duration(e)}static cloneDate(e){return e.clone()}static identity(e){return e}}class ee{externalApiRequestService;apiResponseProcessorFactory;constructor(e,t){this.externalApiRequestService=e,this.apiResponseProcessorFactory=t}template(e,t){return this.processResponse(this.externalApiRequestService.template(e,t))}create(e,t,s,n,r,i,o){return this.processResponse(this.externalApiRequestService.create(e,t,s,n,r,i,o))}delete(e,t,s){return this.processResponse(this.externalApiRequestService.delete(e,t,s))}updateItems(e,t,s,n){return this.processResponse(this.externalApiRequestService.updateItems(e,t,s,n))}requestSkeleton(e,t){return this.processResponse(this.externalApiRequestService.requestSkeleton(e,t))}columns(e,t,s){return this.processResponse(this.externalApiRequestService.columns(e,t,s))}query(e,t,s,n){return this.processResponse(this.externalApiRequestService.query(e,t,s,n))}module(e,t,s){return this.externalApiRequestService._module(e,t,s)}processResponse(e){return e.then((e=>this.apiResponseProcessorFactory.construct(e)))}}class te{response;itemType;columns;links;cacheable;map;items;columnIndexMap={};columnMap={};constructor(e){this.response=e,this.columns=e.columns,this.items=e.items,this.links=e.links,this.cacheable=e.cacheable??!1,this.map=e.map,this.itemType=e.itemType,this.createColumnMaps(),this.replaceTempItemTypeIdsWithLocalIds()}static addLazyFormattingFunction(e,t,s,n){Object.defineProperty(n,e,{enumerable:!0,configurable:!0,set:t=>{delete n[e],n[e]=t},get:()=>(delete n[e],n[e]=J.formatResponseValue(t,s))})}fetchColumnObject(e){return this.columnMap[e]}fetchDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(o));let n=e,r=this.itemType;for(let e=0;e<t.length-1;e++){const i=t[e],o=this.columnMap[r][i];if(void 0===o)throw new Error(`Column '${i}' not found in ApiResponseProcessor.fetchDerivedValue`);if(!he.isItemColumn(o)||null===o.itemType)throw new Error(`Column '${i}' doesn't have children in ApiResponseProcessor.fetchDerivedValue`);if(n=this.fetchValue(r,n,i)??null,r=o.itemType,null===n)return s}return this.fetchValue(r,n,t[t.length-1])??s}fetchValue(e,t,s){if(void 0===this.items[e][t]||void 0===this.columnMap[e]||void 0===this.columnIndexMap[e])return;const n=this.columnMap[e][s],r=this.columnIndexMap[e][s];return J.formatResponseValue(n.type,this.items[e][t].data[r])}fetchColumnArray(e){const t=[];for(const s of this.columns[e])t.push(s);return t}fetchDerivedObject(e,t,s){const n={};for(const r of s)this.fetchDerivedValues(this.fetchValue(e,t,r.id),r,n);return n}fetchDerivedValues(e,t,s){for(const n of t.children){let r;null===e?(r=null,s[n.path]=J.formatResponseValue(n.apiColumn.type,n.apiColumn.default)):(r=this.fetchValue(t.itemType,e,n.id),s[n.path]=r),n.isLeaf||this.fetchDerivedValues(r,n,s)}}fetchObject(e,t){if(void 0===this.items[e])return;if(void 0===this.items[e][t])return;const s=this.items[e][t].data,n={};for(let t=0;t<s.length;t++){const r=this.columns[e][t];J.isExpensiveFormat(r.type)?te.addLazyFormattingFunction(r.id,r.type,s[t],n):n[r.id]=J.formatResponseValue(r.type,s[t])}return n}fetchObjectArray(e,t){const s=[];if(null===t){for(const t in this.items[e])s.push(this.fetchObject(e,t));return s}void 0===t&&(t=this.links[e]);for(const n of t)s.push(this.fetchObject(e,n));return s}fetchColumnsObject(){return this.columnMap}createColumnMaps(){for(const e in this.columns){this.columnIndexMap[e]={},this.columnMap[e]={};for(let t=0;t<this.columns[e].length;t++){const s=this.columns[e][t];this.columnIndexMap[e][s.id]=t,this.columnMap[e][s.id]=s}}}replaceTempItemTypeIdsWithLocalIds(){for(const e in this.links){if(!a.TempItemTypeWithoutFixedIds.includes(e))continue;const t=[];for(const s of this.links[e]){const n=ge.getLocalId();t.push(n);const r=this.items[e][s];r.data[this.columnIndexMap[e].id]=n,this.items[e][n]=r,delete this.items[e][s]}this.links[e]=t}}}class se{transaction;compilation={create:{},delete:{},update:{}};constructor(e){this.transaction=e,this.processDelta()}processDelta(){const e=this.transaction.getDelta();for(const t of e.getDeleteTuplesIterator())t.entry.isLocal()||t.isCascaded||this.addDeleteEntry(t.entry);for(const t in e.created){const s=e.created[t];this.addCreateEntry(s)}for(const t in e.updated){const s=e.updated[t];this.addUpdateEntry(s.entry)}}getDefaultParent(){return{itemType:"Void",itemId:0}}addDeleteEntry(e){q(this.compilation.delete,[e.itemType],[[]]).push(e)}addUpdateEntry(e){q(this.compilation.update,[e.itemType,e.itemId],[{},e])}addCreateEntry(e){let t=this.transaction.getParent(e.entry);null===t&&(t=this.getDefaultParent()),q(this.compilation.create,[t.itemType,t.itemId,e.entry.itemType,e.entry.itemId],[{},{},{},e])}}class ne{apiRequestService;changesDeltaFactory;errorHandler;requestBufferManager;requestColumnExpansionFactory;transaction;changesCompilation;breakUpByParent;onAfterCreateCallback;itemIdConversionMap={};serverCache;constructor(e,t,s,n,r,i,o,a,c){this.apiRequestService=e,this.changesDeltaFactory=t,this.errorHandler=s,this.requestBufferManager=n,this.requestColumnExpansionFactory=r,this.transaction=i,this.changesCompilation=o,this.breakUpByParent=a,this.onAfterCreateCallback=c,this.serverCache=this.transaction.getServerCache()}execute(){const e=this.changesCompilation.compilation;this.requestBufferManager.suspendRequests();const t=self.crypto.randomUUID();return this.executeCreateRequests(this.changesCompilation,t).then((()=>this.executeUpdateRequests(e.update,t))).then((()=>this.executeDeleteRequests(e.delete,t))).then((()=>this.itemIdConversionMap)).finally((()=>this.requestBufferManager.continueRequests()))}getMapValue(e,t,s=this.itemIdConversionMap){if(void 0!==s&&void 0!==s[e])return s[e][t]}executeCreateRequests(e,t){const s=new pe(this.requestColumnExpansionFactory,e.compilation.create,this.transaction,this.breakUpByParent,t).run(),n=[];for(const e of s)n.push(this.executeCreateRequest(e).then((e=>(void 0!==this.onAfterCreateCallback&&this.onAfterCreateCallback(this.itemIdConversionMap),e))));return Promise.all(n)}executeCreateRequest(e){return this.apiRequestService.requestSkeleton(e.request).then((t=>{const s=this.changesDeltaFactory.construct(!1),n=e.items,r={};for(const e in n)for(const i in n[e]){const o=n[e][i],a=this.getMapValue(e,parseInt(i,10),t.map);if(void 0===a){s.setItemDeleted(o);continue}const c=this.transaction.itemHandler.entries.get(e,i);this.serverCache.itemHandler.itemChanges[c.id]=this.serverCache.itemHandler.copyTransactionItemEntryChanges(this.transaction.itemHandler.itemChanges[c.id],c),this.serverCache.itemHandler.entries.add(c),this.transaction.itemHandler.entries.clearByItemId(e,Number(i)),void 0===r[e]&&(r[e]={}),r[e][a]="CLEAR_ALWAYS"}for(const e in t.map){void 0===this.itemIdConversionMap[e]&&(this.itemIdConversionMap[e]={});for(const s in t.map[e])this.itemIdConversionMap[e][s]=t.map[e][s]}return this.serverCache.processResponse(t,e.request.columns,s,r,t.map),this.serverCache.applyChangesDelta(s,!1,t.map)}))}async executeUpdateRequests(e,t){for(const s in e)await this.executeUpdateRequest(s,e[s],t)}async executeUpdateRequest(e,t,s){const n={},r=this.requestColumnExpansionFactory.construct();n[e]={};for(const s in t){const i=t[s],o=this.transaction.itemHandler.formatRequest(i);if(!S(o))continue;const a=n[e][s]={},c=F(this.transaction.tabRequestParameters,[e,s]),l=this.transaction.getAiRequestParameters(i);a.values=o,void 0===c&&void 0===l||(a.parameters={...c,...l}),r.expandWithColumnSet(i.columns)}if(!S(n[e]))return;const i=r.get(),o=await this.apiRequestService.updateItems(e,n,i,s),a={};for(const e in n){void 0===a[e]&&(a[e]={});for(const t in n[e])a[e][t]="CLEAR_ALWAYS"}const c=this.changesDeltaFactory.construct(!1,[e]);await this.serverCache.applyChangesDelta(this.serverCache.processResponse(o,i,c,a))}executeDeleteRequests(e,t){const s=[];for(const n in e)s.push(this.executeDeleteRequest(n,e[n],t));return Promise.all(s)}executeDeleteRequest(e,t,s){return this.apiRequestService.delete(e,t.map((e=>e.itemId)),s).then((e=>{const s=this.changesDeltaFactory.constructParentDelta(),n=e.items;for(const e of t)b(e.itemId,n)?s.setItemDeleted(e):this.errorHandler.logWarning("Delete failed!",e);return this.serverCache.applyChangesFromParent(s,!0)}))}}class re{cache={};pendingCache={};allColumns={};setColumn(e,t){const s=this.cache;void 0===s[e]&&(s[e]={});const n=s[e],r=t.id;return void 0===n[r]&&(n[r]=t),n[r]}setColumns(e,t,s,n){const r={};for(const e in s){const t=s[e];r[e]={};for(const s in t)r[e][s]=this.setColumn(e,t[s])}return!0===t&&!1===n&&(this.allColumns[e]=!0),r}setPendingColumn(e,t,s){const n=this.pendingCache;void 0===n[e]&&(n[e]={});const r=n[e];void 0===r[t]&&(r[t]=s)}clearPendingColumns(e,t){for(const s of t){const t=he.parseRequestColumn(s);delete this.pendingCache[e]?.[t.id]}}setPendingColumns(e,t,s){for(const n of t){const t=he.parseRequestColumn(n);this.setPendingColumn(e,t.id,s)}}retrieve(e,t){if(!0===t)return this.containsAll(e)?{cached:this.getColumns(e),missing:[],pending:null}:{cached:{},missing:!0,pending:null};const s={},n=[],r=[];return this.retrieveColumns(e,t,n,s,r),{cached:s,missing:n,pending:r.length>0?Promise.all(r):null}}containsAll(e){return!0===this.allColumns[e]}getColumns(e){const t=this.cache;return{[e]:void 0===t[e]?{}:t[e]}}getColumn(e,t){const s=this.cache[e];if(void 0!==s)return s[t]}retrieveColumns(e,t,s,n,r){this.retrieveColumn(e,"id",s,n,r);for(const i of t)this.retrieveColumn(e,i,s,n,r)}retrieveColumn(e,t,s,n,r){const i=he.parseRequestColumn(t),o=this.getColumn(e,i.id);if(void 0===o){const n=this.pendingCache[e]?.[i.id];return void(void 0===n?s.push(t):r.push(n))}if(void 0===n[e]&&(n[e]={}),n[e][i.id]=o,0===i.children.length)return;const a=[];this.retrieveColumns(o.itemType,i.children,a,n,r),0!==a.length&&s.push({[i.id]:a})}}class ie{columnInfoFactory;itemType;responseColumns;expansionMap={};requestColumnsTrue;requestColumns;constructor(e,t,s,n){if(this.columnInfoFactory=e,this.itemType=t,this.responseColumns=n,!0===s){this.requestColumnsTrue=!0;const e=[];for(const s in n[t])e.push(s);this.requestColumns=e}else this.requestColumnsTrue=!1,this.requestColumns=s}run(e){const t=this.expansionMap,s=e.id;return void 0!==t[s]?t[s]:t[s]=e.expand(this.requestColumns,this.requestColumnsTrue,this.responseColumns)}aggregateRootColumns(){const e=this.expansionMap,t={};for(const s in e){const n=e[s].difference;null!==n&&this.expandRootColumnMap(n.root,t)}return this.columnInfoFactory.constructFromRootMap(t)}expandRootColumnMap(e,t){for(const s of e){const e=s.id;void 0===t[e]&&(t[e]={apiColumn:s.apiColumn,children:{}}),this.expandRootColumnMap(s.children,t[e].children)}}}class oe{apiRequestService;cache;constructor(e,t){this.apiRequestService=e,this.cache=t}setColumn(e,t){return this.cache.setColumn(e,t)}setColumns(e,t,s,n=!1){return this.cache.setColumns(e,t,s,n)}fetchItemTypeTranslations(e){return Promise.all(e.map((e=>this.fetch(e,["id"])))).then((t=>t.reduce(((t,s,n)=>{const r=e[n];return t[r]=s[r].id.name,t}),{})))}fetch(e,t,s){const n=this.cache.retrieve(e,t);return!0!==n.missing&&0===n.missing.length&&null===n.pending?Promise.resolve(n.cached):!0!==n.missing&&0===n.missing.length&&null!==n.pending?n.pending.then((()=>this.cache.retrieve(e,t).cached)):!0!==n.missing&&n.missing.length>0&&null!==n.pending?Promise.all([this.request(e,n.missing,s),n.pending]).then((()=>this.cache.retrieve(e,t).cached)):this.request(e,n.missing,s).then((e=>he.mergeResponseColumns(e,n.cached).merged))}fetchAll(e){return this.cache.containsAll(e)?Promise.resolve(this.cache.getColumns(e)):this.request(e,!0)}async fetchEditableCustomColumns(e){const t=await this.fetchAll(e),s=[];for(const n in t[e]){const r=t[e][n];he.isCustomColumn(r)&&he.hasLocationProperty(r,de.EDIT)&&s.push(r)}return s}request(e,t,s={filter:!1}){const n=this.apiRequestService.columns(e,{[e]:t},s);return!0!==t&&!1===s.filter&&this.cache.setPendingColumns(e,t,n),n.then((n=>(!0!==t&&!1===s.filter&&this.cache.clearPendingColumns(e,t),this.cache.setColumns(e,t,n.fetchColumnsObject(),s.filter))))}}class ae{apiColumn;parent;id;level;path;tailPath;itemType=null;children=[];isLeaf=!0;constructor(e,t=null){this.apiColumn=e,this.parent=t;const s=e.id;this.id=s,null===t?(this.level=0,this.path=s,this.tailPath=""):(this.level=t.level+1,this.path=t.path+o+s,this.tailPath=0===t.level?s:t.tailPath+o+s)}toRequestColumns(){return 0===this.children.length?[this.id]:[{[this.id]:this.children.flatMap((e=>e.toRequestColumns()))}]}setChildren(e,t){return this.itemType=e,this.children=t,this.isLeaf=!1,this}}let ce=0;class le{columnSetFactory;itemType;request;requestColumnsTrue;response;id=++ce;link=null;main=[];root=[];searchable={main:[],derived:[]};custom={main:[],derived:[]};item={main:[],derived:[]};leaf={main:[],derived:[]};filtered={main:[],derived:[]};constructor(e,t,s,n,r){this.columnSetFactory=e,this.itemType=t,this.request=s,this.requestColumnsTrue=n,this.response=r}groupColumnInfo(e){const t=e.apiColumn,s=null!==e.parent,n=s?"derived":"main";s||(t.type===a.ApiEnumApiType.TYPE_LINK&&(this.link=e),this.main.push(e)),e.isLeaf?this.leaf[n].push(e):s||this.root.push(e),he.isFilteredColumn(t)&&this.filtered[n].push(e),he.isSearchableColumn(t)&&this.searchable[n].push(e),he.isCustomColumn(t)&&this.custom[n].push(e),he.isItemColumn(t)&&this.item[n].push(e)}toJSON(){return this.main.map((e=>e.id))}isSupersetOf(e,t){if(!0===e)return this.requestColumnsTrue;if(!0===t&&!this.requestColumnsTrue)return!1;for(const t of e)if(!he.containsColumn(t,this.request))return!1;return!0}mergeRequestColumns(e){return he.mergeRequestColumns(this.request,e)}mergeResponseColumns(e){return he.mergeResponseColumns(this.response,e).merged}expand(e,t,s){const n=he.mergeRequestColumns(this.request,e);if(0===n.difference.length)return{merged:this,difference:null};const r=this.mergeResponseColumns(s);return{merged:this.columnSetFactory.constructFromRequest(this.itemType,n.merged,this.requestColumnsTrue||t,r,!1,!1),difference:this.columnSetFactory.constructFromRequest(this.itemType,n.difference,!1,r,!1,!1)}}}class ue{itemType;columnCache;requestColumnsTuple;aggregateColumnsTuple;expandedRequestColumnsTuple;columnsMergedWithTupleMap={};expandedColumnsMergedWithTupleMap={};setContainsAllColumnsMap={};setContainsAllExpandedColumnsMap={};constructor(e,t,s){this.itemType=e,this.columnCache=t,this.requestColumnsTuple=this.createRequestColumnsTuple(he.copyRequestColumns(s))}getRequestColumnsTuple(e){return e instanceof st?void 0!==this.expandedRequestColumnsTuple?this.expandedRequestColumnsTuple:this.expandedRequestColumnsTuple=this.createRequestColumnsTuple(e.expandColumnsWithRequiredColumns(this.itemType,this.requestColumnsTuple.object)):this.requestColumnsTuple}getAggregateColumns(){return void 0!==this.aggregateColumnsTuple?this.aggregateColumnsTuple:this.aggregateColumnsTuple=this.createRequestColumnsTuple(this.extractAggregateColumns(this.requestColumnsTuple.object,this.itemType))}hasAggregateColumns(){return this.getAggregateColumns().object.length>0}getColumnsMergedWithTuple(e,t){const s=e.string,n=t instanceof st?this.expandedColumnsMergedWithTupleMap:this.columnsMergedWithTupleMap;return void 0!==n[s]?n[s]:n[s]=this.mergeColumnsWithTuple(e,t)}tupleContainsAllColumns(e,t){const s=this.getColumnsMergedWithTuple(e,t).difference.object;return!0!==s&&0===s.length}setContainsAllColumns(e,t){const s=e.id,n=t instanceof st?this.setContainsAllExpandedColumnsMap:this.setContainsAllColumnsMap;return void 0!==n[s]?n[s]:n[s]=e.isSupersetOf(this.getRequestColumnsTuple(t).object)}mergeColumnsWithTuple(e,t){const s=this.getRequestColumnsTuple(t);if(s.string===e.string)return{merged:s,difference:this.createRequestColumnsTuple([])};const n=he.mergeRequestColumns(e.object,s.object);return{merged:this.createRequestColumnsTuple(n.merged),difference:this.createRequestColumnsTuple(n.difference)}}extractAggregateColumns(e,t){if(!0===e)return[];const s=[];for(const n of e){const e=he.parseRequestColumn(n),r=this.columnCache.getColumn(t,e.id);if(void 0===r)continue;if(he.isAggregateColumn(r)){s.push(e.id);continue}if(0===e.children.length)continue;const i=this.extractAggregateColumns(e.children,r.itemType);i.length>0&&s.push({[e.id]:i})}return s}createRequestColumnsTuple(e){return{object:e,string:he.createRequestColumnSetId(e)}}}var de;!function(e){e[e.NO=0]="NO",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.GRID=4]="GRID",e[e.TEMPLATE=8]="TEMPLATE",e[e.EDIT=16]="EDIT",e[e.API=20]="API",e[e.SOCKET=32]="SOCKET",e[e.ALL=63]="ALL",e[e.GRID_SELECTABLE=32768]="GRID_SELECTABLE",e[e.LOCATION_LABELS=524288]="LOCATION_LABELS"}(de||(de={}));class he{static isStringColumn(e){switch(e.type){case"email":case"phone":case"url":case"text":case"longtext":case"textreplace":case"time":return!0;default:return!1}}static isFloatColumn(e){switch(e.type){case"double":case"volume":case"weight":case"distance":case"dimension":case"power":case"current":case"price":case"percentage":return!0;default:return!1}}static isIntColumn(e){switch(e.type){case"int":case"number":case"quantity":return!0;default:return!1}}static isNumberColumn(e){return this.isFloatColumn(e)||this.isIntColumn(e)}static isCustomColumn(e){return"customfield"===e.fieldtype}static isAggregateColumn(e){return"aggregate"===e.fieldtype}static isItemColumn(e,t=!0){switch(e.type){case"id":return t;case"item":case"child":case"sibling":case"link":return!0;default:return!1}}static isDateColumn(e){switch(e.type){case"datetime":case"date":case"timestamp":case"timestamp_ms":return!0;default:return!1}}static isRenderedColumn(e){switch(e.type){case"datetime":case"date":case"timestamp":case"timestamp_ms":case"duration":return!0;default:return!1}}static isFilteredColumn(e){if("staffel"===e.id)return!0;if(void 0!==e.generator)return!0;switch(e.type){case"current":case"price":case"bool":case"enum":case"country":case"volume":case"weight":case"distance":case"dimension":case"quantity":case"email":case"url":case"datetime":case"date":case"timestamp":case"timestamp_ms":case"duration":case"html":case"textreplace":case"longtext":case"percentage":case"time":return!0;default:return!1}}static hasLocationProperty(e,t){return!!(t&e.location)}static isEditableColumn(e){if(e.readOnly)return!1;switch(e.type){case"date":case"datetime":case"timestamp":case"timestamp_ms":case"duration":return!1}return!0}static isSearchableColumn(e){switch(e.type){case"email":case"phone":case"text":case"longtext":case"html":return!0;default:return!1}}static getComparators(e){switch(e.type){case"dimension":case"weight":case"price":return["=",">","<"];case"date":case"datetime":case"timestamp":case"timestamp_ms":case"duration":return[">","<"];case"time":return[">","<","=","!="];default:return["=","!="]}}static containsColumn(e,t){const s=this.parseRequestColumn(e),n=this.findRequestColumn(s.id,t);if(-1===n)return!1;if(0===s.children.length)return!0;if("string"==typeof t[n])return!1;for(const e of s.children)if(!this.containsColumn(e,t[n][s.id]))return!1;return!0}static containsDerivedColumns(e){for(const t of e)if(this.parseRequestColumn(t).children.length>0)return!0;return!1}static responseColumnsAvailable(e,t,s){for(const n of t){const t=this.parseRequestColumn(n),r=t.children,i=s[e];if(void 0===i)return!1;const o=i[t.id];if(void 0===o)return!1;if(r.length>0&&!this.responseColumnsAvailable(o.itemType,r,s))return!1}return!0}static copyRequestColumns(e){if(!0===e)return!0;const t=[];for(const s of e)t.push(this.copyRequestColumn(s));return t}static copyRequestColumn(e){const t=this.parseRequestColumn(e);if(0===t.children.length)return t.id;const s=[];for(const e of t.children)s.push(this.copyRequestColumn(e));return{[t.id]:s}}static mergeRequestColumns(e,t){if(!0===e)return{merged:!0,difference:[]};if(!0===t)return{merged:!0,difference:!0};const s=this.copyRequestColumns(e),n=[];for(const e of t){const t=this.mergeRequestColumn(e,s);null!==t&&n.push(t)}return{merged:s,difference:n}}static mergeRequestColumn(e,t){const s=this.parseRequestColumn(e),n=this.findRequestColumn(s.id,t);if(-1===n)return t.push(e),e;if(0===s.children.length)return null;"string"==typeof t[n]&&(t[n]={[s.id]:[]});const r=[];for(const e of s.children){const i=this.mergeRequestColumn(e,t[n][s.id]);null!==i&&r.push(i)}return 0===r.length?null:{[s.id]:r}}static createRequestColumnSetId(e){if(!0===e)return"true";if(0===e.length)return"{}";let t=this.createRequestColumnId(e[0]);for(let s=1;s<e.length;s++)t+=","+this.createRequestColumnId(e[s]);return"{"+t+"}"}static getRequestColumnId(e){if("string"==typeof e)return e;for(const t in e)return t;throw new Error("Tried to get request column from empty derived object")}static parseRequestColumn(e){if("string"==typeof e)return{id:e,children:[]};const t=_(e);return{id:t,children:e[t]}}static mergeResponseColumns(e,t){const s={},n={};for(const r in e){if(void 0===t[r]){s[r]=e[r];continue}const i=this.mergeResponseColumnMap(e[r],t[r]);s[r]=i.merged,n[r]=i.difference}for(const r in t)void 0===e[r]&&(s[r]=t[r],n[r]=t[r]);return{merged:s,difference:n}}static mergeResponseColumnMap(e,t){const s={},n={};for(const t in e)s[t]=e[t];for(const r in t)Y(e[r])||(s[r]=t[r],n[r]=t[r]);return{merged:s,difference:n}}static findRequestColumn(e,t){for(let s=0;s<t.length;s++){const n=t[s];if(this.getRequestColumnId(n)===e)return s}return-1}static requestColumnToPath(e){if("string"==typeof e)return[e];for(const t in e)return[t,...this.requestColumnToPath(e[t][0])];return[]}static createRequestColumnId(e){const t=this.parseRequestColumn(e);if(0===t.children.length)return t.id;const s=this.createRequestColumnSetId(t.children);return t.id+">"+s}}class me{createLocalConversionMap(e,t,s){const n={};for(const r in s.links)this.expandLocalConversionMap(r,s.links[r],s,n,r===e?t:void 0);return n}expandConversionMap(e,t,s,n){s[e]??={};const r=s[e];return void 0!==r[t]?r[t]:(n??=ge.getLocalId(),r[t]=n)}batchExpandConversionMap(e,t){for(const s of e)this.expandConversionMap(s.itemType,s.itemId,t);return t}getConversionValue(e,t,s){if(void 0!==s[e])return s[e][t]}updateItemValues(e,t,s,n,r=null){for(const i of s){const s=i.id,o=i.apiColumn;let c;o.type===a.ApiEnumApiType.TYPE_LINK&&void 0===e[s]?null!==r&&(c=r.itemId):c=this.getConversionValue(o.itemType,e[s],n),void 0!==c&&(t[s]=c)}}expandLocalConversionMap(e,t,s,n,r=ge.getLocalId()){void 0===n[e]&&(n[e]={});for(let i=0;i<t.length;i++){const o=t[i];!0===window.IS_IN_TEST?n[e][o]=0===i&&null!==r?r:o:n[e][o]=0===i&&null!==r?r:ge.getLocalId();const a=s.items[e][o].links;for(const e in a)this.expandLocalConversionMap(e,a[e],s,n,null)}}}class pe{requestColumnExpansionFactory;compilation;transaction;breakupByParent;uniqueTransactionId;requests=[];constructor(e,t,s,n=!1,r){this.requestColumnExpansionFactory=e,this.compilation=t,this.transaction=s,this.breakupByParent=n,this.uniqueTransactionId=r}finalizeRequest(e){const t=e.columns;e.request.columns=t.get();const s=e.request.itemType;return e.request.columns[s]=this.transaction.getServerCache().expandColumnsWithRequiredColumns(s,e.request.columns[s]),e}setRequestParent(e,t){const s=t.request;return"Void"!==e&&(s.parentType=e,s.parentId={},!0)}run(){const e=this.compilation;if(this.breakupByParent)for(const t in e){const s=e[t];for(const e in s){if(ge.isLocalId(e))continue;const n=this.initializeRequest();this.extendRequest(s[e],this.setRequestParent(t,n)?+e:null,n),this.requests.push(this.finalizeRequest(n))}}else for(const t in e){const s=e[t],n=this.initializeRequest(),r=this.setRequestParent(t,n);let i=!1;for(const e in s)ge.isLocalId(e)||(this.extendRequest(s[e],r?+e:null,n),i=!0);i&&this.requests.push(this.finalizeRequest(n))}return this.requests}initializeRequest(){return{request:{requestType:"create",items:{},columns:{},uniqueTransactionId:this.uniqueTransactionId},columns:this.requestColumnExpansionFactory.construct(),items:{}}}extendRequest(e,t,s){const n=s.request,r=s.items;for(const i in e){void 0===n.itemType&&(n.itemType=i),void 0===r[i]&&(r[i]={},n.items[i]={});for(const o in e[i]){const a=e[i][o],c=a.entry,l=F(this.compilation,[i,c.itemId]),u=n.items[i][c.itemId]={},d=F(this.transaction.tabRequestParameters,[i,c.itemId]);null!==t&&(n.parentId[c.itemId]=t),s.columns.expandWithColumnSet(c.columns),r[i][o]=c,u.values=J.formatRequestLocal(a.fields,c.columns.main);const h=this.transaction.getAiRequestParameters(c);if(u.parameters=void 0!==h?{...d,...h}:d,void 0===l)continue;const m=u.links={};for(const e in l){m[e]=[];for(const t in l[e])m[e].push(parseInt(t,10))}this.extendRequest(l,null,s)}}}}class fe{graphQueryParserFactory;transaction;entries={};entriesByEntryId={};constructor(e,t){this.graphQueryParserFactory=e,this.transaction=t}getByEntryId(e){if(void 0===this.entriesByEntryId[e])throw new p(e);return this.entriesByEntryId[e]}containsByEntryId(e){return void 0!==this.entriesByEntryId[e]}some(e){const t=this.entries;for(const s in t)for(const n in t[s])if(e(t[s][n]))return!0;return!1}getByItemType(e){const t=this.entries[e],s=[];if(void 0===t)return s;for(const e in t)s.push(t[e]);return s}getByQuery(e,t){const s=this.getByItemType(e);if(0===s.length)return[];const n={string:""},r=this.transaction.itemHandler.matchItemsToQueryGraph(this.graphQueryParserFactory.construct(e,n).run(t),n,s);return Array.from(r.true)}getLocalByQuery(e,t){const s=this.entries[e];if(void 0===s)return[];const n=[];for(const e in s){const t=s[e];t.isLocal()&&n.push(t)}if(0===n.length)return[];const r={string:""},i=this.transaction.itemHandler.matchItemsToQueryGraph(this.graphQueryParserFactory.construct(e,r).run(t),r,n);return Array.from(i.true)}getByParent(e,t,s){const n=this.entries[s],r=[];if(void 0===n)return r;for(const s in n){const i=n[s],o=this.transaction.getParent(i);null!==o&&(o.itemType===e&&o.itemId==t&&r.push(i))}return r}forEach(e){const t=this.entries;for(const s in t)for(const n in t[s])e(t[s][n])}*[Symbol.iterator](){const e=this.entries;for(const t in e)for(const s in e[t])yield e[t][s]}toArray(){const e=this.entries,t=[];for(const s in e)for(const n in e[s])t.push(e[s][n]);return t}add(e){const t=this.entries,s=e.itemType;return void 0===t[s]&&(t[s]={}),this.entriesByEntryId[e.id]=e,t[s][e.itemId]=e}get(e,t){if(void 0===this.entries[e]||void 0===this.entries[e][t])throw new p(e,t);return this.entries[e][t]}contains(e,t){return void 0!==this.entries[e]&&void 0!==this.entries[e][t]}updateItemId(e,t){const s=this.entries[e.itemType];return void 0===s||void 0===s[t]?e:(delete s[t],s[e.itemId]=e)}clear(e){return void 0===e?(this.entries={},this.entriesByEntryId={},!0):this.clearByItemId(e.itemType,e.itemId)}clearByItemId(e,t){const s=this.entries[e];return void 0!==s&&(!!Object.prototype.hasOwnProperty.call(s,t)&&(delete this.entriesByEntryId[s[t].id],delete s[t]))}}class ye{userId;linkTreeService;constructor(e,t){this.userId=e,this.linkTreeService=t}matchParent(e,t){return null===e&&null===t||!(null===e&&null!==t||null!==e&&null===t)&&(e.itemType===t.itemType&&e.itemId==t.itemId)}getLinkFieldsByParent(e,t){const s=this.linkTreeService.get();if(!(t in s[e.itemType]))throw new Error(`Non existing link between '${e.itemType}'->'${t}'`);const n=s[e.itemType][t],r={};return"direct"===n.type?r[n.field]=e.itemId:(r.itemtype=e.itemType,r.item=e.itemId),r}getParentByFields(e,t,s){const n=this.linkTreeService.get()[e][t.itemType];if(void 0===n)throw new Error(`Non existing link between '${e}'->'${t.itemType}'`);return n.type===c.DIRECT?{itemType:e,itemId:s[n.field]}:{itemType:s.itemtype,itemId:s.item}}getFullName(e,t,s){return[e,t,s].map((e=>(e??"").trim())).filter((e=>""!==e)).join(" ")}getTitleField(e){switch(e){case"Exemplaar":return"merk";case"Factuur":return"nummer";case"Files":return"friendlyname";case"Functie":case"Standaardfunctie":return"naamintern";case"Voorraadmutatie":return"omschrijving";case"Barcode":return"code";case"Afspraak":case"Betaalmiddel":case"Betalingsconditie":case"Briefpapier":case"Condition":case"CustomfieldGroup":case"Factuurmoment":case"Functiegroep":case"Grootboek":case"Inhuur":case"Inhuurgroep":case"Inhuurmateriaal":case"Materiaal":case"MateriaalCat":case"Medewerkertarief":case"Notitie":case"Planningmateriaal":case"Project":case"Rol":case"Staffelgroep":case"Subproject":case"Taak":case"Tag":case"TaxClass":case"TaxSchema":case"Template":case"Tijd":case"Titel":case"Type":case"Voertuig":return"naam";default:return"displayname"}}getLocalDefaultValues(){return{permissions:i,creator:this.userId,created:(0,Z.default)()}}}class ge{static NEW_PREFIX="-1";static idCounter=0;static getCssKey(...e){return e.join("_")}static getLocalId(){return+(this.NEW_PREFIX+this.incrementIdCounter())}static isLocalId(e){return void 0!==e&&this.isNewId(e)}static isNewId(e){return(""+e).startsWith(this.NEW_PREFIX)}static incrementIdCounter(){return(++this.idCounter).toString()}}class Ie{errorHandler;callbacks={onBeforeSave:[],onSaveSuccess:[],onRootItemDelete:[]};constructor(e){this.errorHandler=e}clear(){this.callbacks={onBeforeSave:[],onSaveSuccess:[],onRootItemDelete:[]}}registerCallback(e,t,s,n="always",r=100){return this.getPriorityLevel(e,r)[t]={callback:s,condition:n},()=>{delete this.getPriorityLevel(e,r)[t]}}executeCallbacks(e,t,s){const n=this.callbacks[e],r=s?"onClose":"skipOnClose";let i=Promise.resolve();for(const e of n)i=i.then(this.executeCallbacksPriorityLevel(e[1],r,t));return i}getPriorityLevel(e,t){const s=this.callbacks[e];let n;for(let e=0;e<s.length;e++){const r=s[e];if(!(r[0]<t))return r[0]===t?r[1]:(n={},s.splice(e,0,[t,n]),n)}return n={},s.push([t,n]),n}executeCallbacksPriorityLevel(e,t,s){return()=>{const n=[];for(const r in e){const i=e[r];if(i.condition===t||"always"===i.condition)try{n.push(s(i.callback))}catch(e){this.errorHandler.logError(e)}}return Promise.all(n)}}}class Ce{apiRequestService;lockItems=(0,l.signal)({});promises={};constructor(e){this.apiRequestService=e}getLocksSignal(){return this.lockItems.asReadonly()}getLocks(){return(0,l.untracked)((()=>this.lockItems()))}hasLock(e){const t=this.lockItems();for(const s in t)for(const n in t[s]){const r=t[s][n];if(!this.isRemoteLock(r)&&r.id==e)return!0}return!1}isLocked(e){const t=this.getValue(e,this.lockItems());return void 0!==t&&this.isRemoteLock(t)}getMessage(e){const t=this.getValue(e,this.lockItems());if(void 0!==t&&this.isRemoteLock(t))return t.message}fetchLock(e){const t=this.getValue(e,this.lockItems());if(void 0!==t)return Promise.resolve(t);const s=this.getValue(e,this.promises);return void 0!==s?s:this.requestLock(e)}deleteLock(e){const t=t=>this.isRemoteLock(t)?(this.clearLock(e),Promise.resolve()):this.apiRequestService.delete("Locktoken",[t.id]).then((()=>{this.clearLock(e)})),s=this.getValue(e,this.lockItems());if(void 0!==s)return t(s);const n=this.getValue(e,this.promises);return void 0===n?Promise.resolve():n.then((e=>t(e)))}isRemoteLock(e){return"isForeign"in e}clearLock(e){const t=this.lockItems();return void 0!==t[e.itemType]?.[e.itemId]&&(delete t[e.itemType][e.itemId],this.lockItems.set({...t}),!0)}requestLock(e){const{itemType:t,itemId:s}=e,n=this.apiRequestService.create("Locktoken",ge.getLocalId(),{itemtype:t,item:s},{Locktoken:["id"]}).then((n=>{delete this.promises[t][s];const r=n.fetchObject("Locktoken",n.links.Locktoken[0]);return this.setToken(e,r)}),(n=>{if(delete this.promises[t][s],301===n.code)return this.setToken(e,{isForeign:!0,message:n.message});throw n}));return this.setPromise(e,n)}getValue(e,t){const s=e.itemType;if(void 0!==t[s])return t[s][e.itemId]}setPromise(e,t){return this.promises[e.itemType]??={},this.promises[e.itemType][e.itemId]=t,t}setToken(e,t){const s=this.lockItems();return s[e.itemType]??={},s[e.itemType][e.itemId]=t,this.lockItems.set({...s}),t}}const ve={};class Te{linkTreeService;transaction;destination={};itemsMappedOnParent={};transactionChain;constructor(e,t){this.linkTreeService=e,this.transaction=t,this.transactionChain=this.transaction.getTransactionChain()}process(){if(void 0===this.transaction.rootItem)throw new Error("A TransactionCache rootItem is required for ModuleChangesCompilation");return this.itemsMappedOnParent={},this.constructChildItemMap(this.transaction.rootItem.itemType),this.processItems(this.transaction.rootItem.itemType,[this.transaction.rootItem],{}),{itemType:this.transaction.rootItem.itemType,itemId:this.transaction.rootItem.itemId,items:this.destination}}constructChildItemMap(e){const t=this.linkTreeService.get()[e];if(void 0!==t)for(const e in t){this.constructChildItemMap(e);const t=new Set;for(const s of this.transactionChain)if(s instanceof mt){const n=s.itemHandler.getDeletedItemsIterator(e);for(const e of n)t.add(e.id)}for(const s of this.transactionChain){const n=s.itemHandler.entries.getByItemType(e);for(const e of n){if(t.has(e.id))continue;const n=s.getParent(e);null!==n&&(this.itemsMappedOnParent[n.itemType]??={},this.itemsMappedOnParent[n.itemType][n.itemId]??={},this.itemsMappedOnParent[n.itemType][n.itemId][e.itemType]??=[],this.itemsMappedOnParent[n.itemType][n.itemId][e.itemType].push(e))}}}}processItems(e,t,s){void 0===this.destination[e]&&(this.destination[e]={}),void 0===s[e]&&(s[e]=[]);for(const n of t){const t=n.itemId;void 0===this.destination[e][t]&&(s[e].push(t),this.destination[e][t]=this.processItem(n))}}processItem(e){const t=this.getItemsByParent(e.itemType,e.itemId),s=this.transaction.itemHandler.formatRequest(e),n={};for(const e in t)this.processItems(e,t[e],n);const r=S(s),i=S(n);return r&&i?{values:s,links:n}:r?{values:s}:i?{links:n}:ve}getItemsByParent(e,t){return this.itemsMappedOnParent[e]?.[t]??{}}}const Re={"=":"!=","!=":"=",">":"<=","<":">=","<=":">",">=":"<"};class Ee{static normalizeOperator(e){switch(e){case void 0:case"AND":case"and":return"AND";case"OR":case"or":return"OR";default:throw new Error(`QueryParserBase: unknown operator: ${e}`)}}static isLinkedToQuery(e){return void 0!==e.linkedTo}static isCustomQuery(e){return void 0!==e.custom}static isSearchQuery(e){return void 0!==e.search}static isQueryWithConditions(e){return void 0!==e.conditions}static isSubQuery(e){return void 0!==e.query}run(e){return this.parseQuery(e,0)}parseQuery(e,t){if(Ee.isLinkedToQuery(e))return this.parseLinkedToQuery(e.linkedTo,e.query??{},e.reverse??!1,e.not??!1,t);if(Ee.isCustomQuery(e))return this.parseCustomQuery(e.custom,e.parameters,e.not??!1);if(Ee.isSearchQuery(e))return this.parseSearchQuery(e.search,e.not??!1);if(Ee.isQueryWithConditions(e))return this.parseComplexQuery(e.conditions,Ee.normalizeOperator(e.operator),e.not??!1,t);if(Ee.isSubQuery(e)){if(void 0===e.key)throw new Error("QueryParserBase: missing 'key' parameter for subquery");return this.parseSubQuery(e.key,e.itemType,e.field??"id",e.query,e.not??!1,t)}const s=e;if(void 0!==s.key)return this._parseSimpleQuery(s.key,s.value,s);const n=_(e);return null===n?this.parseEmptyQuery():this._parseSimpleQuery(n,e[n],e)}_parseSimpleQuery(e,t,s){const n=s.comparator,r=!0===s.not;switch(n){case void 0:return Array.isArray(t)?this.parseInQuery(e,t,r):this.parseComparatorQuery(e,t,r?"!=":"=",s);case"=":case"!=":case">":case"<":case">=":case"<=":return this.parseComparatorQuery(e,t,r?Re[n]:n,s);case"in":case"IN":return this.parseInQuery(e,t,r);default:throw new Error(`QueryParserBase: unknown comparator: ${n}`)}}}class Se{TOKEN;constructor(e){this.TOKEN=e}static addBranchNode(e,t){let s=e.branchNodeMap;if(null===s)return s=e.branchNodeMap=new Map,void s.set(t.TOKEN,t);const n=s.get(t.TOKEN);void 0===n?s.set(t.TOKEN,t):n.copyEdgesFrom(t,void 0)}static matchQueryNodes(e,t,s,n,r){for(const s of e.leafNodes){let e=r.get(s.string);void 0===e&&r.set(s.string,e={true:new Set}),!0===n?(e.maybe?.delete(t),e.true.add(t)):e.true.has(t)||(e.maybe??=new Set,e.maybe.add(t))}const i=e.branchNodeMap;if(null===i)return r;for(const e of i.values())e.match(t,s,n,r);return r}static cloneQueryNodesInto(e,t,s){const n=t.branchNodeMap;if(void 0!==s&&null===n)return void s(e);for(const s of t.leafNodes)e.leafNodes.push(s);if(null===n)return;let r=e.branchNodeMap;if(null!==r)for(const e of n.values()){const t=r.get(e.TOKEN);void 0===t?r.set(e.TOKEN,e.clone(s)):t.copyEdgesFrom(e,s)}else{r=e.branchNodeMap=new Map;for(const e of n.values())r.set(e.TOKEN,e.clone(s))}}static _updateLocalItemIdReferences(e,t){if(null===e)return!1;let s=!1;for(const n of e.values())n.updateLocalItemIdReferences(t)&&(s=!0);return s}}class _e extends Se{connectedNodesTuple;constructor(e,t={leafNodes:[],branchNodeMap:null}){super(e),this.connectedNodesTuple=t}connectLeafNode(e){return this.connectedNodesTuple.leafNodes.push(e),this}connectBranchNode(e){return Se.addBranchNode(this.connectedNodesTuple,e),this}updateLocalItemIdReferences(e){return Se._updateLocalItemIdReferences(this.connectedNodesTuple.branchNodeMap,e)}copyEdgesFrom(e,t){return Se.cloneQueryNodesInto(this.connectedNodesTuple,e.connectedNodesTuple,t),this}}class be extends _e{apiQuery;constructor(e,t){super(e),this.apiQuery=t}match(e,t,s,n){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,"maybe",n)}}class we extends be{constructor(e){super("CUSTOM:",e)}clone(e){return new we(this.apiQuery).copyEdgesFrom(this,e)}}const qe=Symbol("Unsupported query value"),Fe={queryToEdgeValue:e=>"number"==typeof e?e:qe,fieldToEdgeValue:e=>e,edgeToEdgeCompareValue:e=>e},ke={queryToEdgeValue:e=>null===e?null:"string"==typeof e?e.toLowerCase():qe,fieldToEdgeValue:e=>null===e?e:e.toLowerCase()},Le={queryToEdgeValue:e=>null===e||"number"==typeof e||"boolean"==typeof e?e:qe,fieldToEdgeValue:e=>e},De={queryToEdgeValue:e=>"NOW"===e?"NOW":Z.default.isMoment(e)&&e.isValid()?e.valueOf():qe,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>"NOW"!==e?e:Z.default.now()},xe={queryToEdgeValue:e=>Z.default.isMoment(e)?e.isValid()?e.valueOf():null:qe,fieldToEdgeValue:e=>e.isValid()?e.valueOf():null},Me={queryToEdgeValue:e=>Z.default.isDuration(e)?e.valueOf():qe,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>e};class Pe extends Se{columnId;valueTransformer;errorHandler;edgeMap=new Map;constructor(e,t,s,n){super(e),this.columnId=t,this.valueTransformer=s,this.errorHandler=n}static findValueTransformer(e,t){for(const s of t)if(s.queryToEdgeValue(e)!==qe)return s;return null}connectLeafNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===qe&&(this.errorHandler.logError(new Error(`Unsupported query value '${e}' passed to 'connectLeafNode'`)),s=e),this.getQueryNodeTuple(s).leafNodes.push(t),this}connectBranchNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===qe&&(this.errorHandler.logError(new Error(`Unsupported query value '${e}' passed to 'connectBranchNode'`)),s=e),Se.addBranchNode(this.getQueryNodeTuple(s),t),this}copyEdgesFrom(e,t){this.valueTransformer===Le&&e.valueTransformer===ke&&(this.valueTransformer=ke);for(const s of e.edgeMap.entries())Pe.cloneQueryNodesInto(this.getQueryNodeTuple(s[0]),s[1],t);return this}updateLocalItemIdReferences(e){let t=!1;for(const s in e)for(const n in e[s]){const r=Number(n),i=this.edgeMap.get(r);void 0!==i&&(Pe.cloneQueryNodesInto(this.getQueryNodeTuple(e[s][n]),i,void 0),this.edgeMap.delete(r),t=!0)}for(const s of this.edgeMap.values())Se._updateLocalItemIdReferences(s.branchNodeMap,e)&&(t=!0);return t}getValues(){return Array.from(this.edgeMap.keys())}matchUndefinedValue(e,t,s){for(const n of this.edgeMap.values())Se.matchQueryNodes(n,e,t,"maybe",s);return s}getQueryNodeTuple(e){let t=this.edgeMap.get(e);return void 0===t&&this.edgeMap.set(e,t={leafNodes:[],branchNodeMap:null}),t}}const Be=[Fe,De,Me];class Qe extends Pe{comparator;compareValue;constructor(e,t,s,n){super(`${t}:${e}`,e,s,n),this.comparator=t,this.compareValue=Qe.getCompareFunction(this.comparator)}static construct(e,t,s,n){if(!Qe.isSupportedComparator(s))return null;const r=Pe.findValueTransformer(t,Be);return null===r?null:new Qe(e,s,r,n)}static isSupportedComparator(e){switch(e){case"<":case"<=":case">":case">=":return!0;default:return!1}}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);if(null===r)throw new Error(`Encountered null-value in greater / smaller then comparator node ${this.TOKEN}`);const i=this.valueTransformer.fieldToEdgeValue(r);for(const r of this.edgeMap.entries())this.compareValue(i,this.valueTransformer.edgeToEdgeCompareValue(r[0]))&&Se.matchQueryNodes(r[1],e,t,s,n);return n}static getCompareFunction(e){switch(e){case">":return(e,t)=>e>t;case"<":return(e,t)=>e<t;case">=":return(e,t)=>e>=t;case"<=":return(e,t)=>e<=t}}clone(e){return new Qe(this.columnId,this.comparator,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}const Ae=[Le,ke,xe,Me];class je extends Pe{constructor(e,t,s){super(`IS:${e}`,e,t,s)}static construct(e,t,s,n){if("="!==s)return null;const r=Pe.findValueTransformer(t,Ae);return null===r?null:new je(e,r,n)}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);const i=this.edgeMap.get(this.valueTransformer.fieldToEdgeValue(r));return void 0===i?n:Se.matchQueryNodes(i,e,t,s,n)}clone(e){return new je(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class He extends be{clone(e){return new He(this.apiQuery).copyEdgesFrom(this,e)}constructor(e){super("LI",e)}}const Ue=[Le,ke,xe,Me];class Oe extends Pe{constructor(e,t,s){super(`!IS:${e}`,e,t,s)}static construct(e,t,s,n){if("!="!==s)return null;const r=Pe.findValueTransformer(t,Ue);return null===r?null:new Oe(e,r,n)}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);for(const i of this.edgeMap.entries())this.valueTransformer.fieldToEdgeValue(r)!==i[0]&&Se.matchQueryNodes(i[1],e,t,s,n);return n}clone(e){return new Oe(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class Ve extends _e{constructor(e){super("R",e)}clone(e){return(new Ve).copyEdgesFrom(this,e)}match(e,t,s,n){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,s,n)}doMatch(e,t,s=new Map){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,!0,s)}}class Ne extends be{constructor(e){super(`SEARCH:${e.search}`,e)}clone(e){return new Ne(this.apiQuery).copyEdgesFrom(this,e)}}class We extends be{constructor(e){super("SUB",e)}clone(e){return new We(this.apiQuery).copyEdgesFrom(this,e)}}const $e=[je,Oe,Qe];class Ge extends Ee{itemType;queryId;linkTreeService;errorHandler;constructor(e,t,s,n){super(),this.itemType=e,this.queryId=t,this.linkTreeService=s,this.errorHandler=n}run(e){const t=new Ve,s=this.parseQuery(e,0);if(null===s)return t;if(s===this.queryId)return t.connectLeafNode(s);for(const e of s)t.connectBranchNode(e);return t}parseEmptyQuery(){return this.queryId}static createLinkedToComparatorQueryNode(e,t,s,n,r){const i=n.get()[t][e];switch(i.type){case c.DIRECT:{const e=new je(i.field,Le,r);for(const t of s)e.connectLeafNode(t.value,t.node);return e}case c.ITEMTABLE:{const e=new je("item",Le,r);for(const t of s)e.connectLeafNode(t.value,t.node);return new je("itemtype",ke,r).connectBranchNode(t,e)}}}parseComparatorQuery(e,t,s){let n=null;for(const r of $e)if(n=r.construct(e,t,s,this.errorHandler),null!==n)break;if(null===n)throw new Error(`Could not find supported comparator node: ${e}${s}${t} `);return[n.connectLeafNode(t,this.queryId)]}parseInQuery(e,t,s){if(0===t.length)return s?this.queryId:null;const n=Ae.find((e=>t.every((t=>e.queryToEdgeValue(t)!==qe))));if(void 0===n)throw new Error(`Could not find supported comparator node: ${e} ${t}`);if(!s){const s=new je(e,n,this.errorHandler);for(const e of t)s.connectLeafNode(e,this.queryId);return[s]}const r=new Oe(e,n,this.errorHandler);let i=r;for(let s=0;s<t.length-1;s++)i.connectBranchNode(t[s],i=new Oe(e,n,this.errorHandler));return i.connectLeafNode(t[t.length-1],this.queryId),[r]}parseLinkedToQuery(e,t,s,n,r){if(s||n)return[new He({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)];const i=this.parseQuery(t,r+1);if(null===i)return null;if(i!==this.queryId&&1===i.length&&"IS:id"===i[0].TOKEN){const t=i[0].getValues();return[Ge.createLinkedToComparatorQueryNode(this.itemType,e,t.map((e=>({value:e,node:this.queryId}))),this.linkTreeService,this.errorHandler)]}return[new He({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)]}parseSubQuery(e,t,s,n,r){return[new We({key:e,itemType:t,field:s,query:n,not:r}).connectLeafNode(this.queryId)]}parseSearchQuery(e,t){return[new Ne({search:e,not:t}).connectLeafNode(this.queryId)]}parseCustomQuery(e,t,s){return[new we({custom:e,parameters:t,not:s}).connectLeafNode(this.queryId)]}parseComplexQuery(e,t,s,n){if(s)throw new Error("GraphQueryParser: 'not' unsupported for complex queries. Please rewrite your query.");const r=e.map((e=>this.parseQuery(e,n)));switch(t){case"OR":return this.rewriteOrConditions(r);case"AND":{const e=this.rewriteAndConditions(r);if(null===e||e===this.queryId)return e;let t=e[0];for(let s=1;s<e.length;s++){const n=[];for(const r of e[s]){const e=e=>{Se.addBranchNode(e,r.clone(void 0))};for(const s of t)n.push(s.clone(e))}t=n}return t}}}rewriteOrConditions(e){const t=e.filter((e=>null!==e));return 0===t.length?null:t.some((e=>e===this.queryId))?this.parseEmptyQuery():t.flat()}rewriteAndConditions(e){if(e.some((e=>null===e)))return null;const t=e.filter((e=>e!==this.queryId));return 0===t.length?this.parseEmptyQuery():t}}class ze extends Ee{linkTreeService;itemType;constructor(e,t){super(),this.linkTreeService=e,this.itemType=t}parseEmptyQuery(){return[]}parseSubQuery(e,t,s,n,r,i){if("id"===e||void 0!==t)return[];const o=this.parseQuery(n,i+1);return"id"!==s&&o.push(s),[{[e]:o}]}parseSearchQuery(){return[]}parseCustomQuery(){return[]}parseComparatorQuery(e){return[e]}parseInQuery(e,t){return[e]}parseLinkedToQuery(e,t,s,n,r){return s||r>0?[]:this.linkTreeService.getColumnsFromLink(e,this.itemType)}parseComplexQuery(e,t,s,n){return this.parseConditions(e,n)}parseConditions(e,t){return e.reduce(((e,s)=>e.concat(this.parseQuery(s,t))),[])}}class Ye extends Ee{parseEmptyQuery(){return!1}parseSubQuery(e,t,s,n,r,i){return this.parseQuery(n,i+1)}parseSearchQuery(){return!1}parseCustomQuery(){return!1}parseComparatorQuery(e,t){return ge.isLocalId(t)}parseInQuery(e,t){return t.some((e=>ge.isLocalId(e)))}parseLinkedToQuery(e,t,s,n,r){return this.parseQuery(t,r+1)}parseComplexQuery(e,t,s,n){return e.some((e=>this.parseQuery(e,n)))}}class Ke extends Ee{static formatStringParameters(...e){return"["+e.join(":")+"]"}static formatValue(e){const t=this.processValue(e);return{object:t,string:""+t}}static processValue(e){return Array.isArray(e)?e.slice().sort():Z.default.isMoment(e)?(0,Z.default)(e):Z.default.isDuration(e)?Z.default.duration(e):e}static compareParsedQueries(e,t){return e.string===t.string?0:e.string>t.string?1:-1}parseEmptyQuery(){return{object:{},string:"{}",isLocallyMatchable:!0}}parseSubQuery(e,t,s,n,r,i){const o=this.parseQuery(n,i+1);return{object:{key:e,itemType:t,field:s,query:o.object,not:r},string:Ke.formatStringParameters("subField",e,t??"",s,o.string,r),isLocallyMatchable:!1}}parseSearchQuery(e,t){const s=Ke.formatValue(e);return{object:{search:s.object,not:t},string:Ke.formatStringParameters("search",s.string,t),isLocallyMatchable:!1}}parseCustomQuery(e,t,s){if(void 0===t)return{object:{custom:e,not:s},string:Ke.formatStringParameters(e,s),isLocallyMatchable:!1};const n=this.parseCustomParameters(t);return{object:{custom:e,parameters:n.object,not:s},string:Ke.formatStringParameters(e,n.string,s),isLocallyMatchable:!1}}parseComparatorQuery(e,t,s){const n=Ke.formatValue(t);return{object:{key:e,value:n.object,comparator:s},string:Ke.formatStringParameters(s,e,n.string),isLocallyMatchable:!0}}parseInQuery(e,t,s){const n=Ke.formatValue(t);return{object:{key:e,value:n.object,comparator:"IN",not:s},string:Ke.formatStringParameters("IN",e,n.string,s),isLocallyMatchable:!0}}parseLinkedToQuery(e,t,s,n,r){const i=this.parseQuery(t,r+1);return{object:{linkedTo:e,query:i.object,reverse:s,not:n},string:Ke.formatStringParameters("linkedTo",e,i.string,s,n),isLocallyMatchable:!s}}parseComplexQuery(e,t,s,n){const r=this.parseConditions(e,n);return{object:{conditions:r.object,operator:t,not:s},string:Ke.formatStringParameters(t,r.string,s),isLocallyMatchable:r.isLocallyMatchable}}parseCustomParameters(e){const t=Object.keys(e).sort(),s={};let n="";for(let r=0;r<t.length;r++){const i=t[r],o=Ke.formatValue(e[i]);s[i]=o.object,r>0&&(n+=":"),n+=o.string}return{object:s,string:n}}parseConditions(e,t){const s=[];for(const n of e)s.push(this.parseQuery(n,t));s.sort(((e,t)=>Ke.compareParsedQueries(e,t)));const n=[];let r="",i=!0;for(const e of s)n.push(e.object),r+=e.string,i=i&&e.isLocallyMatchable;return{object:n,string:r,isLocallyMatchable:i}}}class Xe extends Ee{itemIdConversionMap;constructor(e){super(),this.itemIdConversionMap=e}parseEmptyQuery(){return!1}parseSubQuery(e,t,s,n,r,i){return this.parseQuery(n,i+1)}parseSearchQuery(){return!1}parseCustomQuery(){return!1}parseComparatorQuery(e,t,s,n){for(const e in this.itemIdConversionMap)if(void 0!==this.itemIdConversionMap[e][t])return n.value=this.itemIdConversionMap[e][t],!0;return!1}parseInQuery(e,t,s){let n=!1;for(let e=0;e<t.length;e++)for(const s in this.itemIdConversionMap){const r=this.itemIdConversionMap[s][t[e]];void 0!==r&&(t[e]=r,n=!0)}return n}parseLinkedToQuery(e,t,s,n,r){return this.parseQuery(t,r+1)}parseComplexQuery(e,t,s,n){return e.map((e=>this.parseQuery(e,n))).some((e=>e))}}class Ze{containsLocalId(e){return(new Ye).run(e)}addAndCondition(e,t){return this.isEmptyQuery(e)?t:this.isEmptyQuery(t)?e:"conditions"in e&&"or"!==e.operator?{conditions:e.conditions.concat(t)}:{conditions:[e,t]}}addOrCondition(e,t){return this.isEmptyQuery(e)?e:this.isEmptyQuery(t)?t:"conditions"in e&&"or"===e.operator?{conditions:e.conditions.concat(t),operator:"or"}:{conditions:[e,t],operator:"or"}}addParentCondition(e,t){if(null===t)return e;const s={linkedTo:t.itemType,query:{id:t.itemId}};return null===e?s:this.addAndCondition(e,s)}createNotIn(e){return{comparator:"IN",key:"id",value:e,not:!0}}isEmptyQuery(e){for(const t in e)return!1;return!0}}class Je{columns={};columnSetIdMap={};requestColumnSetIdMap={};expandWithRequestColumnsTuple(e,t){!0!==this.requestColumnSetIdMap[t.string]&&(this.expandWithRequestColumns(e,t.object),this.requestColumnSetIdMap[t.string]=!0)}expandWithColumnSet(e){!0!==this.columnSetIdMap[e.id]&&(this.expandWithRequestColumns(e.itemType,e.request),this.columnSetIdMap[e.id]=!0)}expandWithRequestColumns(e,t){const s=this.columns;if(!0!==s[e])if(!0!==t){void 0===s[e]&&(s[e]=[]);for(const n of t)he.mergeRequestColumn(n,s[e])}else{const t=s[e];if(!0===t)return;void 0!==t&&he.containsDerivedColumns(t)||(s[e]=!0)}}get(){return this.columns}}class et{changesDeltaFactory;columnCache;errorHandler;requestColumnExpansionFactory;transactionCacheFactory;requestColumnsOperationsCacheFactory;logPrefix="[SocketMessageHandler]:";requestBufferManager;constructor(e,t,s,n,r,i,o){this.changesDeltaFactory=e,this.columnCache=t,this.errorHandler=s,this.requestColumnExpansionFactory=n,this.transactionCacheFactory=r,this.requestColumnsOperationsCacheFactory=o,this.requestBufferManager=new Ft(i,n)}async onMessagesReceived(e,t){const s=this.changesDeltaFactory.construct(!1,[]),n=[],r=this.transactionCacheFactory.getServerCache().getActiveItemEntries();for(const i of e){const e=i.body;"massUpdate"!==e.eventType?"delete"!==e.eventType?this.processMessage(e,s,n,r,t):this.handleDelete(e,s):this.refreshItemsOfType(e.itemType)}return this.processRequests(n,s)}async refreshItemsOfType(e){const t=this.transactionCacheFactory.getServerCache(),s=t.getActiveItemEntries(),n=t.itemHandler.entries.getByItemType(e),r=[];let i=0;for(const e of n)e.markOutdated(),s.has(e)?r.push(e):i++;const o=t.cachedQueryHandler.getCachedQueryItemsByItemType(e),a=[];let c=0;for(const e of o)e.markOutdated(),t.cachedQueryHandler.hasActiveCollectionsForQuery(e.itemType,e.query.string)?a.push(e):c++;if((i>0||c>0)&&this.errorHandler.logDebug(`${this.logPrefix} Marked ${i} items and ${c} cached queries as outdated for '${e}'`),0===r.length&&0===a.length)return;this.errorHandler.logDebug(`${this.logPrefix} Immediately re-fetching ${r.length} items and ${a.length} cached queries for '${e}'`);const l=this.requestColumnExpansionFactory.construct();for(const e of r)l.expandWithColumnSet(e.columns);const u=t.expandColumnExpansionWithRequiredColumns(e,l,a,[]),d=this.requestColumnsOperationsCacheFactory.construct(e,u),h=[this.requestBufferManager.fetchByIds(e,r.map((e=>e.itemId)),u)];if(a.length>0)for(const s of a)h.push(this.requestBufferManager.fetchByQuery(e,s.query,d.getRequestColumnsTuple(t)));await this.processRequests(h)}handleDelete(e,t){const s=this.transactionCacheFactory.getServerCache(),n=e.itemType;for(const r of e.items)s.containsLocalItemEntryByItemId(n,r)&&t.setItemDeleted(s.getLocalItemEntryByItemId(n,r));const r=[...t.getDeletedItemEntriesIterator(n)];if(0===r.length)return;t.addQueryItemType(n);const i=r.map((e=>e.itemId)).join(", ");this.errorHandler.logDebug(`${this.logPrefix} Removing ${n} items: [${i}]`)}logFetchedItems(e,t){const s=t.join(", ");this.errorHandler.logDebug(`${this.logPrefix} Fetching ${e.itemType} items for ${e.eventType}: [${s}]`)}processSocketMessageValues(e,t){const s=[],n={};for(const r in t[0].values){const t=this.columnCache.getColumn(e,r);void 0!==t&&(s.push(r),n[r]=t)}const r=[];for(const e of t){const t={};for(const r of s)t[r]=J.formatResponseValue(n[r].type,e.values[r]);r.push(t)}return{fieldsArray:r,columns:{request:s,response:n}}}aggregateCachedRequestColumns(e,t){const s=this.transactionCacheFactory.getServerCache(),n=this.requestColumnExpansionFactory.construct();for(const r of t)s.containsLocalItemEntryByItemId(e,r.id)&&n.expandWithColumnSet(s.getLocalItemEntryByItemId(e,r.id).columns);return n}getMergedQueryGraphTuple(e){const t=this.transactionCacheFactory.getServerCache(),s=t.cachedQueryHandler.getMergedQueryGraph(e)??new Ve,n=t.cachedQueryHandler.getUncachedCollectionsOnChildTransactionsIterator(e),r=new Map;for(const e of n){const t=e.entry.query.string;let n=r.get(t);void 0===n&&r.set(t,n=[]),n.push(e),s.copyEdgesFrom(e.queryGraph,void 0)}return{collectionResourceMap:r,queryGraph:s}}matchSocketMessageItems(e,t,s,n){const r=this.transactionCacheFactory.getServerCache(),i=new Set,o=this.getMergedQueryGraphTuple(e),a={active:[],inactive:[]},c=new Map;for(const l of t){if(r.containsLocalItemEntryByItemId(e,l.id)){if(s)continue;const t=l.id,o=r.getLocalItemEntryByItemId(e,t);n.has(o)?a.active.push(o):a.inactive.push(o),i.add(l)}o.queryGraph.doMatch(l,(e=>l[e]),c)}const l={active:[],inactive:[]},u=[];for(const t of c.entries()){const s=t[0],n=r.cachedQueryHandler.getCachedQueryItem(e,s),a=o.collectionResourceMap.get(s);void 0!==n&&(r.cachedQueryHandler.hasActiveCollectionsForQuery(n.itemType,n.query.string)?l.active.push(n):l.inactive.push(n)),void 0!==a&&u.push(...a);const c=t[1];for(const e of c.true)i.add(e);if(void 0!==c.maybe)for(const e of c.maybe)i.add(e)}return 0===i.size?null:{fieldsSet:i,cachedQueryItems:l,uncachedCollections:u,itemEntries:a}}processMessage(e,t,s,n,r){const i=e.itemType,o=this.processSocketMessageValues(i,Object.values(e.items[i])),a=this.matchSocketMessageItems(i,o.fieldsArray,"create"===e.eventType,n);if(null===a)return;const c={};for(const e of a.fieldsSet)c[e.id]="CLEAR_WHEN_SAME";const l=this.transactionCacheFactory.getServerCache();l.processResponseByItemType(i,o.columns.request,{[i]:o.columns.response},a.fieldsSet,t,c);const u=he.mergeRequestColumns(o.columns.request,l.expandColumnExpansionWithRequiredColumns(i,this.aggregateCachedRequestColumns(i,a.fieldsSet),[...a.cachedQueryItems.active,...a.cachedQueryItems.inactive],a.uncachedCollections));if(!0!==u.difference&&0===u.difference.length)return;if(0===a.cachedQueryItems.active.length&&0===a.itemEntries.active.length&&0===a.uncachedCollections.length){this.errorHandler.logDebug(`${this.logPrefix} Marked ${e.itemType} items as outdated`);for(const e of a.cachedQueryItems.inactive)l.cachedQueryHandler.markCachedQueriesOutdatedInAllTransactions(e.itemType,e.query.string);for(const e of a.itemEntries.inactive)e.markOutdated();return}const d=[];for(const e of a.fieldsSet)d.push(e.id);this.logFetchedItems(e,d),s.push(this.requestBufferManager.fetchByIds(i,d,u.merged,{flushTimeout:r}))}async processRequests(e,t=this.changesDeltaFactory.construct(!1)){const s=await Promise.allSettled(e),n=this.transactionCacheFactory.getServerCache();for(const e of s){if("rejected"===e.status){this.errorHandler.logError(e.reason);continue}const{requestColumns:s,response:r,nonLocallyMatchableQueryString:i}=e.value;t.addQueryItemType(r.itemType),null!==i&&t._setQueryResult(r.itemType,i,r.links[r.itemType]),n.processResponse(r,s,t)}return n.applyChangesDelta(t,!0)}}class tt{dependencies;core;childrenSignal=(0,l.signal)([]);itemHandler;cachedQueryHandler;parent;constructor(e,t){this.dependencies=e,this.core=t}getChildren(){return(0,l.untracked)((()=>this.childrenSignal()))}*getDescendantsIterator(){for(const e of this.getChildren())yield e,yield*e.getDescendantsIterator()}onChildDestroy(e){this.childrenSignal.update((t=>t.filter((t=>t!==e))))}getTransactionChain(e=!0){const t=[];let s=this;do{if(!e&&null===s.parent)return t;t.push(s),s=s.parent}while(null!==s);return t}getCurrentItemEntryCache(){return this.itemHandler.entries}clearItemEntry(e){return this.cachedQueryHandler.clearLinkedCachedQueryItems(e),this.itemHandler.clearItemEntry(e)}getLocalItemEntryChangesTuple(e){return{entry:this.getLocalItemEntry(e),changes:this.itemHandler.itemChanges[e]}}getParent(e,t=!1){if(t&&null!==this.parent&&!this.itemHandler.entries.containsByEntryId(e.id))return this.parent.getParent(e,!1);let s=null,n=null;if(null!==e.columns.link)s=e.columns.link.apiColumn.itemType,n=this.itemHandler.lookUpItemField(e,e.columns.link.id)??null;else{const t=e.columns.response[e.itemType];"itemtype"in t&&"item"in t&&(s=this.itemHandler.lookUpItemField(e,"itemtype")??null,n=this.itemHandler.lookUpItemField(e,"item")??null)}return null!==s&&null!==n?{itemType:s,itemId:n}:null}getParentFromFields(e,t){if(void 0===t)return null;let s=null,n=null;if(null!==e.columns.link)s=e.columns.link.apiColumn.itemType,n=t[e.columns.link.id];else{const r=e.columns.response[e.itemType];"itemtype"in r&&"item"in r&&(s=t.itemtype,n=t.item)}return null!==s&&null!==n?{itemType:s,itemId:n}:null}processCreatedItem(e,t){if(!this.containsLocalItemEntryByItemId(e.columns.itemType,e.itemId))return this.itemHandler.createItemEntry(e);const s=this.getLocalItemEntryByItemId(e.columns.itemType,e.itemId);return t.setItemUpdated(s,e.fields,this.core.columnExpansionFactory.construct(e.columns.itemType,!!e.columns.requestColumnsTrue||e.columns.request,e.columns.response),null,"KEEP_WHEN_DIFFERENT"),t.created.remove(s.itemType,s.itemId),null}fetchUpdatedDerivedValuesFromDelta(e,t){const s=[];for(const n in e.updated){const r=e.updated[n],i=[];for(const e of r.entry.columns.root){const s=this.itemHandler.lookUpItemField(r.entry,e.id);if(void 0===s)continue;const n=r.changes.fields[e.id],o=t?.[e.itemType];void 0===n||n===s||void 0!==o&&o[s]===n||i.push(e)}0!==i.length&&s.push(this.itemHandler.resolveDerivedValues([r.entry],i,!1,e))}return Promise.all(s)}handleCascadingDeletes(e){for(const t of e.getDeletedItemTypesIterator()){const s=a.ApiFieldsOnDeleteRule[t]?.foreign??{},n=e.getDeletedItemEntriesIterator(t);for(const t of n)for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}cascadeDeleteByItemType(e,t,s,n){const r=a.ApiFieldsOnDeleteRule[t]?.own[s]?.onDeleteRule;if(void 0===r)return;let i=[];const o=this.getTransactionChain(!0);for(const e of o)i=i.concat(e.itemHandler.entries.getByItemType(t));for(const t of i){let i=e.updated[t.id]?.changes.fields[s];if(void 0===i&&(i=this.itemHandler.lookUpItemField(t,s)),i===n)if("restrict"===r);else if("set_null"===r){const r={[s]:null};e instanceof Rt?e.setItemUpdated(t,r,null,null,"KEEP_WHEN_DIFFERENT"):e instanceof St?e.setItemUpdated(t,r,{[s]:n},"KEEP_WHEN_DIFFERENT"):e.setItemUpdated(t,r,"KEEP_WHEN_DIFFERENT")}else if("cascade"===r){e instanceof Et?e.setItemDeleted({entry:t,changes:this.itemHandler.itemChanges[t.id],isCascaded:!0}):e instanceof St?e.setItemDeleted(t):e.setItemDeletedCascaded(t);const s=a.ApiFieldsOnDeleteRule[t.itemType]?.foreign??{};for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}}}class st extends tt{dependencies;apiFieldsOnDeleteRule;requestBufferManager;itemHandler;cachedQueryHandler;onDeltaAppliedCallbacks=[];parent=null;constructor(e,t,s){super(e,s),this.dependencies=e,this.apiFieldsOnDeleteRule=t,this.requestBufferManager=new Ft(e.apiRequestService,e.requestColumnExpansionFactory,(({requestColumns:e,response:t,nonLocallyMatchableQueryString:s})=>{const n=this.dependencies.changesDeltaFactory.construct(!1,[t.itemType]);return null!==s&&n._setQueryResult(t.itemType,s,t.links[t.itemType]),this.applyChangesDelta(this.processResponse(t,e,n))})),this.itemHandler=new ct(e.errorHandler,e.columnCache,e.itemCacheFactory,e.itemEntryService,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,this),this.cachedQueryHandler=new ut(e,this)}onDeltaApplied(e){return this.onDeltaAppliedCallbacks.push(e),()=>{const t=this.onDeltaAppliedCallbacks.indexOf(e);-1!==t&&this.onDeltaAppliedCallbacks.splice(t,1)}}getServerCache(){return this}createChild(e,t,s){const n=new mt(this.dependencies,this.core,this,e,t,s);return(0,l.untracked)((()=>this.childrenSignal.update((e=>[...e,n])))),n}getActiveItemEntries(){const e=new Set;for(const t of this.getDescendantsIterator())for(const s of t.itemHandler.itemResourcesPerEntry){if(!s[1].some((e=>void 0!==e.deref())))continue;const n=s[0];this.collectActiveItemEntriesBasedOnParentEntry(t,n,n.columns.main,e)}return e}processResponseByItemType(e,t,s,n,r,i,o){const a=null!==t?this.dependencies.columnSetFactory.construct(e,t,s):this.dependencies.columnSetFactory.constructFromResponse(e,!1,s),c=this.dependencies.columnExpansionFactory.construct(e,!!a.requestColumnsTrue||a.request,s);for(const t of n){const s=t.id;let n;if(void 0!==o)for(const e in o)if(o[e]==s){n=Number(e);break}this.itemHandler.entries.contains(e,n??s)?r.setItemUpdated(this.itemHandler.entries.get(e,n??s),t,c,null,i?.[s]??"QUERY"):r._setItemCreated(s,t,a,null,!0)}return r}processResponse(e,t,s=this.dependencies.changesDeltaFactory.construct(!1),n,r){const i=e.fetchColumnsObject();for(const e in i)this.dependencies.columnCache.setColumns(e,t[e],i,"not_false");for(const o in e.items)this.processResponseByItemType(o,o===e.itemType?t[o]:null,i,e.fetchObjectArray(o,null),s,n?.[o],r?.[o]);return s}async applyChangesFromParent(e,t=!1){const s=this.dependencies.changesDeltaFactory.constructParentDelta(e);this.handleCascadingDeletes(e),this.itemHandler.processUpdatesFromDelta(e.updated,s);for(const t of e.getDeletedItemEntriesIterator())s.setItemDeleted(t);const n=await this.cachedQueryHandler.matchItemsToCollectionQueries(s,s._queryItemTypeSet,!1);this.cachedQueryHandler.applyMatchingResultsToCachedQueries(n),await Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(s,t)))),this.callOnDeltaAppliedCallbacks(s);for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}getLinkFieldsByParent(e,t){const s=this.dependencies.linkTreeService.get()[e.itemType][t],n={};if(void 0===s)throw new Error(`Non existing link between '${e.itemType}'->'${t}'`);return s.type===c.DIRECT?n[s.field]=e.itemId:(n.itemtype=e.itemType,n.item=e.itemId),n}getCollectionChangesRecursively(e,t){return this.cachedQueryHandler.getCachedQueryItem(e,t.string)}applyChangesFromChild(e,t,s){const n=this.dependencies;return new ne(n.apiRequestService,n.changesDeltaFactory,n.errorHandler,this.requestBufferManager,n.requestColumnExpansionFactory,e,new se(e),t,s).execute()}async applyChangesDelta(e,t=!1,s){if(e.isEmpty())return{allChildrenDonePromise:Promise.resolve()};this.handleCascadingDeletes(e);const n=this.dependencies.changesDeltaFactory.constructParentDelta(e);e.created.forEach((t=>{const s=this.processCreatedItem(t,e);null!==s&&n.setItemCreated(s,this.itemHandler.itemChanges[s.id])})),await this.fetchUpdatedDerivedValuesFromDelta(e,s),this.itemHandler.processUpdatesFromDelta(e.updated,n);for(const t of e.getDeletedItemEntriesIterator())n.setItemDeleted(t);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(n,n._queryItemTypeSet,!0);return this.cachedQueryHandler.applyMatchingResultsToCachedQueries(r),this.callOnDeltaAppliedCallbacks(n),{allChildrenDonePromise:Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(n,t,s)))).then((()=>{for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}))}}getLocalItemEntry(e){return this.itemHandler.entries.getByEntryId(e)}getLocalItemEntryByItemId(e,t){return this.itemHandler.entries.get(e,t)}containsLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)}expandColumnsWithRequiredColumns(e,t){const s=this.dependencies.requestColumnExpansionFactory.construct();return s.expandWithRequestColumns(e,t),this.expandColumnExpansionWithRequiredColumns(e,s,this.cachedQueryHandler.getCachedQueryItemsByItemType(e),this.cachedQueryHandler.getUncachedCollectionsOnChildTransactionsIterator(e))}expandColumnExpansionWithRequiredColumns(e,t,s,n){t.expandWithRequestColumns(e,["id","permissions","modified"]),t.expandWithRequestColumns(e,this.getColumnIdsWithRelations(e));for(const n of s)t.expandWithRequestColumnsTuple(e,n.requestColumnsTuple);for(const e of n)t.expandWithColumnSet(e.entry.columns);return t.get()[e]}getColumnIdsWithRelations(e){const t=this.apiFieldsOnDeleteRule[e]?.own;if(void 0===t)return[];const s=[];for(const e in t)"restrict"!==t[e].onDeleteRule&&s.push(e);return s}callOnDeltaAppliedCallbacks(e){this.onDeltaAppliedCallbacks.forEach((t=>t(e)))}collectActiveItemEntriesBasedOnParentEntry(e,t,s,n){if(!n.has(t)){n.add(t);for(const r of s){if(0===r.children.length)continue;const s=e.itemHandler.lookUpItemField(t,r.id);if(null===s)continue;let i;try{i=e.getLocalItemEntryByItemId(r.apiColumn.itemType,s)}catch(e){continue}this.collectActiveItemEntriesBasedOnParentEntry(e,i,r.children,n)}}}}class nt{entries={};get(e){const t=this.entries;return void 0!==t[e]?t[e]:t[e]=new Map}*[Symbol.iterator](){for(const e in this.entries)yield[e,this.entries[e]]}}class rt{static addItemsToMatchingResults(e,t,s,n){let r=e.get(t);void 0===r&&e.set(t,r={true:new Set});let i=r[s];void 0===i&&(i=r[s]=new Set);for(const e of n)i.add(e)}matchItemsInDeletedChangesDelta(e,t,s){const n=new nt;for(const s of e.getDeletedItemTypesIterator()){const r=t(s);if(null===r)continue;const i=e.getDeletedItemEntriesIterator(s),o=n.get(s);for(const e of i)r.doMatch(e,this.constructGetField(e),o)}for(const e of n){const t=s.get(e[0]);for(const s of e[1].entries()){const e=s[1];rt.addItemsToMatchingResults(t,s[0],"false",void 0===e.maybe?e.true:[...e.true,...e.maybe])}}}matchItemsToQueryGraph(e,t,s,n={true:new Set}){const r=new Map([[t.string,n]]);for(const t of s)e.doMatch(t,this.constructGetField(t),r);return n}matchEmptyItemsInUpdatedChangesDelta(e,t,s){const n=new nt;for(const n in e){const r=e[n];if(null!==r.previous)continue;const i=r.entry,o=t(i.itemType);null!==o&&o.doMatch(i,this.constructGetField(i),s.get(i.itemType))}for(const e of n){const t=s.get(e[0]);for(const s of e[1].entries())rt.addItemsToMatchingResults(t,s[0],"true",s[1].true)}}matchItemsInUpdatedChangesDelta(e,t,s){const n={};for(const s in e){const r=e[s];if(null===r.previous)continue;const i=r.entry,o=i.itemType,a=t(o);if(null===a)continue;let c=n[o];void 0===c&&(c=n[o]={current:new Map,updated:new Map}),a.doMatch(i,(e=>{const t=r.previous[e];return void 0!==t?t:this.lookUpItemField(i,e)}),c.current),a.doMatch(i,(e=>{const t=r.changes.fields[e];return void 0!==t?t:this.lookUpItemField(i,e)}),c.updated)}for(const e in n){const t=n[e],r=s.get(e);for(const e of t.updated){const t=e[0],s=e[1];void 0!==s.maybe&&rt.addItemsToMatchingResults(r,t,"maybe",s.maybe),rt.addItemsToMatchingResults(r,t,"true",s.true)}for(const e of t.current){const s=e[0],n=e[1],i=t.updated.get(s),o=void 0===n.maybe?n.true:[...n.true,...n.maybe];if(void 0===i){rt.addItemsToMatchingResults(r,s,"false",o);continue}const a=[];for(const e of o)i.true.has(e)||void 0!==i.maybe&&i.maybe.has(e)||a.push(e);a.length>0&&rt.addItemsToMatchingResults(r,s,"false",a)}}}matchItemsInCreatedChangesDelta(e,t,s){for(const n in e){const r=e[n],i=r.entry.itemType,o=t(i);null!==o&&o.doMatch(r.entry,(e=>r.fields[e]),s.get(i))}}}const it={get:(e,t)=>{const s=e.itemHandler.lookUpItemField(e.itemEntry,t);return"displayname"!==t||void 0!==s&&""!==s?s:e.itemHandler.getDisplayName(e.itemEntry)}},ot={get:(e,t)=>e.itemHandler.getItemFieldSignal(e.itemEntry,t)};class at extends rt{columnCache;errorHandler;requestColumnExpansionFactory;requestColumnsOperationsCacheFactory;itemEntryService;transaction;entries;itemChanges={};itemFieldSignals={};constructor(e,t,s,n,r,i,o){super(),this.columnCache=e,this.errorHandler=t,this.requestColumnExpansionFactory=s,this.requestColumnsOperationsCacheFactory=n,this.itemEntryService=r,this.transaction=i,this.entries=o.construct(this.transaction)}getItemFieldSignal(e,t){this.itemFieldSignals[e.id]??={};let s=this.itemFieldSignals[e.id][t];return void 0===s&&(s=this.itemFieldSignals[e.id][t]=(0,l.signal)(this.lookUpItemField(e,t))),s}getDisplayName(e){let t="";switch(e.itemType){case"Contact":if("bedrijf"===this.lookUpItemField(e,"type")){t=this.lookUpItemField(e,"bedrijf");break}t=this.itemEntryService.getFullName(this.lookUpItemField(e,"voornaam"),this.lookUpItemField(e,"tussenvoegsel"),this.lookUpItemField(e,"naam"));break;case"Medewerker":case"Person":t=this.itemEntryService.getFullName(this.lookUpItemField(e,"voornaam"),this.lookUpItemField(e,"tussenvoegsel"),this.lookUpItemField(e,"achternaam"));break;default:t=this.lookUpItemField(e,this.itemEntryService.getTitleField(e.itemType))}return t??""}constructGetField(e){return t=>this.lookUpItemField(e,t)}constructFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},it)}constructSignalFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},ot)}lookUpItemField(e,t){let s=this.transaction;for(;s;){const n=s.itemHandler.itemChanges[e.id];if(void 0!==n){const e=n[t];if(void 0!==e)return e}s=s.parent}}collectFields(e){const t={};for(const s of e.columns.main)t[s.id]=this.lookUpItemField(e,s.id);return t}copyTransactionItemEntryChanges(e,t){return J.copyFields(e,{},t.columns.main)}async resolveDerivedValues(e,t,s,n){const r=[],i=[];for(const o of t){const t=o.children;if(0===t.length)continue;1===t.length&&"id"===t[0].apiColumn.type&&this.errorHandler.logWarning("You should use fields[columnId] instead of derived['columnId>id'] to get the ID of a derived item");const a=new Set;for(const t of e){let e=n?.updated[t.id]?.changes.fields[o.id];if(void 0===e&&(e=this.transaction.itemHandler.lookUpItemField(t,o.id)),void 0===e)throw new Error(`Encountered missing ${o.id} field of ${t.itemType} item when resolving derived value`);null!==e&&a.add(e)}0!==a.size&&(i.push(o),r.push(this.fetchItemEntryData(o.itemType,a,this.requestColumnsOperationsCacheFactory.construct(o.itemType,t.map((e=>e.id))),s,!0)))}if(0===i.length)return;const o=await Promise.all(r),a=[];for(let e=0;e<i.length;e++)a.push(this.resolveDerivedValues(o[e],i[e].children,s,n));await Promise.all(a)}getDerivedValues(e,t){const s=this.getDerivedEntry(e,t);if(null!==s)return this.collectFields(s)}getDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(o));const n=this.getDerivedEntry(e,t.slice(0,-1));if(null===n){if(void 0!==s)return s;const n=t.join(">"),r=this.getDerivedColumn(e.itemType,t);if(void 0!==r)return r.default;throw new Error(`Derived columns for path ${n} couldn't be found. Did you request them?`)}return this.lookUpItemField(n,t[t.length-1])}clearItemEntry(e){this.entries.clear(e);const t=this.itemChanges[e.id];return delete this.itemChanges[e.id],delete this.itemFieldSignals[e.id],t}createItemEntry(e){const t=new u(e.columns.itemType,e.itemId,e.columns);return this.entries.add(t),t}getDerivedEntry(e,t){let s=e;for(const e of t){const t=s.columns.response[s.itemType][e];if(void 0===t)throw new Error(`Column '${e}' not found on entry in ItemResource.getDerivedValue`);if(!he.isItemColumn(t)||null===t.itemType)throw new Error(`Column '${e}' doesn't have children in ItemResource.getDerivedValue`);const n=this.lookUpItemField(s,e);if(null===n)return null;s=this.transaction.getLocalItemEntryByItemId(t.itemType,n)}return s}getDerivedColumn(e,t){for(let s=0;s<t.length;s++){const n=t[s],r=this.columnCache.getColumn(e,n);if(void 0===r){const s=t.join(">");throw new Error(`Column '${n}' not found in path '${s}' for itemType '${e}'`)}if(s===t.length-1)return r;if(!he.isItemColumn(r)||null===r.itemType){const s=t.join(">");throw new Error(`Column '${n}' doesn't have children in path '${s}' for itemType '${e}'`)}e=r.itemType}throw new Error("Invalid path given in getDerivedColumn")}}class ct extends at{transaction;itemFieldLastModified={};constructor(e,t,s,n,r,i,o){super(t,e,r,i,n,o,s),this.transaction=o}createItemEntry(e){const t=super.createItemEntry(e);this.itemChanges[t.id]=e.fields,this.itemFieldLastModified[t.id]={};const s=e.fields.modified?.valueOf()??Z.default.now();for(const n in e.fields){const r=e.columns.response[t.itemType][n];void 0!==r&&"aggregate"!==r.fieldtype&&"method"!==r.fieldtype&&(this.itemFieldLastModified[t.id][n]=s)}return t}async fetchItemEntryData(e,t,s,n,r){const i=[],o=this.requestColumnExpansionFactory.construct(),c=[],l=a.TempItemTypeWithoutFixedIds.includes(e);for(const r of t){if(l){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)){c.push(t);continue}throw new p(e,r)}if(ge.isLocalId(r))throw new p(e,r);if(this.entries.contains(e,r)){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)&&!t.isOutdated()){if(!n||!s.hasAggregateColumns()){c.push(t);continue}i.push(r),o.expandWithRequestColumnsTuple(e,s.getAggregateColumns())}else{const n={object:t.columns.request,string:he.createRequestColumnSetId(t.columns.request)};i.push(r);const a=s.getColumnsMergedWithTuple(n,this.transaction);o.expandWithRequestColumnsTuple(e,t.isOutdated()?a.merged:a.difference),t.markUpToDate()}}else i.push(r),o.expandWithRequestColumnsTuple(e,s.getRequestColumnsTuple(this.transaction))}if(0===i.length)return c;await this.transaction.requestBufferManager.fetchByIds(e,i,o.get()[e],{forceFlush:r});for(const t of i)c.push(this.entries.get(e,t));return c}processUpdatesFromDelta(e,t){for(const s in e){const n=e[s],r=this.processItemEntryChanges(n);t.setItemUpdated(n.entry,n.changes.fields,r,n.mode)}}itemIsDeleted(){return!1}processItemEntryChanges(e){const t=e.entry,s=e.changes.fields;void 0===this.itemChanges[t.id]&&(this.itemChanges[t.id]={}),void 0===this.itemFieldLastModified[t.id]&&(this.itemFieldLastModified[t.id]={});const n=e.changes.columnExpansions;if(void 0!==n&&n.length>0)for(const e of n)t.columns=e.run(t.columns).merged;const r=this.itemChanges[t.id],i=s.modified?.valueOf(),o=t.columns.response[t.itemType];let a=null;for(const n in s){const c=o[n];if(void 0===c)continue;if(void 0===r[n]){r[n]=J.clone(c.type,s[n]);continue}const l=this.itemFieldLastModified[t.id][n];void 0!==l&&void 0!==i&&l>=i&&!c.isDisplayname&&!he.isAggregateColumn(c)||(J.compareFields(c.type,s[n],r[n])||("QUERY"===e.mode&&(e.mode="CLEAR_WHEN_SAME"),null===a&&(a={}),a[n]=r[n],r[n]=J.clone(c.type,s[n]),"aggregate"!==c.fieldtype&&"method"!==c.fieldtype&&(this.itemFieldLastModified[t.id][n]=i??Z.default.now())))}if(void 0!==s.id){const e=t.itemId;t.updateId(s.id),this.entries.updateItemId(t,e)}return a}}class lt{dependencies;transaction;collections={};constructor(e,t){this.dependencies=e,this.transaction=t}createQuery(e){return(new Ke).run(e)}async matchItemsToCollectionQueries(e,t,s){const n={};let r;if(void 0!==t){for(const s of t)n[s]=this.getMergedQueryGraph(s,e._queryResults[s]);r=e=>{const t=n[e];return void 0!==t?t:null}}else r=t=>{const s=n[t];return void 0!==s?s:n[t]=this.getMergedQueryGraph(t,e._queryResults[t])};const i=new nt;this.transaction.itemHandler.matchItemsInDeletedChangesDelta(e,r,i),this.transaction.itemHandler.matchItemsInUpdatedChangesDelta(e.updated,r,i),s&&this.transaction.itemHandler.matchEmptyItemsInUpdatedChangesDelta(e.updated,r,i),this.transaction.itemHandler.matchItemsInCreatedChangesDelta(e.created,r,i);const o=[];for(const t of i){const s=t[0];for(const n of t[1].entries()){const t=n[1];void 0!==t.maybe&&o.push(this.processMaybeMatches(s,n[0],t,e))}}return await Promise.all(o),i}applyMatchingResultsToCachedQueries(e){for(const t of e){const e=t[0];for(const s of t[1].entries()){const t=this.getCachedQueryItem(e,s[0]);if(void 0===t)continue;const n=s[1];t.handleMatchedItemEntries(n.true,n.false)}}}setCachedQuery(e,t,s,n,r){return this.getOrCreateCollectionTuple(e,t.string).cachedQueryItem=this.constructCachedQuery(e,t,n,s,r)}__fetchCachedQueryItem(e,t){const s=this.createQueryFromRootOptions(t);return this.expandColumnsWithQueryColumns(e,t,s.object),this.__fetchItemEntriesByQueryData(e,t,this.dependencies.requestColumnsOperationsCacheFactory.construct(e,t.columns),s)}getCachedQueryItemsByItemType(e){const t=this.collections[e];if(void 0===t)return[];const s=[];for(const e in t){const n=t[e].cachedQueryItem;void 0!==n&&s.push(n)}return s}cloneCachedQuery(e,t=!0){const s=this.setCachedQuery(e.itemType,e.query,e.requestColumnsTuple,e.items.slice(),e.queryGraph);return t&&s.resolve(),s}clearCachedQueryItem(e,t){void 0!==this.collections[e]?.[t]&&(delete this.collections[e][t].cachedQueryItem,this.clearCollectionTupleIfEmpty(e,t))}clearLinkedCachedQueryItems(e){const t=this.dependencies.linkTreeService.get()[e.itemType];for(const s in t){const n=this.collections[s];if(void 0===n)continue;const r=t[s],i={linkedTo:e.itemType,query:{id:e.itemId}};let o;switch(r.type){case c.ITEMTABLE:o={conditions:[{itemtype:e.itemType},{item:e.itemId}]};break;case c.DIRECT:o={[r.field]:e.itemId}}const a=this.createQuery(i).string,l=this.createQuery(o).string;delete n[a],delete n[l]}}getCachedQueryItem(e,t){return this.collections[e]?.[t]?.cachedQueryItem}getMergedQueryGraph(e,t){const s=this.getQueryGraphsForItemType(e);if(0===s.size)return null;const n=new Ve;for(const e of s)n.copyEdgesFrom(e,void 0);if(void 0!==t){const s=new je("id",Le,this.dependencies.errorHandler);for(const n in t){const r=this.getCollectionQueries(e,n);for(const e of t[n])for(const t of r)s.connectLeafNode(e,t)}n.connectBranchNode(s)}return n}*getCachedQueryItemIterator(){const e=this.collections;for(const t in e)for(const s in e[t]){const n=e[t][s].cachedQueryItem;void 0!==n&&(yield n)}}queryIsCacheable(e,t){return!e.preventCaching&&void 0===e.order?.limit&&t.isLocallyMatchable}createBatchQuery(e,t,s){return this.createQuery(this.createQueryFromChildOptions(e,t,s))}createQueryFromChildOptions(e,t,s){if("function"==typeof s)return s(t);const n={linkedTo:e,query:{id:1===t.length?t[0]:t}};return void 0===s?n:this.dependencies.queryService.addAndCondition(s,n)}createQueryFromRootOptions(e){const t=e.parent;let s;if(void 0===t)s=e.query;else{const n={linkedTo:t.itemType,query:{id:t.itemId}};s=void 0===e.query?n:this.dependencies.queryService.addAndCondition(e.query,n)}return this.createQuery(s)}expandColumnsWithQueryColumns(e,t,s){if(!0===t.columns)return;const n=this.dependencies.requestColumnExpansionFactory.construct();n.expandWithRequestColumns(e,t.columns),n.expandWithRequestColumns(e,new ze(this.dependencies.linkTreeService,e).run(s)),void 0!==t.order&&n.expandWithRequestColumns(e,[t.order.field]),t.columns=n.get()[e]}getOrCreateCollectionTuple(e,t){let s=this.collections[e];void 0===s&&(s=this.collections[e]={});const n=s[t];return void 0===n?s[t]={}:n}clearCollectionTupleIfEmpty(e,t){const s=this.collections[e];void 0===s[t].cachedQueryItem&&delete s[t]}getQueryGraphsForItemType(e){const t=this.collections[e],s=new Set;if(void 0===t)return s;for(const e in t){const n=t[e].cachedQueryItem;void 0!==n&&s.add(n.queryGraph)}return s}getCollectionQueries(e,t){const s=this.collections[e]?.[t]?.cachedQueryItem;return void 0!==s?new Set([s.query]):new Set}constructCachedQuery(e,t,s,n,r=this.createQueryGraph(e,t)){return new h(e,t,r,s,n)}createQueryGraph(e,t){return this.dependencies.graphQueryParserFactory.construct(e,t).run(t.object)}}class ut extends lt{transaction;constructor(e,t){super(e,t),this.transaction=t}hasActiveCollectionsForQuery(e,t){const s=this.transaction.getDescendantsIterator();for(const n of s){const s=n.cachedQueryHandler.getCollectionResources(e,t);for(const e of s)return!0}return!1}markCachedQueriesOutdatedInAllTransactions(e,t){const s=s=>{const n=s.getCachedQueryItem(e,t);n?.markOutdated()},n=e=>{for(const t of e)s(t.cachedQueryHandler),n(t.getChildren())};s(this),n(this.transaction.getChildren())}*getUncachedCollectionsOnChildTransactionsIterator(e){const t=[],s=e=>{for(const n of e)t.push(n),s(n.getChildren())};s(this.transaction.getChildren());for(const s of t){const t=s.cachedQueryHandler.getUncachedCollectionsIterator(e);for(const e of t)yield e}}__maybeExpandCachedQuery(e,t,s,n){const r=this.getCachedQueryItem(e,t);if(void 0===r)throw new Error(`ServerCachedQueryHandler: tried to expand non-existing query: ${e} - ${t}`);return!s.tupleContainsAllColumns(r.requestColumnsTuple,this.transaction)||r.itemsResolved()&&s.hasAggregateColumns()?this.transaction.requestBufferManager.fetchByQuery(r.itemType,void 0===n?r.query:n,s.getColumnsMergedWithTuple(r.requestColumnsTuple,this.transaction).merged).then((()=>(r.requestColumnsTuple=s.getColumnsMergedWithTuple(r.requestColumnsTuple,this.transaction).merged,r.promise))):r.promise}async __fetchItemEntriesByQueryData(e,t,s,n,r){if(!this.queryIsCacheable(t,n)){const r=s.getRequestColumnsTuple(this.transaction),i=await this.transaction.requestBufferManager.fetchByQuery(e,n,r,{limit:void 0!==t.order?.limit?t.order:void 0,flushTimeout:0}),o=[];for(const t of i.response.links[e])o.push(this.transaction.itemHandler.entries.get(e,t));const a=this.constructCachedQuery(e,n,o,r);return a.resolve(),a}let i=this.getCachedQueryItem(e,n.string);if(void 0!==i){if(!i.isOutdated())return this.__maybeExpandCachedQuery(e,n.string,s,r?.batchQuery);i.markUpToDate()}else i=this.setCachedQuery(e,n,s.getRequestColumnsTuple(this.transaction),[],r?.batchQueryGraph);return this.transaction.requestBufferManager.fetchByQuery(e,r?.batchQuery??n,s.getRequestColumnsTuple(this.transaction)).then((()=>(i.requestColumnsTuple=s.getColumnsMergedWithTuple(i.requestColumnsTuple,this.transaction).merged,i.resolve(),i)),(e=>{throw i.reject(e),e}))}processMaybeMatches(e,t,s){if(0===s.maybe.size)return;const n=this.getCachedQueryItem(e,t);void 0===n?this.dependencies.errorHandler.logError(new Error("ServerCachedQueryHandler: `processMaybeMatches()` called for query without associated cached query item")):n.markOutdated()}}var dt;!function(e){e.warning="warning",e.error="error"}(dt||(dt={}));const ht=8e3;class mt extends tt{id;errors={item:(0,l.signal)({}),global:(0,l.signal)({})};firstError=(0,l.computed)((()=>{const e=this.errors.global();for(const t in e){const s=e[t];if(s.level===dt.error)return s}const t=this.errors.item();for(const e in t){const s=t[e];for(const e in s){const t=s[e];for(const e in t){const s=t[e];if(s.level===dt.error)return s}}}}));firstErrorString=(0,l.computed)((()=>this.firstError()?.string));rootItemSignal=(0,l.signal)(void 0);rootItemToBeSet;tabRequestParameters={};hasChangesSignal=(0,l.signal)(!1);aiChanges=(0,l.signal)({created:new Set,deleted:new Set,fields:{}});parent;itemHandler;cachedQueryHandler;eventHandler;validator;validatorWithDependencies;options;lastSaveSignal=(0,l.signal)(null);autoSaveEffect;autoSaveInFlightSignal=(0,l.signal)(!1);actionsQueue=Promise.resolve();pendingActionLabels=new Map;transactionStateSignal=(0,l.signal)("Ready");isPendingSignal=(0,l.computed)((()=>{const e=this.transactionStateSignal();return"Pending"===e||"Saving"===e||this.childrenSignal().some((e=>e.isPendingSignal()))}));isDestroyedSignal=(0,l.signal)(!1);isValidSignal=(0,l.computed)((()=>!this.isPendingSignal()&&!0!==this.validator?.isPendingSignal()&&!0!==this.validatorWithDependencies?.isPendingSignal()&&void 0===this.firstError()));constructor(e,t,s,n,r,i){super(e,t),this.id=n,this.options={transparent:!1,autoSave:!1,...i},this.validator=void 0===r?void 0:r.construct(this),this.parent=s,this.itemHandler=new ft(e,this),this.cachedQueryHandler=new yt(e,this),this.eventHandler=new Ie(e.errorHandler),this.options.autoSave&&(0,l.untracked)((()=>{this.autoSaveEffect=(0,l.effect)((e=>{const t=this.rootItemSignal();if(void 0===t||t.isLocalSignal())return;if(this.autoSaveInFlightSignal()||!this.hasChangesSignal()||!this.isValidSignal())return;const s=setTimeout((()=>{this.autoSaveInFlightSignal.set(!0),this.save().finally((()=>{this.autoSaveInFlightSignal.set(!1)}))}),2500);e((()=>clearTimeout(s)))}),{manualCleanup:!0,injector:this.dependencies.rootInjector})}))}enqueueAction(e,t,s){void 0!==s&&this.transactionStateSignal.set(s),this.pendingActionLabels.set(t,e);const n=N();return this.actionsQueue=this.actionsQueue.then((()=>{const s=V(ht),r=t(s.pauseTimeout);return r.finally((()=>{this.pendingActionLabels.delete(t),0===this.pendingActionLabels.size&&this.transactionStateSignal.set("Ready")})).then(n.resolve,n.reject),Promise.race([r.catch((()=>{})),s.promise]).then((t=>{t===O&&this.dependencies.errorHandler.logError(new Ti(e,[...this.pendingActionLabels.values()]))}))})),n.promise}get rootItem(){return(0,l.untracked)((()=>this.rootItemSignal()))}get hasChanges(){return(0,l.untracked)((()=>this.hasChangesSignal()))}get isValid(){return(0,l.untracked)((()=>this.isValidSignal()))}attachValidator(e){if(void 0!==this.validatorWithDependencies)throw new Error("TransactionCache: validator already attached");if(void 0===e.dependencies)throw new Error("TransactionCache: validator dependencies are undefined. Did you call `fetchDependencies` first?");this.validatorWithDependencies=e;const t={item:{[e.dependencies.rootItem.itemType]:[new Pt(e.dependencies.rootItem,this.itemHandler,{},void 0,!1,!0)]},collection:{}},s=e=>{(t.collection[e.itemType]??=[]).push({addedItems:e.items,removedItems:[],changedItems:[],collectionResource:e});for(const t of e.items)for(const e in t.children)s(t.children[e])};for(const t in e.dependencies.rootItem.children)s(e.dependencies.rootItem.children[t]);e.validate(t.collection,t.item,!1)}isPending(){return(0,l.untracked)((()=>this.isPendingSignal()))}setPending(e,t){return this.enqueueAction("setPending","function"==typeof e?s=>e((e=>this.doApplyChangesFromUser(e,s,t))):()=>e,"Pending")}createChild(e,t,s){if(this.options.transparent)return this.parent.createChild(e,t,s);const n=new mt(this.dependencies,this.core,this,e,t,s);return(0,l.untracked)((()=>this.childrenSignal.update((e=>[...e,n])))),n}createBusinessLogicChild(){return new mt(this.dependencies,this.core,this,`${this.id??""}-business-logic-child`)}destroy(){void 0!==this.rootItem&&this.dependencies.lockService.deleteLock(this.rootItem),this.eventHandler.clear(),this.parent.onChildDestroy(this),this.isDestroyedSignal.set(!0),this.autoSaveEffect?.destroy()}isDestroyed(){return(0,l.untracked)((()=>this.isDestroyedSignal()))}expandCollectionResource(e,t){if(e.transaction!==this)throw new Error("TransactionCache: tried to expand collection resource on different transaction");const s=e.entry.itemType;return this.cachedQueryHandler.__fetchItemEntriesByQueryData(s,e.options,this.dependencies.requestColumnsOperationsCacheFactory.construct(s,t),e.entry.query).then((()=>(e.entry.expandColumns(this.dependencies.columnExpansionFactory.construct(s,t,this.dependencies.columnCache.retrieve(s,t).cached)),e)))}expandCollectionResources(e,t,s){if(!S(t))return Promise.resolve({});const n=[];for(const e in t){const s=t[e];if(s.transaction!==this)throw new Error("TransactionCache: tried to expand collection resource on different transaction");const r=s.options;if(n.push({options:r,query:s.entry.query}),r.parent.itemType!==n[0].options.parent.itemType)throw new Error("TransactionCache: invalid collection map passed to expandCollectionResources")}const r=this.dependencies.requestColumnsOperationsCacheFactory.construct(e,s),i={batchQuery:this.cachedQueryHandler.createBatchQuery(n[0].options.parent.itemType,n.map((e=>e.options.parent.itemId)),n[0].options.query)};return Promise.all(n.map((t=>this.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t.options,r,t.query,i)))).then((()=>{const n=this.dependencies.columnExpansionFactory.construct(e,s,this.dependencies.columnCache.retrieve(e,s).cached);for(const e in t)t[e].entry.expandColumns(n);return t}))}registerFieldChangeCallback(e,t,s){return this.itemHandler.registerFieldChangeCallback(e,t,s)}createChangesDelta(e=!0){return this.dependencies.changesDeltaFactory.construct(e)}getFirstErrorString(){return(0,l.untracked)((()=>this.firstErrorString()))}_setGlobalError(e,t,s,n){if(!t)return void this.clearGlobalError(e);const r=this.errors.global();r[e]={string:s(),level:n},this.errors.global.set({...r})}_setItemError(e,t,s,n,r,i,o,a){if(!n)return void this.clearItemError(e,t,s);const c=this.errors.item();q(c,[e,t,s],[{},{},{fieldString:r(),string:i(),level:o,location:a}],!0),this.errors.item.set({...c})}async applyChangesFromParent(e,t=!1,s){if(e.isEmpty()&&void 0===s)return;this.handleCascadingDeletes(e);const n=this.dependencies.changesDeltaFactory.constructParentDelta(e);if(void 0!==s){for(const t in s)for(const n in s[t]){const r=s[t][n],i=Number(n);let o;try{o=this.getLocalItemEntryByItemId(t,r)}catch(e){this.dependencies.errorHandler.logError(e);continue}this.itemHandler.updateLocalItemIdReferences(o.itemType,i,r,e)}this.cachedQueryHandler.updateLocalItemIdReferences(s)}for(const t in e.created){const s=e.created[t];n.setItemCreated(s.entry,s.fields),this.itemHandler.entries.clear(s.entry),this.itemHandler.maybeSetRootItem(s.entry)}this.itemHandler.processUpdatesFromDelta(e.updated,!1,n);for(const t of e.getDeletedItemEntriesIterator())n.setItemDeleted(t),this.itemHandler.removeFromDeletedItems(t),this.rootItem===t&&this.eventHandler.executeCallbacks("onRootItemDelete",(e=>e()),!0);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(n,n._queryItemTypeSet,!1),i=await this.cachedQueryHandler.applyMatchingResultsToCollections(r);if(this.runChangesListenersAndValidators(i,n,s,t),this.clearChildCollectionResources(i),this.detectChanges(!0),void 0!==this.validator||void 0!==this.validatorWithDependencies){this.clearGlobalError();try{this.validator?.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}}await Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(n,t,s))));for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}applyChangesDelta(e,t=!1){this.isDestroyed()&&this.dependencies.errorHandler.logWarning(`TransactionCache: tried to apply changes to destroyed transaction with id: '${this.id}'`);const s=N();return this.enqueueAction("applyChangesDelta",(n=>this.doApplyChangesFromUser(e,n,t).then((e=>(s.resolve(e),e.allChildrenDonePromise))).catch((e=>s.reject(e))))),s.promise}async doApplyChangesFromUser(e,t,s){if(e.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};await this.fetchLock();for(const t in e.restored){const s=e.restored[t];this.itemHandler.removeFromDeletedItems(s.entry),s.entry.isLocal()?(this.itemHandler.entries.add(s.entry),this.itemHandler.itemChanges[s.entry.id]=s.changes):e.setItemUpdated(s.entry,s.changes)}const n=await this.dependencies.businessLogicManager.handleBusinessLogic(this,e,t);return null===n?{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()}:(this.tabRequestParameters=D(this.tabRequestParameters,n.tabRequestParameters),this.doApplyChangesFromChild(n,s))}async applyChangesDirectly(e){this.handleCascadingDeletes(e);const t=this.dependencies.changesDeltaFactory.constructParentDelta(e);for(const s of e.created){const n=this.processCreatedItem(s,e);null!==n&&t.setItemCreated(n,this.itemHandler.itemChanges[n.id])}await this.expandLocalItemsFromDelta(t.created,e.updated),await this.fetchUpdatedDerivedValuesFromDelta(e,void 0),this.itemHandler.processUpdatesFromDelta(e.updated,!0,t);for(const s of e.getDeleteTuplesIterator())t.setItemDeleted(s.entry),this.itemHandler.addToDeletedItems(s.entry,s.isCascaded);const s=await this.cachedQueryHandler.matchItemsToCollectionQueries(t,void 0,!0);return await this.cachedQueryHandler.applyMatchingResultsToCollections(s),t}getRootTransaction(){return this.parent instanceof st?this:this.parent.getRootTransaction()}getServerCache(){return this.parent.getServerCache()}getCollectionChangesRecursively(e,t){const s=this.cachedQueryHandler.getCachedQueryItem(e,t.string);if(void 0!==s)return s;const n=this.parent.getCollectionChangesRecursively(e,t);return void 0!==n?this.cachedQueryHandler.cloneCachedQuery(n):void 0}isLockable(e=this.rootItem){return void 0!==e&&!this.options.autoSave&&e.isLockable()}async save(e=!1,t={},s,n){this.transactionStateSignal.set("Saving");try{await this.eventHandler.executeCallbacks("onBeforeSave",(e=>e(this)),e)}finally{this.transactionStateSignal.set("Ready")}return this.enqueueAction("save",(()=>this.doSave(e,t,s,n)),"Saving")}async doSave(e=!1,t={},s,n){let r;return this.parent instanceof mt?(await this.parent.applyChangesFromChild(this,D(this.tabRequestParameters,t),this.aiChanges()),r={}):r=await this.parent.applyChangesFromChild(this,s,n),this.tabRequestParameters={},this.isLockable(this.rootItem)&&this.dependencies.lockService.deleteLock(this.rootItem),this.hasChangesSignal.set(!1),this.lastSaveSignal.set((0,Z.default)()),this.aiChanges.set({created:new Set,deleted:new Set,fields:{}}),await this.eventHandler.executeCallbacks("onSaveSuccess",(e=>e(this,r)),e),r}fetchLock(){return this.isLockable(this.rootItem)?this.dependencies.lockService.fetchLock(this.rootItem).then((e=>{if(this.dependencies.lockService.isRemoteLock(e))throw new vi(e.message)})):Promise.resolve()}detectChanges(e=!1,t){return!(!this.hasChanges||e)||(this.itemHandler.detectChanges(t)?(this.hasChangesSignal.set(!0),!0):(this.hasChangesSignal.set(!1),!1))}clearItem(e){this.clearItemEntry(e.entry)}clearItemEntry(e){return this.clearItemError(e.id),super.clearItemEntry(e)}onBeforeSave(e,t,s,n){return this.eventHandler.registerCallback("onBeforeSave",e,t,s,n)}onSaveSuccess(e,t,s,n){return this.eventHandler.registerCallback("onSaveSuccess",e,t,s,n)}onRootItemDeleted(e,t,s,n){return this.eventHandler.registerCallback("onRootItemDelete",e,t,s,n)}getModuleChanges(){if(void 0===this.rootItem)throw new Error("No root item for transaction cache "+this.id);return this.dependencies.moduleChangesCompilationFactory.construct(this).process()}updateItemIdMap(e,t){if(void 0!==t)for(const s in t){const n=t[s];void 0!==e[s]&&(e[n]=e[s],delete e[s])}}async getLinkCollections(e,t,s,n){if(0===t.length)return Promise.resolve({});const r=(await this.cachedQueryHandler.__fetchChildCachedQueryItems(e,t,{[s]:n}))[0].cachedQueryItemTuples,i={[s]:this.dependencies.collectionResourceFactory.constructColumnSet(r[0])},o={},a=[];for(const e of r){const t=this.dependencies.collectionResourceFactory.construct(e,null,this,i);o[e.options.parent.itemId]=t,a.push(t)}return o}getCollection(e,t){return this.cachedQueryHandler.__fetchParentCachedQueryItem(e,t).then((e=>{const s=this.dependencies.collectionResourceFactory.construct(e,null,this);return this.maybeCallInitialChangesListener(t,[s],[]),s}))}async getNewResourceWithId(e,t,s,n=!1,r){r&&(this.rootItemToBeSet={itemType:e,itemId:t});const[i,o]=await Promise.all([this.itemHandler.fetchNewItemEntry(e,t,s),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,[t],s.children)]);let a;const c={};for(const s of i.created)s.itemType!==e||s.itemId!==t?(void 0===c[s.itemType]&&(c[s.itemType]=[]),c[s.itemType].push(s)):a=s;if(void 0===a)throw new Error("The ItemEntry with the requested ItemId was not in the template response");const l=this.createItemResource(a,this.dependencies.collectionResourceFactory.constructChildCollectionResources(o,null,this)[a.itemId],!0,s.changesListener,s.abortSignal);if(!n)return this.maybeCallInitialChangesListener(s,[],[l]),l;const u=this.processLinkedItems(c,s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],[l,...Object.values(u).flat()]),{main:l,linked:u}}getNewResource(e,t,s,n){return this.getNewResourceWithId(e,ge.getLocalId(),t,s,n)}async getItemsByQuery(e,t,s){const n=await this.cachedQueryHandler.__fetchParentCachedQueryItem(e,{...s,query:t});return this.createItemResources(n.cachedQueryItem.items,this.dependencies.collectionResourceFactory.constructChildCollectionResources(n.children,null,this),void 0,s.abortSignal)}async getItemsById(e,t,s){if(0===t.length)return Promise.resolve([]);const[n,r]=await Promise.all([this.itemHandler.fetchItemEntries(e,t,s.columns),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,t,s.children)]),i=this.createItemResources(n,this.dependencies.collectionResourceFactory.constructChildCollectionResources(r,null,this),s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],i),i}async getItemById(e,t,s,n=!1){n&&(this.rootItemToBeSet={itemType:e,itemId:t});const[r,i]=await Promise.all([this.itemHandler.fetchItemEntry(e,t,s.columns),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,[t],s.children)]),o=this.createItemResource(r,this.dependencies.collectionResourceFactory.constructChildCollectionResources(i,null,this)[t],!1,s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],[o]),o}fetchTitle(e,t){return this.itemHandler.fetchTitle(e,t)}async applyChangesFromChild(e,t,s){return this.tabRequestParameters=D(this.tabRequestParameters,t),this.enqueueAction("applyChangesFromChild",(()=>this.doApplyChangesFromChild(e,!1,s)))}mergeAiChanges(e){const t=this.aiChanges(),s=new Set(t.created),n=new Set(t.deleted),r={...t.fields};for(const t of e.created)s.add(t);for(const t of e.deleted)n.add(t);for(const t in e.fields){const s=e.fields[t];if(void 0===s||0===s.size)continue;const n=r[t]=new Set(r[t]);for(const e of s)n.add(e)}this.aiChanges.set({created:s,deleted:n,fields:r})}getAiRequestParameters(e){const t=this.aiChanges(),s=t.created.has(e.id),n=t.fields[e.id];if(s||void 0!==n&&0!==n.size)return{aiTouched:!0,aiTouchedFields:void 0!==n?[...n]:[]}}async doApplyChangesFromChild(e,t,s){const n=e.getDelta();if(n.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};await this.fetchLock();for(const t of e.cachedQueryHandler.getCachedQueryItemIterator())void 0===this.cachedQueryHandler.getCachedQueryItem(t.itemType,t.query.string)&&this.cachedQueryHandler.cloneCachedQuery(t);this.handleCascadingDeletes(n);const r=this.dependencies.changesDeltaFactory.constructParentDelta(n),i=[],o=this.aiChanges(),a=o.created,c=o.deleted,l=o.fields;for(const e in n.created){const s=n.created[e];i.push(this.itemHandler.entries.add(s.entry));const o=this.itemHandler.itemChanges[s.entry.id]=this.itemHandler.copyTransactionItemEntryChanges(s.fields,s.entry);r.setItemCreated(s.entry,o),this.itemHandler.maybeSetRootItem(s.entry),t?a.add(s.entry.id):a.delete(s.entry.id)}await this.expandLocalItemsFromDelta(r.created,n.updated);const u=this.itemHandler.processUpdatesFromDelta(n.updated,!0,r);for(const[e,s]of u)if(t){let t=l[e];void 0===t&&(l[e]=t=new Set);for(const e of s)t.add(e)}else{const t=l[e];if(void 0!==t){for(const e of s)t.delete(e);0===t.size&&delete l[e]}}for(const e of n.getDeleteTuplesIterator())r.setItemDeleted(e.entry),this.itemHandler.addToDeletedItems(e.entry,e.isCascaded),t?c.add(e.entry.id):c.delete(e.entry.id);this.aiChanges.set({created:a,deleted:c,fields:l}),void 0!==s&&this.mergeAiChanges(s);const d=await this.cachedQueryHandler.matchItemsToCollectionQueries(r,void 0,!0),h=await this.cachedQueryHandler.applyMatchingResultsToCollections(d);if(this.runChangesListenersAndValidators(h,r,void 0,!1),this.clearChildCollectionResources(h),void 0!==this.validator)try{this.validator.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}return this.detectChanges(!0,n),{changesDelta:n,created:i,allChildrenDonePromise:Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(r)))).then((()=>{for(const e of n.getDeleteTuplesIterator())this.clearItemEntry(e.entry)}))}}getLocalItemEntry(e){return this.itemHandler.entries.containsByEntryId(e)?this.itemHandler.entries.getByEntryId(e):this.parent.getLocalItemEntry(e)}getLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)?this.itemHandler.entries.get(e,t):this.parent.getLocalItemEntryByItemId(e,t)}containsLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)||this.parent.containsLocalItemEntryByItemId(e,t)}getDelta(){const e=this.dependencies.changesDeltaFactory.constructChildDelta();for(const t of this.itemHandler.getItemEntriesWithChangesIterator())if(this.itemHandler.entries.contains(t.itemType,t.itemId)){const s=this.itemHandler.collectFields(t);t.updateId(s.id),e.setItemCreated(t,s)}else e.setItemUpdated(t,this.itemHandler.itemChanges[t.id],"KEEP_WHEN_DIFFERENT");for(const t in this.itemHandler.deletedItems)for(const s of this.itemHandler.deletedItems[t])e.setItemDeleted({entry:s.entry,changes:this.itemHandler.itemChanges[s.entry.id],isCascaded:s.isCascaded});return e}createItemResource(e,t=void 0,s,n,r){const i=this.dependencies.itemResourceFactory.construct(e,this,s,r);return i.setChildCollectionResources(t),void 0!==r&&r.aborted?(i.clearResource(),i):(void 0!==n&&i.registerChangesListener(n),this.itemHandler.registerItemResource(i),i)}createItemResources(e,t={},s,n){const r=[];for(const i of e)r.push(this.createItemResource(i,t[i.itemId],!1,s,n));return r}processLinkedItems(e,t,s){const n={};for(const r in e)n[r]=this.createItemResources(e[r],{},t,s);return n}clearItemError(e,t,s){void 0!==e?void 0!==t?void 0!==s?this.errors.item.update((n=>void 0===n[e]?.[t]?n:(delete n[e][t][s],S(n[e][t])||delete n[e][t],S(n[e])||delete n[e],{...n}))):this.errors.item.update((s=>s[e]?(delete s[e][t],S(s[e])||delete s[e],{...s}):s)):this.errors.item.update((t=>(delete t[e],{...t}))):this.errors.item.set({})}runChangesListenersAndValidators(e,t,s,n){for(const t of e){const e=t.collectionResource;(t.addedItems.length>0||t.removedItems.length>0)&&e.itemsSignal.set([...e.items])}if(void 0!==this.validator)for(const e in t.created){const s=t.created[e];try{this.validator.validateItem(s.entry,s.fields,s.fields,(()=>!0))}catch(e){this.dependencies.errorHandler.notifyError(e)}}const r=new Map,i=this.itemHandler.fieldChangeCallbacks;for(const e in t.updated){const o=t.updated[e],a=o.entry,c=i[a.itemType]?.[a.itemId],l=new Set,u=this.itemHandler.getItemResources(a);let d;for(const e of u)void 0===d&&(d=e),e.getAggregatedChangesListeners(l);if(void 0===this.validator&&void 0===c&&0===l.size)continue;void 0===d&&(d=this.createItemResource(a));const h=new Pt(d,this.itemHandler,o.previous??{},s,n);if(l.size>0)for(const e of l){let t=r.get(e);void 0===t&&r.set(e,t={item:{},collection:{}}),t.item[a.itemType]??=[],t.item[a.itemType].push(h)}if(void 0!==this.validator)try{this.validator.validateItem(a,h.fields,h.previous,h.compareField.bind(h))}catch(e){this.dependencies.errorHandler.logError(e)}if(void 0!==c)for(const e of c)try{e(h)}catch(e){this.dependencies.errorHandler.logError(e)}}for(const i of e)i.collectionResource.triggerCollectionChangesListeners(i,t,s,n,!1,r);for(const e of r.entries())e[0](e[1].collection,e[1].item,n)}clearChildCollectionResources(e){for(const t of e)for(const e of t.removedItems)e.clearChildCollections()}expandLocalItemsFromDelta(e,t){const s={},n={};for(const t in e){const n=e[t].entry;void 0===s[n.itemType]&&(s[n.itemType]=[]),s[n.itemType].push(n)}const r=this.itemHandler.entries;for(const e in t){const n=t[e].entry;r.containsByEntryId(n.id)&&(void 0===s[n.itemType]&&(s[n.itemType]=[]),s[n.itemType].push(n))}for(const e in s){const t=this.cachedQueryHandler.getCachedQueryItemsByItemType(e);if(0===t.length)continue;const s=this.dependencies.requestColumnExpansionFactory.construct();for(const e of t)s.expandWithRequestColumnsTuple(e.itemType,e.requestColumnsTuple);n[e]=s.get()[e]}const i=[];for(const e in n){const t=n[e];i.push(this.itemHandler.expandLocalItemEntries(e,s[e],t,this.dependencies.columnCache.retrieve(e,t).cached,!1))}return Promise.all(i)}clearGlobalError(e){if(void 0===e)return void this.errors.global.set({});const t=this.errors.global();delete t[e],this.errors.global.set({...t})}maybeCallInitialChangesListener(e,t,s){if(void 0===e.changesListener||!0!==e.immediatelyCallChangesListener)return;const n=new Map,r=e=>{e.triggerCollectionChangesListeners({addedItems:e.items,removedItems:[]},null,void 0,!1,!0,n);for(const t of e.items)i(t)},i=e=>{const t=new Set;e.getAggregatedChangesListeners(t);for(const s of t){let t=n.get(s);void 0===t&&n.set(s,t={item:{},collection:{}}),t.item[e.itemType]??=[],t.item[e.itemType].push(new Pt(e,this.itemHandler,{},void 0,!1,!0))}for(const t in e.children)r(e.children[t])};for(const e of t)r(e);for(const e of s)i(e);for(const e of n.entries())e[0](e[1].collection,e[1].item,!1)}}const pt={get:(e,t)=>{const s=e.itemEntry,n=e.itemHandler,r=n.entries.contains(s.itemType,s.itemId)?n:n.transaction.parent.itemHandler,i=r.lookUpItemField(s,t);return"displayname"!==t||void 0!==i&&""!==i?i:r.getDisplayName(s)}};class ft extends at{dependencies;transaction;fieldChangeCallbacks={};deletedItems={};itemResourcesPerEntry=new Map;constructor(e,t){super(e.columnCache,e.errorHandler,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,e.itemEntryService,t,e.itemCacheFactory),this.dependencies=e,this.transaction=t}registerItemResource(e){this.itemResourcesPerEntry.has(e.entry)?this.itemResourcesPerEntry.get(e.entry).push(new WeakRef(e)):this.itemResourcesPerEntry.set(e.entry,[new WeakRef(e)])}*getItemResources(e,t=!1){const s=this.itemResourcesPerEntry.get(e);if(void 0===s)return;let n=!1;for(const e of s){const t=e.deref();void 0!==t?yield t:n=!0}t&&n&&this.cleanUpItemResourcesForEntry(e)}cleanUpItemResourcesForEntry(e){const t=this.itemResourcesPerEntry.get(e);if(void 0===t)return;const s=[];for(const e of t){void 0!==e.deref()&&s.push(e)}s.length!==t.length&&this.itemResourcesPerEntry.set(e,s)}clearItemEntry(e){return this.itemResourcesPerEntry.delete(e),super.clearItemEntry(e)}addToDeletedItems(e,t){if(this.entries.contains(e.itemType,e.itemId))return;const s=e.itemType;void 0===this.deletedItems[s]&&(this.deletedItems[s]=[]);const n=this.deletedItems[s].find((t=>t.entry===e));void 0===n?this.deletedItems[s].push({entry:e,isCascaded:t}):t&&(n.isCascaded=!0)}removeFromDeletedItems(e){const t=this.deletedItems[e.itemType];if(void 0===t)return;const s=t.findIndex((t=>t.entry===e));-1!==s&&t.splice(s,1)}*getDeletedItemsIterator(e){const t=this.deletedItems[e];if(void 0!==t)for(const e of t)yield e.entry}getDeletedItemsAmount(e){const t=this.deletedItems[e];return void 0!==t?t.length:0}constructInitialProxy(e){return new Proxy({itemEntry:e,itemHandler:this},pt)}*getItemEntriesWithChangesIterator(e){for(const t in this.itemChanges)try{const s=this.transaction.getLocalItemEntry(Number(t));if(void 0!==e&&s.itemType!==e)continue;yield s}catch(e){this.dependencies.errorHandler.logError(e)}}processUpdatesFromDelta(e,t,s){const n=new Map;for(const r in e){const i=e[r];if(this.itemIsDeleted(i.entry))continue;const o=this.processItemEntryChanges(i,t);null!==o&&n.set(i.entry.id,new Set(Object.keys(o))),s.setItemUpdated(i.entry,i.changes.fields,o,i.mode)}return n}updateLocalItemIdReferences(e,t,s,n){void 0!==this.fieldChangeCallbacks[e]&&void 0!==this.fieldChangeCallbacks[e][t]&&(this.fieldChangeCallbacks[e][s]=this.fieldChangeCallbacks[e][t],delete this.fieldChangeCallbacks[e][t]);for(const r of this.getItemEntriesWithChangesIterator()){if(r.itemId===s||void 0!==n.updated[r.id]&&"QUERY"!==n.updated[r.id].mode)continue;const i=this.itemChanges[r.id],o=this.itemFieldSignals[r.id];for(const n of r.columns.item.main){if(n.apiColumn.itemType!==e)continue;if(i[n.id]!==t)continue;i[n.id]=s;const r=o?.[n.id];void 0!==r&&r.set(s)}const a=r.columns.response[r.itemType];if("itemtype"in a&&"item"in a&&i.itemtype===e&&i.item===t){i.item=s;const e=o?.item;void 0!==e&&e.set(s)}}}registerFieldChangeCallback(e,t,s){q(this.fieldChangeCallbacks,[e,t],[{},[]]);const n=this.fieldChangeCallbacks[e][t];return n.push(s),()=>{const e=n.indexOf(s);-1!==e&&n.splice(e,1)}}createItemEntry(e){const t=super.createItemEntry(e);return this.itemChanges[t.id]=J.copyFields(e.fields,{},e.columns.main),this.itemChanges[t.id].id=t.itemId,t}formatRequest(e){return void 0===this.itemChanges[e.id]?{}:J.formatRequestLocal(this.itemChanges[e.id],e.columns.main)}detectChanges(e){for(const e in this.deletedItems)if(this.deletedItems[e].length>0)return!0;const t=new Set;if(e)for(const s of e.getDeleteTuplesIterator())t.add(s.entry.id);for(const e in this.itemChanges)if(!t.has(Number(e)))return!0;return!1}detectEntryChanges(e){return void 0!==this.itemChanges[e]}cloneItemEntries(e,t,s={},n){this.dependencies.conversionMapService.batchExpandConversionMap(t,s);const r=[];for(const i of t)r.push(this.cloneItemEntry(e,i,s,n));return r}cloneItemEntry(e,t,s={},n){const r=this.transaction.itemHandler.collectFields(t),i=this.dependencies.conversionMapService.expandConversionMap(t.itemType,t.itemId,s),o=J.copyFields(r,{},t.columns.main);return this.dependencies.conversionMapService.updateItemValues(o,o,t.columns.item.main,s),void 0!==n&&n(t.itemType,o),e._setItemCreated(i,o,t.columns),i}fetchItemEntry(e,t,s){if(null==t)throw new Error("undefined/null id passed to fetchItemEntry");return this.fetchItemEntryData(e,[t],this.requestColumnsOperationsCacheFactory.construct(e,s),!0).then((e=>(this.maybeSetRootItem(e[0]),e[0])))}fetchItemEntries(e,t,s){return this.fetchItemEntryData(e,t,this.requestColumnsOperationsCacheFactory.construct(e,s),!0)}async fetchNewItemEntry(e,t,s){if(this.entries.contains(e,t))throw new Ci(e,t);const n=this.dependencies.requestColumnExpansionFactory.construct();n.expandWithRequestColumns(e,s.columns),void 0!==s.defaultValues&&n.expandWithRequestColumns(e,Object.keys(s.defaultValues));const r=await this.dependencies.templateCache.fetchTemplate(e,t,s.templateOptions,n.get(),s.parent);if(this.entries.contains(e,t))throw new Ci(e,t);const i=this.dependencies.changesDeltaFactory.construct(!1);this.dependencies.itemCreateService.processTemplate(i,e,t,s.parent??null,r,void 0,((t,n)=>{if(t===e&&void 0!==s.defaultValues)for(const e in s.defaultValues)n[e]=s.defaultValues[e]}));const o={};i.created.forEach(((e,t)=>{for(const s of e.columns.root){const n=s.itemType,r=e.fields[s.id];if(void 0===r)throw new Error(`ItemId for derived item of type for ${t}:${s.id} could not be found when fetching derived values for template item.`);if(null===r||ge.isLocalId(r))continue;const i=o[n]??={columns:this.dependencies.requestColumnExpansionFactory.construct(),itemIds:new Set};i.columns.expandWithRequestColumns(s.itemType,s.toRequestColumns()[0][s.id]),i.itemIds.add(r)}}));const a=[];for(const e in o){const t=o[e];a.push(this.fetchItemEntries(e,Array.from(t.itemIds),t.columns.get()[e]))}return await Promise.all(a),this.transaction.applyChangesDelta(i)}async fetchItemEntryData(e,t,s,n,r){const i=this.transaction.getServerCache().itemHandler.entries,o=[],a=[],c=[];for(const n of t)if(i.contains(e,n)){const t=i.get(e,n);s.hasAggregateColumns()||!s.setContainsAllColumns(t.columns,this.transaction)||t.isOutdated()?o.push(n):c.push(t)}else this.entries.contains(e,n)?a.push(n):o.push(n);if(a.length>0){const t=await this.fetchLocalItemEntryData(e,a,s);for(const e of t)c.push(e)}if(o.length>0){const t=await this.transaction.parent.itemHandler.fetchItemEntryData(e,o,s,n,r);for(const e of t)c.push(e)}return c}maybeSetRootItem(e){void 0!==this.transaction.rootItemToBeSet&&this.transaction.rootItemToBeSet.itemType===e.itemType&&this.transaction.rootItemToBeSet.itemId===e.itemId&&(this.transaction.rootItemSignal.set(e),this.transaction.rootItemToBeSet=void 0)}fetchTitle(e,t){const s=this.dependencies.itemEntryService.getTitleField(e);return this.fetchItemEntry(e,t,[s]).then((e=>this.lookUpItemField(e,s)))}expandLocalItemEntries(e,t,s,n,r){if(0===t.length)return Promise.resolve();const i=this.dependencies.columnExpansionFactory.construct(e,s,n);for(const e of t){const t=i.run(e.columns);if(null===t.difference)continue;e.columns=t.merged;const s=this.itemChanges[e.id];if(void 0!==s)for(const n of t.difference.main)void 0===this.lookUpItemField(e,n.id)&&(s[n.id]=J.formatResponseValue(n.apiColumn.type,n.apiColumn.default));else this.errorHandler.logError(new Error(`TransactionItemHandler: expected item changes for '${e.itemType}' item to be present`))}return this.resolveDerivedValues(t,i.aggregateRootColumns(),r)}itemIsDeleted(e){const t=this.deletedItems[e.itemType];return void 0!==t&&t.some((t=>t.entry===e))}clearItemResource(e){const t=this.itemResourcesPerEntry.get(e.entry);if(void 0===t)return;const s=[];for(const n of t){const t=n.deref();void 0!==t&&t!==e&&s.push(n)}this.itemResourcesPerEntry.set(e.entry,s)}processItemEntryChanges(e,t){const s=e.entry;if("QUERY"===e.mode)return null;void 0===this.itemChanges[s.id]&&t&&(this.itemChanges[s.id]={});const n=s.columns.response[s.itemType],r=this.itemChanges[s.id],i="previous"in e?e.previous:null;let o;const c=this.itemFieldSignals[s.id];if(void 0!==c)for(const t in e.changes.fields){const s=c[t];void 0!==s&&s.set(e.changes.fields[t])}if(void 0===r){if(null===i)return null;o=i}else{const t=e.changes.fields,c=this.entries.containsByEntryId(s.id);switch(o={},e.mode){case"CLEAR_ALWAYS":if(c)throw new Error("Cannot clear the fields of a local entry");for(const e in t){if(void 0===r[e]){null!==i&&void 0!==i[e]&&(o[e]=i[e]);continue}const s=n[e];void 0!==s&&(J.compareFields(s.type,t[e],r[e])||(o[e]=r[e]),delete r[e])}for(const e in r){const t=n[e];!1!==t.readOnly&&t.type!==a.ApiEnumApiType.TYPE_LINK&&(J.compareFields(t.type,this.transaction.parent.itemHandler.lookUpItemField(s,e),r[e])||(o[e]=r[e]),delete r[e])}break;case"CLEAR_WHEN_SAME":for(const e in t)void 0!==r[e]&&J.compareFields(n[e].type,t[e],r[e])&&delete r[e];break;case"KEEP_WHEN_DIFFERENT":for(const a in t){if(void 0===r[a]&&null!==i){void 0!==i[a]&&(o[a]=i[a]);continue}const l=n[a];if(void 0===l)continue;const u=c?void 0:this.transaction.parent.itemHandler.lookUpItemField(s,a),d=void 0!==u&&J.compareFields(l.type,t[a],u);if(void 0!==r[a]){if(!J.compareFields(l.type,t[a],r[a])&&(o[a]=r[a],!d)){const s=J.clone(l.type,t[a]);"categorie"===a&&null===s&&this.logEquipmentGroupNullError(e),r[a]=s}d&&delete r[a]}else if(!d){o[a]=u;const s=J.clone(l.type,t[a]);"categorie"===a&&null===s&&this.logEquipmentGroupNullError(e),r[a]=s}}}S(r)||delete this.itemChanges[s.id]}return S(o)?o:null}logEquipmentGroupNullError(e){this.dependencies.errorHandler.logDebug(JSON.stringify(e)),this.dependencies.errorHandler.logError(new Error("TransactionItemHandler: `categorie` being set to `null`"))}async fetchLocalItemEntryData(e,t,s){const n=[],r=[],i=this.requestColumnExpansionFactory.construct();for(const o of t){const t=this.entries.get(e,o);if(n.push(t),s.setContainsAllColumns(t.columns,this.transaction))continue;r.push(t);const a={object:t.columns.request,string:he.createRequestColumnSetId(t.columns.request)};i.expandWithRequestColumnsTuple(e,s.getColumnsMergedWithTuple(a,this.transaction).difference)}if(0===r.length)return n;const o=i.get()[e],a=await this.dependencies.columnHandler.fetch(e,o);return await this.expandLocalItemEntries(e,r,o,a,!0),n}}class yt extends lt{dependencies;collections={};constructor(e,t){super(e,t),this.dependencies=e}*getCollectionResources(e,t,s=!1){const n=this.collections[e]?.[t]?.collectionResources;if(void 0===n)return;let r=!1;for(const e of n){const t=e.deref();void 0===t?r=!0:yield t}s&&r&&this.cleanUpQueryString(e,t)}addCollectionResource(e){const t=this.getOrCreateCollectionTuple(e.itemType,e.entry.query.string);return void 0===t.collectionResources&&(t.collectionResources=[]),t.collectionResources.push(new WeakRef(e)),this.cleanUpQueryString(e.itemType,e.entry.query.string),e}*getUncachedCollectionsIterator(e){const t=this.collections[e];if(void 0!==t)for(const s in t){const n=t[s];void 0===n.cachedQueryItem&&void 0!==n.collectionResources&&(yield*this.getCollectionResources(e,s,!0))}}clearCollectionResource(e){const t=e.entry.itemType,s=e.entry.query.string;if(void 0===this.collections[t]||void 0===this.collections[t][s]||void 0===this.collections[t][s].collectionResources)return;const n=this.collections[t][s].collectionResources,r=[];for(const t of n){const s=t.deref();void 0===s||s.entry===e.entry||r.push(t)}this.collections[t][s].collectionResources=r,this.clearCollectionTupleIfEmpty(t,s,!0)}updateLocalItemIdReferences(e){for(const t in this.collections){const s=this.collections[t];for(const t in s){const n=s[t],r=n.cachedQueryItem;if(void 0!==r){if(this.updateQueryLocalItemIdReferences(r.query,r.queryGraph,e)){const e=this.transaction.parent.cachedQueryHandler;e instanceof ut&&e.cloneCachedQuery(r)}r.query.string!==t&&(s[r.query.string]=s[t],delete s[t])}const i=this.getCollectionResourcesByTuple(n);for(const n of i){if(void 0!==r&&n.entry.query===r.query?r.query.string!==t:this.updateQueryLocalItemIdReferences(n.entry.query,n.queryGraph,e)){const i=n.entry.parent;if(null!==i){const t=e[i.itemType]?.[i.itemId];void 0!==t&&(n.entry.parent={itemType:i.itemType,itemId:t})}void 0===r&&(s[n.entry.query.string]=s[t],delete s[t])}}}}}__maybeExpandCachedQuery(e,t,s,n){const r=this.getCachedQueryItem(e,t);if(void 0===r)throw new Error(`TransactionCachedQueryHandler: tried to expand non-existing query: ${e} - ${t}`);return!s.tupleContainsAllColumns(r.requestColumnsTuple,this.transaction)||r.itemsResolved()&&s.hasAggregateColumns()?this.transaction.parent instanceof st&&this.dependencies.queryService.containsLocalId(r.query.object)?this.mergeColumnsAndExpandLocalItems(r,s):this.transaction.parent.cachedQueryHandler.__maybeExpandCachedQuery(e,t,s,n).then((()=>this.mergeColumnsAndExpandLocalItems(r,s))):r.promise}__fetchItemEntriesByQueryData(e,t,s,n,r){if(!this.queryIsCacheable(t,n))return this.transaction.parent.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t,s,n,r).then((e=>this.resolveLocalCachedQueryItem(e)));const i=this.getCachedQueryItem(e,n.string);if(void 0!==i){if(!i.isOutdated())return this.__maybeExpandCachedQuery(e,n.string,s,r?.batchQuery);i.markUpToDate()}return this.transaction.parent instanceof st&&this.isLocal(t,n.object)?this.resolveLocalCachedQueryItem(i??this.setCachedQuery(e,n,s.getRequestColumnsTuple(this.transaction),[],r?.batchQueryGraph)):this.transaction.parent.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t,s,n,r).then((t=>{const r=this.getCachedQueryItem(e,n.string);return void 0!==r?this.mergeColumnsAndExpandLocalItems(r,s):this.resolveLocalCachedQueryItem(this.cloneCachedQuery(t,!1))}))}isLocal(e,t){return void 0===e.parent?this.dependencies.queryService.containsLocalId(t):ge.isLocalId(e.parent.itemId)}async __fetchChildCachedQueryItemsByItemType(e,t){const s=t.collectionQueryTuples;if(0===s.length)return[];const n=this.dependencies.requestColumnsOperationsCacheFactory.construct(e,s[0].options.columns),r=await Promise.all(s.map((s=>this.__fetchItemEntriesByQueryData(e,s.options,n,s.parsedQuery,t)))),i=[];for(let e=0;e<s.length;e++)i.push({cachedQueryItem:r[e],options:s[e].options,children:null});return i}processChildCollectionOptions(e,t,s,n){if(0===s.length)throw new Error("Expected `parentItemIds` to have at least one element");const r=[],i=new Ve;let o;for(const a of s){const s=this.createQueryFromChildOptions(t,[a],n.query),c={itemType:t,itemId:a};let l;void 0===o?(l=o={...n,parent:c},this.expandColumnsWithQueryColumns(e,o,s)):l={...o,parent:c};const u=this.createQuery(s);i.copyEdgesFrom(this.createQueryGraph(e,u),void 0),r.push({options:l,parsedQuery:u})}return{collectionQueryTuples:r,batchQuery:this.createBatchQuery(t,s,n.query),batchQueryGraph:i}}__fetchParentCachedQueryItem(e,t){const s=this.createQueryFromRootOptions(t);return this.expandColumnsWithQueryColumns(e,t,s.object),this.__fetchParentItemEntriesByQueryData(e,t,this.dependencies.requestColumnsOperationsCacheFactory.construct(e,t.columns),s)}__fetchChildCachedQueryItems(e,t,s){if(0===t.length)return Promise.resolve([]);const n=[];for(const r in s)n.push({itemType:r,linkCollectionOptions:this.processChildCollectionOptions(r,e,t,s[r])});return this.fetchChildCachedQueryItems(n)}async __fetchParentItemEntriesByQueryData(e,t,s,n){const r=await this.__fetchItemEntriesByQueryData(e,t,s,n);return(await this.resolveParentCachedQueryItems(e,[{cachedQueryItem:r,options:t,children:null}]))[0]}async fetchChildCachedQueryItems(e){const t=await Promise.all(e.map((e=>this.__fetchChildCachedQueryItemsByItemType(e.itemType,e.linkCollectionOptions)))),s=[];for(let n=0;n<e.length;n++)s.push(this.resolveParentCachedQueryItems(e[n].itemType,t[n]));const n=await Promise.all(s),r=[];for(let t=0;t<e.length;t++)r.push({itemType:e[t].itemType,cachedQueryItemTuples:n[t]});return r}applyMatchingResultsToCollections(e){const t=[];for(const s of e){const e=s[0];for(const n of s[1].entries()){const s=this.collections[e]?.[n[0]];if(void 0===s)continue;const r=s.cachedQueryItem,i=n[1];void 0!==r&&r.handleMatchedItemEntries(i.true,i.false);const o=this.getCollectionResources(e,n[0],!0);for(const e of o)t.push(e.handleMatchedItemEntries(i.true,i.false,!1))}}return Promise.all(t)}clearCollectionTupleIfEmpty(e,t,s=!1){const n=this.collections[e],r=n[t];void 0!==r?(s||this.cleanUpQueryString(e,t),void 0!==r.cachedQueryItem||void 0!==r.collectionResources&&0!==r.collectionResources.length||delete n[t]):this.dependencies.errorHandler.logError(new Error(`TransactionCachedQueryHandler::clearCollectionTupleIfEmpty, tried to check for empty tuple with tuple not present in cache: ${e} - ${t}`))}getQueryGraphsForItemType(e){const t=this.collections[e],s=new Set;if(void 0===t)return s;for(const n in t){const r=t[n];void 0!==r.cachedQueryItem&&s.add(r.cachedQueryItem.queryGraph);const i=this.getCollectionResources(e,n,!0);if(void 0!==r.collectionResources)for(const e of i)s.add(e.queryGraph)}return s}getCollectionQueries(e,t){const s=this.collections[e]?.[t];if(void 0===s)return new Set;const n=new Set;void 0!==s.cachedQueryItem&&n.add(s.cachedQueryItem.query);let r=!1;if(void 0!==s.collectionResources)for(const e of s.collectionResources){const t=e.deref();void 0!==t?n.add(t.entry.query):r=!0}return r&&this.cleanUpQueryString(e,t),n}async processMaybeMatches(e,t,s,n){if(0===s.maybe.size)return;const r=[...this.getCollectionResources(e,t)];if(0===r.length){const s=this.getCachedQueryItem(e,t);return void 0!==s?void s.markOutdated():void this.dependencies.errorHandler.logError(new Error("TransactionCachedQueryHandler: `processMaybeMatches()` called for query without associated cached query items or collection resources"))}let i=n._getQueryResult(e,t);if(void 0===i){const s=await this.dependencies.apiRequestService.query(e,r[0].entry.query.object,{[e]:["id"]});i=n._setQueryResult(e,t,s.links[e])}for(const e of s.maybe)i.has(e.itemId)?s.true.add(e):(void 0===s.false&&(s.false=new Set),s.false.add(e))}*getCollectionResourcesByTuple(e){const t=e.collectionResources;if(void 0!==t)for(const e of t){const t=e.deref();void 0!==t&&(yield t)}}updateQueryLocalItemIdReferences(e,t,s){if("{}"===e.string)return!1;if(!new Xe(s).run(e.object))return!1;const n=this.createQuery(e.object);return e.string=n.string,e.object=n.object,t.updateLocalItemIdReferences(s),!0}async resolveParentCachedQueryItems(e,t){if(0===t.length)return t;const s=t[0].options.children;if(void 0===s)return t;const n=t.map((e=>e.cachedQueryItem.items.map((e=>e.itemId)))),r=n.flat();if(0===r.length)return t;const i=[];for(const t in s)i.push({itemType:t,linkCollectionOptions:this.processChildCollectionOptions(t,e,r,s[t])});const o=await this.fetchChildCachedQueryItems(i);for(const e of t)e.children=[];for(const e of o){const s=e.itemType,r=e.cachedQueryItemTuples;let i=0;for(let e=0;e<t.length;e++){const o=n[e].length;t[e].children.push({itemType:s,cachedQueryItemTuples:r.slice(i,i+o)}),i+=o}}return t}resolveLocalCachedQueryItem(e){return this.syncCachedQueryWithLocalItems(e).then((()=>(e.resolve(),e)),(t=>{throw void 0!==e&&e.reject(t),t}))}async mergeColumnsAndExpandLocalItems(e,t){if(await e.promise,t.tupleContainsAllColumns(e.requestColumnsTuple,this.transaction))return e;const s=t.getColumnsMergedWithTuple(e.requestColumnsTuple,this.transaction);e.requestColumnsTuple=s.merged;const n=s.difference.object,r=await this.transaction.dependencies.columnHandler.fetch(e.itemType,n);return await this.transaction.itemHandler.expandLocalItemEntries(e.itemType,this.getLocalItemEntries(e),n,r,!1),e}getLocalItemEntries(e){const t=this.transaction.itemHandler.entries;return e.items.filter((e=>t.containsByEntryId(e.id)))}matchItemEntriesWithChangesToCachedQuery(e){const t=[];for(const s of this.transaction.itemHandler.getItemEntriesWithChangesIterator())s.itemType===e.itemType&&t.push(s);const s={true:new Set};if(t.length>0){this.transaction.itemHandler.matchItemsToQueryGraph(e.queryGraph,e.query,t,s);for(const n of t)!s.true.has(n)&&e.items.includes(n)&&(void 0===s.false&&(s.false=new Set),s.false.add(n))}const n=[...this.transaction.itemHandler.getDeletedItemsIterator(e.itemType)];if(n.length>0){void 0===s.false&&(s.false=new Set);for(const e of n)s.false.add(e)}return s}async syncCachedQueryWithLocalItems(e){const t=this.matchItemEntriesWithChangesToCachedQuery(e),s=void 0===t.maybe?[...t.true]:[...t.true,...t.maybe],n=await this.transaction.dependencies.columnHandler.fetch(e.itemType,e.requestColumnsTuple.object);s.length>0&&await this.transaction.itemHandler.expandLocalItemEntries(e.itemType,s,e.requestColumnsTuple.object,n,!1),e.handleMatchedItemEntries(s,t.false)}cleanUpQueryString(e,t){const s=this.collections[e];if(void 0===s)return;const n=s[t];if(void 0===n||void 0===n.collectionResources)return;const r=[];for(const e of n.collectionResources)void 0!==e.deref()&&r.push(e);r.length!==n.collectionResources.length&&(n.collectionResources=r),this.clearCollectionTupleIfEmpty(e,t,!0)}}class gt{transaction;lastCallIdMap={global:(0,l.signal)({}),item:(0,l.signal)({})};isPendingSignal=(0,l.computed)((()=>S(this.lastCallIdMap.global())||S(this.lastCallIdMap.item())));_lastCallId=0;constructor(e){this.transaction=e}isPending(){return(0,l.untracked)((()=>this.isPendingSignal()))}setItemError(e,t,s,n,r,i=r,o=dt.error,a){const c=this.getHash(e,t,s);if(!H(n))return this.deleteLastCall(c,"item"),void this.transaction._setItemError(e,t,s,n,r,i,o,a);const l=this._lastCallId++;this.setLastCall(c,l,"item"),n.then((n=>{this.isLastCall(c,l,"item")&&(this.deleteLastCall(c,"item"),this.transaction._setItemError(e,t,s,n,r,i,o,a))}),(()=>{this.isLastCall(c,l,"item")&&this.deleteLastCall(c,"item")}))}setGlobalError(e,t,s,n=dt.error){if(!H(t))return this.deleteLastCall(e,"global"),void this.transaction._setGlobalError(e,t,s,n);const r=this._lastCallId++;this.setLastCall(e,r,"global"),t.then((t=>{this.isLastCall(e,r,"global")&&(this.deleteLastCall(e,"global"),this.transaction._setGlobalError(e,t,s,n))}),(()=>{this.isLastCall(e,r,"global")&&this.deleteLastCall(e,"global")}))}getHash(...e){return e.join("-")}deleteLastCall(e,t){this.lastCallIdMap[t].update((t=>{if(void 0===t[e])return t;const s={...t};return delete s[e],s}))}setLastCall(e,t,s){this.lastCallIdMap[s].update((s=>({...s,[e]:t})))}isLastCall(e,t,s){return this.lastCallIdMap[s]()[e]===t}}class It extends gt{hasFields(e,t){return t.every((t=>Object.prototype.hasOwnProperty.call(e,t)))}}class Ct extends gt{dependencies}class vt{itemEntryService;updated={};deleted={};_queryResults={};_queryItemTypeSet;constructor(e,t){if(this.itemEntryService=e,void 0!==t)for(const e of t)this.addQueryItemType(e)}addQueryItemType(e){this._queryItemTypeSet??=new Set,this._queryItemTypeSet.add(e)}getUpdatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.updated)}*getItemEntryIdMapIterator(e,t){if(0!==e.length)if(1!==e.length)for(const s in t){const n=t[s];e.includes(n.entry.itemType)&&(yield n)}else{const s=e[0];for(const e in t){const n=t[e];n.entry.itemType===s&&(yield n)}}else for(const e in t)yield t[e]}getUpdatedValue(e,t){const s=this.updated[e.id];if(void 0!==s)return s.changes.fields[t]}hasDeletedItem(e){const t=this.deleted[e.itemType];return void 0!==t&&t.has(e)}hasUpdatedValue(e,t){const s=this.updated[e.id];return void 0!==s&&void 0!==s.changes.fields[t]}*getDeletedItemTypesIterator(){for(const e in this.deleted)yield e}*getDeletedItemEntriesIterator(e){if(void 0===e){for(const e in this.deleted)for(const t of this.deleted[e].keys())yield t;return}const t=this.deleted[e];if(void 0!==t)for(const e of t.keys())yield e}*getDeleteTuplesIterator(e){if(void 0===e){for(const e in this.deleted)for(const t of this.deleted[e].values())yield t;return}const t=this.deleted[e];if(void 0!==t)for(const e of t.values())yield e}isEmpty(){return!S(this.updated)&&!S(this.deleted)}_setQueryResult(e,t,s){return void 0===this._queryResults[e]&&(this._queryResults[e]={}),this._queryResults[e][t]=new Set(s)}_getQueryResult(e,t){return this._queryResults[e]?.[t]}setItemDeletedByTuple(e){const t=e.entry.itemType;let s=this.deleted[t];return void 0===s&&(this.deleted[t]=s=new Map),s.set(e.entry,e),this}}class Tt extends Error{constructor(e,t){super(`Missing column '${t}' for item with type '${e.itemType}' and ID '${e.itemId}'`)}}class Rt extends vt{logMissingColumnErrors;errorHandler;itemCreateService;created=new Lt;restored={};constructor(e,t,s,n,r){super(r,t),this.logMissingColumnErrors=e,this.errorHandler=s,this.itemCreateService=n}getCreatedTuplesIterator(...e){return this.created.getTuplesIterator(e)}setItemCreated(e,t,s={}){return this.itemCreateService.createItemsFromValues(this,e,[t],null,s).then((()=>this))}setItemUpdated(e,t,s=null,n=null,r="KEEP_WHEN_DIFFERENT"){const i=e.id;if(this.hasDeletedItem(e))return this;let o=this.updated[i];if(void 0===o?o=this.updated[i]={entry:e,changes:{fields:{},columnExpansions:null===s?[]:[s]},mode:r}:(null!==s&&o.changes.columnExpansions.push(s),o.mode=r),null!==n){const s=this.itemEntryService.getLinkFieldsByParent(n,e.itemType);for(const e in s)t[e]=s[e]}let a=e.columns;if(null!==s)for(const e of o.changes.columnExpansions)a=e.run(a).merged;return J.shallowCopyFields(t,o.changes.fields,a.response[e.itemType],this.logMissingColumnErrors?t=>this.errorHandler.logError(new Tt(e,t)):void 0),this}setItemDeleted(e,t=!1){return delete this.updated[e.id],delete this.restored[e.id],this.setItemDeletedByTuple({entry:e,isCascaded:t})}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemDeletedCascaded(e){return this.setItemDeleted(e,!0),this}setItemsCreated(e,t){return this.itemCreateService.createItemsFromValues(this,e,t).then((()=>this))}_setItemCreated(e,t,s,n=null,r=!1){t.id=e;let i={};if(null!==n){i=this.itemEntryService.getLinkFieldsByParent(n,s.itemType);for(const e in i)t[e]=i[e]}if(!r){const e=this.itemEntryService.getLocalDefaultValues();for(const s in e)Object.prototype.hasOwnProperty.call(t,s)||(t[s]=e[s])}return this.created.add(e,t,s),this}setItemRestored(e,t){return this.restored[e.id]={entry:e,changes:t},this}isEmpty(){return super.isEmpty()&&this.created.isEmpty()&&!S(this.restored)}toJSON(){return{updated:this.updated,created:this.created,deleted:this.deleted}}}class Et extends vt{created={};getCreatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.created)}getCreatedValueByItemId(e,t,s){for(const n in this.created){const r=this.created[n];if(r.entry.itemType===e&&r.entry.itemId===t)return r.fields[s]}}setItemUpdated(e,t,s="KEEP_WHEN_DIFFERENT"){if(void 0===this.updated[e.id])this.updated[e.id]={entry:e,changes:{fields:t},mode:s};else{const n=this.updated[e.id];J.shallowCopyFields(t,n.changes.fields,e.columns.response[e.itemType]),n.mode=s}return this}setItemDeleted(e){return this.setItemDeletedByTuple(e)}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemCreated(e,t){this.created[e.id]={entry:e,fields:t}}isEmpty(){return super.isEmpty()&&!S(this.created)}}class St extends vt{created={};getCreatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.created)}setItemUpdated(e,t,s=null,n="KEEP_WHEN_DIFFERENT"){if(void 0===this.updated[e.id])this.updated[e.id]={entry:e,changes:{fields:t},previous:s,mode:n};else{const r=this.updated[e.id],i=e.columns.response[e.itemType];J.shallowCopyFields(t,r.changes.fields,i),null!==s&&(null!==r.previous?J.shallowCopyFields(s,r.previous,i):r.previous=s),r.mode=n}return this}setItemDeleted(e){return delete this.updated[e.id],this.setItemDeletedByTuple({entry:e})}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemCreated(e,t){this.created[e.id]={entry:e,fields:t}}isEmpty(){return super.isEmpty()&&!S(this.created)}}const _t={forceFlush:!1,flushTimeout:window.IS_IN_TEST?0:150,limit:void 0};class bt{apiRequestService;itemType;options;deferred=N();requestColumnExpansion;createdDate=Date.now();constructor(e,t,s,n){this.apiRequestService=e,this.itemType=s,this.options=n,this.requestColumnExpansion=t.construct()}async flush(e){try{const t=await this.executeQuery();return void 0!==e&&await e(t),this.deferred.resolve(t),t}catch(e){throw this.deferred.reject(e),e}}getPromise(){return this.deferred.promise}acceptsRequestColumns(e){const t=this.requestColumnExpansion.get()[this.itemType];return void 0===t||(!0===e?!0===t:!0!==t)}compareApiRequestLimit(e,t){return void 0===e&&void 0===t||void 0!==e&&void 0!==t&&e.field===t.field&&e.order===t.order&&e.limit===t.limit}}class wt extends bt{contents={queries:new Map,singleItemIds:new Set};static constructWithSingleItems(e,t,s,n,r,i){return new wt(e,t,s,i)._addSingleItems(n,r)}static constructWithQuery(e,t,s,n,r,i){return new wt(e,t,s,i)._addQuery(n,r)}addSingleItems(e,t,s){return this.options.forceFlush===s&&this.acceptsRequestColumns(t)?this._addSingleItems(e,t):null}addQuery(e,t,s){return this.options.forceFlush===s.forceFlush&&this.acceptsRequestColumns(t.object)&&e.isLocallyMatchable?this._addQuery(e,t):null}async executeQuery(){const e=this.requestColumnExpansion.get();return{requestColumns:e,response:await this.apiRequestService.query(this.itemType,this.createAggregateQuery(),e),nonLocallyMatchableQueryString:null}}_addSingleItems(e,t){this.requestColumnExpansion.expandWithRequestColumns(this.itemType,t);for(const t of e)this.contents.singleItemIds.add(t);return this}_addQuery(e,t){return this.contents.queries.set(e.string,e),this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,t),this}createAggregateQuery(){const e=this.contents;if(void 0===e||0===e.queries.size&&0===e.singleItemIds.size)throw new Error("Tried to flush a RequestBuffer without singleItems or queries");const t=[];e.singleItemIds.size>0&&t.push({key:"id",comparator:"IN",value:[...e.singleItemIds.values()]});for(const s of e.queries.values())t.push(s.object);return 1===t.length?t[0]:{conditions:t,operator:"OR"}}}class qt extends bt{contents;constructor(e,t,s,n,r,i){super(e,t,s,i),this.contents=n,this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,r)}addSingleItems(){return null}addQuery(e,t,s){return this.options.forceFlush===s.forceFlush&&this.compareApiRequestLimit(this.options.limit,s.limit)&&this.acceptsRequestColumns(t.object)&&e.string===this.contents.string?(this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,t),this):null}async executeQuery(){const e=this.requestColumnExpansion.get();return{requestColumns:e,response:await this.apiRequestService.query(this.itemType,this.contents.object,e,this.options.limit),nonLocallyMatchableQueryString:this.contents.isLocallyMatchable?null:this.contents.string}}}class Ft{apiRequestService;requestColumnExpansionFactory;onBufferFlushed;pendingBufferMap={};requestsSuspended=!1;constructor(e,t,s){this.apiRequestService=e,this.requestColumnExpansionFactory=t,this.onBufferFlushed=s}suspendRequests(){this.requestsSuspended=!0}continueRequests(){this.requestsSuspended=!1,this.flushPendingBuffers()}fetchByIds(e,t,s,n){const r=this.processOptions(n),i=this.pendingBufferMap[e];if(void 0!==i)for(const e of i)if(null!==e.addSingleItems(t,s,r.forceFlush))return e.getPromise();return this.addBuffer(wt.constructWithSingleItems(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}fetchByQuery(e,t,s,n={}){const r=this.processOptions(n),i=this.pendingBufferMap[e];if(void 0!==i)for(const e of i)if(null!==e.addQuery(t,s,r))return e.getPromise();return this.addBuffer(t.isLocallyMatchable&&void 0===r.limit&&0!==n.flushTimeout?wt.constructWithQuery(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r):new qt(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}processOptions(e={}){const t={};let s;for(s in _t)t[s]=void 0!==e[s]?e[s]:_t[s];return t}addBuffer(e){let t=this.pendingBufferMap[e.itemType];return void 0===t&&(t=this.pendingBufferMap[e.itemType]=[]),t.push(e),e.options.flushTimeout>0?window.setTimeout((()=>{this.flushPendingBuffers()}),e.options.flushTimeout):this.flushPendingBuffers(),e.getPromise()}flushPendingBuffers(){const e=Date.now();for(const t in this.pendingBufferMap){const s=this.pendingBufferMap[t],n=[];for(const t of s)(!this.requestsSuspended||t.options.forceFlush)&&e-t.createdDate>=t.options.flushTimeout?t.flush(this.onBufferFlushed):n.push(t);0===n.length?delete this.pendingBufferMap[t]:this.pendingBufferMap[t]=n}}}class kt{conversionMapService;templateCache;constructor(e,t){this.conversionMapService=e,this.templateCache=t}createItemsFromValues(e,t,s,n=null,r={}){if(0===s.length)return Promise.resolve([]);const i=[];for(const o of s){const a=Object.prototype.hasOwnProperty.call(o,"id")?o.id:ge.getLocalId();i.push(this.templateCache.fetchTemplate(t,a,r,{[t]:Object.keys(s[0])},n).then((s=>{this.processTemplate(e,t,a,n,s,(()=>!0),((e,s)=>{if(e===t)for(const e in o)s[e]=o[e]}))})))}return Promise.all(i)}processTemplate(e,t,s,n,r,i=()=>!0,o){const a=this.conversionMapService.createLocalConversionMap(t,s,r.response);for(const t in r.response.links){const s=r.getColumnSet(t);for(const c of r.response.links[t]){const l=a[t][c],u=r.getFields(t,c);this.conversionMapService.updateItemValues(u,u,s.item.main,a,n),o?.(t,u,a),e._setItemCreated(l,u,s,n),this.processTemplateLinkItems(e,t,l,r,a,i,o)}}}processTemplateLinkItems(e,t,s,n,r,i=()=>!0,o){const a={},c=(t,s,l)=>{const u={itemType:t,itemId:s},d=n.response.items[t][l].links;for(const t in d)if(Object.prototype.hasOwnProperty.call(d,t)){void 0===a[t]&&(a[t]=n.getColumnSet(t));for(const s of d[t]){const l=n.getFields(t,s);if(!i(t,l))continue;const d=r[t][s];this.conversionMapService.updateItemValues(l,l,a[t].item.main,r,u),void 0!==o&&o(t,l,r),e._setItemCreated(d,l,a[t],u),c(t,d,s)}}};c(t,s,n.response.links[t][0])}}class Lt{tuples={};remove(e,t){return void 0!==this.tuples[e]&&(!!this.tuples[e].has(t)&&(this.tuples[e].delete(t),!0))}add(e,t,s){const n=s.itemType;void 0===this.tuples[n]&&(this.tuples[n]=new Map);const r=this.tuples[n].get(e);if(void 0!==r){r.columns=r.columns.expand(s.request,s.requestColumnsTrue,s.response).merged;for(const e in t)r.fields[e]=t[e]}else this.tuples[n].set(e,{itemId:e,fields:t,columns:s})}isEmpty(){return!S(this.tuples)}*getTuplesIterator(e){if(0!==e.length)if(1!==e.length)for(const t of e){if(void 0!==this.tuples[t])for(const e of this.tuples[t].values())yield e}else{const t=this.tuples[e[0]];if(void 0===t)return;for(const e of t.values())yield e}else for(const e in this.tuples)for(const t of this.tuples[e].values())yield t}forEach(e){for(const t in this.tuples){const s=this.tuples[t];for(const n of s.values())e(n,t)}}contains(e){return void 0!==this.tuples[e]}getTupleByItemId(e,t){const s=this.tuples[e];if(void 0!==s)return s.get(t)}matchTuplesToQueryGraph(e,t,s){const n=this.tuples[e];if(void 0===n)return s;for(const e of n.values())t.doMatch(e,(t=>e.fields[t]),s);return s}*[Symbol.iterator](){for(const e in this.tuples){const t=this.tuples[e];for(const e of t.values())yield e}}}class Dt{apiRequestService;columnHandler;columnSetFactory;requestColumnExpansionFactory;linkTreeService;itemEntryService;pendingTemplateBufferMap={};templateResponses={};constructor(e,t,s,n,r,i){this.apiRequestService=e,this.columnHandler=t,this.columnSetFactory=s,this.requestColumnExpansionFactory=n,this.linkTreeService=r,this.itemEntryService=i}fetchTemplate(e,t,s={},n={},r=null){let i;const o=S(s);let a;a=o||void 0===this.templateResponses[e]?this.fetchTemplateById(e,t,s):Promise.resolve(this.templateResponses[e]);const c=this.requestColumnExpansionFactory.construct();return a.then((t=>{i=t;for(const e in i.columns)for(const t of i.columns[e])this.columnHandler.setColumn(e,t);!o&&i.cacheable&&(this.templateResponses[e]=t);for(const e in n)c.expandWithRequestColumns(e,n[e]);this.expandWithDefaultRequestColumns(c,e),this.expandWithLinkedItemTypesDefaultColumns(Object.keys(i.columns),c),null!==r&&c.expandWithRequestColumns(e,this.linkTreeService.getColumnsFromLink("string"==typeof r?r:r.itemType,e));for(const e in i.columns)c.expandWithRequestColumns(e,i.columns[e].map((e=>e.id)));const s=c.get(),a=[];for(const e in s)a.push(this.columnHandler.fetch(e,s[e]));return Promise.all(a)})).then((t=>{let s={};for(const e of t)s=he.mergeResponseColumns(s,e).merged;return new T(e,i,this.columnSetFactory,this.itemEntryService,s)}))}expandWithLinkedItemTypesDefaultColumns(e,t){for(const s of e)this.expandWithDefaultRequestColumns(t,s)}fetchTemplateById(e,t="no-id",s){return void 0===this.pendingTemplateBufferMap[e]||void 0===this.pendingTemplateBufferMap[e][t]?this.constructTemplateBuffer(e,t,s):this.pendingTemplateBufferMap[e][t]}constructTemplateBuffer(e,t,s){return void 0===this.pendingTemplateBufferMap[e]&&(this.pendingTemplateBufferMap[e]={}),this.pendingTemplateBufferMap[e][t]=this.apiRequestService.template(e,s).then((s=>(delete this.pendingTemplateBufferMap[e][t],s)),(s=>{throw delete this.pendingTemplateBufferMap[e][t],s}))}expandWithDefaultRequestColumns(e,t){e.expandWithRequestColumns(t,[{creator:["displayname"]},"created","permissions"])}}const xt={get:(e,t)=>{const s=e.previous[t];return void 0!==s?s:e.itemHandler.lookUpItemField(e.itemEntry,t)}};class Mt{itemResource;fields;itemHandler;partialPrevious;itemIdConversionMap;isInitialCall;constructor(e,t,s,n,r,i=!1){this.itemResource=e,this.fields=t,this.itemHandler=s,this.partialPrevious=n,this.itemIdConversionMap=r,this.isInitialCall=i}_previous;get previous(){return void 0!==this._previous?this._previous:this._previous=new Proxy({itemEntry:this.itemResource.entry,itemHandler:this.itemHandler,previous:this.partialPrevious},xt)}compareField(e,t=!0){const s=this.partialPrevious[e];if(void 0===s)return!this.isInitialCall;if(t||void 0===this.itemIdConversionMap)return!1;const n=this.itemResource.entry.columns.response[this.itemResource.entry.itemType][e];return he.isItemColumn(n)&&void 0!==this.itemIdConversionMap[n.itemType]?.[s]}compareFields(e,t){for(const s of e)if(!this.compareField(s,t))return!1;return!0}}class Pt extends Mt{isCalledAfterSocketUpdate;constructor(e,t,s,n,r,i=!1){super(e,t.collectFields(e.entry),t,s,n,i),this.isCalledAfterSocketUpdate=r}}class Bt extends Mt{collectionResource;isCalledAfterSocketUpdate;constructor(e,t,s,n,r){super(t,t.fields,t.transaction.itemHandler,n,r),this.collectionResource=e,this.isCalledAfterSocketUpdate=s}}class Qt{transaction;previousChangesDelta;constructor(e,t){this.transaction=e,this.previousChangesDelta=t}}const At=Symbol("Skip rule"),jt=Symbol("Continue with defaults"),Ht=Symbol("Stop execution");class Ut{locals;hasFlag;getAccountSettings;confirm=null;postDependencyConfirm=null;constructor(e,t,s){this.locals=e,this.hasFlag=t,this.getAccountSettings=s}}class Ot extends Qt{constructor(e,t){super(e,t)}getItemIdsWithUpdatedField(e,t,s=!1){const n=[];if(s){const t=this.previousChangesDelta.getCreatedTuplesIterator(e);for(const e of t)n.push(e.entry.itemId)}const r=this.previousChangesDelta.getUpdatedTuplesIterator(e);for(const e of r)this.previousChangesDelta.hasUpdatedValue(e.entry,t)&&n.push(e.entry.itemId);return 0===n.length?At:n}getItemIdsWithFieldUpdatedTo(e,t,s){const n=this.previousChangesDelta.getUpdatedTuplesIterator(e),r=[];for(const e of n){const n=this.previousChangesDelta.getUpdatedValue(e.entry,t);if(void 0===n)continue;const i=e.entry.columns.response[e.entry.itemType][t];J.compareFields(i.type,n,s)&&r.push(e.entry.itemId)}return 0===r.length?At:r}}class Vt extends Qt{destinationChangesDelta;constructor(e,t,s){super(e,t),this.destinationChangesDelta=s}setItemUpdated(e,t){this.destinationChangesDelta.setItemUpdated(e,t)}setItemsDeleted(e){this.destinationChangesDelta.setItemsDeleted(e)}}function Nt(e){return function(t){t.__name=e}}function Wt(e,t,s,n){var r,i=arguments.length,o=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,s):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,s,n);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(i<3?r(o):i>3?r(t,s,o):r(t,s))||o);return i>3&&o&&Object.defineProperty(t,s,o),o}Object.create;Object.create;"function"==typeof SuppressedError&&SuppressedError;const $t=["recureind","recurperiode","recurhoe"];let Gt=class extends Ut{itemType;toField;condition(e){const t=e.previousChangesDelta,s=t.getUpdatedTuplesIterator(this.itemType),n=[];for(const e of s){if(void 0!==t.getUpdatedValue(e.entry,"recureind"))continue;const s=void 0!==t.getUpdatedValue(e.entry,"recurhoe"),r=void 0!==t.getUpdatedValue(e.entry,"recurperiode");(s||r)&&n.push(e.entry.itemId)}return 0===n.length?At:n}async dependency(e,t){return e.getItemsById(this.itemType,t,{columns:[...$t,this.toField]})}apply(e,t){for(const s of t){const t=s.fields.recurhoe;if("eenmalig"===t||"specifieke_dagen"===t)continue;const n=s.fields[this.toField].clone().add(s.fields.recurperiode,this.convertRecurhoeToMomentDuration(t)).startOf("day").add(1,"day");n.isAfter(s.fields.recureind)&&e.setItemUpdated(s.entry,{recureind:n})}}convertRecurhoeToMomentDuration(e){switch(e){case"dag":case"specifieke_dagen":return"days";case"week":return"weeks";case"maand":return"months";case"jaar":return"years"}}};Gt=Wt([Nt("RecurrentItemRecureindBusinessLogicRule")],Gt);let zt=class extends Gt{itemType="Afspraak";toField="tot"};zt=Wt([Nt("AfspraakRecureindBusinessLogicRule")],zt);let Yt=class extends Gt{itemType="Beschikbaarheid";toField="plantot"};Yt=Wt([Nt("BeschikbaarheidRecureindBusinessLogicRule")],Yt);const Kt=["straat","huisnummer","postcode","stad","provincie","land"],Xt=["bezoek","post","factuur"];let Zt=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Contact"),s=[];for(const n of t)Kt.some((t=>e.previousChangesDelta.hasUpdatedValue(n.entry,`bezoek${t}`)))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){const s=[];for(const e of Xt)for(const t of Kt)s.push(`${e}${t}`);return e.getItemsById("Contact",t,{columns:s})}apply(e,t){const s=["post","factuur"];for(const n of t)for(const t of s)this.addressEqualsVisitingAddress(n,t)&&e.setItemUpdated(n.entry,Kt.reduce(((e,s)=>(e[`${t}${s}`]=n.fields[`bezoek${s}`],e)),{}))}addressEqualsVisitingAddress(e,t){for(const s of Kt)if(e.fields[t+s]!==e.initial["bezoek"+s])return!1;return!0}};Zt=Wt([Nt("ContactAddressBusinessLogicRule")],Zt);const Jt=["defaultvalue"];let es=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Customfield","linkedItemType")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:Jt})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{defaultvalue:null})}};es=Wt([Nt("CustomFieldLinkedItemTypeBusinessLogicRule")],es);const ts=["defaultvalue","attributes","type"];let ss=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Customfield","type")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ts})}apply(e,t){for(const s of t){const t=s.fields.type;let n;n="enum"===t?0:J.getDefaultValue(t),e.setItemUpdated(s.entry,{defaultvalue:n,attributes:{}})}}};ss=Wt([Nt("CustomFieldTypeBusinessLogicRule")],ss);const ns={Offerte:{opdrachtgever:"contactpersoon"},Contract:{opdrachtgever:"contactpersoon"},Factuur:{opdrachtgever:"contactpersoon"},Project:{opdrachtgever:"opdrachtgever_persoon",locatie:"locatie_persoon"},Subproject:{locatie:"locatie_persoon"},Inhuur:{locatie:"locatie_persoon",leverancier:"contactpersoon"},ProjectRequest:{aanvrager:"accountmanager"}},rs=["id","contactpersoon"];let is=class extends Ut{condition(e){const t={};let s=!1;for(const n of e.previousChangesDelta.getUpdatedTuplesIterator()){const r=ns[n.entry.itemType];if(void 0!==r)for(const i in r)if(e.previousChangesDelta.hasUpdatedValue(n.entry,i)&&!e.previousChangesDelta.hasUpdatedValue(n.entry,r[i])){const e=t[n.entry.itemType]??=new Map;let r=e.get(n.entry);void 0===r&&e.set(n.entry,r={}),r[i]=n.changes.fields[i],s=!0}}return s?t:At}dependency(e,t){const s=new Set;for(const e in t)for(const n of t[e].values())for(const e in n){const t=n[e];null!==t&&s.add(t)}return e.getItemsById("Contact",[...s],{columns:rs})}apply(e,t,s){const n=new Map(t.map((e=>[e.fields.id,e])));for(const t in s)for(const r of s[t].entries()){const[s,i]=r;for(const o in i){const i=ns[t][o],a=r[1][o];if(null===a){e.setItemUpdated(s,{[i]:null});continue}const c=n.get(a);e.setItemUpdated(s,{[i]:c.fields.contactpersoon})}}}};is=Wt([Nt("DefaultContactPersonUpdateBusinessLogicRule")],is);const os=["Factuur","Offerte","Contract","Bon","Inhuurbon","Materiaalbon","Medewerkerbon","Aanmaning","Reparatiebon","Voertuigbon"],as=["filename","betreft"];let cs=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator(...os),s={};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"template")&&(void 0===s[r.entry.itemType]&&(s[r.entry.itemType]=[]),n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}dependency(e,t){const s={};for(const n in t)s[n]=e.getItemsById(n,t[n],{columns:as});return U(s)}apply(e,t){for(const s in t)for(const n of t[s])e.setItemUpdated(n.entry,{filename:"",betreft:""})}};cs=Wt([Nt("DocumentTemplateBusinessLogicRule")],cs);const ls=["actief"];let us=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Exemplaar"),s=[],n=(0,Z.default)();for(const r of t){const t=e.getUpdatedValue(r.entry,"aanschafdatum");void 0!==t&&t.isAfter(n)&&s.push(r.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Exemplaar",t,{columns:ls})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{actief:!0})}};us=Wt([Nt("ExemplaarAanschafdatumBusinessLogicRule")],us);let ds=class extends Ut{condition({previousChangesDelta:e}){const t=e.getDeletedItemEntriesIterator("Exemplaar"),s=[];for(const e of t)s.push(e.itemId);return 0===s.length?At:s}async dependency(e,t){return(await e.getItemsByQuery("Barcode",{conditions:[{key:"itemtype",comparator:"=",value:"Exemplaar"},{key:"item",comparator:"IN",value:t}]},{columns:[]})).map((e=>e.entry))}apply(e,t){e.setItemsDeleted(t)}};ds=Wt([Nt("ExemplaarBarcodeDeleteBusinessLogicRule")],ds);const hs=["vervaldatum","datum","betalingsconditie"],ms=["id","dagen"];let ps=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","betalingsconditie")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:hs}),n=new Set;let r,i=!1;for(const e of s){const t=e.fields.betalingsconditie;null!==t?n.add(t):i=!0}i?(r=this.getAccountSettings().betalingsconditie,null!==r&&n.add(r)):r=null;return{Factuur:s,Betalingsconditie:(await e.getItemsById("Betalingsconditie",[...n],{columns:ms})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{}),defaultPaymentConditionId:r}}apply(e,t){for(const s of t.Factuur){let n=s.fields.betalingsconditie;null===n&&(n=t.defaultPaymentConditionId),null!==n&&e.setItemUpdated(s.entry,{vervaldatum:s.fields.datum.clone().add(t.Betalingsconditie[n].fields.dagen,"days")})}}};ps=Wt([Nt("FactuurBetalingsconditieBusinessLogicRule")],ps);const fs=["id","taxschema","vervaldatum","betalingsconditie","datum"],ys=["id","dagen"];let gs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","datum")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:fs}),n=[...new Set(s.map((e=>e.fields.betalingsconditie)).filter((e=>null!==e)))],r=await e.getItemsById("Betalingsconditie",n,{columns:ys}),i=await Promise.all(s.map((t=>e.core.apiRequestService.module("taxes","getTaxRateForDate",{schemaId:t.fields.taxschema,date:t.fields.datum})))),o={};for(let e=0;e<s.length;e++)o[s[e].fields.id]=i[e];return{Factuur:s,Betalingsconditie:r.reduce(((e,t)=>(e[t.fields.id]=t,e)),{}),latestTaxSchemasByDateMap:o}}apply(e,t){for(const s of t.Factuur)e.setItemUpdated(s.entry,{taxschema:t.latestTaxSchemasByDateMap[s.fields.id]}),null!==s.fields.betalingsconditie&&e.setItemUpdated(s.entry,{vervaldatum:s.fields.datum.clone().add(t.Betalingsconditie[s.fields.betalingsconditie].fields.dagen,"days")})}};gs=Wt([Nt("FactuurDatumBusinessLogicRule")],gs);const Is=["nummer"];let Cs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","numberseries")}async dependency(e,t){return e.getItemsById("Factuur",t,{columns:Is})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{nummer:null})}};var vs;Cs=Wt([Nt("FactuurNumberseriesBusinessLogicRule")],Cs);const Ts=["name","friendlyname"];let Rs=vs=class extends Ut{static getExtension(e){const t=e.lastIndexOf(".");return-1===t?null:e.slice(t)}condition(e){const t=e.previousChangesDelta,s=e.previousChangesDelta.getUpdatedTuplesIterator("Files"),n=[];for(const e of s)(t.hasUpdatedValue(e.entry,"name")||t.hasUpdatedValue(e.entry,"friendlyname"))&&n.push(e.entry.itemId);return 0===n.length?At:n}async dependency(e,t){return e.getItemsById("Files",t,{columns:Ts})}apply(e,t){for(const s of t)for(const t of Ts){const n=vs.getExtension(s.initial[t]);if(null===n)continue;const r=vs.getExtension(s.fields[t]);null!==r&&r===n||e.setItemUpdated(s.entry,{[t]:s.fields[t]+n})}}};Rs=vs=Wt([Nt("FilesNameExtensionBusinessLogicRule")],Rs);const Es=["naamintern","naamofferte"];let Ss=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Functie","naamofferte")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Es})}apply(e,t){for(const s of t)""===s.fields.naamintern.trim()&&e.setItemUpdated(s.entry,{naamintern:s.fields.naamofferte})}};Ss=Wt([Nt("FunctieNaaminternBusinessLogicRule")],Ss);let _s=class extends Gt{itemType="Functie";toField="plantot"};_s=Wt([Nt("FunctieRecureindBusinessLogicRule")],_s);const bs=["twoway","afstand","afstand_van_locatie",{subproject:[{locatie:["kilometers"]}]}];function ws(e,t){return t.getDerivedValue(["subproject","locatie","kilometers"])*(e.transaction.itemHandler.lookUpItemField(t.entry,"twoway")?2:1)}let qs=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","afstand_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:bs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:ws(e,s)})}};qs=Wt([Nt("FunctieTravelDistanceFromLocationBusinessLogicRule")],qs);let Fs=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Functie"),s=[];for(const n of t)e.previousChangesDelta.hasUpdatedValue(n.entry,"afstand")&&s.push(n.entry.itemId);return 0===s.length?At:s}dependency(e,t){return e.getItemsById("Functie",t,{columns:bs})}apply(e,t){for(const s of t){const t=ws(e,s);s.fields.afstand!==t&&e.setItemUpdated(s.entry,{afstand_van_locatie:!1})}}};Fs=Wt([Nt("FunctieTravelDistanceUnlinkLocationBusinessLogicRule")],Fs);const ks=[{subproject:[{locatie:["reistijd"]}]}];let Ls=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","reistijd_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:ks})}apply(e,t){for(const s of t){const t=s.getDerivedValue(["subproject","locatie","reistijd"]);e.setItemUpdated(s.entry,{reistijd_vooraf:t,reistijd_achteraf:t})}}};Ls=Wt([Nt("FunctieTravelTimeFromLocationBusinessLogicRule")],Ls);const Ds=["afstand","twoway"];let xs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Functie","twoway")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ds})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:s.fields.afstand*(s.fields.twoway?2:.5)})}};xs=Wt([Nt("FunctieTwowayBusinessLogicRule")],xs);const Ms=["subproject"];let Ps=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Functiegroep"),s=[];for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"subproject");void 0!==t&&s.push({itemEntry:n.entry,newValue:t})}return 0===s.length?At:s}dependency(e,t){return Promise.all(t.map((t=>e.getItemsByQuery("Functie",{functiegroep:t.itemEntry.itemId},{columns:Ms}))))}apply(e,t,s){for(let n=0;n<s.length;n++)for(const r of t[n])e.setItemUpdated(r.entry,{subproject:s[n].newValue})}};Ps=Wt([Nt("FunctiegroepSubprojectBusinessLogicRule")],Ps);const Bs=["id","aantal","parent","materiaal"];class Qs extends Ut{itemType;condition({previousChangesDelta:e,transaction:t}){const s=e.getCreatedTuplesIterator(this.itemType),n=[];for(const e of s)null!==e.fields.materiaal&&n.push(e.entry.itemId);const r=e.getUpdatedTuplesIterator(this.itemType);for(const s of r)(e.hasUpdatedValue(s.entry,"aantal")||e.hasUpdatedValue(s.entry,"parent"))&&null!==t.itemHandler.lookUpItemField(s.entry,"materiaal")&&n.push(s.entry.itemId);return 0===n.length?At:n}async dependency(e,t,s){const n=await e.getItemsById(this.itemType,t,{columns:Bs}),r=new Set;for(const e of n)r.add(e.fields.materiaal);return{itemResources:n,materiaalPropertiesMap:await this.getMateriaalPropertiesMap(s,[...r])}}apply(e,t){for(const s of t.itemResources){const n=s.fields.aantal,r=t.materiaalPropertiesMap[s.fields.materiaal];!r.is_physical&&r.is_combination||null!==s.fields.parent||Number.isInteger(n)||e.setItemUpdated(s.entry,{aantal:Math.ceil(n)})}}async getMateriaalPropertiesMap(e,t){const s=await e.transaction.getItemsById("Materiaal",t,{columns:["id","is_physical","is_combination"]}),n={};for(const e of s)n[e.fields.id]={is_physical:e.fields.is_physical,is_combination:e.fields.is_combination};return n}}let As=class extends Qs{itemType="Inhuurmateriaal"};As=Wt([Nt("InhuurmateriaalAantalRoundUpBusinessLogicRule")],As);class js extends Error{context;constructor(e,t){super(e),this.context=t}}const Hs=["id","aantal","aantaltotaal","parent","materiaal"],Us=[...Hs,"categorie"],Os=[...Hs,"inhuurgroep"];class Vs extends Ut{condition(e){const t=[],s=e.previousChangesDelta.getCreatedTuplesIterator(this.itemType);for(const e of s)null!==e.fields.materiaal&&t.push(e.entry.itemId);const n=e.previousChangesDelta.getUpdatedTuplesIterator(this.itemType);for(const s of n)(e.previousChangesDelta.hasUpdatedValue(s.entry,"aantal")||e.previousChangesDelta.hasUpdatedValue(s.entry,"parent"))&&null!==e.transaction.itemHandler.lookUpItemField(s.entry,"materiaal")&&t.push(s.entry.itemId);return 0===t.length?At:t}async dependency(e,t,s){const n=new Set,r=await e.getItemsById(this.itemType,t,{columns:this.requestColumns});for(const e of r){const t=this.groupingProperties.columnId;n.add(e.fields[t]);const s=e.initial[t];void 0!==s&&n.add(s)}const i=await s.transaction.getLinkCollections(this.groupingProperties.itemType,[...n],this.itemType,{query:{},columns:this.requestColumns}),o=new Map,a=new Map;for(const e in i)for(const t of i[e].items){o.set(t.fields.id,t);const e=t.fields.parent;if(void 0===e)throw new js("AantaltotaalBusinessLogicRuleBase: 'parent' field missing for planned equipment item",t.collectFields());let s=a.get(e);void 0===s&&a.set(e,s=[]),s.push(t)}const c=new Set;for(const e of r){let t=e,s=t.fields.parent;for(;null!==s;){const e=o.get(s);if(void 0===e)throw new js("AantaltotaalBusinessLogicRuleBase: parent planned equipment item not available in equipment group",t.collectFields());t=e,s=t.fields.parent}c.add(t.fields.id)}return{rootItemIds:c,affectedEquipmentItemsByParent:a,affectedEquipmentItemsById:o,equipmentIsPhysicalMap:await this.fetchEquipmentIsPhysicalMap(c,o,a,s)}}apply(e,t){for(const s of t.rootItemIds)this.updatePlannedEquipmentItem(e,t.affectedEquipmentItemsById.get(s),1,t)}async fetchEquipmentIsPhysicalMap(e,t,s=new Map,n){const r=new Set,i=e=>{const n=s.get(e);if(void 0===n)return;const o=t.get(e);r.add(o.fields.materiaal);for(const e of n)i(e.fields.id)};for(const t of e)i(t);return(await n.transaction.getItemsById("Materiaal",[...r],{columns:["id","is_physical"]})).reduce(((e,t)=>e.set(t.fields.id,t.fields.is_physical)),new Map)}updatePlannedEquipmentItem(e,t,s,n){const r=t.fields.aantal*s,i=Math.ceil(r);e.setItemUpdated(t.entry,{aantaltotaal:i});const o=n.affectedEquipmentItemsByParent.get(t.fields.id);if(void 0===o)return;const a=!0===n.equipmentIsPhysicalMap.get(t.fields.materiaal)?i:r;for(const t of o)this.updatePlannedEquipmentItem(e,t,a,n)}}let Ns=class extends Vs{itemType="Inhuurmateriaal";groupingProperties={itemType:"Inhuurgroep",columnId:"inhuurgroep"};requestColumns=Os};Ns=Wt([Nt("InhuurmateriaalAantaltotaalBusinessLogicRule")],Ns);const Ws=["is_combination"],$s=["equipment"];let Gs=class extends Ut{async dependency(e,t){const s=t.filter((e=>!ge.isLocalId(e))),n=s.length>0?e.cachedQueryHandler.__fetchCachedQueryItem("Voorraadmutatie",{columns:["id"],query:{conditions:[{key:"datum",value:(0,Z.default)(),comparator:">"},{key:"materiaal",value:s,comparator:"IN"},{key:"type",value:"manual",comparator:"="}]}}):Promise.resolve(null),[r,i,o]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Ws}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:$s}),n]),a={voorraadmutatieTuples:{remote:o?.items??[],local:[]},materiaalResources:r,containerContentResources:i},c=e.getTransactionChain(!1);for(const e of c){const s=e.itemHandler.entries.getByQuery("Voorraadmutatie",{conditions:[{key:"type",value:"manual",comparator:"="},{key:"materiaal",value:t,comparator:"IN"}],operator:"AND"});a.voorraadmutatieTuples.local=a.voorraadmutatieTuples.local.concat(s)}return a}apply(e,t){e.destinationChangesDelta.setItemsDeleted(t.voorraadmutatieTuples.local),e.destinationChangesDelta.setItemsDeleted(t.voorraadmutatieTuples.remote)}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!0)}};Gs=Wt([Nt("MateriaalBulkToSerialBusinessLogicRule")],Gs);let zs=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_combination",!1)}async dependency(e,t){return(await e.getItemsByQuery("Setinhoud",{package:t},{columns:["id"]})).map((e=>e.entry))}apply(e,t){e.destinationChangesDelta.setItemsDeleted(t)}};zs=Wt([Nt("MateriaalIsCombinationBusinessLogicRule")],zs);const Ys=["is_physical","is_combination","telexemplaren","can_edit_content_during_planning"];let Ks=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)!0!==e.getUpdatedValue(n.entry,"is_combination")&&!0!==e.getUpdatedValue(n.entry,"is_physical")&&!1!==e.getUpdatedValue(n.entry,"telexemplaren")||s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:Ys})}apply(e,t){for(const s of t)s.fields.is_physical&&s.fields.is_combination&&!s.fields.telexemplaren&&e.setItemUpdated(s.entry,{can_edit_content_during_planning:!1})}};Ks=Wt([Nt("MateriaalIsPhysicalCombinationBulkBusinessLogicRule")],Ks);const Xs=["is_combination"],Zs=["equipment"];let Js=class extends Ut{async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Xs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:Zs})]);return{materiaalResources:s,containerContentResources:n}}apply(){}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!1)}};Js=Wt([Nt("MateriaalSerialToBulkBusinessLogicRule")],Js);const en=["is_combination","verhuur","can_edit_content_during_planning"];let tn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!0)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:en})}apply(e,t){const s=this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING");for(const n of t)n.fields.is_combination&&(s||e.setItemUpdated(n.entry,{can_edit_content_during_planning:!1}),e.setItemUpdated(n.entry,{verhuur:!0}))}};tn=Wt([Nt("MateriaalToPhysicalBusinessLogicRule")],tn);const sn=["is_combination","can_edit_content_during_planning"];let nn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:sn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{is_combination:!0,can_edit_content_during_planning:!0})}};nn=Wt([Nt("MateriaalToVirtualBusinessLogicRule")],nn);const rn=["type","is_combination","is_physical","can_edit_content_during_planning"];let on=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)(e.hasUpdatedValue(n.entry,"is_combination")||e.hasUpdatedValue(n.entry,"is_physical"))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:rn})}apply(e,t){for(const s of t){let t;t=s.fields.is_combination?s.fields.is_physical?"case":"set":"item",e.setItemUpdated(s.entry,{type:t})}}};on=Wt([Nt("MateriaalTypePropertiesBusinessLogicRule")],on);const an=["is_combination","is_physical"];let cn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","verhuur",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:an})}apply(e,t){for(const s of t)s.fields.is_physical&&e.setItemUpdated(s.entry,{is_combination:!1})}};cn=Wt([Nt("MateriaalVerhuurBusinessLogicRule")],cn);const ln=["width","height","oppervlakteartikel","nieuwprijs","inhuurprijs","verhuurprijs","naam"];let un=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)(e.hasUpdatedValue(n.entry,"width")||e.hasUpdatedValue(n.entry,"height"))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:ln})}apply(e,t){for(const s of t){if(!s.fields.oppervlakteartikel)continue;let t=s.fields.width,n=s.fields.height;n<1&&(n=1),t<1&&(t=1);const r={},i=this.locals.units.dimension,o=/\((.*)\)/,a=`(${t} ${i} x ${n} ${i})`;o.test(s.fields.naam)?r.naam=s.fields.naam.replace(o,a):r.naam=`${s.fields.naam} ${a}`;const c=s.initial.width*s.initial.height;if(0!==c){const e=t*n;for(const t of["nieuwprijs","inhuurprijs","verhuurprijs"])r[t]=s.initial[t]/c*e}e.setItemUpdated(s.entry,r)}}};un=Wt([Nt("SurfaceArticleSizeBusinessLogicRule")],un);const dn=["MateriaalCat","Functie","Functiegroep"],hn=["type","isStart","defaultValue"],mn={schema_gv:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_gv_begin",value:"gebruikvan",opposite:"schema_gt",plan:"schema_pv",isStart:!0},schema_gt:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_gt_begin",value:"gebruiktot",opposite:"schema_gv",plan:"schema_pt",isStart:!1},schema_pv:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_pv_begin",value:"planvan",opposite:"schema_pt",usage:"schema_gv",isStart:!0},schema_pt:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_pt_begin",value:"plantot",opposite:"schema_pv",usage:"schema_gt",isStart:!1},gebruikvan:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gv",opposite:"gebruiktot",plan:"planvan",isStart:!0},gebruiktot:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gt",opposite:"gebruikvan",plan:"plantot",isStart:!1},planvan:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pv",opposite:"plantot",usage:"gebruikvan",isStart:!0},plantot:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pt",opposite:"planvan",usage:"gebruiktot",isStart:!1},schema_pv_begin:{type:a.ApiEnumApiType.TYPE_BOOL,usage:"schema_gv_begin",defaultValue:!0},schema_pt_begin:{type:a.ApiEnumApiType.TYPE_BOOL,usage:"schema_gt_begin",defaultValue:!1},schema_gv_begin:{type:a.ApiEnumApiType.TYPE_BOOL,plan:"schema_pv_begin",defaultValue:!0},schema_gt_begin:{type:a.ApiEnumApiType.TYPE_BOOL,plan:"schema_pt_begin",defaultValue:!1},duur:{type:a.ApiEnumApiType.TYPE_DURATION},timeframe:{type:a.ApiEnumApiType.TYPE_ITEM}};class pn{static columnInstances={};static schemeValueStartColumnIds=["schema_gv","schema_pv"];static schemeValueEndColumnIds=["schema_gt","schema_pt"];static schemeValueColumnIds=["schema_gv","schema_pv","schema_gt","schema_pt"];static schemeStartColumnIds=["schema_gv_begin","schema_gt_begin","schema_pv_begin","schema_pt_begin"];static valueStartColumnIds=["gebruikvan","planvan"];static valueEndColumnIds=["gebruiktot","plantot"];static valueColumnIds=["gebruikvan","planvan","gebruiktot","plantot"];static usageColumnIds=["gebruikvan","gebruiktot","schema_gv","schema_gt","schema_gv_begin","schema_gt_begin"];static planColumnIds=["planvan","plantot","schema_pv","schema_pt","schema_pv_begin","schema_pt_begin"];static isTimeColumn(e){return void 0!==mn[e]}static getColumnInstance(e){if(void 0!==this.columnInstances[e])return this.columnInstances[e];const t=mn[e],s={id:e};this.columnInstances[e]=s;for(const e in t)s[e]=hn.includes(e)?t[e]:this.getColumnInstance(t[e]);return s}static*getColumnIdIterator(e){for(const t in mn)"timeframe"===t&&"Functie"!==e||(yield t)}static getColumnIds(e){return[...this.getColumnIdIterator(e)]}static getDefaultValues(e,t={id:null,van:Z.default.invalid(),tot:Z.default.invalid()},s=t){const n={schema_gv:t.id,schema_gt:t.id,schema_pv:s.id,schema_pt:s.id,schema_pv_begin:this.getColumnInstance("schema_pv_begin").defaultValue,schema_pt_begin:this.getColumnInstance("schema_pt_begin").defaultValue,schema_gv_begin:this.getColumnInstance("schema_gv_begin").defaultValue,schema_gt_begin:this.getColumnInstance("schema_gt_begin").defaultValue,gebruiktot:t.tot.clone(),gebruikvan:t.van.clone(),plantot:s.tot.clone(),planvan:s.van.clone(),duur:Z.default.duration(t.van.isValid()&&t.tot.isValid()?t.tot.diff(t.van):0)};return"Functie"===e?{...n,timeframe:null}:n}static cloneValues(e,t,s={}){const n=this.getColumnIdIterator(e);for(const e of n)s[e]=J.clone(mn[e].type,t[e]);return s}static compareValues(e,t,s){const n=this.getColumnIdIterator(e);for(const e of n)if(!J.compareFields(mn[e].type,t[e],s[e]))return!1;return!0}}class fn extends Ut{conditionColumns;extractUpdatedTuples(e,t=!1){const s=e.previousChangesDelta.getUpdatedTuplesIterator(...dn),n=dn.reduce(((e,t)=>(e[t]=new Map,e)),{});for(const t of s){const s=t.entry;for(const t of this.conditionColumns){if(!e.previousChangesDelta.hasUpdatedValue(s,t))continue;let r=n[s.itemType].get(s);void 0===r&&n[s.itemType].set(s,r=[]),r.push(t)}}if(t){const t=e.previousChangesDelta.getCreatedTuplesIterator(...dn);for(const e of t){const t=e.entry;for(const e of this.conditionColumns){let s=n[t.itemType].get(t);void 0===s&&n[t.itemType].set(t,s=[]),s.push(e)}}}return n}extractUpdatedTuplesCondition(e){const t=this.extractUpdatedTuples(e);return dn.every((e=>0===t[e].size))?At:t}async fetchLinkedItemResourcesWithColumns(e,t,s){return U(dn.reduce(((n,r)=>(n[r]=e.getItemsById(r,[...t[r].keys()].map((e=>e.itemId)),{columns:s[r]}),n)),{}))}async fetchLinkedItemResources(e,t,s){return this.fetchLinkedItemResourcesWithColumns(e,t,dn.reduce(((e,t)=>(e[t]=s,e)),{}))}}const yn=["gebruikvan","gebruiktot"],gn=[...yn,"duur"];let In=class extends fn{conditionColumns=yn;condition(e){return this.extractUpdatedTuplesCondition(e)}apply(e,t){for(const s of dn)for(const n of t[s]){const t=n.fields.gebruikvan,s=n.fields.gebruiktot;t.isValid()&&s.isValid()&&e.setItemUpdated(n.entry,{duur:Z.default.duration(s.diff(t))})}}dependency(e,t){return this.fetchLinkedItemResources(e,t,gn)}};In=Wt([Nt("LinkedTimeItemDurationBusinessLogicRule")],In);const Cn=["van","tot","is_absolute_times_substitute"],vn=["id",...pn.valueColumnIds,...pn.schemeStartColumnIds,{schema_pv:Cn},{schema_pt:Cn},{schema_gv:Cn},{schema_gt:Cn}];let Tn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("MateriaalCat"),s=new Map;for(const n of t){const t=n.entry;for(const n of pn.valueColumnIds){if(void 0===e.previousChangesDelta.getUpdatedValue(t,n)||null===e.transaction.itemHandler.lookUpItemField(t,pn.getColumnInstance(n).scheme.id))continue;let r=s.get(t.itemId);void 0===r&&s.set(t.itemId,r=[]),r.push(n)}}return 0===s.size?At:s}dependency(e,t){return e.getItemsById("MateriaalCat",[...t.keys()],{columns:vn})}apply(e,t,s){for(const n of t){const t=s.get(n.fields.id);for(const s of t){const t=pn.getColumnInstance(s);!0===n.getDerivedValue([t.scheme.id,"is_absolute_times_substitute"])&&e.setItemUpdated(e.transaction.getLocalItemEntryByItemId("Tijd",n.fields[t.scheme.id]),{[n.fields[t.scheme.start.id]?"van":"tot"]:n.fields[s].clone()})}}}};Tn=Wt([Nt("LinkedTimeItemMateriaalCatBusinessLogicRule")],Tn);const Rn=["project","subproject"],En=pn.schemeValueColumnIds,Sn=[...En,...Rn],_n=["id","project","subproject","is_absolute_times_substitute"],bn=[...pn.schemeValueColumnIds,"timeframe"];let wn=class extends fn{conditionColumns=Rn;async condition(e){const t=this.extractUpdatedTuples(e,!0);if(dn.every((e=>0===t[e].size)))return At;const s=await this.fetchLinkedItemResourcesWithColumns(e.transaction,t,{MateriaalCat:Sn,Functie:[...Sn,"timeframe"],Functiegroep:Sn}),n=await e.transaction.getItemsById("Tijd",[...this.extractTimeItemIds(s)],{columns:_n}),r=this.validateLinkedTimes(s,n);return dn.every((e=>0===r[e].length))?At:r}apply(e,t,s){for(const t of dn)for(const n of s[t])e.setItemUpdated(n.item,this.schemeValueColumnIdArrayToFieldMap(n.invalidTimes))}dependency(){return Promise.resolve(null)}schemeValueColumnIdArrayToFieldMap(e){const t={};for(const s of e)t[s]=null;return t}validateLinkedTimes(e,t){const s={};for(const n of dn){const r=[];for(const s of e[n]){const e=this.getInvalidTimeColumnIds(s,t);e.length>0&&r.push({item:s.entry,invalidTimes:e})}s[n]=r}return s}getInvalidTimeColumnIds(e,t){const s=this.getTimeIdIterator(e),n=[];for(const r of s){const s=t.find((e=>e.fields.id===r.timeId));if(s.fields.is_absolute_times_substitute)continue;const i=s.fields.subproject;(s.fields.project!==e.fields.project||null!==i&&i!==e.fields.subproject)&&n.push(r.columnId)}return n}extractTimeItemIds(e){const t=new Set;for(const s of dn)for(const n of e[s]){const e=this.getTimeIdIterator(n);for(const s of e)t.add(s.timeId)}return t}*getTimeIdIterator(e){const t="Functie"===e.itemType?bn:En;for(const s of t){const t=e.fields[s];null!==t&&(yield{timeId:t,columnId:s})}}};wn=Wt([Nt("LinkedTimeItemSubprojectBusinessLogicRule")],wn);const qn=[...pn.valueColumnIds,...pn.schemeStartColumnIds],Fn=["id","van","tot"];let kn=class extends fn{conditionColumns=pn.schemeValueColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}async dependency(e,t,s){const[n,r]=await Promise.all([e.getItemsById("Tijd",this.getTimeItemIds(t,s.previousChangesDelta),{columns:Fn}),this.fetchLinkedItemResources(e,t,qn)]);return{timeResources:n,linkedTimeItemResources:r}}apply(e,t,s){for(const n of dn)for(const[r,i]of s[n])for(const s of i){const n=pn.getColumnInstance(s);let i=e.previousChangesDelta.getUpdatedValue(r,n.start.id);void 0===i&&e.setItemUpdated(r,{[n.start.id]:i=n.isStart});const o=e.previousChangesDelta.getUpdatedValue(r,s);if(null!==o){const s=t.timeResources.find((e=>e.fields.id===o));e.setItemUpdated(r,{[n.value.id]:i?s.fields.van:s.fields.tot})}}}getTimeItemIds(e,t){const s=new Set;for(const n of dn)for(const r of e[n]){const e=r[0];for(const n of r[1]){const r=t.getUpdatedValue(e,n);null!==r&&s.add(r)}}return[...s]}};kn=Wt([Nt("LinkedTimeItemTimeSchemeBusinessLogicRule")],kn);let Ln=class extends fn{conditionColumns=pn.schemeValueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,pn.schemeValueColumnIds)}apply(e,t,s){for(const n of dn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=pn.getColumnInstance(s),i=n.opposite.id;!e.previousChangesDelta.hasUpdatedValue(t,i)&&r.fields[n.start.id]&&r.initial[s]===r.initial[i]&&e.setItemUpdated(t,{[i]:r.fields[s]})}}}};Ln=Wt([Nt("LinkedTimeItemTimeSchemeStartBusinessLogicRule")],Ln);const Dn=[...pn.valueColumnIds,...pn.schemeValueEndColumnIds];let xn=class extends fn{conditionColumns=pn.valueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,Dn)}apply(e,t,s){for(const n of dn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=pn.getColumnInstance(s).opposite;if(e.previousChangesDelta.hasUpdatedValue(t,n.id)||null!==r.fields[n.scheme.id])continue;const i=r.initial[n.id];i.isValid()&&!i.isSame(r.initial[s])||e.setItemUpdated(t,{[n.id]:r.fields[s]})}}}};xn=Wt([Nt("LinkedTimeItemTimeValueStartBusinessLogicRule")],xn);const Mn=["vervaldatum","datum"];let Pn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Offerte","Contract"),s={Offerte:[],Contract:[]};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"datum")&&(n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}async dependency(e,t){return U({Offerte:e.getItemsById("Offerte",t.Offerte,{columns:Mn}),Contract:e.getItemsById("Contract",t.Contract,{columns:Mn})})}apply(e,t){const s=this.getAccountSettings().geldigheidofferte;for(const n of["Offerte","Contract"])for(const r of t[n])e.setItemUpdated(r.entry,{vervaldatum:r.fields.datum.clone().add(s,"days")})}};Pn=Wt([Nt("OfferteContractDatumBusinessLogicRule")],Pn);let Bn=class extends Qs{itemType="Planningmateriaal"};Bn=Wt([Nt("PlanningmateriaalAantalRoundUpBusinessLogicRule")],Bn);let Qn=class extends Vs{itemType="Planningmateriaal";groupingProperties={itemType:"MateriaalCat",columnId:"categorie"};requestColumns=Us};Qn=Wt([Nt("PlanningmateriaalAantaltotaalBusinessLogicRule")],Qn);const An=["id","optie","parent"],jn=["id","optie","categorie","parent",{materiaal:["is_combination","is_physical"]}];let Hn=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","optie")}async dependency(e,t){const s=await e.getItemsById("Planningmateriaal",t,{columns:jn}),n=new Set;for(const e of s)n.add(e.fields.categorie);return{childPlanningmateriaalResourcesInCategories:await e.getItemsByQuery("Planningmateriaal",{conditions:[{key:"categorie",value:Array.from(n.values()),comparator:"IN"},{key:"parent",value:null,comparator:"!="}]},{columns:An}),changedPlanningmateriaalResources:s}}apply(e,t){for(const s of t.changedPlanningmateriaalResources)s.getDerivedValue("materiaal>is_combination")&&!s.getDerivedValue("materiaal>is_physical")&&this.updatePlanningmateriaalByParent(s.fields.id,t.childPlanningmateriaalResourcesInCategories,s.fields.optie,e.destinationChangesDelta)}updatePlanningmateriaalByParent(e,t,s,n){for(const r of t)r.fields.parent===e&&e!==r.fields.id&&(r.fields.optie!==s&&n.setItemUpdated(r.entry,{optie:s}),this.updatePlanningmateriaalByParent(r.fields.id,t,s,n))}};Hn=Wt([Nt("PlanningmateriaalOptieBusinessLogicRule")],Hn);const Un=["parent","setcontent"];let On=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","parent")}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Un})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{setcontent:null})}};On=Wt([Nt("PlanningmateriaalParentBusinessLogicRule")],On);const Vn=["aantaltotaal","stays_at_location",{categorie:[{project:[{projecttype:["type"]}]}]}];let Nn=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","aantaltotaal",!0)}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Vn})}apply(e,t){for(const s of t)"transfer"===s.getDerivedValue(["categorie","project","projecttype","type"])&&e.setItemUpdated(s.entry,{stays_at_location:s.fields.aantaltotaal})}};Nn=Wt([Nt("PlanningmateriaalStaysAtLocationBusinessLogicRule")],Nn);const Wn={planning:"planvan",travel:"reistijd_vooraf",factor:-1},$n={planning:"plantot",travel:"reistijd_achteraf",factor:1},Gn=["vervoer","functie",Wn.planning,$n.planning],zn=["id",Wn.travel,$n.travel],Yn={geen:[],heen:[Wn],terug:[$n],retour:[Wn,$n]};let Kn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Planningpersoneel","Planningtransport"),s={Planningpersoneel:[],Planningtransport:[]};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"vervoer")&&(n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Planningpersoneel",t.Planningpersoneel,{columns:Gn}),e.getItemsById("Planningtransport",t.Planningtransport,{columns:Gn})]),r=new Set;for(const e of[s,n])for(const t of e)r.add(t.fields.functie);return{Planningpersoneel:s,Planningtransport:n,Functie:(await e.getItemsById("Functie",[...r],{columns:zn})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{})}}apply({destinationChangesDelta:e},t){for(const s of["Planningpersoneel","Planningtransport"])for(const n of t[s]){const s=t.Functie[n.fields.functie];this.updatePlanningColumns(e,n,Yn[n.initial.vervoer],-1,s.initial),this.updatePlanningColumns(e,n,Yn[n.fields.vervoer],1,s.fields)}}updatePlanningColumns(e,t,s,n,r){for(const i of s)e.setItemUpdated(t.entry,{[i.planning]:t.fields[i.planning].clone().add(n*i.factor*r[i.travel].asMilliseconds())})}};Kn=Wt([Nt("PlanningPersoneelTransportBusinessLogicRule")],Kn);const Xn=["factuurmoment","taxschema"],Zn=["korting_personeel","korting_transport","korting_verkoop","korting_verhuur","korting_totaal","verzekering"],Jn=["factuurmoment","taxschema","personeelkorting","transportkorting","verkoopkorting","verhuurkorting","totaalkorting","verzekering","verzekering_aangepast"],er={Project:{factuurmoment:"factuurmoment",taxschema:"taxschema"},Subproject:{personeelkorting:"korting_personeel",transportkorting:"korting_transport",verkoopkorting:"korting_verkoop",verhuurkorting:"korting_verhuur",totaalkorting:"korting_totaal",verzekering:"verzekering"}};let tr=class extends Ut{async condition({previousChangesDelta:e,transaction:t}){const s=e.getUpdatedTuplesIterator("Project"),n=[];for(const r of s){const s=e.getUpdatedValue(r.entry,"opdrachtgever");null!=s&&n.push(U({projectId:r.entry.itemId,clientId:s,hasEqualValues:this.valuesEqual(r.entry.itemId,s,t)}))}if(0===n.length)return At;const r=(await Promise.all(n)).filter((e=>!e.hasEqualValues));return 0===r.length?At:r.map((e=>({projectId:e.projectId,clientId:e.clientId})))}dependency(e,t){const s={};for(const n of t){const{projectId:t,clientId:r}=n;s[t]=U({projectResource:e.getItemById("Project",t,{columns:Xn}),subprojectCollection:e.getCollection("Subproject",{parent:{itemType:"Project",itemId:t},columns:Zn}),clientResource:e.getItemById("Contact",r,{columns:Jn})})}return U(s)}apply({destinationChangesDelta:e},t){for(const s in t){this.setValues(t[s].projectResource,t[s].clientResource.fields,e);for(const n of t[s].subprojectCollection.items)this.setValues(n,t[s].clientResource.fields,e)}}async valuesEqual(e,t,s){const n=await U({projectResource:s.getItemById("Project",e,{columns:Xn}),subprojectCollection:s.getCollection("Subproject",{parent:{itemType:"Project",itemId:e},columns:Zn}),clientResource:s.getItemById("Contact",t,{columns:Jn})}),r=n.subprojectCollection.items,i=n.clientResource.fields;let o,a;for(const e of r)for(o in er.Subproject)if(a=er.Subproject[o],("verzekering"!==o||i.verzekering_aangepast)&&("taxschema"!==o||null!==i.taxschema)&&e.fields[a]!==i[o])return!1;for(o in er.Project)if(a=er.Project[o],("factuurmoment"!==o||null!==i[o])&&null!==i[o]&&n.projectResource.fields[a]!==i[o])return!1;return!0}setValues(e,t,s){const n=e.entry.itemType,r=er[n],i={};for(const e in r){const s=r[e];("factuurmoment"!==e&&"taxschema"!==e||null!==t[e])&&(("verzekering"!==e||t.verzekering_aangepast)&&(i[s]=t[e]))}return s.setItemUpdated(e.entry,i)}};tr=Wt([Nt("ProjectClientChangedBusinessLogicRule")],tr);const sr=["opdrachtgever","locatie"],nr=["projectnotitie_naam","projectnotitie"],rr=["naam","omschrijving"];let ir=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Project"),s=[];for(const n of t){const t=sr.reduce(((t,s)=>{const r=e.previousChangesDelta.getUpdatedValue(n.entry,s);return null!=r?t.add(r):t}),new Set);t.size>0&&s.push({projectId:n.entry.itemId,updatedContactIds:t})}return s.length>0?s:At}async dependency(e,t){const s=Promise.all(t.map((t=>U({projectId:t.projectId,Contact:e.getItemsById("Contact",[...t.updatedContactIds],{columns:nr}),Projectnotitie:e.getItemsByQuery("Projectnotitie",{},{parent:{itemType:"Project",itemId:t.projectId},columns:rr})}))));return U({template:e.core.templateCache.fetchTemplate("Projectnotitie"),projectTuples:s})}apply(e,t){for(const s of t.projectTuples)for(const n of s.Contact){const{projectnotitie_naam:r,projectnotitie:i}=n.fields;0===r.length&&0===i.length||(s.Projectnotitie.some((e=>e.fields.naam===r&&e.fields.omschrijving===i))||e.destinationChangesDelta._setItemCreated(ge.getLocalId(),{...t.template.getFields(),naam:r,omschrijving:i,project:s.projectId},t.template.getMainColumnSet()))}}};ir=Wt([Nt("ProjectContactProjectNoteBusinessLogicRule")],ir);const or=["id","locatie"],ar=["id","locatie","locatie_persoon"];let cr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Project","locatie")}dependency(e,t){const s={};for(const n of t)s[n]=U({subprojectResources:e.getItemsByQuery("Subproject",{project:n},{columns:or}),projectResource:e.getItemById("Project",n,{columns:ar})});return U(s)}apply(e,t){for(const s in t){if(1!==t[s].subprojectResources.length)continue;const n=t[s].projectResource.fields.locatie;n!==t[s].subprojectResources[0].fields.locatie&&e.setItemUpdated(t[s].subprojectResources[0].entry,{locatie:n,locatie_persoon:t[s].projectResource.fields.locatie_persoon})}}};cr=Wt([Nt("ProjectOneSubLocationAlignBusinessLogicRule")],cr);const lr=["gebruiksperiode","planperiode","transport_pickup","transport_return"];let ur=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Project","Subproject"),s={Project:[],Subproject:[]};let n=!1;for(const r of t)for(const t of lr)if(e.getUpdatedValue(r.entry,t)){n=!0,s[r.entry.itemType].push(r.entry.itemId);break}return n?s:At}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Project",t.Project,{columns:lr}),e.getItemsById("Subproject",t.Subproject,{columns:lr})]);return{project:s,subproject:n}}apply(e,t){const s=[...t.project,...t.subproject];for(const t of s)for(const s of lr){const n=t.fields[s];if(null!==n){for(const r of lr){if(r===s)continue;if(t.fields[r]===n){if("planperiode"===r&&"gebruiksperiode"===s||"gebruiksperiode"===r&&"planperiode"===s)continue;e.setItemUpdated(t.entry,{[r]:null})}}break}}}};ur=Wt([Nt("ProjectSubprojectDefaultTimeBusinessLogicRule")],ur);const dr=["approval_status","previous_status"];let hr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","approval_status")}async dependency(e,t){return e.getItemsById("PurchaseOrder",t,{columns:dr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{previous_status:s.initial.approval_status})}};hr=Wt([Nt("PurchaseOrderApprovalStatusBusinessLogicRule")],hr);let mr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","owner")}async dependency(){return Promise.resolve()}apply(){}};mr=Wt([Nt("PurchaseOrderOwnerBusinessLogicRule")],mr);const pr=["rate_group","active","id"];let fr=class extends Ut{condition(e){const t=new Set;for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Rate"))0!==s.fields.rate_group&&t.add(s.fields.rate_group);return 0===t.size?At:t}dependency(e,t){return e.getItemsByQuery("Rate",{conditions:[{key:"rate_group",comparator:"IN",value:[...t]},{active:!0}],operator:"AND"},{columns:pr,preventCaching:!0})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{active:!1})}};fr=Wt([Nt("RateDeactivateExistingOnCreateBusinessLogicRule")],fr);const yr=["aantal"];let gr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Reparatie"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"exemplaar");null!=t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Reparatie",t,{columns:yr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{aantal:1})}};gr=Wt([Nt("ReparatiesExemplaarAantalBusinessLogicRule")],gr);const Ir=["id","asset_location"];let Cr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Reparatie","MateriaalLost"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"exemplaar");null!=t&&s.push({entry:n.entry,exemplaar:t})}return 0===s.length?At:s}async dependency(e,t){return{entries:t.map((e=>e.entry)),exemplaarResources:await e.getItemsById("Exemplaar",Array.from(new Set(t.map((e=>e.exemplaar)))),{columns:Ir})}}apply(e,t){for(const s of t.entries){const n=e.transaction.itemHandler.lookUpItemField(s,"exemplaar"),r=t.exemplaarResources.find((e=>e.fields.id===n));if(void 0===r)throw new Error(`Exemplaar ${n} linked to Repair/MateriaalLost ${s.itemId} does not exist`);e.setItemUpdated(s,{asset_location:r.fields.asset_location})}}};Cr=Wt([Nt("ReparatieLostItemExemplaarLocationBusinessLogicRule")],Cr);const vr=["general_eigen_medewerker_edit"];let Tr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"medewerkers_rechten");(void 0!==t&&"read"!==t||!0===e.getUpdatedValue(n.entry,"medewerkers_toegang"))&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:vr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{general_eigen_medewerker_edit:!0})}};Tr=Wt([Nt("RolEditOwnDataBusinessLogicRule")],Tr);const Rr=["facturen_eigen","general_bestanden_downloaden","facturen_toegang","projecten_offertes_maken","projecten_facturen_maken"];let Er=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t)!0!==e.getUpdatedValue(n.entry,"projecten_facturen_maken")&&!0!==e.getUpdatedValue(n.entry,"projecten_offertes_maken")||s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Rr})}apply(e,t){for(const s of t){const t=s.fields.projecten_facturen_maken,n=s.fields.projecten_offertes_maken;if((t||n)&&(e.setItemUpdated(s.entry,{general_bestanden_downloaden:"all"}),t)){const t=s.fields.facturen_eigen;e.setItemUpdated(s.entry,{facturen_toegang:!0,facturen_eigen:"read"===t?"write":t})}}}};Er=Wt([Nt("RolFileAccessBusinessLogicRule")],Er);const Sr=["medewerkers_loginfields","medewerkers_lastseen"];let _r=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","medewerkers_loginfields",!1)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Sr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{medewerkers_lastseen:!1})}};_r=Wt([Nt("RolLoginFieldsLastSeenBusinessLogicRule")],_r);const br=["projecten_toegang"];let wr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","personeelsplanner_toegang",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:br})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{projecten_toegang:!0})}};wr=Wt([Nt("RolPersoneelsplannerToegangBusinessLogicRule")],wr);const qr=["materialen_tijdlijn"];let Fr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"projecten_bewerken");void 0!==t&&"no"!==t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:qr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{materialen_tijdlijn:"projects"})}};Fr=Wt([Nt("RolProjectenBewerkenBusinessLogicRule")],Fr);const kr=["uren_kosten","visibility_financials"];let Lr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","projecten_toegang",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:kr})}apply(e,t){for(const s of t)!1!==s.fields.visibility_financials&&e.setItemUpdated(s.entry,{uren_kosten:!0})}};Lr=Wt([Nt("RolProjectenToegangBusinessLogicRule")],Lr);const Dr=["purchaseorders_edit"];let xr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"purchaseorders_edit");void 0!==t&&"all"!==t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Dr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{purchaseorders_attach_crew_plannings:!1})}};xr=Wt([Nt("RolPurchaseOrderAttachPlanningBusinessLogicRule")],xr);const Mr=["visibility_financials","facturen_toegang","projecten_facturen_maken","projecten_offertes_maken","projecten_toegang"];let Pr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Rol","visibility_financials")}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Mr})}apply(e,t){for(const s of t)s.fields.visibility_financials?s.fields.projecten_facturen_maken&&e.setItemUpdated(s.entry,{facturen_toegang:!0}):e.setItemUpdated(s.entry,{projecten_facturen_maken:!1,projecten_offertes_maken:!1,facturen_toegang:!1})}};Pr=Wt([Nt("RolVisibilityFinancialsBusinessLogicRule")],Pr);let Br=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","warehouse_trackinglog_access",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:["magazijn_toegang"]})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{magazijn_toegang:!0})}};Br=Wt([Nt("RolWarehouseTrackingLogAccessBusinessLogicRule")],Br);const Qr=["id","type","is_combination","is_physical","telexemplaren","verhuur"];let Ar=class extends Ut{condition(e){const t=[];for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Setinhoud"))void 0!==s.fields.package&&t.push(s);return 0===t.length?At:t}async dependency(e,t,s){const n=Array.from(new Set(t.flatMap((e=>[e.fields.package,e.fields.materiaal]))));return(await s.transaction.getItemsById("Materiaal",n,{columns:Qr})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{})}apply(e,t,s){for(const n of s){const s=t[n.fields.package],r=t[n.fields.materiaal];e.setItemUpdated(n.entry,{is_fixed:s.fields.is_combination&&s.fields.is_physical&&r.fields.verhuur})}}};Ar=Wt([Nt("SetinhoudCreateFixedBusinessLogicRule")],Ar);const jr=["is_fixed",{package:["type"]}];let Hr=class extends Ut{condition({previousChangesDelta:e}){if(this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING"))return At;const t=e.getUpdatedTuplesIterator("Materiaal","Setinhoud"),s={Materiaal:[],Setinhoud:[]};for(const n of t)"Materiaal"===n.entry.itemType&&(e.hasUpdatedValue(n.entry,"is_physical")||e.hasUpdatedValue(n.entry,"is_combination"))&&s.Materiaal.push(n.entry.itemId),"Setinhoud"===n.entry.itemType&&e.hasUpdatedValue(n.entry,"is_fixed")&&s.Setinhoud.push(n.entry.itemId);return 0===s.Materiaal.length&&0===s.Setinhoud.length?At:s}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Setinhoud",t.Setinhoud,{columns:jr}),e.getItemsByQuery("Setinhoud",{package:t.Materiaal},{columns:jr})]);return[...s,...n.filter((e=>void 0===s.find((t=>e.entry.id!==t.entry.id))))]}apply(e,t){for(const s of t){const t=e.transaction.createItemResource(e.transaction.getLocalItemEntryByItemId("Materiaal",s.fields.package));e.setItemUpdated(s.entry,{is_fixed:t.fields.is_physical&&t.fields.is_combination})}}};Hr=Wt([Nt("SetinhoudUpdateFixedBusinessLogicRule")],Hr);const Ur=["subproject","inplanning"];let Or=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Subproject"),s=new Map;for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"inplanning");void 0!==t&&s.set(n.entry.itemId,t)}return s.size>0?s:At}async dependency(e,t){const s=await e.getItemsById("Subproject",[...t.keys()],{columns:["project"]}),n=s[0].fields.project;for(let e=1;e<s.length;e++)if(s[e].fields.project!==n)throw new Error("SubprojectInPlanningBusinessLogicRuleBase: unexpected change of multiple projects");const r=await e.getItemsByQuery("Functie",{},{parent:{itemType:"Project",itemId:n},columns:Ur}),i=new Map;for(const e of t.keys())i.set(e,[]);for(const e of r)i.get(e.fields.subproject)?.push(e);return i}apply(e,t,s){for(const n of t.entries())for(const t of n[1])e.setItemUpdated(t.entry,{inplanning:s.get(n[0])})}};Or=Wt([Nt("SubprojectInPlanningBusinessLogicRule")],Or);const Vr=["id","project","locatie","locatie_persoon"],Nr=["id","locatie"];let Wr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Subproject","locatie")}async dependency(e,t){const s={};for(const n of t){const t=await e.getItemById("Subproject",n,{columns:Vr}),r=t.fields.project;void 0===s[r]&&(s[r]={}),s[r].Subproject=t,s[r].Project=await e.getItemById("Project",r,{columns:Nr});const i=await e.getItemsByQuery("Subproject",{project:r},{columns:["id"]});s[r].amountOfSubprojects=i.length}return U(s)}apply(e,t){for(const s in t){if(1!==t[s].amountOfSubprojects)continue;const n=t[s].Subproject.fields.locatie;n!==t[s].Project.fields.locatie&&e.setItemUpdated(t[s].Project.entry,{locatie:n,locatie_persoon:t[s].Subproject.fields.locatie_persoon})}}};Wr=Wt([Nt("SubprojectOneSubLocationAlignBusinessLogicRule")],Wr);const $r=["id","naam"],Gr=["id","project","naam"];let zr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Project","naam")}async dependency(e,t){return Promise.all(t.map((t=>U({projectResource:e.getItemById("Project",t,{columns:$r}),subprojectResources:e.getItemsByQuery("Subproject",{},{parent:{itemType:"Project",itemId:t},columns:Gr})}))))}apply(e,t){for(const s of t)1===s.subprojectResources.length&&e.setItemUpdated(s.subprojectResources[0].entry,{naam:s.projectResource.fields.naam})}};zr=Wt([Nt("SubprojectOneSubNameAlignBusinessLogicRule")],zr);const Yr=["deadline_type","deadline_relative_time_period","deadline_relative_offset_amount","deadline_relative_offset_base","deadline_relative_offset_direction","deadline_relative_offset_unit"];let Kr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Taak","deadline_type","absolute")}async dependency(e,t){return e.getItemsById("Taak",t,{columns:Yr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{deadline_relative_time_period:null,deadline_relative_offset_amount:0})}};Kr=Wt([Nt("TaakDeadlineTypeBusinessLogicRule")],Kr);const Xr=[{deadline_relative_time_period:["tot","van"]},"deadline_type","deadline_relative_offset_amount","deadline_relative_offset_base","deadline_relative_offset_direction","deadline_relative_offset_unit"],Zr=["id","tot","van"];let Jr=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Taak"),s=[];for(const n of t){const t=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_time_period"),r=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_amount"),i=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_unit"),o=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_direction"),a=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_base");(t||r||i||o||a)&&s.push(n.entry.itemId)}return s.length>0?s:At}async dependency(e,t){const s=await e.getItemsById("Taak",t,{columns:Xr}),n=new Set;for(const e of s){const t=e.fields.deadline_relative_time_period;null!==t&&n.add(t)}return{taakResources:s,tijdResources:await e.getItemsById("Tijd",Array.from(n),{columns:Zr})}}apply(e,{taakResources:t,tijdResources:s}){const n=s.reduce(((e,t)=>(e[t.fields.id]=t,e)),{});for(const s of t){const t=s.fields.deadline_type,r=s.fields.deadline_relative_time_period;if("relative"===t&&null!=r){const t=n[r],i="end"===s.fields.deadline_relative_offset_base?t.fields.tot:t.fields.van;if(void 0!==i){const t=this.calculateTaskTimeWithOffset(e,i,s);e.setItemUpdated(s.entry,{deadline:t})}}}}calculateTaskTimeWithOffset(e,t,s){const n=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_amount"),r=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_unit"),i=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_direction"),o=t.clone();return void 0!==n&&n>0&&("before"===i?o.subtract(n,"day"===r?"days":"hours"):o.add(n,"day"===r?"days":"hours")),o}};Jr=Wt([Nt("TaakDeadlineOffsetBusinessLogicRule")],Jr);const ei=["naam","id"],ti=["schema_pv","schema_gv","schema_pt","schema_gt","naam"];let si=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Tijd","naam")}async dependency(e,t){const s=await e.getItemsById("Tijd",t,{columns:ei}),n=await e.getItemsByQuery("Functiegroep",{conditions:[{key:"schema_pv",comparator:"IN",value:t},{key:"schema_pt",comparator:"IN",value:t},{key:"schema_gv",comparator:"IN",value:t},{key:"schema_gt",comparator:"IN",value:t}],operator:"OR"},{columns:ti}),r=[];for(const e of s){const t=e.fields.id,s=n.filter((s=>s.fields.schema_pv===t&&s.fields.schema_gv===t&&s.fields.schema_pt===t&&s.fields.schema_gt===t&&s.fields.naam===e.fields.naam));r.push(...s.map((t=>({tijdResource:e,functiegroepResource:t}))))}return r}apply(e,t){for(const s of t)e.setItemUpdated(s.functiegroepResource.entry,{naam:s.tijdResource.fields.naam})}};si=Wt([Nt("TijdPropagateNameToFunctiegroepBusinessLogicRule")],si);const ni=["id","gebruiksperiode","planperiode"];let ri=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Tijd"),s=[];for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"subproject");null!=t&&s.push({itemEntry:n.entry,newValue:t})}return 0===s.length?At:s}async dependency(e,t){const s=(await e.getItemsById("Tijd",t.map((e=>e.itemEntry.itemId)),{columns:["project"]})).reduce(((e,t)=>e.add(t.fields.project)),new Set);if(s.size>1)throw new Error("Updating times of multiple projects currently unsupported");return e.getItemById("Project",[...s][0],{columns:ni,children:{Subproject:{columns:ni}}})}apply(e,t,s){for(const n of s)for(const s of ni){const r=n.itemEntry.itemId;t.fields[s]===r&&e.setItemUpdated(t.entry,{[s]:null});for(const i of t.children.Subproject.items)n.newValue!==i.fields.id&&i.fields[s]===r&&e.setItemUpdated(i.entry,{[s]:null})}}};ri=Wt([Nt("TijdSubprojectChangedBusinessLogicRule")],ri);const ii=[is,Zt,es,ss,cs,us,ds,ps,gs,Cs,Rs,Ss,qs,Fs,Ls,xs,_s,Ps,Ns,As,zs,Ks,nn,tn,Gs,Js,on,cn,un,In,kn,Ln,xn,wn,Tn,Pn,Bn,Qn,Hn,On,Nn,Kn,tr,ir,cr,ur,mr,hr,fr,gr,Cr,Tr,Er,_r,wr,Fr,Lr,Pr,Br,xr,Ar,Hr,Wr,zr,Or,Kr,Jr,ri,si,zt,Yt];class oi{errorHandler;businessLogicRuleInstances;constructor(e,t){this.errorHandler=e,this.businessLogicRuleInstances=t}static constructBusinessLogicRules(e,t,s,n=ii){const r=[];for(const i of n)r.push(new i(e,t,s));return r}setBusinessLogicRuleConfirmation(e,t){this.findBusinessLogicRuleInstance(e).confirm=t}setBusinessLogicRulePostDependencyConfirmation(e,t){this.findBusinessLogicRuleInstance(e).postDependencyConfirm=t}async handleBusinessLogic(e,t,s){const n=e.createBusinessLogicChild();let r=await n.applyChangesDirectly(t),i=0;for(;!r.isEmpty()&&i<20;){const e=new Ot(n,r),t=await this.extractRulesToRun(e,s);if(null===t)return null;const o=await this.waitForRuleDependencies(t,e,s);if(null===o)return null;const a=n.createChangesDelta();this.applyRules(o,new Vt(n,r,a)),r=await n.applyChangesDirectly(a),i++}return 20===i&&this.errorHandler.logError(new Error("Business logic cycles maximum reached")),n}findBusinessLogicRuleInstance(e){const t=this.businessLogicRuleInstances.filter((t=>t instanceof e));if(0===t.length)throw new Error(`BusinessLogicManager: Could not find instance of '${e.__name}'. Have you registered it?`);if(t.length>1)throw new Error(`BusinessLogicManager: Multiple instances of '${e.__name}' found.`);return t[0]}applyRules(e,t){for(const s of e)try{s.ruleInstance.apply(t,s.dependencyResult,s.conditionResult,s.confirmResult===jt?void 0:s.confirmResult)}catch(e){this.errorHandler.logError(e)}}async waitForRuleDependencies(e,t,s){const n=await Promise.allSettled(e.map((async e=>(e.dependencyResult=await e.ruleInstance.dependency(t.transaction,e.conditionResult,t),null!==e.ruleInstance.postDependencyConfirm&&(e.confirmResult=await s(e.ruleInstance.postDependencyConfirm(e.conditionResult,e.dependencyResult,t.transaction))),e)))),r=[];for(const e of n)if("rejected"!==e.status){if(e.value.confirmResult!==At){if(e.value.confirmResult===Ht)return null;r.push(e.value)}}else{if(e.reason instanceof js)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return r}async extractRulesToRun(e,t){const s=await Promise.allSettled(this.businessLogicRuleInstances.map((async s=>{const n=await s.condition(e);let r;return null!==s.confirm&&n!==At&&(r=await t(s.confirm(n,e.transaction))),{ruleInstance:s,conditionResult:n,confirmResult:r}}))),n=[];for(const e of s)if("rejected"!==e.status){if(e.value.conditionResult!==At&&e.value.confirmResult!==At){if(e.value.confirmResult===Ht)return null;n.push(e.value)}}else{if(e.reason instanceof js)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return n}}class ai{construct(e){return new te(e)}}class ci{errorHandler;itemEntryService;queryService;requestColumnsOperationsCacheFactory;columnCache;columnSetFactory;constructor(e,t,s,n,r,i){this.errorHandler=e,this.itemEntryService=t,this.queryService=s,this.requestColumnsOperationsCacheFactory=n,this.columnCache=r,this.columnSetFactory=i}construct(e,t,s,n){const r=e.cachedQueryItem,i=e.options,o=void 0!==n?n[r.itemType]:this.constructColumnSet(e);let a;return a=void 0===i.order?new f(this,i,s,r.queryGraph,r.query,o,t):void 0===i.order.limit?new C(this,i,s,r.queryGraph,r.query,o,t):new v(this,i,s,r.queryGraph,r.query,o,t),a.initializeItems(r.items,this.constructChildCollectionResources(e.children,a,s,n)),void 0!==a.options.abortSignal&&a.options.abortSignal.aborted?(a.clearResource(),a):(s.cachedQueryHandler.addCollectionResource(a),a)}constructChildCollectionResources(e,t,s,n={}){if(null===e)return{};const r={};for(const i of e){const e=i.itemType,o=i.cachedQueryItemTuples;if(0!==o.length){void 0===n[e]&&(n[e]=this.constructColumnSet(o[0]));for(const e of o){const o=e.options.parent.itemId;void 0===r[o]&&(r[o]={}),r[o][i.itemType]=this.construct(e,t,s,n)}}}return r}constructColumnSet(e){const t=e.cachedQueryItem.itemType,s=e.options.columns,n=this.columnCache.retrieve(t,s);return(!0===n.missing||n.missing.length>0)&&this.errorHandler.logWarning("Missing columns in when constructing collection resource column set:",n.missing),this.columnSetFactory.construct(t,s,n.cached)}}class li{columnInfoFactory;constructor(e){this.columnInfoFactory=e}construct(e,t,s){return new ie(this.columnInfoFactory,e,t,s)}}class ui{constructor(){}construct(e,t){return new ae(e,t)}constructFromRootMap(e,t=null){const s=[];for(const n in e){const r=e[n],i=this.construct(r.apiColumn,t),o=this.constructFromRootMap(r.children,i);o.length>0&&i.setChildren(i.apiColumn.itemType,o),s.push(i)}return s}}class di{columnHandler;columnInfoFactory;errorHandler;constructor(e,t,s){this.columnHandler=e,this.columnInfoFactory=t,this.errorHandler=s}construct(e,t,s,n,r){return!0===t?this.constructFromResponse(e,!0,s,n):this.constructFromRequest(e,t,!1,s,n,r)}constructFromRequest(e,t,s,n,r=!0,i=!0){const o=this.expandRootColumnMap(t,e,n,{},r);i&&this.expandRootColumnMap(["id"],e,n,o,r);const a=new le(this,e,t,s,{});return this.processColumnInfo(a,this.columnInfoFactory.constructFromRootMap(o),e),a}constructFromResponse(e,t,s,n=!0){const r=this.expandRootColumnMapFromResponseColumns(e,s,{},n),i=new le(this,e,this.constructRequestColumnsFromRootColumnMap(r),t,s);return this.processColumnInfo(i,this.columnInfoFactory.constructFromRootMap(r),e),i}constructRequestColumnsFromRootColumnMap(e){const t=[];for(const s in e){const n=e[s];S(n.children)?t.push({[s]:this.constructRequestColumnsFromRootColumnMap(n.children)}):t.push(s)}return t}expandRootColumnMapFromResponseColumns(e,t,s,n,r={}){if(!0===r[e])return s;r[e]=!0;for(const i in t[e]){const o=t[e][i];if(void 0===o)continue;if(n&&this.columnHandler.setColumn(e,o),void 0===s[i]&&(s[i]={apiColumn:o,children:{}}),!he.isItemColumn(o,!1))continue;const a=t[o.itemType];void 0!==a&&S(a)&&this.expandRootColumnMapFromResponseColumns(o.itemType,t,s[i].children,n,r)}return s}processColumnInfo(e,t,s){const n=e.response;void 0===n[s]&&(n[s]={});for(const r of t)n[s][r.id]=r.apiColumn,e.groupColumnInfo(r),r.isLeaf||this.processColumnInfo(e,r.children,r.itemType)}expandRootColumnMap(e,t,s,n,r){for(const i of e){const{id:e,children:o}=he.parseRequestColumn(i);let a=s[t]?.[e];void 0!==a?(r&&(a=this.columnHandler.setColumn(t,a)),void 0===n[e]&&(n[e]={apiColumn:a,children:{}}),0!==o.length&&this.expandRootColumnMap(o,a.itemType,s,n[e].children,r)):this.errorHandler.logWarning(`No api column for request column ${e} for itemType ${t}`)}return n}}class hi{columnCache;constructor(e){this.columnCache=e}construct(e,t){return new ue(e,this.columnCache,t)}}class mi{graphQueryParserFactory;constructor(e){this.graphQueryParserFactory=e}construct(e){return new fe(this.graphQueryParserFactory,e)}}class pi{errorHandler;constructor(e){this.errorHandler=e}construct(e,t,s=!1,n){return new d(this,e,t,s,n)}}class fi{serverCache;constructor(e,t,s){this.serverCache=new st(e,t,s)}getById(e){const t=s=>{for(const n of s){if(n.id===e)return n;const s=t(n.getChildren());if(void 0!==s)return s}};return t(this.serverCache.getChildren())}construct(e,t,s){return this.serverCache.createChild(e,t,s)}getServerCache(){return this.serverCache}}class yi{linkTreeService;constructor(e){this.linkTreeService=e}construct(e){return new Te(this.linkTreeService,e)}}class gi{construct(){return new Je}}class Ii{conversionMapService;errorHandler;itemCreateService;itemEntryService;constructor(e,t,s,n){this.conversionMapService=e,this.errorHandler=t,this.itemCreateService=s,this.itemEntryService=n}construct(e,t){return new Rt(e,t,this.errorHandler,this.itemCreateService,this.itemEntryService)}cloneCreatedChanges(e,t=this.construct(e.logMissingColumnErrors)){const s={};return e.created.forEach(((e,t)=>{this.conversionMapService.expandConversionMap(t,e.itemId,s)})),e.created.forEach(((e,n)=>{const r=J.copyFields(e.fields,{},e.columns.main);this.conversionMapService.updateItemValues(r,r,e.columns.item.main,s),t.created.add(s[n][e.itemId],r,e.columns)})),t}constructChildDelta(){return new Et(this.itemEntryService)}constructParentDelta(e){const t=new St(this.itemEntryService,e?._queryItemTypeSet);if(void 0===e)return t;for(const s in e._queryResults)for(const n in e._queryResults[s])t._setQueryResult(s,n,e._queryResults[s][n]);return t}}class Ci extends Error{constructor(e,t){super(`A local item of type ${e} with ID ${t} not be created, the ID is already in use`)}}class vi extends Error{}class Ti extends Error{constructor(e,t){super(`Transaction action timed out during '${e}'. Actions in queue: [${t.join(", ")}]`)}}class Ri{linkTreeService;errorHandler;constructor(e,t){this.linkTreeService=e,this.errorHandler=t}construct(e,t){return new Ge(e,t,this.linkTreeService,this.errorHandler)}}class Ei{version="66.8.0";apiRequestService;apiResponseProcessorFactory;changesDeltaFactory;collectionResourceFactory;columnCache;columnExpansionFactory;columnHandler;columnInfoFactory;columnSetFactory;requestColumnOperationsCacheFactory;conversionMapService;itemCacheFactory;itemCreateService;itemEntryService;itemResourceFactory;lockService;moduleChangesCompilationFactory;queryService;requestColumnExpansionFactory;socketMessageHandler;templateCache;transactionCacheFactory;businessLogicManager;constructor(e,t,s,n,r,i=a.ApiFieldsOnDeleteRule,o){const c=new Ri(n,s),l=new Ze,u=new gi,d=new ye(e,n),h=new ai,m=new ee(t,h),p=new re,f=new oe(m,p),y=new ui,g=new li(y),I=new di(f,y,s),C=new hi(p),v=new Ce(m),T=new mi(c),R=new pi(s),E=new Dt(m,f,I,u,n,d),S=new me,_=new kt(S,E),b=new Ii(S,s,_,d),w=new oi(s,r),q=new ci(s,d,l,C,p,I),F=new yi(n),k=new fi({apiRequestService:m,businessLogicManager:w,changesDeltaFactory:b,collectionResourceFactory:q,columnCache:p,columnExpansionFactory:g,columnHandler:f,columnSetFactory:I,conversionMapService:S,errorHandler:s,graphQueryParserFactory:c,itemCacheFactory:T,itemCreateService:_,itemEntryService:d,itemResourceFactory:R,linkTreeService:n,lockService:v,moduleChangesCompilationFactory:F,queryService:l,requestColumnExpansionFactory:u,requestColumnsOperationsCacheFactory:C,templateCache:E,rootInjector:o},i,this),L=new et(b,p,s,u,k,m,C);this.apiRequestService=m,this.apiResponseProcessorFactory=h,this.changesDeltaFactory=b,this.collectionResourceFactory=q,this.columnCache=p,this.columnExpansionFactory=g,this.columnHandler=f,this.columnInfoFactory=y,this.columnSetFactory=I,this.requestColumnOperationsCacheFactory=C,this.conversionMapService=S,this.itemCacheFactory=T,this.itemCreateService=_,this.itemEntryService=d,this.itemResourceFactory=R,this.lockService=v,this.moduleChangesCompilationFactory=F,this.queryService=l,this.requestColumnExpansionFactory=u,this.socketMessageHandler=L,this.templateCache=E,this.transactionCacheFactory=k,this.businessLogicManager=w}}function Si(e){return e}const _i="beach_access",bi=["id","date","name","yearly"];class wi{holidayCollectionResourcesMap=new Map;rangeContainsHoliday$(e,t,s){return!this.getHolidaysInDateRangeIterator$(e,t,s).next().done}getHolidaysInDateRange$(e,t,s){return[...this.getHolidaysInDateRangeIterator$(e,t,s)]}rangeContainsHoliday(e,t,s){return(0,l.untracked)((()=>this.rangeContainsHoliday$(e,t,s)))}getHolidaysInDateRange(e,t,s){return(0,l.untracked)((()=>[...this.getHolidaysInDateRangeIterator$(e,t,s)]))}async initialize(e){const t=await e.transactionCacheFactory.construct("rm-holidays-service").getCollection("Holiday",{query:{},columns:bi});this.holidayCollectionResourcesMap.set(e,t)}clear(e){return this.holidayCollectionResourcesMap.get(e)?.transaction.destroy(),this.holidayCollectionResourcesMap.delete(e)}*getHolidaysInDateRangeIterator$(e,t,s){const n=this.getHolidaysCollection(s),r=e.clone().startOf("day").valueOf(),i=t.clone().endOf("day").valueOf(),o=e.year(),a=t.year();for(const e of n.itemsSignal()){const t=e.fieldSignals.id(),s=e.fieldSignals.date(),n=e.fieldSignals.name();if(e.fieldSignals.yearly())for(let e=o;e<=a;e++){const o=s.clone().set("year",e);o.valueOf()>=r&&o.valueOf()<=i&&(yield{uid:`hol-${t}-${e}`,name:n,date:o})}else s.valueOf()>=r&&s.valueOf()<=i&&(yield{uid:`hol-${t}`,name:n,date:s.clone()})}}getHolidaysCollection(e){const t=void 0===e?this.holidayCollectionResourcesMap.values().next().value:this.holidayCollectionResourcesMap.get(e);if(void 0===t)throw new Error("RmHolidaysService was not initialized for this core instance, call `initialize` first.");return t}}var qi=r.lp,Fi=r.Gy,ki=r.Zd,Li=r.PC,Di=r.ZN,xi=r.xV,Mi=r.M$,Pi=r.yt,Bi=r.p5,Qi=r.J0,Ai=r.s6,ji=r.mX,Hi=r.vT,Ui=r.iZ,Oi=r.Hj,Vi=r.zn,Ni=r.LQ,Wi=r.KV,$i=r.sY,Gi=r.Z4,zi=r.Ez,Yi=r.ho,Ki=r.iz,Xi=r.yd,Zi=r.qc,Ji=r.tV,eo=r.Gp,to=r.Lf,so=r.Ry,no=r.Vd,ro=r.kj,io=r.sm,oo=r.hA,ao=r.xB,co=r.Pw,lo=r.fB,uo=r.BM,ho=r.Tk,mo=r.OC,po=r.QU,fo=r.Yo,yo=r.hn,go=r.QI,Io=r.bb,Co=r.Z5,vo=r.GQ,To=r.kI,Ro=r.M,Eo=r.vK,So=r.nL,_o=r.Ec,bo=r.X1,wo=r.r,qo=r.ZS,Fo=r.R8,ko=r.y$,Lo=r.mD,Do=r.AX,xo=r.Lu,Mo=r.aA,Po=r.Dr,Bo=r.tO,Qo=r.FQ,Ao=r.n4,jo=r.K7,Ho=r.ep,Uo=r.sW,Oo=r.Xt,Vo=r.f8,No=r.X$,Wo=r.Tz,$o=r.a7,Go=r._C,zo=r.v4,Yo=r.H7,Ko=r.zw,Xo=r.bu,Zo=r.Mf,Jo=r.Fs,ea=r.O$,ta=r.cq,sa=r.aw,na=r.Tf,ra=r.vo,ia=r.Pr,oa=r.Fe,aa=r.ni,ca=r.B5,la=r.JR,ua=r.GE,da=r.qy,ha=r.Gc,ma=r.J$,pa=r.Eq,fa=r.TV,ya=r.M_,ga=r.Bj,Ia=r.ZM,Ca=r.GH,va=r.BF,Ta=r.p$,Ra=r.hw,Ea=r.r4,Sa=r.Jt,_a=r.Qn,ba=r.r2,wa=r.rU,qa=r.Qg,Fa=r.lC,ka=r.C,La=r.AO,Da=r.P$,xa=r.aI,Ma=r.ox,Pa=r.wX,Ba=r.SL,Qa=r.$A,Aa=r.Yn,ja=r.GT,Ha=r.D_,Ua=r.RV,Oa=r.NN,Va=r.cy,Na=r.I0,Wa=r.Lm,$a=r.$P,Ga=r.O9,za=r.vq,Ya=r.Tn,Ka=r.Et,Xa=r.Gv,Za=r.$X,Ja=r.gd,ec=r.Kg,tc=r.l6,sc=r.h1,nc=r.s0,rc=r.c4,ic=r.LV,oc=r.dq,ac=r.oy,cc=r.jF,lc=r.zr,uc=r.A2;export{qi as ALL_PERMISSIONS,Fi as API_COLUMN_LOCATION,ki as AbstractCache,Li as ApiFormatter,Di as ApiLinkTreeType,xi as ApiRequestService,Mi as ApiResponseProcessor,Pi as ApiResponseProcessorFactory,Bi as BLR_ABANDON_CHANGES,Qi as BLR_CONTINUE_WITH_DEFAULTS,Ai as BLR_SKIP_RULE,ji as BusinessLogicManager,Hi as BusinessLogicRule,Ui as BusinessLogicRuleApplyContext,Oi as BusinessLogicRuleConditionContext,Vi as BusinessLogicRuleContextBase,Ni as COLUMN_SEPERATOR,Wi as CachedQueryHandlerBase,$i as CachedQueryItem,Gi as ChangesCompilation,zi as ChangesDelta,Yi as ChangesDeltaBase,Ki as ChangesDeltaFactory,Xi as ChangesProcessor,Zi as ChildChangesDelta,Ji as CollectionEntry,eo as CollectionItemChangesListenerContext,to as CollectionResource,so as CollectionResourceFactory,no as ColumnCache,ro as ColumnExpansion,io as ColumnExpansionFactory,oo as ColumnHandler,ao as ColumnInfo,co as ColumnInfoFactory,lo as ColumnSet,uo as ColumnSetFactory,ho as ColumnUtil,mo as ConversionMapService,po as CreateRequest,fo as CreatedChangesDelta,yo as CriticalBusinessLogicRuleException,go as GraphQueryParser,Io as HOLIDAY_ICON,Co as ItemAlreadyExistsException,vo as ItemCache,To as ItemCacheFactory,Ro as ItemChangesListenerContext,Eo as ItemChangesListenerContextBase,So as ItemCreateService,_o as ItemEntry,bo as ItemEntryService,wo as ItemHandlerBase,qo as ItemLockedException,Fo as ItemMatcherBase,ko as ItemNotFoundException,Lo as ItemResource,Do as ItemResourceFactory,xo as KeyService,Mo as LINKED_TIME_ITEM_TYPES,Po as LimitedCollectionResource,Bo as LinkedTimeItemSubprojectBusinessLogicRule,Qo as LockService,Ao as MatchesAccumulatorMap,jo as MateriaalBulkToSerialBusinessLogicRule,Ho as MateriaalIsCombinationBusinessLogicRule,Uo as MateriaalSerialToBulkBusinessLogicRule,Oo as MateriaalToPhysicalBusinessLogicRule,Vo as MateriaalToVirtualBusinessLogicRule,No as ModuleChangesCompilation,Wo as ModuleChangesCompilationFactory,$o as OrderedCollectionResource,Go as ParentChangesDelta,zo as ProjectClientChangedBusinessLogicRule,Yo as PurchaseOrderOwnerBusinessLogicRule,Ko as QueryColumnExtractor,Xo as QueryContainsLocalIdParser,Zo as QueryParser,Jo as QueryParserBase,ea as QueryParserIdUpdater,ta as QueryService,sa as RequestBuffer,na as RequestBufferBase,ra as RequestBufferManager,ia as RequestColumnExpansion,oa as RequestColumnExpansionFactory,aa as RequestColumnsOperationsCache,ca as RequestColumnsOperationsCacheFactory,la as RmCore,ua as RmHolidaysService,da as ServerCache,ha as ServerCachedQueryHandler,ma as ServerItemHandler,pa as SingleQueryRequestBuffer,fa as SocketMessageHandler,ya as SubprojectInPlanningBusinessLogicRule,ga as Template,Ia as TemplateCache,Ca as TimeColumnUtil,va as TransactionCache,Ta as TransactionCacheFactory,Ra as TransactionCachedQueryHandler,Ea as TransactionErrorLevel,Sa as TransactionEventHandler,_a as TransactionItemHandler,ba as TransactionTimeoutException,wa as TransactionValidator,qa as TransactionValidatorWithDependencies,Fa as businessLogicRule,ka as copy,La as createPath,Da as defaultRequestBufferOptions,xa as equals,Ma as extend,Pa as fieldsSignalProxyHandler,Ba as findIndex,Qa as getFirstProperty,Aa as getPath,ja as hasProperties,Ha as identity,Ua as inArray,Oa as initialProxyHandler,Va as isArray,Na as isBlankObject,Wa as isBoolean,$a as isDate,Ga as isDefined,za as isElement,Ya as isFunction,Ka as isNumber,Xa as isObject,Za as isPromiseLike,Ja as isRegExp,ec as isString,tc as isWindow,sc as merge,nc as pathExists,rc as promiseAllObject,ic as promiseCreateDeferred,oc as promiseCreateTimeout,ac as registeredBusinessLogicRules,cc as shallowMerge,lc as timeoutPromiseSymbol,uc as transactionActionTimeoutMilliseconds};
|
|
1
|
+
import*as e from"@rentman/backend-types";import*as t from"@angular/core";import*as s from"moment";var n={d:(e,t)=>{for(var s in t)n.o(t,s)&&!n.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},r={};n.d(r,{lp:()=>i,Gy:()=>de,Zd:()=>tt,PC:()=>J,ZN:()=>c,xV:()=>ee,M$:()=>te,yt:()=>ai,p5:()=>Ht,J0:()=>jt,s6:()=>At,mX:()=>oi,vT:()=>Ut,iZ:()=>Vt,Hj:()=>Ot,zn:()=>Qt,LQ:()=>o,KV:()=>lt,sY:()=>h,Z4:()=>se,Ez:()=>Rt,ho:()=>vt,iz:()=>Ii,yd:()=>ne,qc:()=>Et,tV:()=>m,Gp:()=>Bt,Lf:()=>f,Ry:()=>ci,Vd:()=>re,kj:()=>ie,sm:()=>li,hA:()=>oe,xB:()=>ae,Pw:()=>ui,fB:()=>le,BM:()=>di,Tk:()=>he,OC:()=>me,QU:()=>pe,Yo:()=>Lt,hn:()=>js,QI:()=>Ge,bb:()=>_i,Z5:()=>Ci,GQ:()=>fe,kI:()=>mi,M:()=>Pt,vK:()=>Mt,nL:()=>kt,Ec:()=>u,X1:()=>ye,r:()=>at,ZS:()=>vi,R8:()=>rt,y$:()=>p,mD:()=>d,AX:()=>pi,Lu:()=>ge,aA:()=>dn,Dr:()=>v,tO:()=>wn,FQ:()=>Ce,n4:()=>nt,K7:()=>Gs,ep:()=>zs,sW:()=>Js,Xt:()=>tn,f8:()=>nn,X$:()=>Te,Tz:()=>yi,a7:()=>C,_C:()=>St,v4:()=>tr,H7:()=>mr,zw:()=>ze,bu:()=>Ye,Mf:()=>Ke,Fs:()=>Ee,O$:()=>Xe,cq:()=>Ze,aw:()=>wt,Tf:()=>bt,vo:()=>Ft,Pr:()=>Je,Fe:()=>gi,ni:()=>ue,B5:()=>hi,JR:()=>Ei,GE:()=>wi,qy:()=>st,Gc:()=>ut,J$:()=>ct,Eq:()=>qt,TV:()=>et,M_:()=>Or,Bj:()=>T,ZM:()=>Dt,GH:()=>pn,BF:()=>mt,p$:()=>fi,hw:()=>yt,r4:()=>dt,Jt:()=>Ie,Qn:()=>ft,r2:()=>Ti,rU:()=>It,Qg:()=>Ct,lC:()=>Nt,C:()=>X,AO:()=>q,P$:()=>_t,aI:()=>K,ox:()=>L,wX:()=>ot,SL:()=>R,$A:()=>_,Yn:()=>F,GT:()=>S,D_:()=>Si,RV:()=>b,NN:()=>pt,cy:()=>A,I0:()=>M,Lm:()=>$,$P:()=>Q,O9:()=>Y,vq:()=>G,Tn:()=>j,Et:()=>B,Gv:()=>x,$X:()=>H,gd:()=>W,Kg:()=>P,l6:()=>z,h1:()=>D,s0:()=>w,c4:()=>U,LV:()=>N,dq:()=>V,oy:()=>ii,jF:()=>E,zr:()=>O,A2:()=>ht});const i=7,o=">";const a=(e=>{var t={};return n.d(t,e),t})({ApiEnumApiType:()=>e.ApiEnumApiType,ApiFieldsOnDeleteRule:()=>e.ApiFieldsOnDeleteRule,TempItemTypeWithoutFixedIds:()=>e.TempItemTypeWithoutFixedIds});var c;!function(e){e.ITEMTABLE="itemtable",e.DIRECT="direct"}(c||(c={}));const l=(e=>{var t={};return n.d(t,e),t})({computed:()=>t.computed,effect:()=>t.effect,signal:()=>t.signal,untracked:()=>t.untracked});class u{itemType;columns;static currentId=0;id=++u.currentId;isLockableSignal=(0,l.signal)(!0);isLocalSignal=(0,l.signal)(!0);outdated=!1;get itemId(){return this._itemId}_itemId;constructor(e,t,s){this.itemType=e,this.columns=s,this.updateId(t)}updateId(e){this._itemId=e,this.isLockableSignal.set(this.isLockable()),this.isLocalSignal.set(this.isLocal())}isOutdated(){return this.outdated}markOutdated(){this.outdated=!0}markUpToDate(){this.outdated=!1}isLocal(){return ge.isLocalId(this.itemId)}isLockable(){if(this.isLocal())return!1;switch(this.itemType){case"Project":case"Materiaal":case"Contact":case"Medewerker":case"Voertuig":case"Template":case"Inhuur":return!0;default:return!1}}toJSON(){return{id:this.id,columns:this.columns}}}class d{factory;entry;transaction;_isNew;columns;fields;initial;fieldSignals;itemType;children;aggregatedChangesListeners=[];derivedFieldSignals={};__computedFunctions=new WeakMap;constructor(e,t,s,n,r=null){this.factory=e,this.entry=t,this.transaction=s,this._isNew=n,this.columns=t.columns.response[t.columns.itemType],this.itemType=this.entry.itemType,this.initial=s.itemHandler.constructInitialProxy(t),this.fields=s.itemHandler.constructFieldsProxy(t),this.fieldSignals=s.itemHandler.constructSignalFieldsProxy(t),this.onConstruct(),null===r||r.aborted||r.addEventListener("abort",(()=>this.clearResource()))}onConstruct(){}computedSignal(e){if(this.__computedFunctions.has(e))return this.__computedFunctions.get(e);const t=(0,l.computed)((()=>e(this)));return this.__computedFunctions.set(e,t),t}getAggregatedChangesListeners(e=new Set){for(const t of this.aggregatedChangesListeners)e.add(t);return e}clearResource(){this.clearChildCollections(),this.transaction.itemHandler.clearItemResource(this)}deregisterChangesListener(e){const t=this.aggregatedChangesListeners.indexOf(e);-1!==t&&this.aggregatedChangesListeners.splice(t,1)}registerChangesListener(e){return this.aggregatedChangesListeners.push(e),()=>{this.deregisterChangesListener(e)}}setChildCollectionResources(e){if(void 0!==e){this.children=e;for(const t in e){e[t].setParentItem(this)}}}collectFields(){return this.transaction.itemHandler.collectFields(this.entry)}setFields(e,t=!1){const s=this.columns;for(const t in e){void 0===s[t]&&this.factory.errorHandler.logWarning(`setFields: no column found for ${t}`)}const n=this.transaction.createChangesDelta();return n.setItemUpdated(this.entry,e),this.transaction.applyChangesDelta(n,t).then((()=>this))}copyFields(e={},t){for(const s of this.entry.columns.main){const n=s.id;void 0!==e[n]||void 0!==t&&!t.includes(n)||(e[n]=J.clone(s.apiColumn.type,this.transaction.itemHandler.lookUpItemField(this.entry,n)))}return e}getParent(e){return this.transaction.getParent(this.entry,e)}compareItemField(e,t){const s=this.columns[e];if(void 0===s)throw new Error("Missing column in ItemResource.compareItemField");return J.compareFields(s.type,this.fields[e],t[e])}hasChanges(){return this.transaction.itemHandler.detectEntryChanges(this.entry.id)}setTransactionParameters(e){q(this.transaction.tabRequestParameters,[this.entry.itemType,this.entry.itemId],[{},e])}isNew(){return this._isNew}isLocal(){return this.entry.isLocal()}toJSON(){const e=[];for(const t in this.columns)e.push(t);return{columns:e,fields:this.fields,entry:this.entry}}getDerivedSignal(e,t){let s,n;if("string"==typeof e?(n=e.split(o),s=e):(n=e,s=e.join(o)),void 0!==this.derivedFieldSignals[s])return this.derivedFieldSignals[s];return this.derivedFieldSignals[s]=(0,l.computed)((()=>{let e=this.entry;for(let s=0;s<n.length;s++){const r=n[s];if(s===n.length-1){return this.transaction.itemHandler.getItemFieldSignal(e,r)()}const i=this.transaction.core.columnCache.getColumn(e.itemType,r);if(void 0===i)throw new Error(`getDerivedSignal: column ${r} not found for itemtype ${e.itemType}`);if(!he.isItemColumn(i))throw new Error(`getDerivedSignal: column ${r} for itemtype ${e.itemType} is not an item type`);const o=this.transaction.itemHandler.getItemFieldSignal(e,r)();if(null===o)return t;e=this.transaction.getLocalItemEntryByItemId(i.itemType,o)}throw new Error(`getDerivedSignal: could not traverse path ${s} for itemtype ${e.itemType}`)}))}getDerivedValue(e,t){return this.transaction.itemHandler.getDerivedValue(this.entry,e,t)}getDerivedValues(e){return this.transaction.itemHandler.getDerivedValues(this.entry,e)}clearChildCollections(){if(null!==this.children)for(const e in this.children)this.children[e].clearResource()}}class h{itemType;query;queryGraph;items;requestColumnsTuple;promise;creation=new Date;deferred;outdated=!1;constructor(e,t,s,n,r){this.itemType=e,this.query=t,this.queryGraph=s,this.items=n,this.requestColumnsTuple=r,this.deferred=N(),this.promise=this.deferred.promise}isOutdated(){return this.outdated}markOutdated(){this.outdated=!0}markUpToDate(){this.outdated=!1}itemsResolved(){return null===this.deferred}resolve(){null!==this.deferred&&(this.deferred.resolve(this),this.deferred=null)}reject(e){null!==this.deferred&&(this.deferred.reject(e),this.deferred=null)}handleMatchedItemEntries(e,t){const s=new Set(e);if(s.size>0){for(const e of this.items)s.delete(e);for(const e of s)this.items.push(e)}if(void 0===t)return;const n=[];for(const e of this.items)t.has(e)||n.push(e);this.items=n}}class m{queryService;options;query;columns;static currentId=0;id=m.currentId++;itemType;parent=null;promise;constructor(e,t,s,n){this.queryService=e,this.options=t,this.query=s,this.columns=n,this.itemType=n.itemType,this.parent=t.parent??null}isLocal(){const e=this.parent;return null===e?this.queryService.containsLocalId(this.query.object):ge.isLocalId(e.itemId)}expandColumns(e){this.columns=e.run(this.columns).merged,this.options.columns=this.columns.request}}class p extends Error{constructor(e,t){super("number"==typeof e?`Item with item entry ID ${e} does not exist`:`Item with type '${e}' and item ID ${t} does not exist`)}}class f{factory;options;transaction;queryGraph;parentCollection;itemType;entry;columns;items=[];itemsSignal=(0,l.signal)(this.items);parentItem;itemEntryIdMap={};onChangeCallbacks=[];onAddCallbacks=[];onRemoveCallbacks=[];aggregatedChangesListeners=[];constructor(e,t,s,n,r,i,o){this.factory=e,this.options=t,this.transaction=s,this.queryGraph=n,this.parentCollection=o,this.columns=i.response,this.itemType=i.itemType,this.entry=new m(this.factory.queryService,t,r,i),this.registerOptionsChangesListeners(),this.onConstruct();const a=this.options.abortSignal;void 0===a||a.aborted||a.addEventListener("abort",(()=>this.clearResource()))}setParentItem(e){this.parentItem=e}initializeItems(e,t){const s=this.addItemResources(e,t);!0===this.options.callOnAddWithInitialItems&&this.triggerCollectionChangesListeners({addedItems:s,removedItems:[]},null,void 0,!1,!0,null)}onConstruct(){}clearCachedQueryOnTransaction(e){const t=e.cachedQueryHandler.getCachedQueryItem(this.entry.itemType,this.entry.query.string);if(t?.markOutdated(),null!==this.options.children)for(const t of this.items)for(const s in t.children)t.children[s].clearCachedQueryOnTransaction(e)}async refresh(){const e=this.transaction.getTransactionChain(!0);for(const t of e)this.clearCachedQueryOnTransaction(t);const t=await this.fetchCachedQuery(),s=new Set;for(const e of this.items){void 0===t.items.find((t=>t.itemId===e.entry.itemId))&&s.add(e.entry)}const n=await this.updateItemsProperty([],s,!0);return this.itemsSignal.set([...this.items]),this.triggerCollectionChangesListeners(n,null,void 0,!1,!1,null),t}deregisterChangesListener(e){const t=this.aggregatedChangesListeners.indexOf(e);-1!==t&&this.aggregatedChangesListeners.splice(t,1)}registerChangesListener(e){return this.aggregatedChangesListeners.push(e),()=>{this.deregisterChangesListener(e)}}onAdd(e){return this.__registerCallback(this.onAddCallbacks,e)}onChange(e){return this.__registerCallback(this.onChangeCallbacks,e)}onRemove(e){return this.__registerCallback(this.onRemoveCallbacks,e)}getIdArray(){return this.items.map((e=>e.entry.itemId))}getItemById(e){try{const t=this.transaction.getLocalItemEntryByItemId(this.itemType,e);return this.itemEntryIdMap[t.id]}catch(e){if(e instanceof p)return;throw e}}triggerCollectionChangesListeners({addedItems:e,changedItems:t,removedItems:s},n,r,i,o,a){if(this.onAddCallbacks.length>0&&e.length>0)try{for(const t of this.onAddCallbacks)t({itemResources:e,collectionResource:this,isInitialCall:o,isCalledAfterSocketUpdate:i})}catch(e){this.factory.errorHandler.logError(e)}if(this.onRemoveCallbacks.length>0&&s.length>0){const e=s.map((e=>e.entry));try{for(const t of this.onRemoveCallbacks)t({itemEntries:e,itemResources:s,collectionResource:this,isCalledAfterSocketUpdate:i})}catch(e){this.factory.errorHandler.logError(e)}}const c=this.getAggregatedChangesListeners(),l=[];if((this.onChangeCallbacks.length>0||c.size>0)&&void 0!==t&&t.length>0){for(const e of t){const t=e.entry.id;if(void 0!==n.created[t])continue;const s=n.updated[t].previous;null!==s&&l.push(new Bt(this,e,i,s,r))}try{for(const e of this.onChangeCallbacks)for(const t of l)e(t)}catch(e){this.factory.errorHandler.logError(e)}}if(0===c.size||0===e.length&&0===s.length&&0===l.length)return;const u={addedItems:e,changedItems:l,removedItems:s,collectionResource:this};if(null!==a)for(const e of c){let t=a.get(e);void 0===t&&a.set(e,t={item:{},collection:{}}),t.collection[this.itemType]??=[],t.collection[this.itemType].push(u)}else for(const e of c)e({[this.itemType]:[u]},{},i)}forEach(e){const t=this.items;for(const s of t)e(s)}filter(e){const t=this.items,s=[];for(const n of t)e(n)&&s.push(n);return s}first(e){const t=this.items;for(const s of t)if(e(s))return s;return null}some(e){return null!==this.first(e)}groupBy(e){const t=this.items,s={};if("string"==typeof e)for(const n of t){if(void 0===n.entry.columns.response[this.entry.itemType][e])throw new Error(`Trying to group on a column not in one of the items in this collection! (column '${e}', item ${n.entry.itemType}:${n.entry.itemId})`);const t=n.fields[e];void 0===s[t]&&(s[t]=[]),s[t].push(n)}if("function"==typeof e)for(const n of t){const t=e(n);null!==t&&(void 0===s[t]&&(s[t]=[]),s[t].push(n))}return s}map(e){const t=this.items,s=t.length,n=new Array(s);if("string"==typeof e)for(let r=0;r<s;r++)n[r]=t[r].fields[e];if("function"==typeof e)for(let r=0;r<s;r++)n[r]=e(t[r]);return n}reduce(e,t){const s=this.items;for(const n of s)t=e(n,t);return t}clearResource(){if(this.aggregatedChangesListeners=[],this.onAddCallbacks=[],this.onRemoveCallbacks=[],this.onChangeCallbacks=[],null!==this.options.children)for(const e of this.items)e.clearChildCollections();this.transaction.cachedQueryHandler.clearCollectionResource(this)}async handleMatchedItemEntries(e,t,s){const{itemEntriesToBeAdded:n,itemEntriesToBeRemovedSet:r,changedItemResources:i}=this.getCollectionItemEntryChanges(e,t),o=await this.updateItemsProperty(n,r,s);return{collectionResource:this,addedItems:o.addedItems,removedItems:o.removedItems,changedItems:i}}getAggregatedChangesListeners(e=new Set){for(const t of this.aggregatedChangesListeners)e.add(t);return this.parentCollection?.getAggregatedChangesListeners(e),this.parentItem?.getAggregatedChangesListeners(e),e}getCollectionItemEntryChanges(e,t){const s=[],n=new Set,r=[];for(const t of e){const e=this.itemEntryIdMap[t.id];void 0===e?s.push(t):r.push(e)}if(void 0!==t)for(const e of t)void 0!==this.itemEntryIdMap[e.id]&&n.add(e);return{itemEntriesToBeAdded:s,itemEntriesToBeRemovedSet:n,changedItemResources:r}}removeItemResources(e,t){if(0===e.size)return[];const s=[],n=[];for(const r of this.items){const i=r.entry;e.has(i)?(n.push(r),delete this.itemEntryIdMap[i.id],t&&r.clearChildCollections()):s.push(r)}this.items.length=s.length;for(let e=0;e<s.length;e++)this.items[e]=s[e];return n}async updateItemsProperty(e,t,s){if(void 0===this.options.children||0===e.length)return{addedItems:this.addItemResources(e,{}),removedItems:this.removeItemResources(t,s)};const n=await this.transaction.cachedQueryHandler.__fetchChildCachedQueryItems(this.entry.itemType,e.map((e=>e.itemId)),this.options.children),r=new Map;for(const t of e)void 0===this.itemEntryIdMap[t.id]&&r.set(t.itemId,t);let i;if(r.size===e.length)i=n;else{i=[];for(const e of n){const t=[];for(const s of e.cachedQueryItemTuples)r.has(s.options.parent.itemId)&&t.push(s);i.push({itemType:e.itemType,cachedQueryItemTuples:t})}}return{addedItems:this.addItemResources([...r.values()],this.factory.constructChildCollectionResources(i,this,this.transaction)),removedItems:this.removeItemResources(t,s)}}addItemResources(e,t){const s=this.transaction.createItemResources(e,t,void 0,this.options.abortSignal);for(const e of s)this.items.push(e),this.itemEntryIdMap[e.entry.id]=e;return s}async fetchCachedQuery(e=this.options){const t=this.transaction.cachedQueryHandler;return(await t.__fetchParentItemEntriesByQueryData(this.itemType,e,this.factory.requestColumnsOperationsCacheFactory.construct(this.itemType,this.options.columns),this.entry.query)).cachedQueryItem}registerOptionsChangesListeners(){const{onAdd:e,onRemove:t,onChange:s,changesListener:n}=this.options;void 0!==e&&this.onAddCallbacks.push((t=>{e(t.itemResources,t.collectionResource,t.isInitialCall,t.isCalledAfterSocketUpdate)})),void 0!==t&&this.onRemoveCallbacks.push((e=>{t(e.itemEntries,e.collectionResource,e.isCalledAfterSocketUpdate,e.itemResources)})),void 0!==s&&this.onChangeCallbacks.push(s),void 0!==n&&this.aggregatedChangesListeners.push(n)}__registerCallback(e,t){return e.push(t),()=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)}}}const y=(e,t)=>Number(e)-Number(t),g=(e,t)=>e.localeCompare(t);function I(e){switch(e){case a.ApiEnumApiType.TYPE_NUMBER:case a.ApiEnumApiType.TYPE_DATETIME:case a.ApiEnumApiType.TYPE_TIMESTAMP:case a.ApiEnumApiType.TYPE_TIMESTAMP_MS:case a.ApiEnumApiType.TYPE_DATE:case a.ApiEnumApiType.TYPE_DURATION:case a.ApiEnumApiType.TYPE_VOLUME:case a.ApiEnumApiType.TYPE_WEIGHT:case a.ApiEnumApiType.TYPE_DIMENSION:case a.ApiEnumApiType.TYPE_PRICE:case a.ApiEnumApiType.TYPE_DOUBLE:case a.ApiEnumApiType.TYPE_INT:case a.ApiEnumApiType.TYPE_CURRENT:case a.ApiEnumApiType.TYPE_POWER:case a.ApiEnumApiType.TYPE_DISTANCE:case a.ApiEnumApiType.TYPE_ORDER:return y;case a.ApiEnumApiType.TYPE_TEXT:case a.ApiEnumApiType.TYPE_LONGTEXT:case a.ApiEnumApiType.TYPE_HTML:case a.ApiEnumApiType.TYPE_TIME:return g;default:throw new Error(`ApiType ${e} does not have a sort function`)}}class C extends f{initializeItems(e,t){const s=this.addItemResources(e,t);this.sortItemResources(),!0===this.options.callOnAddWithInitialItems&&this.triggerCollectionChangesListeners({addedItems:s,removedItems:[]},null,void 0,!1,!0,null)}async updateItemsProperty(e,t,s){const n=await super.updateItemsProperty(e,t,s);return this.sortItemResources(),n}getSortCompareTuple(){const e=this.options.order;return{compareFunction:I(this.columns[this.itemType][e.field].type),isDescending:void 0===e.order||"desc"===e.order}}sortItemResources(){const{compareFunction:e,isDescending:t}=this.getSortCompareTuple(),s=this.options.order.field;this.items.sort(((n,r)=>{let i=e(n.fields[s],r.fields[s]);return 0===i&&(i=n.fields.id-r.fields.id),t?-i:i}))}sortItemEntries(e){const{compareFunction:t,isDescending:s}=this.getSortCompareTuple(),n=this.options.order.field,r=this.transaction.itemHandler;return e.sort(((e,i)=>{let o=t(r.lookUpItemField(e,n),r.lookUpItemField(i,n));return 0===o&&(o=e.itemId-i.itemId),s?-o:o}))}}class v extends C{async setLimit(e){const t=this.options.order.limit;this.options.order.limit=e;let s=[],n=new Set;e>t?s=await this.increaseItemEntriesToBeAdded(s,n,t):({itemEntriesToBeAdded:s,itemEntriesToBeRemovedSet:n}=this.limitItemEntriesToBeAdded(s,n));const r=await this.updateItemsProperty(s,n,!0);this.itemsSignal.set([...this.items]),this.triggerCollectionChangesListeners(r,null,void 0,!1,!1,null)}async handleMatchedItemEntries(e,t,s){const n=this.getCollectionItemEntryChanges(e,t);let{itemEntriesToBeAdded:r,itemEntriesToBeRemovedSet:i}=n;({itemEntriesToBeAdded:r,itemEntriesToBeRemovedSet:i}=this.limitItemEntriesToBeAdded(r,i)),r=await this.increaseItemEntriesToBeAdded(r,i);const o=await this.updateItemsProperty(r,i,s);return{collectionResource:this,addedItems:o.addedItems,removedItems:o.removedItems,changedItems:n.changedItemResources}}applyAddedRemovedItemEntries(e,t,s){const n=t.slice();for(const t of e)s.has(t)||n.push(t);return this.sortItemEntries(n)}limitItemEntriesToBeAdded(e,t){const s=this.items.length+(e.length-t.size),n=this.options.order.limit;if(s<=n)return{itemEntriesToBeAdded:e,itemEntriesToBeRemovedSet:t};const r=this.applyAddedRemovedItemEntries(this.items.map((e=>e.entry)),e,t).slice(n),i=e.slice(),o=new Set([...t]);for(const e of r){const t=i.indexOf(e);-1===t?o.add(e):i.splice(t,1)}return{itemEntriesToBeAdded:i,itemEntriesToBeRemovedSet:o}}async increaseItemEntriesToBeAdded(e,t,s=this.options.order.limit){const n=this.items.length+(e.length-t.size),r=this.options.order.limit;if(n>=r||this.items.length<s)return e;const i=this.transaction.itemHandler,o=this.options.order,a=await this.fetchCachedQuery({...this.options,order:{order:o.order,field:o.field,limit:r+t.size+i.getDeletedItemsAmount(this.itemType)}}),c=this.applyAddedRemovedItemEntries(a.items,e,t),l=[],u=r-(this.items.length-t.size);for(let t=0;t<c.length&&l.length<u;t++){const s=c[t];void 0!==this.itemEntryIdMap[s.id]||i.itemIsDeleted(s)&&!e.includes(s)||l.push(s)}return l}}class T{itemType;response;columnSetFactory;itemEntryService;additionalResponseColumns;responseColumns;constructor(e,t,s,n,r){this.itemType=e,this.response=t,this.columnSetFactory=s,this.itemEntryService=n,this.additionalResponseColumns=r,this.responseColumns=he.mergeResponseColumns(t.fetchColumnsObject(),r).merged}getFields(e=this.itemType,t=this.response.links[e][0]){const s=this.response.fetchObject(e,t);if(void 0===s)throw new Error(`Template.getFields: itemType ${e} with itemId ${t} not found in ApiResponseProcessor.`);const n=this.additionalResponseColumns[this.itemType];for(const e in n){const t=this.additionalResponseColumns[this.itemType][e];void 0===s[t.id]&&(J.isExpensiveFormat(t.type)?te.addLazyFormattingFunction(t.id,t.type,t.default,s):s[t.id]=J.formatResponseValue(t.type,t.default))}return{...s,...this.itemEntryService.getLocalDefaultValues()}}getMainColumnSet(){return this.getColumnSet(this.itemType)}getColumnSet(e){return this.columnSetFactory.constructFromResponse(e,!1,this.responseColumns)}}function R(e,t){for(let s=0;s<e.length;s++)if(t(e[s]))return s;return-1}function E(e,t){if(void 0===e)return t;const s={};for(const n in t)s[n]=void 0===e[n]?t[n]:e[n];return s}function S(e){for(const t in e)return!0;return!1}function _(e){if("object"!=typeof e)return null;for(const t in e)return t;return null}function b(e,t){for(const s of t)if(e==s)return!0;return!1}function w(e,t){if(void 0===e)return!1;for(const s of t){if(void 0===e[s])return!1;e=e[s]}return!0}function q(e,t,s,n=!1){for(let r=0;r<t.length;r++){const i=t[r];(void 0===e[i]||n&&r===t.length-1)&&(e[i]=s[r]),e=e[i]}return e}function F(e,t,s=!1){if(void 0!==e){for(const n of t)if(void 0===(e=e[n])&&!s)return;return e}}function k(e,t,s){for(let n=0,r=t.length;n<r;++n){const r=t[n];if(!x(r)&&!j(r))continue;const i=Object.keys(r);for(let t=0,n=i.length;t<n;t++){const n=i[t],o=r[n];s&&x(o)?Q(o)?e[n]=new Date(o.valueOf()):W(o)?e[n]=new RegExp(o):o.nodeName?e[n]=o.cloneNode(!0):G(o)?e[n]=o.clone():(x(e[n])||(e[n]=A(o)?[]:{}),k(e[n],[o],!0)):e[n]=o}}return e}function L(e,...t){return k(e,t,!1)}function D(e,...t){return k(e,t,!0)}function x(e){return null!==e&&"object"==typeof e}function M(e){return null!==e&&"object"==typeof e&&!Object.getPrototypeOf(e)}function P(e){return"string"==typeof e}function B(e){return"number"==typeof e}function Q(e){return"[object Date]"===toString.call(e)}const A=Array.isArray;function j(e){return"function"==typeof e}function H(e){return e&&j(e.then)}function U(e){const t=[],s=[];for(const n in e)t.push(n),s.push(e[n]);return Promise.all(s).then((e=>{const s={};for(let n=0;n<t.length;n++)s[t[n]]=e[n];return s}))}const O=Symbol("Timeout promise symbol");function V(e){const t={};return t.promise=new Promise((s=>{const n=()=>window.setTimeout((()=>{s(O)}),e);let r=n(),i=0;t.pauseTimeout=async e=>{window.clearTimeout(r),i++;try{return await e}finally{i--,0===i&&(r=n())}}})),t}function N(){const e={};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e}function W(e){return"[object RegExp]"===toString.call(e)}function $(e){return"boolean"==typeof e}function G(e){return!(!e||!(e.nodeName||e.prop&&e.attr&&e.find))}function z(e){return e&&e.window===e}function Y(e){return void 0!==e}function K(e,t){if(e===t)return!0;if(null===e||null===t)return!1;if(e!=e&&t!=t)return!0;const s=typeof e;let n,r,i;if(s===typeof t&&"object"===s){if(!A(e)){if(Q(e))return!!Q(t)&&(o=e.getTime(),a=t.getTime(),o===a||o!=o&&a!=a);if(W(e))return!!W(t)&&e.toString()===t.toString();if(z(e)||z(t)||A(t)||Q(t)||W(t))return!1;for(r in i=Object.create(null),e)if(!j(e[r])){if(!K(e[r],t[r]))return!1;i[r]=!0}for(r in t)if(!(r in i)&&Y(t[r])&&!j(t[r]))return!1;return!0}if(!A(t))return!1;if(n=e.length,e.length===t.length){for(r=0;r<n;r++)if(!K(e[r],t[r]))return!1;return!0}}var o,a;return!1}function X(e,t,s){const n=[],r=[];if(s=function(e){return B(e)&&e>0}(s)?s:NaN,t){if(e===t)throw new Error("Can't copy! Source and destination are identical.");if(A(t))t.length=0;else for(const e in t)delete t[e];return n.push(e),r.push(t),i(e,t,s)}return o(e,s);function i(e,t,s){if(--s<0)return"...";if(A(e))for(let n=0,r=e.length;n<r;n++)t.push(o(e[n],s));else if(M(e))for(const n in e)t[n]=o(e[n],s);else if(e&&"function"==typeof e.hasOwnProperty)for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=o(e[n],s));else for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=o(e[n],s));return t}function o(e,t=5){if(!x(e))return e;const s=n.indexOf(e);if(-1!==s)return r[s];if(z(e))throw new Error("Can't copy! Making copies of Window instances is not supported.");let a=!1,c=function(e){switch(toString.call(e)){case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Float32Array]":case"[object Float64Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return new e.constructor(o(e.buffer),e.byteOffset,e.length);case"[object ArrayBuffer]":if(!e.slice){const t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(new Uint8Array(e)),t}return e.slice(0);case"[object Boolean]":case"[object Number]":case"[object String]":case"[object Date]":return new e.constructor(e.valueOf());case"[object RegExp]":{const t=new RegExp(e._source,e.toString().match(/[^/]*$/)[0]);return t.lastIndex=e.lastIndex,t}case"[object Blob]":return new e.constructor([e],{type:e.type})}if(j(e.cloneNode))return e.cloneNode(!0)}(e);return void 0===c&&(c=A(e)?[]:Object.create(Object.getPrototypeOf(e)),a=!0),n.push(e),r.push(c),a?i(e,c,t):c}}const Z=(e=>{var t={};return n.d(t,e),t})({default:()=>s.default});class J{static SERVER_DATETIME_FORMAT="YYYY-MM-DD[T]HH:mm:ssZ";static SERVER_DATE_FORMAT="YYYY-MM-DD";static isExpensiveFormat(e){switch(e){case"date":case"datetime":case"duration":case"timestamp":case"timestamp_ms":return!0;default:return!1}}static formatRequestLocal(e,t){const s={};for(const n of t){const t=n.id,r=n.apiColumn;r.readOnly||void 0===e[t]||(s[t]=this.formatRequestValue(r.type,e[t]))}return s}static copyFields(e,t,s){for(const n of s){const s=n.path;Object.prototype.hasOwnProperty.call(e,s)&&(this.isExpensiveFormat(n.apiColumn.type)||void 0!==e[s])&&(t[s]=this.clone(n.apiColumn.type,e[s]))}return t}static shallowCopyFields(e,t,s,n){for(const r in e){const i=s[r];if(void 0!==i){if(this.isExpensiveFormat(i.type)){const s=Object.getOwnPropertyDescriptor(e,r);if(void 0!==s&&void 0!==s.get){Object.defineProperty(t,r,s);continue}}t[r]=e[r]}else n?.(r)}return t}static setDefaultValues(e,t){for(const s of t)e[s.id]=J.formatResponseValue(s.apiColumn.type,s.apiColumn.default);return e}static compareFields(e,t,s){if(void 0===t)return void 0===s;if(void 0===s)return!1;switch(e){case"date":case"datetime":case"timestamp":case"timestamp_ms":return this.compareMomentObjects(t,s);case"duration":return this.compareDurations(t,s);case"id":case"item":case"link":case"child":case"sibling":case"numeric_externalid":case"alphanumeric_externalid":return t==s;case"current":case"dimension":case"distance":case"power":case"volume":case"weight":case"coordinate":case"price":case"percentage":return this.compareFloats(t,s);case"double":return this.compareFloats(t,s,"double");case"quantity":case"number":case"filesize":case"int":case"bool":case"enum":case"email":case"phone":case"url":case"text":case"longtext":case"color":case"order":case"time":return t===s;default:return K(t,s)}}static compareFloats(e,t,s="float"){const n=Math.abs(e),r=Math.abs(t),i=Math.abs(e-t),o="float"===s?119e-9:1e-14;return e===t||(0===e||0===t||i<Number.MIN_VALUE?i<o*Number.MIN_VALUE:i/Math.min(n+r,Number.MAX_VALUE)<o)}static compareMomentObjects(e,t){return e.isValid()?!!t.isValid()&&e.isSame(t):!t.isValid()}static compareDurations(e,t){return e.asMilliseconds()===t.asMilliseconds()}static formatResponseValue(e,t){switch(e){case"datetime":case"date":case"timestamp":case"timestamp_ms":return this.formatResponseDate(t);case"color":return this.formatResponseColor(t);case"duration":return this.formatResponseDuration(t);case"json":return"string"==typeof t&&""!==t?JSON.parse(t):t;case"number":return 0===t?null:t;case"filesize":return t/1e6;default:return t}}static formatRequestValue(e,t){switch(e){case"datetime":return this.formatRequestDateTime(t);case"date":return this.formatRequestDate(t);case"color":return this.formatRequestColor(t);case"duration":return this.formatRequestDuration(t);case"number":return 0===t?null:t;default:return t}}static formatResponseDate(e){return null===e?Z.default.invalid():(0,Z.default)(e,Z.default.ISO_8601)}static formatResponseDuration(e){return Z.default.duration(null===e?0:e,"seconds")}static formatResponseColor(e){return null===e||e.startsWith("#")?e:"#"+e}static formatRequestDateTime(e){return e.isValid()?e.format(this.SERVER_DATETIME_FORMAT):null}static formatRequestDate(e){return e.isValid()?e.format(this.SERVER_DATE_FORMAT):null}static formatRequestDuration(e){return e.asSeconds()}static formatRequestColor(e){return null===e?e:e.startsWith("#")?e.substring(1):e}static getDefaultValue(e){switch(e){case"int":case"double":case"percentage":case"price":case"order":return 0;case"item":case"link":case"child":case"sibling":return null;case"bool":return!1;case"enum":return"0";case"date":case"datetime":case"timestamp":case"timestamp_ms":return Z.default.invalid();case"duration":return Z.default.duration();case"text":case"longtext":default:return"";case"time":return"00:00";case"color":return"#000000"}}static hasValue(e,t){if(null==t)return!1;switch(e){case"int":case"double":case"percentage":case"price":case"order":return!isNaN(t);case"item":case"link":case"child":case"sibling":case"enum":return null!==t;case"bool":return!0;case"date":case"datetime":case"timestamp":case"timestamp_ms":return Z.default.isMoment(t)&&t.isValid();case"duration":return Z.default.isDuration(t)&&t.asMilliseconds()>0;case"text":case"longtext":return""!==t;case"color":return"#"!==t;default:return!!t}}static isDefaultValue(e,t){return this.compareFields(e,t,this.getDefaultValue(e))}static clone(e,t){switch(e){case"duration":return this.cloneDuration(t);case"date":case"datetime":case"timestamp":case"timestamp_ms":return(0,Z.default)(t);case"json":return X(t);default:return t}}static getCloneFunction(e){switch(e){case"duration":return this.cloneDuration;case"date":case"datetime":case"timestamp":case"timestamp_ms":return this.cloneDate;default:return this.identity}}static cloneDuration(e){return Z.default.duration(e)}static cloneDate(e){return e.clone()}static identity(e){return e}}class ee{externalApiRequestService;apiResponseProcessorFactory;constructor(e,t){this.externalApiRequestService=e,this.apiResponseProcessorFactory=t}template(e,t){return this.processResponse(this.externalApiRequestService.template(e,t))}create(e,t,s,n,r,i,o){return this.processResponse(this.externalApiRequestService.create(e,t,s,n,r,i,o))}delete(e,t,s){return this.processResponse(this.externalApiRequestService.delete(e,t,s))}updateItems(e,t,s,n){return this.processResponse(this.externalApiRequestService.updateItems(e,t,s,n))}requestSkeleton(e,t){return this.processResponse(this.externalApiRequestService.requestSkeleton(e,t))}columns(e,t,s){return this.processResponse(this.externalApiRequestService.columns(e,t,s))}query(e,t,s,n){return this.processResponse(this.externalApiRequestService.query(e,t,s,n))}module(e,t,s){return this.externalApiRequestService._module(e,t,s)}processResponse(e){return e.then((e=>this.apiResponseProcessorFactory.construct(e)))}}class te{response;itemType;columns;links;cacheable;map;items;columnIndexMap={};columnMap={};constructor(e){this.response=e,this.columns=e.columns,this.items=e.items,this.links=e.links,this.cacheable=e.cacheable??!1,this.map=e.map,this.itemType=e.itemType,this.createColumnMaps(),this.replaceTempItemTypeIdsWithLocalIds()}static addLazyFormattingFunction(e,t,s,n){Object.defineProperty(n,e,{enumerable:!0,configurable:!0,set:t=>{delete n[e],n[e]=t},get:()=>(delete n[e],n[e]=J.formatResponseValue(t,s))})}fetchColumnObject(e){return this.columnMap[e]}fetchDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(o));let n=e,r=this.itemType;for(let e=0;e<t.length-1;e++){const i=t[e],o=this.columnMap[r][i];if(void 0===o)throw new Error(`Column '${i}' not found in ApiResponseProcessor.fetchDerivedValue`);if(!he.isItemColumn(o)||null===o.itemType)throw new Error(`Column '${i}' doesn't have children in ApiResponseProcessor.fetchDerivedValue`);if(n=this.fetchValue(r,n,i)??null,r=o.itemType,null===n)return s}return this.fetchValue(r,n,t[t.length-1])??s}fetchValue(e,t,s){if(void 0===this.items[e][t]||void 0===this.columnMap[e]||void 0===this.columnIndexMap[e])return;const n=this.columnMap[e][s],r=this.columnIndexMap[e][s];return J.formatResponseValue(n.type,this.items[e][t].data[r])}fetchColumnArray(e){const t=[];for(const s of this.columns[e])t.push(s);return t}fetchDerivedObject(e,t,s){const n={};for(const r of s)this.fetchDerivedValues(this.fetchValue(e,t,r.id),r,n);return n}fetchDerivedValues(e,t,s){for(const n of t.children){let r;null===e?(r=null,s[n.path]=J.formatResponseValue(n.apiColumn.type,n.apiColumn.default)):(r=this.fetchValue(t.itemType,e,n.id),s[n.path]=r),n.isLeaf||this.fetchDerivedValues(r,n,s)}}fetchObject(e,t){if(void 0===this.items[e])return;if(void 0===this.items[e][t])return;const s=this.items[e][t].data,n={};for(let t=0;t<s.length;t++){const r=this.columns[e][t];J.isExpensiveFormat(r.type)?te.addLazyFormattingFunction(r.id,r.type,s[t],n):n[r.id]=J.formatResponseValue(r.type,s[t])}return n}fetchObjectArray(e,t){const s=[];if(null===t){for(const t in this.items[e])s.push(this.fetchObject(e,t));return s}void 0===t&&(t=this.links[e]);for(const n of t)s.push(this.fetchObject(e,n));return s}fetchColumnsObject(){return this.columnMap}createColumnMaps(){for(const e in this.columns){this.columnIndexMap[e]={},this.columnMap[e]={};for(let t=0;t<this.columns[e].length;t++){const s=this.columns[e][t];this.columnIndexMap[e][s.id]=t,this.columnMap[e][s.id]=s}}}replaceTempItemTypeIdsWithLocalIds(){for(const e in this.links){if(!a.TempItemTypeWithoutFixedIds.includes(e))continue;const t=[];for(const s of this.links[e]){const n=ge.getLocalId();t.push(n);const r=this.items[e][s];r.data[this.columnIndexMap[e].id]=n,this.items[e][n]=r,delete this.items[e][s]}this.links[e]=t}}}class se{transaction;compilation={create:{},delete:{},update:{}};constructor(e){this.transaction=e,this.processDelta()}processDelta(){const e=this.transaction.getDelta();for(const t of e.getDeleteTuplesIterator())t.entry.isLocal()||t.isCascaded||this.addDeleteEntry(t.entry);for(const t in e.created){const s=e.created[t];this.addCreateEntry(s)}for(const t in e.updated){const s=e.updated[t];this.addUpdateEntry(s.entry)}}getDefaultParent(){return{itemType:"Void",itemId:0}}addDeleteEntry(e){q(this.compilation.delete,[e.itemType],[[]]).push(e)}addUpdateEntry(e){q(this.compilation.update,[e.itemType,e.itemId],[{},e])}addCreateEntry(e){let t=this.transaction.getParent(e.entry);null===t&&(t=this.getDefaultParent()),q(this.compilation.create,[t.itemType,t.itemId,e.entry.itemType,e.entry.itemId],[{},{},{},e])}}class ne{apiRequestService;changesDeltaFactory;errorHandler;requestBufferManager;requestColumnExpansionFactory;transaction;changesCompilation;breakUpByParent;onAfterCreateCallback;itemIdConversionMap={};serverCache;constructor(e,t,s,n,r,i,o,a,c){this.apiRequestService=e,this.changesDeltaFactory=t,this.errorHandler=s,this.requestBufferManager=n,this.requestColumnExpansionFactory=r,this.transaction=i,this.changesCompilation=o,this.breakUpByParent=a,this.onAfterCreateCallback=c,this.serverCache=this.transaction.getServerCache()}execute(){const e=this.changesCompilation.compilation;this.requestBufferManager.suspendRequests();const t=self.crypto.randomUUID();return this.executeCreateRequests(this.changesCompilation,t).then((()=>this.executeUpdateRequests(e.update,t))).then((()=>this.executeDeleteRequests(e.delete,t))).then((()=>this.itemIdConversionMap)).finally((()=>this.requestBufferManager.continueRequests()))}getMapValue(e,t,s=this.itemIdConversionMap){if(void 0!==s&&void 0!==s[e])return s[e][t]}executeCreateRequests(e,t){const s=new pe(this.requestColumnExpansionFactory,e.compilation.create,this.transaction,this.breakUpByParent,t).run(),n=[];for(const e of s)n.push(this.executeCreateRequest(e).then((e=>(void 0!==this.onAfterCreateCallback&&this.onAfterCreateCallback(this.itemIdConversionMap),e))));return Promise.all(n)}executeCreateRequest(e){return this.apiRequestService.requestSkeleton(e.request).then((t=>{const s=this.changesDeltaFactory.construct(!1),n=e.items,r={};for(const e in n)for(const i in n[e]){const o=n[e][i],a=this.getMapValue(e,parseInt(i,10),t.map);if(void 0===a){s.setItemDeleted(o);continue}const c=this.transaction.itemHandler.entries.get(e,i);this.serverCache.itemHandler.itemChanges[c.id]=this.serverCache.itemHandler.copyTransactionItemEntryChanges(this.transaction.itemHandler.itemChanges[c.id],c),this.serverCache.itemHandler.entries.add(c),this.transaction.itemHandler.entries.clearByItemId(e,Number(i)),void 0===r[e]&&(r[e]={}),r[e][a]="CLEAR_ALWAYS"}for(const e in t.map){void 0===this.itemIdConversionMap[e]&&(this.itemIdConversionMap[e]={});for(const s in t.map[e])this.itemIdConversionMap[e][s]=t.map[e][s]}return this.serverCache.processResponse(t,e.request.columns,s,r,t.map),this.serverCache.applyChangesDelta(s,!1,t.map)}))}async executeUpdateRequests(e,t){for(const s in e)await this.executeUpdateRequest(s,e[s],t)}async executeUpdateRequest(e,t,s){const n={},r=this.requestColumnExpansionFactory.construct();n[e]={};for(const s in t){const i=t[s],o=this.transaction.itemHandler.formatRequest(i);if(!S(o))continue;const a=n[e][s]={},c=F(this.transaction.tabRequestParameters,[e,s]),l=this.transaction.getAiRequestParameters(i);a.values=o,void 0===c&&void 0===l||(a.parameters={...c,...l}),r.expandWithColumnSet(i.columns)}if(!S(n[e]))return;const i=r.get(),o=await this.apiRequestService.updateItems(e,n,i,s),a={};for(const e in n){void 0===a[e]&&(a[e]={});for(const t in n[e])a[e][t]="CLEAR_ALWAYS"}const c=this.changesDeltaFactory.construct(!1,[e]);await this.serverCache.applyChangesDelta(this.serverCache.processResponse(o,i,c,a))}executeDeleteRequests(e,t){const s=[];for(const n in e)s.push(this.executeDeleteRequest(n,e[n],t));return Promise.all(s)}executeDeleteRequest(e,t,s){return this.apiRequestService.delete(e,t.map((e=>e.itemId)),s).then((e=>{const s=this.changesDeltaFactory.constructParentDelta(),n=e.items;for(const e of t)b(e.itemId,n)?s.setItemDeleted(e):this.errorHandler.logWarning("Delete failed!",e);return this.serverCache.applyChangesFromParent(s,!0)}))}}class re{cache={};pendingCache={};allColumns={};setColumn(e,t){const s=this.cache;void 0===s[e]&&(s[e]={});const n=s[e],r=t.id;return void 0===n[r]&&(n[r]=t),n[r]}setColumns(e,t,s,n){const r={};for(const e in s){const t=s[e];r[e]={};for(const s in t)r[e][s]=this.setColumn(e,t[s])}return!0===t&&!1===n&&(this.allColumns[e]=!0),r}setPendingColumn(e,t,s){const n=this.pendingCache;void 0===n[e]&&(n[e]={});const r=n[e];void 0===r[t]&&(r[t]=s)}clearPendingColumns(e,t){for(const s of t){const t=he.parseRequestColumn(s);delete this.pendingCache[e]?.[t.id]}}setPendingColumns(e,t,s){for(const n of t){const t=he.parseRequestColumn(n);this.setPendingColumn(e,t.id,s)}}retrieve(e,t){if(!0===t)return this.containsAll(e)?{cached:this.getColumns(e),missing:[],pending:null}:{cached:{},missing:!0,pending:null};const s={},n=[],r=[];return this.retrieveColumns(e,t,n,s,r),{cached:s,missing:n,pending:r.length>0?Promise.all(r):null}}containsAll(e){return!0===this.allColumns[e]}getColumns(e){const t=this.cache;return{[e]:void 0===t[e]?{}:t[e]}}getColumn(e,t){const s=this.cache[e];if(void 0!==s)return s[t]}retrieveColumns(e,t,s,n,r){this.retrieveColumn(e,"id",s,n,r);for(const i of t)this.retrieveColumn(e,i,s,n,r)}retrieveColumn(e,t,s,n,r){const i=he.parseRequestColumn(t),o=this.getColumn(e,i.id);if(void 0===o){const n=this.pendingCache[e]?.[i.id];return void(void 0===n?s.push(t):r.push(n))}if(void 0===n[e]&&(n[e]={}),n[e][i.id]=o,0===i.children.length)return;const a=[];this.retrieveColumns(o.itemType,i.children,a,n,r),0!==a.length&&s.push({[i.id]:a})}}class ie{columnInfoFactory;itemType;responseColumns;expansionMap={};requestColumnsTrue;requestColumns;constructor(e,t,s,n){if(this.columnInfoFactory=e,this.itemType=t,this.responseColumns=n,!0===s){this.requestColumnsTrue=!0;const e=[];for(const s in n[t])e.push(s);this.requestColumns=e}else this.requestColumnsTrue=!1,this.requestColumns=s}run(e){const t=this.expansionMap,s=e.id;return void 0!==t[s]?t[s]:t[s]=e.expand(this.requestColumns,this.requestColumnsTrue,this.responseColumns)}aggregateRootColumns(){const e=this.expansionMap,t={};for(const s in e){const n=e[s].difference;null!==n&&this.expandRootColumnMap(n.root,t)}return this.columnInfoFactory.constructFromRootMap(t)}expandRootColumnMap(e,t){for(const s of e){const e=s.id;void 0===t[e]&&(t[e]={apiColumn:s.apiColumn,children:{}}),this.expandRootColumnMap(s.children,t[e].children)}}}class oe{apiRequestService;cache;constructor(e,t){this.apiRequestService=e,this.cache=t}setColumn(e,t){return this.cache.setColumn(e,t)}setColumns(e,t,s,n=!1){return this.cache.setColumns(e,t,s,n)}fetchItemTypeTranslations(e){return Promise.all(e.map((e=>this.fetch(e,["id"])))).then((t=>t.reduce(((t,s,n)=>{const r=e[n];return t[r]=s[r].id.name,t}),{})))}fetch(e,t,s){const n=this.cache.retrieve(e,t);return!0!==n.missing&&0===n.missing.length&&null===n.pending?Promise.resolve(n.cached):!0!==n.missing&&0===n.missing.length&&null!==n.pending?n.pending.then((()=>this.cache.retrieve(e,t).cached)):!0!==n.missing&&n.missing.length>0&&null!==n.pending?Promise.all([this.request(e,n.missing,s),n.pending]).then((()=>this.cache.retrieve(e,t).cached)):this.request(e,n.missing,s).then((e=>he.mergeResponseColumns(e,n.cached).merged))}fetchAll(e){return this.cache.containsAll(e)?Promise.resolve(this.cache.getColumns(e)):this.request(e,!0)}async fetchEditableCustomColumns(e){const t=await this.fetchAll(e),s=[];for(const n in t[e]){const r=t[e][n];he.isCustomColumn(r)&&he.hasLocationProperty(r,de.EDIT)&&s.push(r)}return s}request(e,t,s={filter:!1}){const n=this.apiRequestService.columns(e,{[e]:t},s);return!0!==t&&!1===s.filter&&this.cache.setPendingColumns(e,t,n),n.then((n=>(!0!==t&&!1===s.filter&&this.cache.clearPendingColumns(e,t),this.cache.setColumns(e,t,n.fetchColumnsObject(),s.filter))))}}class ae{apiColumn;parent;id;level;path;tailPath;itemType=null;children=[];isLeaf=!0;constructor(e,t=null){this.apiColumn=e,this.parent=t;const s=e.id;this.id=s,null===t?(this.level=0,this.path=s,this.tailPath=""):(this.level=t.level+1,this.path=t.path+o+s,this.tailPath=0===t.level?s:t.tailPath+o+s)}toRequestColumns(){return 0===this.children.length?[this.id]:[{[this.id]:this.children.flatMap((e=>e.toRequestColumns()))}]}setChildren(e,t){return this.itemType=e,this.children=t,this.isLeaf=!1,this}}let ce=0;class le{columnSetFactory;itemType;request;requestColumnsTrue;response;id=++ce;link=null;main=[];root=[];searchable={main:[],derived:[]};custom={main:[],derived:[]};item={main:[],derived:[]};leaf={main:[],derived:[]};filtered={main:[],derived:[]};constructor(e,t,s,n,r){this.columnSetFactory=e,this.itemType=t,this.request=s,this.requestColumnsTrue=n,this.response=r}groupColumnInfo(e){const t=e.apiColumn,s=null!==e.parent,n=s?"derived":"main";s||(t.type===a.ApiEnumApiType.TYPE_LINK&&(this.link=e),this.main.push(e)),e.isLeaf?this.leaf[n].push(e):s||this.root.push(e),he.isFilteredColumn(t)&&this.filtered[n].push(e),he.isSearchableColumn(t)&&this.searchable[n].push(e),he.isCustomColumn(t)&&this.custom[n].push(e),he.isItemColumn(t)&&this.item[n].push(e)}toJSON(){return this.main.map((e=>e.id))}isSupersetOf(e,t){if(!0===e)return this.requestColumnsTrue;if(!0===t&&!this.requestColumnsTrue)return!1;for(const t of e)if(!he.containsColumn(t,this.request))return!1;return!0}mergeRequestColumns(e){return he.mergeRequestColumns(this.request,e)}mergeResponseColumns(e){return he.mergeResponseColumns(this.response,e).merged}expand(e,t,s){const n=he.mergeRequestColumns(this.request,e);if(0===n.difference.length)return{merged:this,difference:null};const r=this.mergeResponseColumns(s);return{merged:this.columnSetFactory.constructFromRequest(this.itemType,n.merged,this.requestColumnsTrue||t,r,!1,!1),difference:this.columnSetFactory.constructFromRequest(this.itemType,n.difference,!1,r,!1,!1)}}}class ue{itemType;columnCache;requestColumnsTuple;aggregateColumnsTuple;expandedRequestColumnsTuple;columnsMergedWithTupleMap={};expandedColumnsMergedWithTupleMap={};setContainsAllColumnsMap={};setContainsAllExpandedColumnsMap={};constructor(e,t,s){this.itemType=e,this.columnCache=t,this.requestColumnsTuple=this.createRequestColumnsTuple(he.copyRequestColumns(s))}getRequestColumnsTuple(e){return e instanceof st?void 0!==this.expandedRequestColumnsTuple?this.expandedRequestColumnsTuple:this.expandedRequestColumnsTuple=this.createRequestColumnsTuple(e.expandColumnsWithRequiredColumns(this.itemType,this.requestColumnsTuple.object)):this.requestColumnsTuple}getAggregateColumns(){return void 0!==this.aggregateColumnsTuple?this.aggregateColumnsTuple:this.aggregateColumnsTuple=this.createRequestColumnsTuple(this.extractAggregateColumns(this.requestColumnsTuple.object,this.itemType))}hasAggregateColumns(){return this.getAggregateColumns().object.length>0}getColumnsMergedWithTuple(e,t){const s=e.string,n=t instanceof st?this.expandedColumnsMergedWithTupleMap:this.columnsMergedWithTupleMap;return void 0!==n[s]?n[s]:n[s]=this.mergeColumnsWithTuple(e,t)}tupleContainsAllColumns(e,t){const s=this.getColumnsMergedWithTuple(e,t).difference.object;return!0!==s&&0===s.length}setContainsAllColumns(e,t){const s=e.id,n=t instanceof st?this.setContainsAllExpandedColumnsMap:this.setContainsAllColumnsMap;return void 0!==n[s]?n[s]:n[s]=e.isSupersetOf(this.getRequestColumnsTuple(t).object)}mergeColumnsWithTuple(e,t){const s=this.getRequestColumnsTuple(t);if(s.string===e.string)return{merged:s,difference:this.createRequestColumnsTuple([])};const n=he.mergeRequestColumns(e.object,s.object);return{merged:this.createRequestColumnsTuple(n.merged),difference:this.createRequestColumnsTuple(n.difference)}}extractAggregateColumns(e,t){if(!0===e)return[];const s=[];for(const n of e){const e=he.parseRequestColumn(n),r=this.columnCache.getColumn(t,e.id);if(void 0===r)continue;if(he.isAggregateColumn(r)){s.push(e.id);continue}if(0===e.children.length)continue;const i=this.extractAggregateColumns(e.children,r.itemType);i.length>0&&s.push({[e.id]:i})}return s}createRequestColumnsTuple(e){return{object:e,string:he.createRequestColumnSetId(e)}}}var de;!function(e){e[e.NO=0]="NO",e[e.IMPORT=1]="IMPORT",e[e.EXPORT=2]="EXPORT",e[e.GRID=4]="GRID",e[e.TEMPLATE=8]="TEMPLATE",e[e.EDIT=16]="EDIT",e[e.API=20]="API",e[e.SOCKET=32]="SOCKET",e[e.ALL=63]="ALL",e[e.GRID_SELECTABLE=32768]="GRID_SELECTABLE",e[e.LOCATION_LABELS=524288]="LOCATION_LABELS"}(de||(de={}));class he{static isStringColumn(e){switch(e.type){case"email":case"phone":case"url":case"text":case"longtext":case"textreplace":case"time":return!0;default:return!1}}static isFloatColumn(e){switch(e.type){case"double":case"volume":case"weight":case"distance":case"dimension":case"power":case"current":case"price":case"percentage":return!0;default:return!1}}static isIntColumn(e){switch(e.type){case"int":case"number":case"quantity":return!0;default:return!1}}static isNumberColumn(e){return this.isFloatColumn(e)||this.isIntColumn(e)}static isCustomColumn(e){return"customfield"===e.fieldtype}static isAggregateColumn(e){return"aggregate"===e.fieldtype}static isItemColumn(e,t=!0){switch(e.type){case"id":return t;case"item":case"child":case"sibling":case"link":return!0;default:return!1}}static isDateColumn(e){switch(e.type){case"datetime":case"date":case"timestamp":case"timestamp_ms":return!0;default:return!1}}static isRenderedColumn(e){switch(e.type){case"datetime":case"date":case"timestamp":case"timestamp_ms":case"duration":return!0;default:return!1}}static isFilteredColumn(e){if("staffel"===e.id)return!0;if(void 0!==e.generator)return!0;switch(e.type){case"current":case"price":case"bool":case"enum":case"country":case"volume":case"weight":case"distance":case"dimension":case"quantity":case"email":case"url":case"datetime":case"date":case"timestamp":case"timestamp_ms":case"duration":case"html":case"textreplace":case"longtext":case"percentage":case"time":return!0;default:return!1}}static hasLocationProperty(e,t){return!!(t&e.location)}static isEditableColumn(e){if(e.readOnly)return!1;switch(e.type){case"date":case"datetime":case"timestamp":case"timestamp_ms":case"duration":return!1}return!0}static isSearchableColumn(e){switch(e.type){case"email":case"phone":case"text":case"longtext":case"html":return!0;default:return!1}}static getComparators(e){switch(e.type){case"dimension":case"weight":case"price":return["=",">","<"];case"date":case"datetime":case"timestamp":case"timestamp_ms":case"duration":return[">","<"];case"time":return[">","<","=","!="];default:return["=","!="]}}static containsColumn(e,t){const s=this.parseRequestColumn(e),n=this.findRequestColumn(s.id,t);if(-1===n)return!1;if(0===s.children.length)return!0;if("string"==typeof t[n])return!1;for(const e of s.children)if(!this.containsColumn(e,t[n][s.id]))return!1;return!0}static containsDerivedColumns(e){for(const t of e)if(this.parseRequestColumn(t).children.length>0)return!0;return!1}static responseColumnsAvailable(e,t,s){for(const n of t){const t=this.parseRequestColumn(n),r=t.children,i=s[e];if(void 0===i)return!1;const o=i[t.id];if(void 0===o)return!1;if(r.length>0&&!this.responseColumnsAvailable(o.itemType,r,s))return!1}return!0}static copyRequestColumns(e){if(!0===e)return!0;const t=[];for(const s of e)t.push(this.copyRequestColumn(s));return t}static copyRequestColumn(e){const t=this.parseRequestColumn(e);if(0===t.children.length)return t.id;const s=[];for(const e of t.children)s.push(this.copyRequestColumn(e));return{[t.id]:s}}static mergeRequestColumns(e,t){if(!0===e)return{merged:!0,difference:[]};if(!0===t)return{merged:!0,difference:!0};const s=this.copyRequestColumns(e),n=[];for(const e of t){const t=this.mergeRequestColumn(e,s);null!==t&&n.push(t)}return{merged:s,difference:n}}static mergeRequestColumn(e,t){const s=this.parseRequestColumn(e),n=this.findRequestColumn(s.id,t);if(-1===n)return t.push(e),e;if(0===s.children.length)return null;"string"==typeof t[n]&&(t[n]={[s.id]:[]});const r=[];for(const e of s.children){const i=this.mergeRequestColumn(e,t[n][s.id]);null!==i&&r.push(i)}return 0===r.length?null:{[s.id]:r}}static createRequestColumnSetId(e){if(!0===e)return"true";if(0===e.length)return"{}";let t=this.createRequestColumnId(e[0]);for(let s=1;s<e.length;s++)t+=","+this.createRequestColumnId(e[s]);return"{"+t+"}"}static getRequestColumnId(e){if("string"==typeof e)return e;for(const t in e)return t;throw new Error("Tried to get request column from empty derived object")}static parseRequestColumn(e){if("string"==typeof e)return{id:e,children:[]};const t=_(e);return{id:t,children:e[t]}}static mergeResponseColumns(e,t){const s={},n={};for(const r in e){if(void 0===t[r]){s[r]=e[r];continue}const i=this.mergeResponseColumnMap(e[r],t[r]);s[r]=i.merged,n[r]=i.difference}for(const r in t)void 0===e[r]&&(s[r]=t[r],n[r]=t[r]);return{merged:s,difference:n}}static mergeResponseColumnMap(e,t){const s={},n={};for(const t in e)s[t]=e[t];for(const r in t)Y(e[r])||(s[r]=t[r],n[r]=t[r]);return{merged:s,difference:n}}static findRequestColumn(e,t){for(let s=0;s<t.length;s++){const n=t[s];if(this.getRequestColumnId(n)===e)return s}return-1}static requestColumnToPath(e){if("string"==typeof e)return[e];for(const t in e)return[t,...this.requestColumnToPath(e[t][0])];return[]}static createRequestColumnId(e){const t=this.parseRequestColumn(e);if(0===t.children.length)return t.id;const s=this.createRequestColumnSetId(t.children);return t.id+">"+s}}class me{createLocalConversionMap(e,t,s){const n={};for(const r in s.links)this.expandLocalConversionMap(r,s.links[r],s,n,r===e?t:void 0);return n}expandConversionMap(e,t,s,n){s[e]??={};const r=s[e];return void 0!==r[t]?r[t]:(n??=ge.getLocalId(),r[t]=n)}batchExpandConversionMap(e,t){for(const s of e)this.expandConversionMap(s.itemType,s.itemId,t);return t}getConversionValue(e,t,s){if(void 0!==s[e])return s[e][t]}updateItemValues(e,t,s,n,r=null){for(const i of s){const s=i.id,o=i.apiColumn;let c;o.type===a.ApiEnumApiType.TYPE_LINK&&void 0===e[s]?null!==r&&(c=r.itemId):c=this.getConversionValue(o.itemType,e[s],n),void 0!==c&&(t[s]=c)}}expandLocalConversionMap(e,t,s,n,r=ge.getLocalId()){void 0===n[e]&&(n[e]={});for(let i=0;i<t.length;i++){const o=t[i];!0===window.IS_IN_TEST?n[e][o]=0===i&&null!==r?r:o:n[e][o]=0===i&&null!==r?r:ge.getLocalId();const a=s.items[e][o].links;for(const e in a)this.expandLocalConversionMap(e,a[e],s,n,null)}}}class pe{requestColumnExpansionFactory;compilation;transaction;breakupByParent;uniqueTransactionId;requests=[];constructor(e,t,s,n=!1,r){this.requestColumnExpansionFactory=e,this.compilation=t,this.transaction=s,this.breakupByParent=n,this.uniqueTransactionId=r}finalizeRequest(e){const t=e.columns;e.request.columns=t.get();const s=e.request.itemType;return e.request.columns[s]=this.transaction.getServerCache().expandColumnsWithRequiredColumns(s,e.request.columns[s]),e}setRequestParent(e,t){const s=t.request;return"Void"!==e&&(s.parentType=e,s.parentId={},!0)}run(){const e=this.compilation;if(this.breakupByParent)for(const t in e){const s=e[t];for(const e in s){if(ge.isLocalId(e))continue;const n=this.initializeRequest();this.extendRequest(s[e],this.setRequestParent(t,n)?+e:null,n),this.requests.push(this.finalizeRequest(n))}}else for(const t in e){const s=e[t],n=this.initializeRequest(),r=this.setRequestParent(t,n);let i=!1;for(const e in s)ge.isLocalId(e)||(this.extendRequest(s[e],r?+e:null,n),i=!0);i&&this.requests.push(this.finalizeRequest(n))}return this.requests}initializeRequest(){return{request:{requestType:"create",items:{},columns:{},uniqueTransactionId:this.uniqueTransactionId},columns:this.requestColumnExpansionFactory.construct(),items:{}}}extendRequest(e,t,s){const n=s.request,r=s.items;for(const i in e){void 0===n.itemType&&(n.itemType=i),void 0===r[i]&&(r[i]={},n.items[i]={});for(const o in e[i]){const a=e[i][o],c=a.entry,l=F(this.compilation,[i,c.itemId]),u=n.items[i][c.itemId]={},d=F(this.transaction.tabRequestParameters,[i,c.itemId]);null!==t&&(n.parentId[c.itemId]=t),s.columns.expandWithColumnSet(c.columns),r[i][o]=c,u.values=J.formatRequestLocal(a.fields,c.columns.main);const h=this.transaction.getAiRequestParameters(c);if(u.parameters=void 0!==h?{...d,...h}:d,void 0===l)continue;const m=u.links={};for(const e in l){m[e]=[];for(const t in l[e])m[e].push(parseInt(t,10))}this.extendRequest(l,null,s)}}}}class fe{graphQueryParserFactory;transaction;entries={};entriesByEntryId={};constructor(e,t){this.graphQueryParserFactory=e,this.transaction=t}getByEntryId(e){if(void 0===this.entriesByEntryId[e])throw new p(e);return this.entriesByEntryId[e]}containsByEntryId(e){return void 0!==this.entriesByEntryId[e]}some(e){const t=this.entries;for(const s in t)for(const n in t[s])if(e(t[s][n]))return!0;return!1}getByItemType(e){const t=this.entries[e],s=[];if(void 0===t)return s;for(const e in t)s.push(t[e]);return s}getByQuery(e,t){const s=this.getByItemType(e);if(0===s.length)return[];const n={string:""},r=this.transaction.itemHandler.matchItemsToQueryGraph(this.graphQueryParserFactory.construct(e,n).run(t),n,s);return Array.from(r.true)}getLocalByQuery(e,t){const s=this.entries[e];if(void 0===s)return[];const n=[];for(const e in s){const t=s[e];t.isLocal()&&n.push(t)}if(0===n.length)return[];const r={string:""},i=this.transaction.itemHandler.matchItemsToQueryGraph(this.graphQueryParserFactory.construct(e,r).run(t),r,n);return Array.from(i.true)}getByParent(e,t,s){const n=this.entries[s],r=[];if(void 0===n)return r;for(const s in n){const i=n[s],o=this.transaction.getParent(i);null!==o&&(o.itemType===e&&o.itemId==t&&r.push(i))}return r}forEach(e){const t=this.entries;for(const s in t)for(const n in t[s])e(t[s][n])}*[Symbol.iterator](){const e=this.entries;for(const t in e)for(const s in e[t])yield e[t][s]}toArray(){const e=this.entries,t=[];for(const s in e)for(const n in e[s])t.push(e[s][n]);return t}add(e){const t=this.entries,s=e.itemType;return void 0===t[s]&&(t[s]={}),this.entriesByEntryId[e.id]=e,t[s][e.itemId]=e}get(e,t){if(void 0===this.entries[e]||void 0===this.entries[e][t])throw new p(e,t);return this.entries[e][t]}contains(e,t){return void 0!==this.entries[e]&&void 0!==this.entries[e][t]}updateItemId(e,t){const s=this.entries[e.itemType];return void 0===s||void 0===s[t]?e:(delete s[t],s[e.itemId]=e)}clear(e){return void 0===e?(this.entries={},this.entriesByEntryId={},!0):this.clearByItemId(e.itemType,e.itemId)}clearByItemId(e,t){const s=this.entries[e];return void 0!==s&&(!!Object.prototype.hasOwnProperty.call(s,t)&&(delete this.entriesByEntryId[s[t].id],delete s[t]))}}class ye{userId;linkTreeService;constructor(e,t){this.userId=e,this.linkTreeService=t}matchParent(e,t){return null===e&&null===t||!(null===e&&null!==t||null!==e&&null===t)&&(e.itemType===t.itemType&&e.itemId==t.itemId)}getLinkFieldsByParent(e,t){const s=this.linkTreeService.get();if(!(t in s[e.itemType]))throw new Error(`Non existing link between '${e.itemType}'->'${t}'`);const n=s[e.itemType][t],r={};return"direct"===n.type?r[n.field]=e.itemId:(r.itemtype=e.itemType,r.item=e.itemId),r}getParentByFields(e,t,s){const n=this.linkTreeService.get()[e][t.itemType];if(void 0===n)throw new Error(`Non existing link between '${e}'->'${t.itemType}'`);return n.type===c.DIRECT?{itemType:e,itemId:s[n.field]}:{itemType:s.itemtype,itemId:s.item}}getFullName(e,t,s){return[e,t,s].map((e=>(e??"").trim())).filter((e=>""!==e)).join(" ")}getTitleField(e){switch(e){case"Exemplaar":return"merk";case"Factuur":return"nummer";case"Files":return"friendlyname";case"Functie":case"Standaardfunctie":return"naamintern";case"Voorraadmutatie":return"omschrijving";case"Barcode":return"code";case"Afspraak":case"Betaalmiddel":case"Betalingsconditie":case"Briefpapier":case"Condition":case"CustomfieldGroup":case"Factuurmoment":case"Functiegroep":case"Grootboek":case"Inhuur":case"Inhuurgroep":case"Inhuurmateriaal":case"Materiaal":case"MateriaalCat":case"Medewerkertarief":case"Notitie":case"Planningmateriaal":case"Project":case"Rol":case"Staffelgroep":case"Subproject":case"Taak":case"Tag":case"TaxClass":case"TaxSchema":case"Template":case"Tijd":case"Titel":case"Type":case"Voertuig":return"naam";default:return"displayname"}}getLocalDefaultValues(){return{permissions:i,creator:this.userId,created:(0,Z.default)()}}}class ge{static NEW_PREFIX="-1";static idCounter=0;static getCssKey(...e){return e.join("_")}static getLocalId(){return+(this.NEW_PREFIX+this.incrementIdCounter())}static isLocalId(e){return void 0!==e&&this.isNewId(e)}static isNewId(e){return(""+e).startsWith(this.NEW_PREFIX)}static incrementIdCounter(){return(++this.idCounter).toString()}}class Ie{errorHandler;callbacks={onBeforeSave:[],onSaveSuccess:[],onRootItemDelete:[]};constructor(e){this.errorHandler=e}clear(){this.callbacks={onBeforeSave:[],onSaveSuccess:[],onRootItemDelete:[]}}registerCallback(e,t,s,n="always",r=100){return this.getPriorityLevel(e,r)[t]={callback:s,condition:n},()=>{delete this.getPriorityLevel(e,r)[t]}}executeCallbacks(e,t,s){const n=this.callbacks[e],r=s?"onClose":"skipOnClose";let i=Promise.resolve();for(const e of n)i=i.then(this.executeCallbacksPriorityLevel(e[1],r,t));return i}getPriorityLevel(e,t){const s=this.callbacks[e];let n;for(let e=0;e<s.length;e++){const r=s[e];if(!(r[0]<t))return r[0]===t?r[1]:(n={},s.splice(e,0,[t,n]),n)}return n={},s.push([t,n]),n}executeCallbacksPriorityLevel(e,t,s){return()=>{const n=[];for(const r in e){const i=e[r];if(i.condition===t||"always"===i.condition)try{n.push(s(i.callback))}catch(e){this.errorHandler.logError(e)}}return Promise.all(n)}}}class Ce{apiRequestService;lockItems=(0,l.signal)({});promises={};constructor(e){this.apiRequestService=e}getLocksSignal(){return this.lockItems.asReadonly()}getLocks(){return(0,l.untracked)((()=>this.lockItems()))}hasLock(e){const t=this.lockItems();for(const s in t)for(const n in t[s]){const r=t[s][n];if(!this.isRemoteLock(r)&&r.id==e)return!0}return!1}isLocked(e){const t=this.getValue(e,this.lockItems());return void 0!==t&&this.isRemoteLock(t)}getMessage(e){const t=this.getValue(e,this.lockItems());if(void 0!==t&&this.isRemoteLock(t))return t.message}fetchLock(e){const t=this.getValue(e,this.lockItems());if(void 0!==t)return Promise.resolve(t);const s=this.getValue(e,this.promises);return void 0!==s?s:this.requestLock(e)}deleteLock(e){const t=t=>this.isRemoteLock(t)?(this.clearLock(e),Promise.resolve()):this.apiRequestService.delete("Locktoken",[t.id]).then((()=>{this.clearLock(e)})),s=this.getValue(e,this.lockItems());if(void 0!==s)return t(s);const n=this.getValue(e,this.promises);return void 0===n?Promise.resolve():n.then((e=>t(e)))}isRemoteLock(e){return"isForeign"in e}clearLock(e){const t=this.lockItems();return void 0!==t[e.itemType]?.[e.itemId]&&(delete t[e.itemType][e.itemId],this.lockItems.set({...t}),!0)}requestLock(e){const{itemType:t,itemId:s}=e,n=this.apiRequestService.create("Locktoken",ge.getLocalId(),{itemtype:t,item:s},{Locktoken:["id"]}).then((n=>{delete this.promises[t][s];const r=n.fetchObject("Locktoken",n.links.Locktoken[0]);return this.setToken(e,r)}),(n=>{if(delete this.promises[t][s],301===n.code)return this.setToken(e,{isForeign:!0,message:n.message});throw n}));return this.setPromise(e,n)}getValue(e,t){const s=e.itemType;if(void 0!==t[s])return t[s][e.itemId]}setPromise(e,t){return this.promises[e.itemType]??={},this.promises[e.itemType][e.itemId]=t,t}setToken(e,t){const s=this.lockItems();return s[e.itemType]??={},s[e.itemType][e.itemId]=t,this.lockItems.set({...s}),t}}const ve={};class Te{linkTreeService;transaction;destination={};itemsMappedOnParent={};transactionChain;constructor(e,t){this.linkTreeService=e,this.transaction=t,this.transactionChain=this.transaction.getTransactionChain()}process(){if(void 0===this.transaction.rootItem)throw new Error("A TransactionCache rootItem is required for ModuleChangesCompilation");return this.itemsMappedOnParent={},this.constructChildItemMap(this.transaction.rootItem.itemType),this.processItems(this.transaction.rootItem.itemType,[this.transaction.rootItem],{}),{itemType:this.transaction.rootItem.itemType,itemId:this.transaction.rootItem.itemId,items:this.destination}}constructChildItemMap(e){const t=this.linkTreeService.get()[e];if(void 0!==t)for(const e in t){this.constructChildItemMap(e);const t=new Set;for(const s of this.transactionChain)if(s instanceof mt){const n=s.itemHandler.getDeletedItemsIterator(e);for(const e of n)t.add(e.id)}for(const s of this.transactionChain){const n=s.itemHandler.entries.getByItemType(e);for(const e of n){if(t.has(e.id))continue;const n=s.getParent(e);null!==n&&(this.itemsMappedOnParent[n.itemType]??={},this.itemsMappedOnParent[n.itemType][n.itemId]??={},this.itemsMappedOnParent[n.itemType][n.itemId][e.itemType]??=[],this.itemsMappedOnParent[n.itemType][n.itemId][e.itemType].push(e))}}}}processItems(e,t,s){void 0===this.destination[e]&&(this.destination[e]={}),void 0===s[e]&&(s[e]=[]);for(const n of t){const t=n.itemId;void 0===this.destination[e][t]&&(s[e].push(t),this.destination[e][t]=this.processItem(n))}}processItem(e){const t=this.getItemsByParent(e.itemType,e.itemId),s=this.transaction.itemHandler.formatRequest(e),n={};for(const e in t)this.processItems(e,t[e],n);const r=S(s),i=S(n);return r&&i?{values:s,links:n}:r?{values:s}:i?{links:n}:ve}getItemsByParent(e,t){return this.itemsMappedOnParent[e]?.[t]??{}}}const Re={"=":"!=","!=":"=",">":"<=","<":">=","<=":">",">=":"<"};class Ee{static normalizeOperator(e){switch(e){case void 0:case"AND":case"and":return"AND";case"OR":case"or":return"OR";default:throw new Error(`QueryParserBase: unknown operator: ${e}`)}}static isLinkedToQuery(e){return void 0!==e.linkedTo}static isCustomQuery(e){return void 0!==e.custom}static isSearchQuery(e){return void 0!==e.search}static isQueryWithConditions(e){return void 0!==e.conditions}static isSubQuery(e){return void 0!==e.query}run(e){return this.parseQuery(e,0)}parseQuery(e,t){if(Ee.isLinkedToQuery(e))return this.parseLinkedToQuery(e.linkedTo,e.query??{},e.reverse??!1,e.not??!1,t);if(Ee.isCustomQuery(e))return this.parseCustomQuery(e.custom,e.parameters,e.not??!1);if(Ee.isSearchQuery(e))return this.parseSearchQuery(e.search,e.not??!1);if(Ee.isQueryWithConditions(e))return this.parseComplexQuery(e.conditions,Ee.normalizeOperator(e.operator),e.not??!1,t);if(Ee.isSubQuery(e)){if(void 0===e.key)throw new Error("QueryParserBase: missing 'key' parameter for subquery");return this.parseSubQuery(e.key,e.itemType,e.field??"id",e.query,e.not??!1,t)}const s=e;if(void 0!==s.key)return this._parseSimpleQuery(s.key,s.value,s);const n=_(e);return null===n?this.parseEmptyQuery():this._parseSimpleQuery(n,e[n],e)}_parseSimpleQuery(e,t,s){const n=s.comparator,r=!0===s.not;switch(n){case void 0:return Array.isArray(t)?this.parseInQuery(e,t,r):this.parseComparatorQuery(e,t,r?"!=":"=",s);case"=":case"!=":case">":case"<":case">=":case"<=":return this.parseComparatorQuery(e,t,r?Re[n]:n,s);case"in":case"IN":return this.parseInQuery(e,t,r);default:throw new Error(`QueryParserBase: unknown comparator: ${n}`)}}}class Se{TOKEN;constructor(e){this.TOKEN=e}static addBranchNode(e,t){let s=e.branchNodeMap;if(null===s)return s=e.branchNodeMap=new Map,void s.set(t.TOKEN,t);const n=s.get(t.TOKEN);void 0===n?s.set(t.TOKEN,t):n.copyEdgesFrom(t,void 0)}static matchQueryNodes(e,t,s,n,r){for(const s of e.leafNodes){let e=r.get(s.string);void 0===e&&r.set(s.string,e={true:new Set}),!0===n?(e.maybe?.delete(t),e.true.add(t)):e.true.has(t)||(e.maybe??=new Set,e.maybe.add(t))}const i=e.branchNodeMap;if(null===i)return r;for(const e of i.values())e.match(t,s,n,r);return r}static cloneQueryNodesInto(e,t,s){const n=t.branchNodeMap;if(void 0!==s&&null===n)return void s(e);for(const s of t.leafNodes)e.leafNodes.push(s);if(null===n)return;let r=e.branchNodeMap;if(null!==r)for(const e of n.values()){const t=r.get(e.TOKEN);void 0===t?r.set(e.TOKEN,e.clone(s)):t.copyEdgesFrom(e,s)}else{r=e.branchNodeMap=new Map;for(const e of n.values())r.set(e.TOKEN,e.clone(s))}}static _updateLocalItemIdReferences(e,t){if(null===e)return!1;let s=!1;for(const n of e.values())n.updateLocalItemIdReferences(t)&&(s=!0);return s}}class _e extends Se{connectedNodesTuple;constructor(e,t={leafNodes:[],branchNodeMap:null}){super(e),this.connectedNodesTuple=t}connectLeafNode(e){return this.connectedNodesTuple.leafNodes.push(e),this}connectBranchNode(e){return Se.addBranchNode(this.connectedNodesTuple,e),this}updateLocalItemIdReferences(e){return Se._updateLocalItemIdReferences(this.connectedNodesTuple.branchNodeMap,e)}copyEdgesFrom(e,t){return Se.cloneQueryNodesInto(this.connectedNodesTuple,e.connectedNodesTuple,t),this}}class be extends _e{apiQuery;constructor(e,t){super(e),this.apiQuery=t}match(e,t,s,n){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,"maybe",n)}}class we extends be{constructor(e){super("CUSTOM:",e)}clone(e){return new we(this.apiQuery).copyEdgesFrom(this,e)}}const qe=Symbol("Unsupported query value"),Fe={queryToEdgeValue:e=>"number"==typeof e?e:qe,fieldToEdgeValue:e=>e,edgeToEdgeCompareValue:e=>e},ke={queryToEdgeValue:e=>null===e?null:"string"==typeof e?e.toLowerCase():qe,fieldToEdgeValue:e=>null===e?e:e.toLowerCase()},Le={queryToEdgeValue:e=>null===e||"number"==typeof e||"boolean"==typeof e?e:qe,fieldToEdgeValue:e=>e},De={queryToEdgeValue:e=>"NOW"===e?"NOW":Z.default.isMoment(e)&&e.isValid()?e.valueOf():qe,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>"NOW"!==e?e:Z.default.now()},xe={queryToEdgeValue:e=>Z.default.isMoment(e)?e.isValid()?e.valueOf():null:qe,fieldToEdgeValue:e=>e.isValid()?e.valueOf():null},Me={queryToEdgeValue:e=>Z.default.isDuration(e)?e.valueOf():qe,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>e};class Pe extends Se{columnId;valueTransformer;errorHandler;edgeMap=new Map;constructor(e,t,s,n){super(e),this.columnId=t,this.valueTransformer=s,this.errorHandler=n}static findValueTransformer(e,t){for(const s of t)if(s.queryToEdgeValue(e)!==qe)return s;return null}connectLeafNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===qe&&(this.errorHandler.logError(new Error(`Unsupported query value '${e}' passed to 'connectLeafNode'`)),s=e),this.getQueryNodeTuple(s).leafNodes.push(t),this}connectBranchNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===qe&&(this.errorHandler.logError(new Error(`Unsupported query value '${e}' passed to 'connectBranchNode'`)),s=e),Se.addBranchNode(this.getQueryNodeTuple(s),t),this}copyEdgesFrom(e,t){this.valueTransformer===Le&&e.valueTransformer===ke&&(this.valueTransformer=ke);for(const s of e.edgeMap.entries())Pe.cloneQueryNodesInto(this.getQueryNodeTuple(s[0]),s[1],t);return this}updateLocalItemIdReferences(e){let t=!1;for(const s in e)for(const n in e[s]){const r=Number(n),i=this.edgeMap.get(r);void 0!==i&&(Pe.cloneQueryNodesInto(this.getQueryNodeTuple(e[s][n]),i,void 0),this.edgeMap.delete(r),t=!0)}for(const s of this.edgeMap.values())Se._updateLocalItemIdReferences(s.branchNodeMap,e)&&(t=!0);return t}getValues(){return Array.from(this.edgeMap.keys())}matchUndefinedValue(e,t,s){for(const n of this.edgeMap.values())Se.matchQueryNodes(n,e,t,"maybe",s);return s}getQueryNodeTuple(e){let t=this.edgeMap.get(e);return void 0===t&&this.edgeMap.set(e,t={leafNodes:[],branchNodeMap:null}),t}}const Be=[Fe,De,Me];class Qe extends Pe{comparator;compareValue;constructor(e,t,s,n){super(`${t}:${e}`,e,s,n),this.comparator=t,this.compareValue=Qe.getCompareFunction(this.comparator)}static construct(e,t,s,n){if(!Qe.isSupportedComparator(s))return null;const r=Pe.findValueTransformer(t,Be);return null===r?null:new Qe(e,s,r,n)}static isSupportedComparator(e){switch(e){case"<":case"<=":case">":case">=":return!0;default:return!1}}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);if(null===r)throw new Error(`Encountered null-value in greater / smaller then comparator node ${this.TOKEN}`);const i=this.valueTransformer.fieldToEdgeValue(r);for(const r of this.edgeMap.entries())this.compareValue(i,this.valueTransformer.edgeToEdgeCompareValue(r[0]))&&Se.matchQueryNodes(r[1],e,t,s,n);return n}static getCompareFunction(e){switch(e){case">":return(e,t)=>e>t;case"<":return(e,t)=>e<t;case">=":return(e,t)=>e>=t;case"<=":return(e,t)=>e<=t}}clone(e){return new Qe(this.columnId,this.comparator,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}const Ae=[Le,ke,xe,Me];class je extends Pe{constructor(e,t,s){super(`IS:${e}`,e,t,s)}static construct(e,t,s,n){if("="!==s)return null;const r=Pe.findValueTransformer(t,Ae);return null===r?null:new je(e,r,n)}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);const i=this.edgeMap.get(this.valueTransformer.fieldToEdgeValue(r));return void 0===i?n:Se.matchQueryNodes(i,e,t,s,n)}clone(e){return new je(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class He extends be{clone(e){return new He(this.apiQuery).copyEdgesFrom(this,e)}constructor(e){super("LI",e)}}const Ue=[Le,ke,xe,Me];class Oe extends Pe{constructor(e,t,s){super(`!IS:${e}`,e,t,s)}static construct(e,t,s,n){if("!="!==s)return null;const r=Pe.findValueTransformer(t,Ue);return null===r?null:new Oe(e,r,n)}match(e,t,s,n){const r=t(this.columnId);if(void 0===r)return this.matchUndefinedValue(e,t,n);for(const i of this.edgeMap.entries())this.valueTransformer.fieldToEdgeValue(r)!==i[0]&&Se.matchQueryNodes(i[1],e,t,s,n);return n}clone(e){return new Oe(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class Ve extends _e{constructor(e){super("R",e)}clone(e){return(new Ve).copyEdgesFrom(this,e)}match(e,t,s,n){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,s,n)}doMatch(e,t,s=new Map){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,!0,s)}}class Ne extends be{constructor(e){super(`SEARCH:${e.search}`,e)}clone(e){return new Ne(this.apiQuery).copyEdgesFrom(this,e)}}class We extends be{constructor(e){super("SUB",e)}clone(e){return new We(this.apiQuery).copyEdgesFrom(this,e)}}const $e=[je,Oe,Qe];class Ge extends Ee{itemType;queryId;linkTreeService;errorHandler;constructor(e,t,s,n){super(),this.itemType=e,this.queryId=t,this.linkTreeService=s,this.errorHandler=n}run(e){const t=new Ve,s=this.parseQuery(e,0);if(null===s)return t;if(s===this.queryId)return t.connectLeafNode(s);for(const e of s)t.connectBranchNode(e);return t}parseEmptyQuery(){return this.queryId}static createLinkedToComparatorQueryNode(e,t,s,n,r){const i=n.get()[t][e];switch(i.type){case c.DIRECT:{const e=new je(i.field,Le,r);for(const t of s)e.connectLeafNode(t.value,t.node);return e}case c.ITEMTABLE:{const e=new je("item",Le,r);for(const t of s)e.connectLeafNode(t.value,t.node);return new je("itemtype",ke,r).connectBranchNode(t,e)}}}parseComparatorQuery(e,t,s){let n=null;for(const r of $e)if(n=r.construct(e,t,s,this.errorHandler),null!==n)break;if(null===n)throw new Error(`Could not find supported comparator node: ${e}${s}${t} `);return[n.connectLeafNode(t,this.queryId)]}parseInQuery(e,t,s){if(0===t.length)return s?this.queryId:null;const n=Ae.find((e=>t.every((t=>e.queryToEdgeValue(t)!==qe))));if(void 0===n)throw new Error(`Could not find supported comparator node: ${e} ${t}`);if(!s){const s=new je(e,n,this.errorHandler);for(const e of t)s.connectLeafNode(e,this.queryId);return[s]}const r=new Oe(e,n,this.errorHandler);let i=r;for(let s=0;s<t.length-1;s++)i.connectBranchNode(t[s],i=new Oe(e,n,this.errorHandler));return i.connectLeafNode(t[t.length-1],this.queryId),[r]}parseLinkedToQuery(e,t,s,n,r){if(s||n)return[new He({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)];const i=this.parseQuery(t,r+1);if(null===i)return null;if(i!==this.queryId&&1===i.length&&"IS:id"===i[0].TOKEN){const t=i[0].getValues();return[Ge.createLinkedToComparatorQueryNode(this.itemType,e,t.map((e=>({value:e,node:this.queryId}))),this.linkTreeService,this.errorHandler)]}return[new He({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)]}parseSubQuery(e,t,s,n,r){return[new We({key:e,itemType:t,field:s,query:n,not:r}).connectLeafNode(this.queryId)]}parseSearchQuery(e,t){return[new Ne({search:e,not:t}).connectLeafNode(this.queryId)]}parseCustomQuery(e,t,s){return[new we({custom:e,parameters:t,not:s}).connectLeafNode(this.queryId)]}parseComplexQuery(e,t,s,n){if(s)throw new Error("GraphQueryParser: 'not' unsupported for complex queries. Please rewrite your query.");const r=e.map((e=>this.parseQuery(e,n)));switch(t){case"OR":return this.rewriteOrConditions(r);case"AND":{const e=this.rewriteAndConditions(r);if(null===e||e===this.queryId)return e;let t=e[0];for(let s=1;s<e.length;s++){const n=[];for(const r of e[s]){const e=e=>{Se.addBranchNode(e,r.clone(void 0))};for(const s of t)n.push(s.clone(e))}t=n}return t}}}rewriteOrConditions(e){const t=e.filter((e=>null!==e));return 0===t.length?null:t.some((e=>e===this.queryId))?this.parseEmptyQuery():t.flat()}rewriteAndConditions(e){if(e.some((e=>null===e)))return null;const t=e.filter((e=>e!==this.queryId));return 0===t.length?this.parseEmptyQuery():t}}class ze extends Ee{linkTreeService;itemType;constructor(e,t){super(),this.linkTreeService=e,this.itemType=t}parseEmptyQuery(){return[]}parseSubQuery(e,t,s,n,r,i){if("id"===e||void 0!==t)return[];const o=this.parseQuery(n,i+1);return"id"!==s&&o.push(s),[{[e]:o}]}parseSearchQuery(){return[]}parseCustomQuery(){return[]}parseComparatorQuery(e){return[e]}parseInQuery(e,t){return[e]}parseLinkedToQuery(e,t,s,n,r){return s||r>0?[]:this.linkTreeService.getColumnsFromLink(e,this.itemType)}parseComplexQuery(e,t,s,n){return this.parseConditions(e,n)}parseConditions(e,t){return e.reduce(((e,s)=>e.concat(this.parseQuery(s,t))),[])}}class Ye extends Ee{parseEmptyQuery(){return!1}parseSubQuery(e,t,s,n,r,i){return this.parseQuery(n,i+1)}parseSearchQuery(){return!1}parseCustomQuery(){return!1}parseComparatorQuery(e,t){return ge.isLocalId(t)}parseInQuery(e,t){return t.some((e=>ge.isLocalId(e)))}parseLinkedToQuery(e,t,s,n,r){return this.parseQuery(t,r+1)}parseComplexQuery(e,t,s,n){return e.some((e=>this.parseQuery(e,n)))}}class Ke extends Ee{static formatStringParameters(...e){return"["+e.join(":")+"]"}static formatValue(e){const t=this.processValue(e);return{object:t,string:""+t}}static processValue(e){return Array.isArray(e)?e.slice().sort():Z.default.isMoment(e)?(0,Z.default)(e):Z.default.isDuration(e)?Z.default.duration(e):e}static compareParsedQueries(e,t){return e.string===t.string?0:e.string>t.string?1:-1}parseEmptyQuery(){return{object:{},string:"{}",isLocallyMatchable:!0}}parseSubQuery(e,t,s,n,r,i){const o=this.parseQuery(n,i+1);return{object:{key:e,itemType:t,field:s,query:o.object,not:r},string:Ke.formatStringParameters("subField",e,t??"",s,o.string,r),isLocallyMatchable:!1}}parseSearchQuery(e,t){const s=Ke.formatValue(e);return{object:{search:s.object,not:t},string:Ke.formatStringParameters("search",s.string,t),isLocallyMatchable:!1}}parseCustomQuery(e,t,s){if(void 0===t)return{object:{custom:e,not:s},string:Ke.formatStringParameters(e,s),isLocallyMatchable:!1};const n=this.parseCustomParameters(t);return{object:{custom:e,parameters:n.object,not:s},string:Ke.formatStringParameters(e,n.string,s),isLocallyMatchable:!1}}parseComparatorQuery(e,t,s){const n=Ke.formatValue(t);return{object:{key:e,value:n.object,comparator:s},string:Ke.formatStringParameters(s,e,n.string),isLocallyMatchable:!0}}parseInQuery(e,t,s){const n=Ke.formatValue(t);return{object:{key:e,value:n.object,comparator:"IN",not:s},string:Ke.formatStringParameters("IN",e,n.string,s),isLocallyMatchable:!0}}parseLinkedToQuery(e,t,s,n,r){const i=this.parseQuery(t,r+1);return{object:{linkedTo:e,query:i.object,reverse:s,not:n},string:Ke.formatStringParameters("linkedTo",e,i.string,s,n),isLocallyMatchable:!s}}parseComplexQuery(e,t,s,n){const r=this.parseConditions(e,n);return{object:{conditions:r.object,operator:t,not:s},string:Ke.formatStringParameters(t,r.string,s),isLocallyMatchable:r.isLocallyMatchable}}parseCustomParameters(e){const t=Object.keys(e).sort(),s={};let n="";for(let r=0;r<t.length;r++){const i=t[r],o=Ke.formatValue(e[i]);s[i]=o.object,r>0&&(n+=":"),n+=o.string}return{object:s,string:n}}parseConditions(e,t){const s=[];for(const n of e)s.push(this.parseQuery(n,t));s.sort(((e,t)=>Ke.compareParsedQueries(e,t)));const n=[];let r="",i=!0;for(const e of s)n.push(e.object),r+=e.string,i=i&&e.isLocallyMatchable;return{object:n,string:r,isLocallyMatchable:i}}}class Xe extends Ee{itemIdConversionMap;constructor(e){super(),this.itemIdConversionMap=e}parseEmptyQuery(){return!1}parseSubQuery(e,t,s,n,r,i){return this.parseQuery(n,i+1)}parseSearchQuery(){return!1}parseCustomQuery(){return!1}parseComparatorQuery(e,t,s,n){for(const e in this.itemIdConversionMap)if(void 0!==this.itemIdConversionMap[e][t])return n.value=this.itemIdConversionMap[e][t],!0;return!1}parseInQuery(e,t,s){let n=!1;for(let e=0;e<t.length;e++)for(const s in this.itemIdConversionMap){const r=this.itemIdConversionMap[s][t[e]];void 0!==r&&(t[e]=r,n=!0)}return n}parseLinkedToQuery(e,t,s,n,r){return this.parseQuery(t,r+1)}parseComplexQuery(e,t,s,n){return e.map((e=>this.parseQuery(e,n))).some((e=>e))}}class Ze{containsLocalId(e){return(new Ye).run(e)}addAndCondition(e,t){return this.isEmptyQuery(e)?t:this.isEmptyQuery(t)?e:"conditions"in e&&"or"!==e.operator?{conditions:e.conditions.concat(t)}:{conditions:[e,t]}}addOrCondition(e,t){return this.isEmptyQuery(e)?e:this.isEmptyQuery(t)?t:"conditions"in e&&"or"===e.operator?{conditions:e.conditions.concat(t),operator:"or"}:{conditions:[e,t],operator:"or"}}addParentCondition(e,t){if(null===t)return e;const s={linkedTo:t.itemType,query:{id:t.itemId}};return null===e?s:this.addAndCondition(e,s)}createNotIn(e){return{comparator:"IN",key:"id",value:e,not:!0}}isEmptyQuery(e){for(const t in e)return!1;return!0}}class Je{columns={};columnSetIdMap={};requestColumnSetIdMap={};expandWithRequestColumnsTuple(e,t){!0!==this.requestColumnSetIdMap[t.string]&&(this.expandWithRequestColumns(e,t.object),this.requestColumnSetIdMap[t.string]=!0)}expandWithColumnSet(e){!0!==this.columnSetIdMap[e.id]&&(this.expandWithRequestColumns(e.itemType,e.request),this.columnSetIdMap[e.id]=!0)}expandWithRequestColumns(e,t){const s=this.columns;if(!0!==s[e])if(!0!==t){void 0===s[e]&&(s[e]=[]);for(const n of t)he.mergeRequestColumn(n,s[e])}else{const t=s[e];if(!0===t)return;void 0!==t&&he.containsDerivedColumns(t)||(s[e]=!0)}}get(){return this.columns}}class et{changesDeltaFactory;columnCache;errorHandler;requestColumnExpansionFactory;transactionCacheFactory;requestColumnsOperationsCacheFactory;logPrefix="[SocketMessageHandler]:";requestBufferManager;constructor(e,t,s,n,r,i,o){this.changesDeltaFactory=e,this.columnCache=t,this.errorHandler=s,this.requestColumnExpansionFactory=n,this.transactionCacheFactory=r,this.requestColumnsOperationsCacheFactory=o,this.requestBufferManager=new Ft(i,n)}async onMessagesReceived(e,t){const s=this.changesDeltaFactory.construct(!1,[]),n=[],r=this.transactionCacheFactory.getServerCache().getActiveItemEntries();for(const i of e){const e=i.body;"massUpdate"!==e.eventType?"delete"!==e.eventType?this.processMessage(e,s,n,r,t):this.handleDelete(e,s):this.refreshItemsOfType(e.itemType)}return this.processRequests(n,s)}async refreshItemsOfType(e){const t=this.transactionCacheFactory.getServerCache(),s=t.getActiveItemEntries(),n=t.itemHandler.entries.getByItemType(e),r=[];let i=0;for(const e of n)e.markOutdated(),s.has(e)?r.push(e):i++;const o=t.cachedQueryHandler.getCachedQueryItemsByItemType(e),a=[];let c=0;for(const e of o)e.markOutdated(),t.cachedQueryHandler.hasActiveCollectionsForQuery(e.itemType,e.query.string)?a.push(e):c++;if((i>0||c>0)&&this.errorHandler.logDebug(`${this.logPrefix} Marked ${i} items and ${c} cached queries as outdated for '${e}'`),0===r.length&&0===a.length)return;this.errorHandler.logDebug(`${this.logPrefix} Immediately re-fetching ${r.length} items and ${a.length} cached queries for '${e}'`);const l=this.requestColumnExpansionFactory.construct();for(const e of r)l.expandWithColumnSet(e.columns);const u=t.expandColumnExpansionWithRequiredColumns(e,l,a,[]),d=this.requestColumnsOperationsCacheFactory.construct(e,u),h=[this.requestBufferManager.fetchByIds(e,r.map((e=>e.itemId)),u)];if(a.length>0)for(const s of a)h.push(this.requestBufferManager.fetchByQuery(e,s.query,d.getRequestColumnsTuple(t)));await this.processRequests(h)}handleDelete(e,t){const s=this.transactionCacheFactory.getServerCache(),n=e.itemType;for(const r of e.items)s.containsLocalItemEntryByItemId(n,r)&&t.setItemDeleted(s.getLocalItemEntryByItemId(n,r));const r=[...t.getDeletedItemEntriesIterator(n)];if(0===r.length)return;t.addQueryItemType(n);const i=r.map((e=>e.itemId)).join(", ");this.errorHandler.logDebug(`${this.logPrefix} Removing ${n} items: [${i}]`)}logFetchedItems(e,t){const s=t.join(", ");this.errorHandler.logDebug(`${this.logPrefix} Fetching ${e.itemType} items for ${e.eventType}: [${s}]`)}processSocketMessageValues(e,t){const s=[],n={};for(const r in t[0].values){const t=this.columnCache.getColumn(e,r);void 0!==t&&(s.push(r),n[r]=t)}const r=[];for(const e of t){const t={};for(const r of s)t[r]=J.formatResponseValue(n[r].type,e.values[r]);r.push(t)}return{fieldsArray:r,columns:{request:s,response:n}}}aggregateCachedRequestColumns(e,t){const s=this.transactionCacheFactory.getServerCache(),n=this.requestColumnExpansionFactory.construct();for(const r of t)s.containsLocalItemEntryByItemId(e,r.id)&&n.expandWithColumnSet(s.getLocalItemEntryByItemId(e,r.id).columns);return n}getMergedQueryGraphTuple(e){const t=this.transactionCacheFactory.getServerCache(),s=t.cachedQueryHandler.getMergedQueryGraph(e)??new Ve,n=t.cachedQueryHandler.getUncachedCollectionsOnChildTransactionsIterator(e),r=new Map;for(const e of n){const t=e.entry.query.string;let n=r.get(t);void 0===n&&r.set(t,n=[]),n.push(e),s.copyEdgesFrom(e.queryGraph,void 0)}return{collectionResourceMap:r,queryGraph:s}}matchSocketMessageItems(e,t,s,n){const r=this.transactionCacheFactory.getServerCache(),i=new Set,o=this.getMergedQueryGraphTuple(e),a={active:[],inactive:[]},c=new Map;for(const l of t){if(r.containsLocalItemEntryByItemId(e,l.id)){if(s)continue;const t=l.id,o=r.getLocalItemEntryByItemId(e,t);n.has(o)?a.active.push(o):a.inactive.push(o),i.add(l)}o.queryGraph.doMatch(l,(e=>l[e]),c)}const l={active:[],inactive:[]},u=[];for(const t of c.entries()){const s=t[0],n=r.cachedQueryHandler.getCachedQueryItem(e,s),a=o.collectionResourceMap.get(s);void 0!==n&&(r.cachedQueryHandler.hasActiveCollectionsForQuery(n.itemType,n.query.string)?l.active.push(n):l.inactive.push(n)),void 0!==a&&u.push(...a);const c=t[1];for(const e of c.true)i.add(e);if(void 0!==c.maybe)for(const e of c.maybe)i.add(e)}return 0===i.size?null:{fieldsSet:i,cachedQueryItems:l,uncachedCollections:u,itemEntries:a}}processMessage(e,t,s,n,r){const i=e.itemType,o=this.processSocketMessageValues(i,Object.values(e.items[i])),a=this.matchSocketMessageItems(i,o.fieldsArray,"create"===e.eventType,n);if(null===a)return;const c={};for(const e of a.fieldsSet)c[e.id]="CLEAR_WHEN_SAME";const l=this.transactionCacheFactory.getServerCache();l.processResponseByItemType(i,o.columns.request,{[i]:o.columns.response},a.fieldsSet,t,c);const u=he.mergeRequestColumns(o.columns.request,l.expandColumnExpansionWithRequiredColumns(i,this.aggregateCachedRequestColumns(i,a.fieldsSet),[...a.cachedQueryItems.active,...a.cachedQueryItems.inactive],a.uncachedCollections));if(!0!==u.difference&&0===u.difference.length)return;if(0===a.cachedQueryItems.active.length&&0===a.itemEntries.active.length&&0===a.uncachedCollections.length){this.errorHandler.logDebug(`${this.logPrefix} Marked ${e.itemType} items as outdated`);for(const e of a.cachedQueryItems.inactive)l.cachedQueryHandler.markCachedQueriesOutdatedInAllTransactions(e.itemType,e.query.string);for(const e of a.itemEntries.inactive)e.markOutdated();return}const d=[];for(const e of a.fieldsSet)d.push(e.id);this.logFetchedItems(e,d),s.push(this.requestBufferManager.fetchByIds(i,d,u.merged,{flushTimeout:r}))}async processRequests(e,t=this.changesDeltaFactory.construct(!1)){const s=await Promise.allSettled(e),n=this.transactionCacheFactory.getServerCache();for(const e of s){if("rejected"===e.status){this.errorHandler.logError(e.reason);continue}const{requestColumns:s,response:r,nonLocallyMatchableQueryString:i}=e.value;t.addQueryItemType(r.itemType),null!==i&&t._setQueryResult(r.itemType,i,r.links[r.itemType]),n.processResponse(r,s,t)}return n.applyChangesDelta(t,!0)}}class tt{dependencies;core;childrenSignal=(0,l.signal)([]);itemHandler;cachedQueryHandler;parent;constructor(e,t){this.dependencies=e,this.core=t}getChildren(){return(0,l.untracked)((()=>this.childrenSignal()))}*getDescendantsIterator(){for(const e of this.getChildren())yield e,yield*e.getDescendantsIterator()}onChildDestroy(e){this.childrenSignal.update((t=>t.filter((t=>t!==e))))}getTransactionChain(e=!0){const t=[];let s=this;do{if(!e&&null===s.parent)return t;t.push(s),s=s.parent}while(null!==s);return t}getCurrentItemEntryCache(){return this.itemHandler.entries}clearItemEntry(e){return this.cachedQueryHandler.clearLinkedCachedQueryItems(e),this.itemHandler.clearItemEntry(e)}getLocalItemEntryChangesTuple(e){return{entry:this.getLocalItemEntry(e),changes:this.itemHandler.itemChanges[e]}}getParent(e,t=!1){if(t&&null!==this.parent&&!this.itemHandler.entries.containsByEntryId(e.id))return this.parent.getParent(e,!1);let s=null,n=null;if(null!==e.columns.link)s=e.columns.link.apiColumn.itemType,n=this.itemHandler.lookUpItemField(e,e.columns.link.id)??null;else{const t=e.columns.response[e.itemType];"itemtype"in t&&"item"in t&&(s=this.itemHandler.lookUpItemField(e,"itemtype")??null,n=this.itemHandler.lookUpItemField(e,"item")??null)}return null!==s&&null!==n?{itemType:s,itemId:n}:null}getParentFromFields(e,t){if(void 0===t)return null;let s=null,n=null;if(null!==e.columns.link)s=e.columns.link.apiColumn.itemType,n=t[e.columns.link.id];else{const r=e.columns.response[e.itemType];"itemtype"in r&&"item"in r&&(s=t.itemtype,n=t.item)}return null!==s&&null!==n?{itemType:s,itemId:n}:null}processCreatedItem(e,t){if(!this.containsLocalItemEntryByItemId(e.columns.itemType,e.itemId))return this.itemHandler.createItemEntry(e);const s=this.getLocalItemEntryByItemId(e.columns.itemType,e.itemId);return t.setItemUpdated(s,e.fields,this.core.columnExpansionFactory.construct(e.columns.itemType,!!e.columns.requestColumnsTrue||e.columns.request,e.columns.response),null,"KEEP_WHEN_DIFFERENT"),t.created.remove(s.itemType,s.itemId),null}fetchUpdatedDerivedValuesFromDelta(e,t){const s=[];for(const n in e.updated){const r=e.updated[n],i=[];for(const e of r.entry.columns.root){const s=this.itemHandler.lookUpItemField(r.entry,e.id);if(void 0===s)continue;const n=r.changes.fields[e.id],o=t?.[e.itemType];void 0===n||n===s||void 0!==o&&o[s]===n||i.push(e)}0!==i.length&&s.push(this.itemHandler.resolveDerivedValues([r.entry],i,!1,e))}return Promise.all(s)}handleCascadingDeletes(e){for(const t of e.getDeletedItemTypesIterator()){const s=a.ApiFieldsOnDeleteRule[t]?.foreign??{},n=e.getDeletedItemEntriesIterator(t);for(const t of n)for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}cascadeDeleteByItemType(e,t,s,n){const r=a.ApiFieldsOnDeleteRule[t]?.own[s]?.onDeleteRule;if(void 0===r)return;let i=[];const o=this.getTransactionChain(!0);for(const e of o)i=i.concat(e.itemHandler.entries.getByItemType(t));for(const t of i){let i=e.updated[t.id]?.changes.fields[s];if(void 0===i&&(i=this.itemHandler.lookUpItemField(t,s)),i===n)if("restrict"===r);else if("set_null"===r){const r={[s]:null};e instanceof Rt?e.setItemUpdated(t,r,null,null,"KEEP_WHEN_DIFFERENT"):e instanceof St?e.setItemUpdated(t,r,{[s]:n},"KEEP_WHEN_DIFFERENT"):e.setItemUpdated(t,r,"KEEP_WHEN_DIFFERENT")}else if("cascade"===r){e instanceof Et?e.setItemDeleted({entry:t,changes:this.itemHandler.itemChanges[t.id],isCascaded:!0}):e instanceof St?e.setItemDeleted(t):e.setItemDeletedCascaded(t);const s=a.ApiFieldsOnDeleteRule[t.itemType]?.foreign??{};for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}}}class st extends tt{dependencies;apiFieldsOnDeleteRule;requestBufferManager;itemHandler;cachedQueryHandler;onDeltaAppliedCallbacks=[];parent=null;constructor(e,t,s){super(e,s),this.dependencies=e,this.apiFieldsOnDeleteRule=t,this.requestBufferManager=new Ft(e.apiRequestService,e.requestColumnExpansionFactory,(({requestColumns:e,response:t,nonLocallyMatchableQueryString:s})=>{const n=this.dependencies.changesDeltaFactory.construct(!1,[t.itemType]);return null!==s&&n._setQueryResult(t.itemType,s,t.links[t.itemType]),this.applyChangesDelta(this.processResponse(t,e,n))})),this.itemHandler=new ct(e.errorHandler,e.columnCache,e.itemCacheFactory,e.itemEntryService,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,this),this.cachedQueryHandler=new ut(e,this)}onDeltaApplied(e){return this.onDeltaAppliedCallbacks.push(e),()=>{const t=this.onDeltaAppliedCallbacks.indexOf(e);-1!==t&&this.onDeltaAppliedCallbacks.splice(t,1)}}getServerCache(){return this}createChild(e,t,s){const n=new mt(this.dependencies,this.core,this,e,t,s);return(0,l.untracked)((()=>this.childrenSignal.update((e=>[...e,n])))),n}getActiveItemEntries(){const e=new Set;for(const t of this.getDescendantsIterator())for(const s of t.itemHandler.itemResourcesPerEntry){if(!s[1].some((e=>void 0!==e.deref())))continue;const n=s[0];this.collectActiveItemEntriesBasedOnParentEntry(t,n,n.columns.main,e)}return e}processResponseByItemType(e,t,s,n,r,i,o){const a=null!==t?this.dependencies.columnSetFactory.construct(e,t,s):this.dependencies.columnSetFactory.constructFromResponse(e,!1,s),c=this.dependencies.columnExpansionFactory.construct(e,!!a.requestColumnsTrue||a.request,s);for(const t of n){const s=t.id;let n;if(void 0!==o)for(const e in o)if(o[e]==s){n=Number(e);break}this.itemHandler.entries.contains(e,n??s)?r.setItemUpdated(this.itemHandler.entries.get(e,n??s),t,c,null,i?.[s]??"QUERY"):r._setItemCreated(s,t,a,null,!0)}return r}processResponse(e,t,s=this.dependencies.changesDeltaFactory.construct(!1),n,r){const i=e.fetchColumnsObject();for(const e in i)this.dependencies.columnCache.setColumns(e,t[e],i,"not_false");for(const o in e.items)this.processResponseByItemType(o,o===e.itemType?t[o]:null,i,e.fetchObjectArray(o,null),s,n?.[o],r?.[o]);return s}async applyChangesFromParent(e,t=!1){const s=this.dependencies.changesDeltaFactory.constructParentDelta(e);this.handleCascadingDeletes(e),this.itemHandler.processUpdatesFromDelta(e.updated,s);for(const t of e.getDeletedItemEntriesIterator())s.setItemDeleted(t);const n=await this.cachedQueryHandler.matchItemsToCollectionQueries(s,s._queryItemTypeSet,!1);this.cachedQueryHandler.applyMatchingResultsToCachedQueries(n),await Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(s,t)))),this.callOnDeltaAppliedCallbacks(s);for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}getLinkFieldsByParent(e,t){const s=this.dependencies.linkTreeService.get()[e.itemType][t],n={};if(void 0===s)throw new Error(`Non existing link between '${e.itemType}'->'${t}'`);return s.type===c.DIRECT?n[s.field]=e.itemId:(n.itemtype=e.itemType,n.item=e.itemId),n}getCollectionChangesRecursively(e,t){return this.cachedQueryHandler.getCachedQueryItem(e,t.string)}applyChangesFromChild(e,t,s){const n=this.dependencies;return new ne(n.apiRequestService,n.changesDeltaFactory,n.errorHandler,this.requestBufferManager,n.requestColumnExpansionFactory,e,new se(e),t,s).execute()}async applyChangesDelta(e,t=!1,s){if(e.isEmpty())return{allChildrenDonePromise:Promise.resolve()};this.handleCascadingDeletes(e);const n=this.dependencies.changesDeltaFactory.constructParentDelta(e);e.created.forEach((t=>{const s=this.processCreatedItem(t,e);null!==s&&n.setItemCreated(s,this.itemHandler.itemChanges[s.id])})),await this.fetchUpdatedDerivedValuesFromDelta(e,s),this.itemHandler.processUpdatesFromDelta(e.updated,n);for(const t of e.getDeletedItemEntriesIterator())n.setItemDeleted(t);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(n,n._queryItemTypeSet,!0);return this.cachedQueryHandler.applyMatchingResultsToCachedQueries(r),this.callOnDeltaAppliedCallbacks(n),{allChildrenDonePromise:Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(n,t,s)))).then((()=>{for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}))}}getLocalItemEntry(e){return this.itemHandler.entries.getByEntryId(e)}getLocalItemEntryByItemId(e,t){return this.itemHandler.entries.get(e,t)}containsLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)}expandColumnsWithRequiredColumns(e,t){const s=this.dependencies.requestColumnExpansionFactory.construct();return s.expandWithRequestColumns(e,t),this.expandColumnExpansionWithRequiredColumns(e,s,this.cachedQueryHandler.getCachedQueryItemsByItemType(e),this.cachedQueryHandler.getUncachedCollectionsOnChildTransactionsIterator(e))}expandColumnExpansionWithRequiredColumns(e,t,s,n){t.expandWithRequestColumns(e,["id","permissions","modified"]),t.expandWithRequestColumns(e,this.getColumnIdsWithRelations(e));for(const n of s)t.expandWithRequestColumnsTuple(e,n.requestColumnsTuple);for(const e of n)t.expandWithColumnSet(e.entry.columns);return t.get()[e]}getColumnIdsWithRelations(e){const t=this.apiFieldsOnDeleteRule[e]?.own;if(void 0===t)return[];const s=[];for(const e in t)"restrict"!==t[e].onDeleteRule&&s.push(e);return s}callOnDeltaAppliedCallbacks(e){this.onDeltaAppliedCallbacks.forEach((t=>t(e)))}collectActiveItemEntriesBasedOnParentEntry(e,t,s,n){if(!n.has(t)){n.add(t);for(const r of s){if(0===r.children.length)continue;const s=e.itemHandler.lookUpItemField(t,r.id);if(null===s)continue;let i;try{i=e.getLocalItemEntryByItemId(r.apiColumn.itemType,s)}catch(e){continue}this.collectActiveItemEntriesBasedOnParentEntry(e,i,r.children,n)}}}}class nt{entries={};get(e){const t=this.entries;return void 0!==t[e]?t[e]:t[e]=new Map}*[Symbol.iterator](){for(const e in this.entries)yield[e,this.entries[e]]}}class rt{static addItemsToMatchingResults(e,t,s,n){let r=e.get(t);void 0===r&&e.set(t,r={true:new Set});let i=r[s];void 0===i&&(i=r[s]=new Set);for(const e of n)i.add(e)}matchItemsInDeletedChangesDelta(e,t,s){const n=new nt;for(const s of e.getDeletedItemTypesIterator()){const r=t(s);if(null===r)continue;const i=e.getDeletedItemEntriesIterator(s),o=n.get(s);for(const e of i)r.doMatch(e,this.constructGetField(e),o)}for(const e of n){const t=s.get(e[0]);for(const s of e[1].entries()){const e=s[1];rt.addItemsToMatchingResults(t,s[0],"false",void 0===e.maybe?e.true:[...e.true,...e.maybe])}}}matchItemsToQueryGraph(e,t,s,n={true:new Set}){const r=new Map([[t.string,n]]);for(const t of s)e.doMatch(t,this.constructGetField(t),r);return n}matchEmptyItemsInUpdatedChangesDelta(e,t,s){const n=new nt;for(const n in e){const r=e[n];if(null!==r.previous)continue;const i=r.entry,o=t(i.itemType);null!==o&&o.doMatch(i,this.constructGetField(i),s.get(i.itemType))}for(const e of n){const t=s.get(e[0]);for(const s of e[1].entries())rt.addItemsToMatchingResults(t,s[0],"true",s[1].true)}}matchItemsInUpdatedChangesDelta(e,t,s){const n={};for(const s in e){const r=e[s];if(null===r.previous)continue;const i=r.entry,o=i.itemType,a=t(o);if(null===a)continue;let c=n[o];void 0===c&&(c=n[o]={current:new Map,updated:new Map}),a.doMatch(i,(e=>{const t=r.previous[e];return void 0!==t?t:this.lookUpItemField(i,e)}),c.current),a.doMatch(i,(e=>{const t=r.changes.fields[e];return void 0!==t?t:this.lookUpItemField(i,e)}),c.updated)}for(const e in n){const t=n[e],r=s.get(e);for(const e of t.updated){const t=e[0],s=e[1];void 0!==s.maybe&&rt.addItemsToMatchingResults(r,t,"maybe",s.maybe),rt.addItemsToMatchingResults(r,t,"true",s.true)}for(const e of t.current){const s=e[0],n=e[1],i=t.updated.get(s),o=void 0===n.maybe?n.true:[...n.true,...n.maybe];if(void 0===i){rt.addItemsToMatchingResults(r,s,"false",o);continue}const a=[];for(const e of o)i.true.has(e)||void 0!==i.maybe&&i.maybe.has(e)||a.push(e);a.length>0&&rt.addItemsToMatchingResults(r,s,"false",a)}}}matchItemsInCreatedChangesDelta(e,t,s){for(const n in e){const r=e[n],i=r.entry.itemType,o=t(i);null!==o&&o.doMatch(r.entry,(e=>r.fields[e]),s.get(i))}}}const it={get:(e,t)=>{const s=e.itemHandler.lookUpItemField(e.itemEntry,t);return"displayname"!==t||void 0!==s&&""!==s?s:e.itemHandler.getDisplayName(e.itemEntry)}},ot={get:(e,t)=>e.itemHandler.getItemFieldSignal(e.itemEntry,t)};class at extends rt{columnCache;errorHandler;requestColumnExpansionFactory;requestColumnsOperationsCacheFactory;itemEntryService;transaction;entries;itemChanges={};itemFieldSignals={};constructor(e,t,s,n,r,i,o){super(),this.columnCache=e,this.errorHandler=t,this.requestColumnExpansionFactory=s,this.requestColumnsOperationsCacheFactory=n,this.itemEntryService=r,this.transaction=i,this.entries=o.construct(this.transaction)}getItemFieldSignal(e,t){this.itemFieldSignals[e.id]??={};let s=this.itemFieldSignals[e.id][t];return void 0===s&&(s=this.itemFieldSignals[e.id][t]=(0,l.signal)(this.lookUpItemField(e,t))),s}getDisplayName(e){let t="";switch(e.itemType){case"Contact":if("bedrijf"===this.lookUpItemField(e,"type")){t=this.lookUpItemField(e,"bedrijf");break}t=this.itemEntryService.getFullName(this.lookUpItemField(e,"voornaam"),this.lookUpItemField(e,"tussenvoegsel"),this.lookUpItemField(e,"naam"));break;case"Medewerker":case"Person":t=this.itemEntryService.getFullName(this.lookUpItemField(e,"voornaam"),this.lookUpItemField(e,"tussenvoegsel"),this.lookUpItemField(e,"achternaam"));break;default:t=this.lookUpItemField(e,this.itemEntryService.getTitleField(e.itemType))}return t??""}constructGetField(e){return t=>this.lookUpItemField(e,t)}constructFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},it)}constructSignalFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},ot)}lookUpItemField(e,t){let s=this.transaction;for(;s;){const n=s.itemHandler.itemChanges[e.id];if(void 0!==n){const e=n[t];if(void 0!==e)return e}s=s.parent}}collectFields(e){const t={};for(const s of e.columns.main)t[s.id]=this.lookUpItemField(e,s.id);return t}copyTransactionItemEntryChanges(e,t){return J.copyFields(e,{},t.columns.main)}async resolveDerivedValues(e,t,s,n){const r=[],i=[];for(const o of t){const t=o.children;if(0===t.length)continue;1===t.length&&"id"===t[0].apiColumn.type&&this.errorHandler.logWarning("You should use fields[columnId] instead of derived['columnId>id'] to get the ID of a derived item");const a=new Set;for(const t of e){let e=n?.updated[t.id]?.changes.fields[o.id];if(void 0===e&&(e=this.transaction.itemHandler.lookUpItemField(t,o.id)),void 0===e)throw new Error(`Encountered missing ${o.id} field of ${t.itemType} item when resolving derived value`);null!==e&&a.add(e)}0!==a.size&&(i.push(o),r.push(this.fetchItemEntryData(o.itemType,a,this.requestColumnsOperationsCacheFactory.construct(o.itemType,t.map((e=>e.id))),s,!0)))}if(0===i.length)return;const o=await Promise.all(r),a=[];for(let e=0;e<i.length;e++)a.push(this.resolveDerivedValues(o[e],i[e].children,s,n));await Promise.all(a)}getDerivedValues(e,t){const s=this.getDerivedEntry(e,t);if(null!==s)return this.collectFields(s)}getDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(o));const n=this.getDerivedEntry(e,t.slice(0,-1));if(null===n){if(void 0!==s)return s;const n=t.join(">"),r=this.getDerivedColumn(e.itemType,t);if(void 0!==r)return r.default;throw new Error(`Derived columns for path ${n} couldn't be found. Did you request them?`)}return this.lookUpItemField(n,t[t.length-1])}clearItemEntry(e){this.entries.clear(e);const t=this.itemChanges[e.id];return delete this.itemChanges[e.id],delete this.itemFieldSignals[e.id],t}createItemEntry(e){const t=new u(e.columns.itemType,e.itemId,e.columns);return this.entries.add(t),t}getDerivedEntry(e,t){let s=e;for(const e of t){const t=s.columns.response[s.itemType][e];if(void 0===t)throw new Error(`Column '${e}' not found on entry in ItemResource.getDerivedValue`);if(!he.isItemColumn(t)||null===t.itemType)throw new Error(`Column '${e}' doesn't have children in ItemResource.getDerivedValue`);const n=this.lookUpItemField(s,e);if(null===n)return null;s=this.transaction.getLocalItemEntryByItemId(t.itemType,n)}return s}getDerivedColumn(e,t){for(let s=0;s<t.length;s++){const n=t[s],r=this.columnCache.getColumn(e,n);if(void 0===r){const s=t.join(">");throw new Error(`Column '${n}' not found in path '${s}' for itemType '${e}'`)}if(s===t.length-1)return r;if(!he.isItemColumn(r)||null===r.itemType){const s=t.join(">");throw new Error(`Column '${n}' doesn't have children in path '${s}' for itemType '${e}'`)}e=r.itemType}throw new Error("Invalid path given in getDerivedColumn")}}class ct extends at{transaction;itemFieldLastModified={};constructor(e,t,s,n,r,i,o){super(t,e,r,i,n,o,s),this.transaction=o}createItemEntry(e){const t=super.createItemEntry(e);this.itemChanges[t.id]=e.fields,this.itemFieldLastModified[t.id]={};const s=e.fields.modified?.valueOf()??Z.default.now();for(const n in e.fields){const r=e.columns.response[t.itemType][n];void 0!==r&&"aggregate"!==r.fieldtype&&"method"!==r.fieldtype&&(this.itemFieldLastModified[t.id][n]=s)}return t}async fetchItemEntryData(e,t,s,n,r){const i=[],o=this.requestColumnExpansionFactory.construct(),c=[],l=a.TempItemTypeWithoutFixedIds.includes(e);for(const r of t){if(l){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)){c.push(t);continue}throw new p(e,r)}if(ge.isLocalId(r))throw new p(e,r);if(this.entries.contains(e,r)){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)&&!t.isOutdated()){if(!n||!s.hasAggregateColumns()){c.push(t);continue}i.push(r),o.expandWithRequestColumnsTuple(e,s.getAggregateColumns())}else{const n={object:t.columns.request,string:he.createRequestColumnSetId(t.columns.request)};i.push(r);const a=s.getColumnsMergedWithTuple(n,this.transaction);o.expandWithRequestColumnsTuple(e,t.isOutdated()?a.merged:a.difference),t.markUpToDate()}}else i.push(r),o.expandWithRequestColumnsTuple(e,s.getRequestColumnsTuple(this.transaction))}if(0===i.length)return c;await this.transaction.requestBufferManager.fetchByIds(e,i,o.get()[e],{forceFlush:r});for(const t of i)c.push(this.entries.get(e,t));return c}processUpdatesFromDelta(e,t){for(const s in e){const n=e[s],r=this.processItemEntryChanges(n);t.setItemUpdated(n.entry,n.changes.fields,r,n.mode)}}itemIsDeleted(){return!1}processItemEntryChanges(e){const t=e.entry,s=e.changes.fields;void 0===this.itemChanges[t.id]&&(this.itemChanges[t.id]={}),void 0===this.itemFieldLastModified[t.id]&&(this.itemFieldLastModified[t.id]={});const n=e.changes.columnExpansions;if(void 0!==n&&n.length>0)for(const e of n)t.columns=e.run(t.columns).merged;const r=this.itemChanges[t.id],i=s.modified?.valueOf(),o=t.columns.response[t.itemType];let a=null;for(const n in s){const c=o[n];if(void 0===c)continue;if(void 0===r[n]){r[n]=J.clone(c.type,s[n]);continue}const l=this.itemFieldLastModified[t.id][n];void 0!==l&&void 0!==i&&l>=i&&!c.isDisplayname&&!he.isAggregateColumn(c)||(J.compareFields(c.type,s[n],r[n])||("QUERY"===e.mode&&(e.mode="CLEAR_WHEN_SAME"),null===a&&(a={}),a[n]=r[n],r[n]=J.clone(c.type,s[n]),"aggregate"!==c.fieldtype&&"method"!==c.fieldtype&&(this.itemFieldLastModified[t.id][n]=i??Z.default.now())))}if(void 0!==s.id){const e=t.itemId;t.updateId(s.id),this.entries.updateItemId(t,e)}return a}}class lt{dependencies;transaction;collections={};constructor(e,t){this.dependencies=e,this.transaction=t}createQuery(e){return(new Ke).run(e)}async matchItemsToCollectionQueries(e,t,s){const n={};let r;if(void 0!==t){for(const s of t)n[s]=this.getMergedQueryGraph(s,e._queryResults[s]);r=e=>{const t=n[e];return void 0!==t?t:null}}else r=t=>{const s=n[t];return void 0!==s?s:n[t]=this.getMergedQueryGraph(t,e._queryResults[t])};const i=new nt;this.transaction.itemHandler.matchItemsInDeletedChangesDelta(e,r,i),this.transaction.itemHandler.matchItemsInUpdatedChangesDelta(e.updated,r,i),s&&this.transaction.itemHandler.matchEmptyItemsInUpdatedChangesDelta(e.updated,r,i),this.transaction.itemHandler.matchItemsInCreatedChangesDelta(e.created,r,i);const o=[];for(const t of i){const s=t[0];for(const n of t[1].entries()){const t=n[1];void 0!==t.maybe&&o.push(this.processMaybeMatches(s,n[0],t,e))}}return await Promise.all(o),i}applyMatchingResultsToCachedQueries(e){for(const t of e){const e=t[0];for(const s of t[1].entries()){const t=this.getCachedQueryItem(e,s[0]);if(void 0===t)continue;const n=s[1];t.handleMatchedItemEntries(n.true,n.false)}}}setCachedQuery(e,t,s,n,r){return this.getOrCreateCollectionTuple(e,t.string).cachedQueryItem=this.constructCachedQuery(e,t,n,s,r)}__fetchCachedQueryItem(e,t){const s=this.createQueryFromRootOptions(t);return this.expandColumnsWithQueryColumns(e,t,s.object),this.__fetchItemEntriesByQueryData(e,t,this.dependencies.requestColumnsOperationsCacheFactory.construct(e,t.columns),s)}getCachedQueryItemsByItemType(e){const t=this.collections[e];if(void 0===t)return[];const s=[];for(const e in t){const n=t[e].cachedQueryItem;void 0!==n&&s.push(n)}return s}cloneCachedQuery(e,t=!0){const s=this.setCachedQuery(e.itemType,e.query,e.requestColumnsTuple,e.items.slice(),e.queryGraph);return t&&s.resolve(),s}clearCachedQueryItem(e,t){void 0!==this.collections[e]?.[t]&&(delete this.collections[e][t].cachedQueryItem,this.clearCollectionTupleIfEmpty(e,t))}clearLinkedCachedQueryItems(e){const t=this.dependencies.linkTreeService.get()[e.itemType];for(const s in t){const n=this.collections[s];if(void 0===n)continue;const r=t[s],i={linkedTo:e.itemType,query:{id:e.itemId}};let o;switch(r.type){case c.ITEMTABLE:o={conditions:[{itemtype:e.itemType},{item:e.itemId}]};break;case c.DIRECT:o={[r.field]:e.itemId}}const a=this.createQuery(i).string,l=this.createQuery(o).string;delete n[a],delete n[l]}}getCachedQueryItem(e,t){return this.collections[e]?.[t]?.cachedQueryItem}getMergedQueryGraph(e,t){const s=this.getQueryGraphsForItemType(e);if(0===s.size)return null;const n=new Ve;for(const e of s)n.copyEdgesFrom(e,void 0);if(void 0!==t){const s=new je("id",Le,this.dependencies.errorHandler);for(const n in t){const r=this.getCollectionQueries(e,n);for(const e of t[n])for(const t of r)s.connectLeafNode(e,t)}n.connectBranchNode(s)}return n}*getCachedQueryItemIterator(){const e=this.collections;for(const t in e)for(const s in e[t]){const n=e[t][s].cachedQueryItem;void 0!==n&&(yield n)}}queryIsCacheable(e,t){return!e.preventCaching&&void 0===e.order?.limit&&t.isLocallyMatchable}createBatchQuery(e,t,s){return this.createQuery(this.createQueryFromChildOptions(e,t,s))}createQueryFromChildOptions(e,t,s){if("function"==typeof s)return s(t);const n={linkedTo:e,query:{id:1===t.length?t[0]:t}};return void 0===s?n:this.dependencies.queryService.addAndCondition(s,n)}createQueryFromRootOptions(e){const t=e.parent;let s;if(void 0===t)s=e.query;else{const n={linkedTo:t.itemType,query:{id:t.itemId}};s=void 0===e.query?n:this.dependencies.queryService.addAndCondition(e.query,n)}return this.createQuery(s)}expandColumnsWithQueryColumns(e,t,s){if(!0===t.columns)return;const n=this.dependencies.requestColumnExpansionFactory.construct();n.expandWithRequestColumns(e,t.columns),n.expandWithRequestColumns(e,new ze(this.dependencies.linkTreeService,e).run(s)),void 0!==t.order&&n.expandWithRequestColumns(e,[t.order.field]),t.columns=n.get()[e]}getOrCreateCollectionTuple(e,t){let s=this.collections[e];void 0===s&&(s=this.collections[e]={});const n=s[t];return void 0===n?s[t]={}:n}clearCollectionTupleIfEmpty(e,t){const s=this.collections[e];void 0===s[t].cachedQueryItem&&delete s[t]}getQueryGraphsForItemType(e){const t=this.collections[e],s=new Set;if(void 0===t)return s;for(const e in t){const n=t[e].cachedQueryItem;void 0!==n&&s.add(n.queryGraph)}return s}getCollectionQueries(e,t){const s=this.collections[e]?.[t]?.cachedQueryItem;return void 0!==s?new Set([s.query]):new Set}constructCachedQuery(e,t,s,n,r=this.createQueryGraph(e,t)){return new h(e,t,r,s,n)}createQueryGraph(e,t){return this.dependencies.graphQueryParserFactory.construct(e,t).run(t.object)}}class ut extends lt{transaction;constructor(e,t){super(e,t),this.transaction=t}hasActiveCollectionsForQuery(e,t){const s=this.transaction.getDescendantsIterator();for(const n of s){const s=n.cachedQueryHandler.getCollectionResources(e,t);for(const e of s)return!0}return!1}markCachedQueriesOutdatedInAllTransactions(e,t){const s=s=>{const n=s.getCachedQueryItem(e,t);n?.markOutdated()},n=e=>{for(const t of e)s(t.cachedQueryHandler),n(t.getChildren())};s(this),n(this.transaction.getChildren())}*getUncachedCollectionsOnChildTransactionsIterator(e){const t=[],s=e=>{for(const n of e)t.push(n),s(n.getChildren())};s(this.transaction.getChildren());for(const s of t){const t=s.cachedQueryHandler.getUncachedCollectionsIterator(e);for(const e of t)yield e}}__maybeExpandCachedQuery(e,t,s,n){const r=this.getCachedQueryItem(e,t);if(void 0===r)throw new Error(`ServerCachedQueryHandler: tried to expand non-existing query: ${e} - ${t}`);return!s.tupleContainsAllColumns(r.requestColumnsTuple,this.transaction)||r.itemsResolved()&&s.hasAggregateColumns()?this.transaction.requestBufferManager.fetchByQuery(r.itemType,void 0===n?r.query:n,s.getColumnsMergedWithTuple(r.requestColumnsTuple,this.transaction).merged).then((()=>(r.requestColumnsTuple=s.getColumnsMergedWithTuple(r.requestColumnsTuple,this.transaction).merged,r.promise))):r.promise}async __fetchItemEntriesByQueryData(e,t,s,n,r){if(!this.queryIsCacheable(t,n)){const r=s.getRequestColumnsTuple(this.transaction),i=await this.transaction.requestBufferManager.fetchByQuery(e,n,r,{limit:void 0!==t.order?.limit?t.order:void 0,flushTimeout:0}),o=[];for(const t of i.response.links[e])o.push(this.transaction.itemHandler.entries.get(e,t));const a=this.constructCachedQuery(e,n,o,r);return a.resolve(),a}let i=this.getCachedQueryItem(e,n.string);if(void 0!==i){if(!i.isOutdated())return this.__maybeExpandCachedQuery(e,n.string,s,r?.batchQuery);i.markUpToDate()}else i=this.setCachedQuery(e,n,s.getRequestColumnsTuple(this.transaction),[],r?.batchQueryGraph);return this.transaction.requestBufferManager.fetchByQuery(e,r?.batchQuery??n,s.getRequestColumnsTuple(this.transaction)).then((()=>(i.requestColumnsTuple=s.getColumnsMergedWithTuple(i.requestColumnsTuple,this.transaction).merged,i.resolve(),i)),(e=>{throw i.reject(e),e}))}processMaybeMatches(e,t,s){if(0===s.maybe.size)return;const n=this.getCachedQueryItem(e,t);void 0===n?this.dependencies.errorHandler.logError(new Error("ServerCachedQueryHandler: `processMaybeMatches()` called for query without associated cached query item")):n.markOutdated()}}var dt;!function(e){e.warning="warning",e.error="error"}(dt||(dt={}));const ht=8e3;class mt extends tt{id;errors={item:(0,l.signal)({}),global:(0,l.signal)({})};firstError=(0,l.computed)((()=>{const e=this.errors.global();for(const t in e){const s=e[t];if(s.level===dt.error)return s}const t=this.errors.item();for(const e in t){const s=t[e];for(const e in s){const t=s[e];for(const e in t){const s=t[e];if(s.level===dt.error)return s}}}}));firstErrorString=(0,l.computed)((()=>this.firstError()?.string));rootItemSignal=(0,l.signal)(void 0);rootItemToBeSet;tabRequestParameters={};hasChangesSignal=(0,l.signal)(!1);aiChanges=(0,l.signal)({created:new Set,deleted:new Set,fields:{}});parent;itemHandler;cachedQueryHandler;eventHandler;validator;validatorWithDependencies;options;lastSaveSignal=(0,l.signal)(null);autoSaveEffect;autoSaveInFlightSignal=(0,l.signal)(!1);actionsQueue=Promise.resolve();pendingActionLabels=new Map;transactionStateSignal=(0,l.signal)("Ready");isPendingSignal=(0,l.computed)((()=>{const e=this.transactionStateSignal();return"Pending"===e||"Saving"===e||this.childrenSignal().some((e=>e.isPendingSignal()))}));isDestroyedSignal=(0,l.signal)(!1);isValidSignal=(0,l.computed)((()=>!this.isPendingSignal()&&!0!==this.validator?.isPendingSignal()&&!0!==this.validatorWithDependencies?.isPendingSignal()&&void 0===this.firstError()));constructor(e,t,s,n,r,i){super(e,t),this.id=n,this.options={transparent:!1,autoSave:!1,...i},this.validator=void 0===r?void 0:r.construct(this),this.parent=s,this.itemHandler=new ft(e,this),this.cachedQueryHandler=new yt(e,this),this.eventHandler=new Ie(e.errorHandler),this.options.autoSave&&(0,l.untracked)((()=>{this.autoSaveEffect=(0,l.effect)((e=>{const t=this.rootItemSignal();if(void 0===t||t.isLocalSignal())return;if(this.autoSaveInFlightSignal()||!this.hasChangesSignal()||!this.isValidSignal())return;const s=setTimeout((()=>{this.autoSaveInFlightSignal.set(!0),this.save().finally((()=>{this.autoSaveInFlightSignal.set(!1)}))}),2500);e((()=>clearTimeout(s)))}),{manualCleanup:!0,injector:this.dependencies.rootInjector})}))}enqueueAction(e,t,s){void 0!==s&&this.transactionStateSignal.set(s),this.pendingActionLabels.set(t,e);const n=N();return this.actionsQueue=this.actionsQueue.then((()=>{const s=V(ht),r=t(s.pauseTimeout);return r.finally((()=>{this.pendingActionLabels.delete(t),0===this.pendingActionLabels.size&&this.transactionStateSignal.set("Ready")})).then(n.resolve,n.reject),Promise.race([r.catch((()=>{})),s.promise]).then((t=>{t===O&&this.dependencies.errorHandler.logError(new Ti(e,[...this.pendingActionLabels.values()]))}))})),n.promise}get rootItem(){return(0,l.untracked)((()=>this.rootItemSignal()))}get hasChanges(){return(0,l.untracked)((()=>this.hasChangesSignal()))}get isValid(){return(0,l.untracked)((()=>this.isValidSignal()))}attachValidator(e){if(void 0!==this.validatorWithDependencies)throw new Error("TransactionCache: validator already attached");if(void 0===e.dependencies)throw new Error("TransactionCache: validator dependencies are undefined. Did you call `fetchDependencies` first?");this.validatorWithDependencies=e;const t={item:{[e.dependencies.rootItem.itemType]:[new Pt(e.dependencies.rootItem,this.itemHandler,{},void 0,!1,!0)]},collection:{}},s=e=>{(t.collection[e.itemType]??=[]).push({addedItems:e.items,removedItems:[],changedItems:[],collectionResource:e});for(const t of e.items)for(const e in t.children)s(t.children[e])};for(const t in e.dependencies.rootItem.children)s(e.dependencies.rootItem.children[t]);e.validate(t.collection,t.item,!1)}isPending(){return(0,l.untracked)((()=>this.isPendingSignal()))}setPending(e,t){return this.enqueueAction("setPending","function"==typeof e?s=>e((e=>this.doApplyChangesFromUser(e,s,t))):()=>e,"Pending")}createChild(e,t,s){if(this.options.transparent)return this.parent.createChild(e,t,s);const n=new mt(this.dependencies,this.core,this,e,t,s);return(0,l.untracked)((()=>this.childrenSignal.update((e=>[...e,n])))),n}createBusinessLogicChild(){return new mt(this.dependencies,this.core,this,`${this.id??""}-business-logic-child`)}destroy(){void 0!==this.rootItem&&this.dependencies.lockService.deleteLock(this.rootItem),this.eventHandler.clear(),this.parent.onChildDestroy(this),this.isDestroyedSignal.set(!0),this.autoSaveEffect?.destroy()}isDestroyed(){return(0,l.untracked)((()=>this.isDestroyedSignal()))}expandCollectionResource(e,t){if(e.transaction!==this)throw new Error("TransactionCache: tried to expand collection resource on different transaction");const s=e.entry.itemType;return this.cachedQueryHandler.__fetchItemEntriesByQueryData(s,e.options,this.dependencies.requestColumnsOperationsCacheFactory.construct(s,t),e.entry.query).then((()=>(e.entry.expandColumns(this.dependencies.columnExpansionFactory.construct(s,t,this.dependencies.columnCache.retrieve(s,t).cached)),e)))}expandCollectionResources(e,t,s){if(!S(t))return Promise.resolve({});const n=[];for(const e in t){const s=t[e];if(s.transaction!==this)throw new Error("TransactionCache: tried to expand collection resource on different transaction");const r=s.options;if(n.push({options:r,query:s.entry.query}),r.parent.itemType!==n[0].options.parent.itemType)throw new Error("TransactionCache: invalid collection map passed to expandCollectionResources")}const r=this.dependencies.requestColumnsOperationsCacheFactory.construct(e,s),i={batchQuery:this.cachedQueryHandler.createBatchQuery(n[0].options.parent.itemType,n.map((e=>e.options.parent.itemId)),n[0].options.query)};return Promise.all(n.map((t=>this.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t.options,r,t.query,i)))).then((()=>{const n=this.dependencies.columnExpansionFactory.construct(e,s,this.dependencies.columnCache.retrieve(e,s).cached);for(const e in t)t[e].entry.expandColumns(n);return t}))}registerFieldChangeCallback(e,t,s){return this.itemHandler.registerFieldChangeCallback(e,t,s)}createChangesDelta(e=!0){return this.dependencies.changesDeltaFactory.construct(e)}getFirstErrorString(){return(0,l.untracked)((()=>this.firstErrorString()))}_setGlobalError(e,t,s,n){if(!t)return void this.clearGlobalError(e);const r=this.errors.global();r[e]={string:s(),level:n},this.errors.global.set({...r})}_setItemError(e,t,s,n,r,i,o,a){if(!n)return void this.clearItemError(e,t,s);const c=this.errors.item();q(c,[e,t,s],[{},{},{fieldString:r(),string:i(),level:o,location:a}],!0),this.errors.item.set({...c})}async applyChangesFromParent(e,t=!1,s){if(e.isEmpty()&&void 0===s)return;this.handleCascadingDeletes(e);const n=this.dependencies.changesDeltaFactory.constructParentDelta(e);if(void 0!==s){for(const t in s)for(const n in s[t]){const r=s[t][n],i=Number(n);let o;try{o=this.getLocalItemEntryByItemId(t,r)}catch(e){this.dependencies.errorHandler.logError(e);continue}this.itemHandler.updateLocalItemIdReferences(o.itemType,i,r,e)}this.cachedQueryHandler.updateLocalItemIdReferences(s)}for(const t in e.created){const s=e.created[t];n.setItemCreated(s.entry,s.fields),this.itemHandler.entries.clear(s.entry),this.itemHandler.maybeSetRootItem(s.entry)}this.itemHandler.processUpdatesFromDelta(e.updated,!1,n);for(const t of e.getDeletedItemEntriesIterator())n.setItemDeleted(t),this.itemHandler.removeFromDeletedItems(t),this.rootItem===t&&this.eventHandler.executeCallbacks("onRootItemDelete",(e=>e()),!0);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(n,n._queryItemTypeSet,!1),i=await this.cachedQueryHandler.applyMatchingResultsToCollections(r);if(this.runChangesListenersAndValidators(i,n,s,t),this.clearChildCollectionResources(i),this.detectChanges(!0),void 0!==this.validator||void 0!==this.validatorWithDependencies){this.clearGlobalError();try{this.validator?.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}}await Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(n,t,s))));for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}applyChangesDelta(e,t=!1){this.isDestroyed()&&this.dependencies.errorHandler.logWarning(`TransactionCache: tried to apply changes to destroyed transaction with id: '${this.id}'`);const s=N();return this.enqueueAction("applyChangesDelta",(n=>this.doApplyChangesFromUser(e,n,t).then((e=>(s.resolve(e),e.allChildrenDonePromise))).catch((e=>s.reject(e))))),s.promise}async doApplyChangesFromUser(e,t,s){if(e.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};await this.fetchLock();for(const t in e.restored){const s=e.restored[t];this.itemHandler.removeFromDeletedItems(s.entry),s.entry.isLocal()?(this.itemHandler.entries.add(s.entry),this.itemHandler.itemChanges[s.entry.id]=s.changes):e.setItemUpdated(s.entry,s.changes)}const n=await this.dependencies.businessLogicManager.handleBusinessLogic(this,e,t);return null===n?{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()}:(this.tabRequestParameters=D(this.tabRequestParameters,n.tabRequestParameters),this.doApplyChangesFromChild(n,s))}async applyChangesDirectly(e){this.handleCascadingDeletes(e);const t=this.dependencies.changesDeltaFactory.constructParentDelta(e);for(const s of e.created){const n=this.processCreatedItem(s,e);null!==n&&t.setItemCreated(n,this.itemHandler.itemChanges[n.id])}await this.expandLocalItemsFromDelta(t.created,e.updated),await this.fetchUpdatedDerivedValuesFromDelta(e,void 0),this.itemHandler.processUpdatesFromDelta(e.updated,!0,t);for(const s of e.getDeleteTuplesIterator())t.setItemDeleted(s.entry),this.itemHandler.addToDeletedItems(s.entry,s.isCascaded);const s=await this.cachedQueryHandler.matchItemsToCollectionQueries(t,void 0,!0);return await this.cachedQueryHandler.applyMatchingResultsToCollections(s),t}getRootTransaction(){return this.parent instanceof st?this:this.parent.getRootTransaction()}getServerCache(){return this.parent.getServerCache()}getCollectionChangesRecursively(e,t){const s=this.cachedQueryHandler.getCachedQueryItem(e,t.string);if(void 0!==s)return s;const n=this.parent.getCollectionChangesRecursively(e,t);return void 0!==n?this.cachedQueryHandler.cloneCachedQuery(n):void 0}isLockable(e=this.rootItem){return void 0!==e&&!this.options.autoSave&&e.isLockable()}async save(e=!1,t={},s,n){this.transactionStateSignal.set("Saving");try{await this.eventHandler.executeCallbacks("onBeforeSave",(e=>e(this)),e)}finally{this.transactionStateSignal.set("Ready")}return this.enqueueAction("save",(()=>this.doSave(e,t,s,n)),"Saving")}async doSave(e=!1,t={},s,n){let r;return this.parent instanceof mt?(await this.parent.applyChangesFromChild(this,D(this.tabRequestParameters,t),this.aiChanges()),r={}):r=await this.parent.applyChangesFromChild(this,s,n),this.tabRequestParameters={},this.isLockable(this.rootItem)&&this.dependencies.lockService.deleteLock(this.rootItem),this.hasChangesSignal.set(!1),this.lastSaveSignal.set((0,Z.default)()),this.aiChanges.set({created:new Set,deleted:new Set,fields:{}}),await this.eventHandler.executeCallbacks("onSaveSuccess",(e=>e(this,r)),e),r}fetchLock(){return this.isLockable(this.rootItem)?this.dependencies.lockService.fetchLock(this.rootItem).then((e=>{if(this.dependencies.lockService.isRemoteLock(e))throw new vi(e.message)})):Promise.resolve()}detectChanges(e=!1,t){return!(!this.hasChanges||e)||(this.itemHandler.detectChanges(t)?(this.hasChangesSignal.set(!0),!0):(this.hasChangesSignal.set(!1),!1))}clearItem(e){this.clearItemEntry(e.entry)}clearItemEntry(e){return this.clearItemError(e.id),super.clearItemEntry(e)}onBeforeSave(e,t,s,n){return this.eventHandler.registerCallback("onBeforeSave",e,t,s,n)}onSaveSuccess(e,t,s,n){return this.eventHandler.registerCallback("onSaveSuccess",e,t,s,n)}onRootItemDeleted(e,t,s,n){return this.eventHandler.registerCallback("onRootItemDelete",e,t,s,n)}getModuleChanges(){if(void 0===this.rootItem)throw new Error("No root item for transaction cache "+this.id);return this.dependencies.moduleChangesCompilationFactory.construct(this).process()}updateItemIdMap(e,t){if(void 0!==t)for(const s in t){const n=t[s];void 0!==e[s]&&(e[n]=e[s],delete e[s])}}async getLinkCollections(e,t,s,n){if(0===t.length)return Promise.resolve({});const r=(await this.cachedQueryHandler.__fetchChildCachedQueryItems(e,t,{[s]:n}))[0].cachedQueryItemTuples,i={[s]:this.dependencies.collectionResourceFactory.constructColumnSet(r[0])},o={},a=[];for(const e of r){const t=this.dependencies.collectionResourceFactory.construct(e,null,this,i);o[e.options.parent.itemId]=t,a.push(t)}return o}getCollection(e,t){return this.cachedQueryHandler.__fetchParentCachedQueryItem(e,t).then((e=>{const s=this.dependencies.collectionResourceFactory.construct(e,null,this);return this.maybeCallInitialChangesListener(t,[s],[]),s}))}async getNewResourceWithId(e,t,s,n=!1,r){r&&(this.rootItemToBeSet={itemType:e,itemId:t});const[i,o]=await Promise.all([this.itemHandler.fetchNewItemEntry(e,t,s),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,[t],s.children)]);let a;const c={};for(const s of i.created)s.itemType!==e||s.itemId!==t?(void 0===c[s.itemType]&&(c[s.itemType]=[]),c[s.itemType].push(s)):a=s;if(void 0===a)throw new Error("The ItemEntry with the requested ItemId was not in the template response");const l=this.createItemResource(a,this.dependencies.collectionResourceFactory.constructChildCollectionResources(o,null,this)[a.itemId],!0,s.changesListener,s.abortSignal);if(!n)return this.maybeCallInitialChangesListener(s,[],[l]),l;const u=this.processLinkedItems(c,s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],[l,...Object.values(u).flat()]),{main:l,linked:u}}getNewResource(e,t,s,n){return this.getNewResourceWithId(e,ge.getLocalId(),t,s,n)}async getItemsByQuery(e,t,s){const n=await this.cachedQueryHandler.__fetchParentCachedQueryItem(e,{...s,query:t});return this.createItemResources(n.cachedQueryItem.items,this.dependencies.collectionResourceFactory.constructChildCollectionResources(n.children,null,this),void 0,s.abortSignal)}async getItemsById(e,t,s){if(0===t.length)return Promise.resolve([]);const[n,r]=await Promise.all([this.itemHandler.fetchItemEntries(e,t,s.columns),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,t,s.children)]),i=this.createItemResources(n,this.dependencies.collectionResourceFactory.constructChildCollectionResources(r,null,this),s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],i),i}async getItemById(e,t,s,n=!1){n&&(this.rootItemToBeSet={itemType:e,itemId:t});const[r,i]=await Promise.all([this.itemHandler.fetchItemEntry(e,t,s.columns),void 0===s.children?null:this.cachedQueryHandler.__fetchChildCachedQueryItems(e,[t],s.children)]),o=this.createItemResource(r,this.dependencies.collectionResourceFactory.constructChildCollectionResources(i,null,this)[t],!1,s.changesListener,s.abortSignal);return this.maybeCallInitialChangesListener(s,[],[o]),o}fetchTitle(e,t){return this.itemHandler.fetchTitle(e,t)}async applyChangesFromChild(e,t,s){return this.tabRequestParameters=D(this.tabRequestParameters,t),this.enqueueAction("applyChangesFromChild",(()=>this.doApplyChangesFromChild(e,!1,s)))}mergeAiChanges(e){const t=this.aiChanges(),s=new Set(t.created),n=new Set(t.deleted),r={...t.fields};for(const t of e.created)s.add(t);for(const t of e.deleted)n.add(t);for(const t in e.fields){const s=e.fields[t];if(void 0===s||0===s.size)continue;const n=r[t]=new Set(r[t]);for(const e of s)n.add(e)}this.aiChanges.set({created:s,deleted:n,fields:r})}getAiRequestParameters(e){const t=this.aiChanges(),s=t.created.has(e.id),n=t.fields[e.id];if(s||void 0!==n&&0!==n.size)return{aiTouched:!0,aiTouchedFields:void 0!==n?[...n]:[]}}async doApplyChangesFromChild(e,t,s){const n=e.getDelta();if(n.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};await this.fetchLock();for(const t of e.cachedQueryHandler.getCachedQueryItemIterator())void 0===this.cachedQueryHandler.getCachedQueryItem(t.itemType,t.query.string)&&this.cachedQueryHandler.cloneCachedQuery(t);this.handleCascadingDeletes(n);const r=this.dependencies.changesDeltaFactory.constructParentDelta(n),i=[],o=this.aiChanges(),a=o.created,c=o.deleted,l=o.fields;for(const e in n.created){const s=n.created[e];i.push(this.itemHandler.entries.add(s.entry));const o=this.itemHandler.itemChanges[s.entry.id]=this.itemHandler.copyTransactionItemEntryChanges(s.fields,s.entry);r.setItemCreated(s.entry,o),this.itemHandler.maybeSetRootItem(s.entry),t?a.add(s.entry.id):a.delete(s.entry.id)}await this.expandLocalItemsFromDelta(r.created,n.updated);const u=this.itemHandler.processUpdatesFromDelta(n.updated,!0,r);for(const[e,s]of u)if(t){let t=l[e];void 0===t&&(l[e]=t=new Set);for(const e of s)t.add(e)}else{const t=l[e];if(void 0!==t){for(const e of s)t.delete(e);0===t.size&&delete l[e]}}for(const e of n.getDeleteTuplesIterator())r.setItemDeleted(e.entry),this.itemHandler.addToDeletedItems(e.entry,e.isCascaded),t?c.add(e.entry.id):c.delete(e.entry.id);this.aiChanges.set({created:a,deleted:c,fields:l}),void 0!==s&&this.mergeAiChanges(s);const d=await this.cachedQueryHandler.matchItemsToCollectionQueries(r,void 0,!0),h=await this.cachedQueryHandler.applyMatchingResultsToCollections(d);if(this.runChangesListenersAndValidators(h,r,void 0,!1),this.clearChildCollectionResources(h),void 0!==this.validator)try{this.validator.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}return this.detectChanges(!0,n),{changesDelta:n,created:i,allChildrenDonePromise:Promise.all(this.getChildren().map((e=>e.applyChangesFromParent(r)))).then((()=>{for(const e of n.getDeleteTuplesIterator())this.clearItemEntry(e.entry)}))}}getLocalItemEntry(e){return this.itemHandler.entries.containsByEntryId(e)?this.itemHandler.entries.getByEntryId(e):this.parent.getLocalItemEntry(e)}getLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)?this.itemHandler.entries.get(e,t):this.parent.getLocalItemEntryByItemId(e,t)}containsLocalItemEntryByItemId(e,t){return this.itemHandler.entries.contains(e,t)||this.parent.containsLocalItemEntryByItemId(e,t)}getDelta(){const e=this.dependencies.changesDeltaFactory.constructChildDelta();for(const t of this.itemHandler.getItemEntriesWithChangesIterator())if(this.itemHandler.entries.contains(t.itemType,t.itemId)){const s=this.itemHandler.collectFields(t);t.updateId(s.id),e.setItemCreated(t,s)}else e.setItemUpdated(t,this.itemHandler.itemChanges[t.id],"KEEP_WHEN_DIFFERENT");for(const t in this.itemHandler.deletedItems)for(const s of this.itemHandler.deletedItems[t])e.setItemDeleted({entry:s.entry,changes:this.itemHandler.itemChanges[s.entry.id],isCascaded:s.isCascaded});return e}createItemResource(e,t=void 0,s,n,r){const i=this.dependencies.itemResourceFactory.construct(e,this,s,r);return i.setChildCollectionResources(t),void 0!==r&&r.aborted?(i.clearResource(),i):(void 0!==n&&i.registerChangesListener(n),this.itemHandler.registerItemResource(i),i)}createItemResources(e,t={},s,n){const r=[];for(const i of e)r.push(this.createItemResource(i,t[i.itemId],!1,s,n));return r}processLinkedItems(e,t,s){const n={};for(const r in e)n[r]=this.createItemResources(e[r],{},t,s);return n}clearItemError(e,t,s){void 0!==e?void 0!==t?void 0!==s?this.errors.item.update((n=>void 0===n[e]?.[t]?n:(delete n[e][t][s],S(n[e][t])||delete n[e][t],S(n[e])||delete n[e],{...n}))):this.errors.item.update((s=>s[e]?(delete s[e][t],S(s[e])||delete s[e],{...s}):s)):this.errors.item.update((t=>(delete t[e],{...t}))):this.errors.item.set({})}runChangesListenersAndValidators(e,t,s,n){for(const t of e){const e=t.collectionResource;(t.addedItems.length>0||t.removedItems.length>0)&&e.itemsSignal.set([...e.items])}if(void 0!==this.validator)for(const e in t.created){const s=t.created[e];try{this.validator.validateItem(s.entry,s.fields,s.fields,(()=>!0))}catch(e){this.dependencies.errorHandler.notifyError(e)}}const r=new Map,i=this.itemHandler.fieldChangeCallbacks;for(const e in t.updated){const o=t.updated[e],a=o.entry,c=i[a.itemType]?.[a.itemId],l=new Set,u=this.itemHandler.getItemResources(a);let d;for(const e of u)void 0===d&&(d=e),e.getAggregatedChangesListeners(l);if(void 0===this.validator&&void 0===c&&0===l.size)continue;void 0===d&&(d=this.createItemResource(a));const h=new Pt(d,this.itemHandler,o.previous??{},s,n);if(l.size>0)for(const e of l){let t=r.get(e);void 0===t&&r.set(e,t={item:{},collection:{}}),t.item[a.itemType]??=[],t.item[a.itemType].push(h)}if(void 0!==this.validator)try{this.validator.validateItem(a,h.fields,h.previous,h.compareField.bind(h))}catch(e){this.dependencies.errorHandler.logError(e)}if(void 0!==c)for(const e of c)try{e(h)}catch(e){this.dependencies.errorHandler.logError(e)}}for(const i of e)i.collectionResource.triggerCollectionChangesListeners(i,t,s,n,!1,r);for(const e of r.entries())e[0](e[1].collection,e[1].item,n)}clearChildCollectionResources(e){for(const t of e)for(const e of t.removedItems)e.clearChildCollections()}expandLocalItemsFromDelta(e,t){const s={},n={};for(const t in e){const n=e[t].entry;void 0===s[n.itemType]&&(s[n.itemType]=[]),s[n.itemType].push(n)}const r=this.itemHandler.entries;for(const e in t){const n=t[e].entry;r.containsByEntryId(n.id)&&(void 0===s[n.itemType]&&(s[n.itemType]=[]),s[n.itemType].push(n))}for(const e in s){const t=this.cachedQueryHandler.getCachedQueryItemsByItemType(e);if(0===t.length)continue;const s=this.dependencies.requestColumnExpansionFactory.construct();for(const e of t)s.expandWithRequestColumnsTuple(e.itemType,e.requestColumnsTuple);n[e]=s.get()[e]}const i=[];for(const e in n){const t=n[e];i.push(this.itemHandler.expandLocalItemEntries(e,s[e],t,this.dependencies.columnCache.retrieve(e,t).cached,!1))}return Promise.all(i)}clearGlobalError(e){if(void 0===e)return void this.errors.global.set({});const t=this.errors.global();delete t[e],this.errors.global.set({...t})}maybeCallInitialChangesListener(e,t,s){if(void 0===e.changesListener||!0!==e.immediatelyCallChangesListener)return;const n=new Map,r=e=>{e.triggerCollectionChangesListeners({addedItems:e.items,removedItems:[]},null,void 0,!1,!0,n);for(const t of e.items)i(t)},i=e=>{const t=new Set;e.getAggregatedChangesListeners(t);for(const s of t){let t=n.get(s);void 0===t&&n.set(s,t={item:{},collection:{}}),t.item[e.itemType]??=[],t.item[e.itemType].push(new Pt(e,this.itemHandler,{},void 0,!1,!0))}for(const t in e.children)r(e.children[t])};for(const e of t)r(e);for(const e of s)i(e);for(const e of n.entries())e[0](e[1].collection,e[1].item,!1)}}const pt={get:(e,t)=>{const s=e.itemEntry,n=e.itemHandler,r=n.entries.contains(s.itemType,s.itemId)?n:n.transaction.parent.itemHandler,i=r.lookUpItemField(s,t);return"displayname"!==t||void 0!==i&&""!==i?i:r.getDisplayName(s)}};class ft extends at{dependencies;transaction;fieldChangeCallbacks={};deletedItems={};itemResourcesPerEntry=new Map;constructor(e,t){super(e.columnCache,e.errorHandler,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,e.itemEntryService,t,e.itemCacheFactory),this.dependencies=e,this.transaction=t}registerItemResource(e){this.itemResourcesPerEntry.has(e.entry)?this.itemResourcesPerEntry.get(e.entry).push(new WeakRef(e)):this.itemResourcesPerEntry.set(e.entry,[new WeakRef(e)])}*getItemResources(e,t=!1){const s=this.itemResourcesPerEntry.get(e);if(void 0===s)return;let n=!1;for(const e of s){const t=e.deref();void 0!==t?yield t:n=!0}t&&n&&this.cleanUpItemResourcesForEntry(e)}cleanUpItemResourcesForEntry(e){const t=this.itemResourcesPerEntry.get(e);if(void 0===t)return;const s=[];for(const e of t){void 0!==e.deref()&&s.push(e)}s.length!==t.length&&this.itemResourcesPerEntry.set(e,s)}clearItemEntry(e){return this.itemResourcesPerEntry.delete(e),super.clearItemEntry(e)}addToDeletedItems(e,t){if(this.entries.contains(e.itemType,e.itemId))return;const s=e.itemType;void 0===this.deletedItems[s]&&(this.deletedItems[s]=[]);const n=this.deletedItems[s].find((t=>t.entry===e));void 0===n?this.deletedItems[s].push({entry:e,isCascaded:t}):t&&(n.isCascaded=!0)}removeFromDeletedItems(e){const t=this.deletedItems[e.itemType];if(void 0===t)return;const s=t.findIndex((t=>t.entry===e));-1!==s&&t.splice(s,1)}*getDeletedItemsIterator(e){const t=this.deletedItems[e];if(void 0!==t)for(const e of t)yield e.entry}getDeletedItemsAmount(e){const t=this.deletedItems[e];return void 0!==t?t.length:0}constructInitialProxy(e){return new Proxy({itemEntry:e,itemHandler:this},pt)}*getItemEntriesWithChangesIterator(e){for(const t in this.itemChanges)try{const s=this.transaction.getLocalItemEntry(Number(t));if(void 0!==e&&s.itemType!==e)continue;yield s}catch(e){this.dependencies.errorHandler.logError(e)}}processUpdatesFromDelta(e,t,s){const n=new Map;for(const r in e){const i=e[r];if(this.itemIsDeleted(i.entry))continue;const o=this.processItemEntryChanges(i,t);null!==o&&n.set(i.entry.id,new Set(Object.keys(o))),s.setItemUpdated(i.entry,i.changes.fields,o,i.mode)}return n}updateLocalItemIdReferences(e,t,s,n){void 0!==this.fieldChangeCallbacks[e]&&void 0!==this.fieldChangeCallbacks[e][t]&&(this.fieldChangeCallbacks[e][s]=this.fieldChangeCallbacks[e][t],delete this.fieldChangeCallbacks[e][t]);for(const r of this.getItemEntriesWithChangesIterator()){if(r.itemId===s||void 0!==n.updated[r.id]&&"QUERY"!==n.updated[r.id].mode)continue;const i=this.itemChanges[r.id],o=this.itemFieldSignals[r.id];for(const n of r.columns.item.main){if(n.apiColumn.itemType!==e)continue;if(i[n.id]!==t)continue;i[n.id]=s;const r=o?.[n.id];void 0!==r&&r.set(s)}const a=r.columns.response[r.itemType];if("itemtype"in a&&"item"in a&&i.itemtype===e&&i.item===t){i.item=s;const e=o?.item;void 0!==e&&e.set(s)}}}registerFieldChangeCallback(e,t,s){q(this.fieldChangeCallbacks,[e,t],[{},[]]);const n=this.fieldChangeCallbacks[e][t];return n.push(s),()=>{const e=n.indexOf(s);-1!==e&&n.splice(e,1)}}createItemEntry(e){const t=super.createItemEntry(e);return this.itemChanges[t.id]=J.copyFields(e.fields,{},e.columns.main),this.itemChanges[t.id].id=t.itemId,t}formatRequest(e){return void 0===this.itemChanges[e.id]?{}:J.formatRequestLocal(this.itemChanges[e.id],e.columns.main)}detectChanges(e){for(const e in this.deletedItems)if(this.deletedItems[e].length>0)return!0;const t=new Set;if(e)for(const s of e.getDeleteTuplesIterator())t.add(s.entry.id);for(const e in this.itemChanges)if(!t.has(Number(e)))return!0;return!1}detectEntryChanges(e){return void 0!==this.itemChanges[e]}cloneItemEntries(e,t,s={},n){this.dependencies.conversionMapService.batchExpandConversionMap(t,s);const r=[];for(const i of t)r.push(this.cloneItemEntry(e,i,s,n));return r}cloneItemEntry(e,t,s={},n){const r=this.transaction.itemHandler.collectFields(t),i=this.dependencies.conversionMapService.expandConversionMap(t.itemType,t.itemId,s),o=J.copyFields(r,{},t.columns.main);return this.dependencies.conversionMapService.updateItemValues(o,o,t.columns.item.main,s),void 0!==n&&n(t.itemType,o),e._setItemCreated(i,o,t.columns),i}fetchItemEntry(e,t,s){if(null==t)throw new Error("undefined/null id passed to fetchItemEntry");return this.fetchItemEntryData(e,[t],this.requestColumnsOperationsCacheFactory.construct(e,s),!0).then((e=>(this.maybeSetRootItem(e[0]),e[0])))}fetchItemEntries(e,t,s){return this.fetchItemEntryData(e,t,this.requestColumnsOperationsCacheFactory.construct(e,s),!0)}async fetchNewItemEntry(e,t,s){if(this.entries.contains(e,t))throw new Ci(e,t);const n=this.dependencies.requestColumnExpansionFactory.construct();n.expandWithRequestColumns(e,s.columns),void 0!==s.defaultValues&&n.expandWithRequestColumns(e,Object.keys(s.defaultValues));const r=await this.dependencies.templateCache.fetchTemplate(e,t,s.templateOptions,n.get(),s.parent);if(this.entries.contains(e,t))throw new Ci(e,t);const i=this.dependencies.changesDeltaFactory.construct(!1);this.dependencies.itemCreateService.processTemplate(i,e,t,s.parent??null,r,void 0,((t,n)=>{if(t===e&&void 0!==s.defaultValues)for(const e in s.defaultValues)n[e]=s.defaultValues[e]}));const o={};i.created.forEach(((e,t)=>{for(const s of e.columns.root){const n=s.itemType,r=e.fields[s.id];if(void 0===r)throw new Error(`ItemId for derived item of type for ${t}:${s.id} could not be found when fetching derived values for template item.`);if(null===r||ge.isLocalId(r))continue;const i=o[n]??={columns:this.dependencies.requestColumnExpansionFactory.construct(),itemIds:new Set};i.columns.expandWithRequestColumns(s.itemType,s.toRequestColumns()[0][s.id]),i.itemIds.add(r)}}));const a=[];for(const e in o){const t=o[e];a.push(this.fetchItemEntries(e,Array.from(t.itemIds),t.columns.get()[e]))}return await Promise.all(a),this.transaction.applyChangesDelta(i)}async fetchItemEntryData(e,t,s,n,r){const i=this.transaction.getServerCache().itemHandler.entries,o=[],a=[],c=[];for(const n of t)if(i.contains(e,n)){const t=i.get(e,n);s.hasAggregateColumns()||!s.setContainsAllColumns(t.columns,this.transaction)||t.isOutdated()?o.push(n):c.push(t)}else this.entries.contains(e,n)?a.push(n):o.push(n);if(a.length>0){const t=await this.fetchLocalItemEntryData(e,a,s);for(const e of t)c.push(e)}if(o.length>0){const t=await this.transaction.parent.itemHandler.fetchItemEntryData(e,o,s,n,r);for(const e of t)c.push(e)}return c}maybeSetRootItem(e){void 0!==this.transaction.rootItemToBeSet&&this.transaction.rootItemToBeSet.itemType===e.itemType&&this.transaction.rootItemToBeSet.itemId===e.itemId&&(this.transaction.rootItemSignal.set(e),this.transaction.rootItemToBeSet=void 0)}fetchTitle(e,t){const s=this.dependencies.itemEntryService.getTitleField(e);return this.fetchItemEntry(e,t,[s]).then((e=>this.lookUpItemField(e,s)))}expandLocalItemEntries(e,t,s,n,r){if(0===t.length)return Promise.resolve();const i=this.dependencies.columnExpansionFactory.construct(e,s,n);for(const e of t){const t=i.run(e.columns);if(null===t.difference)continue;e.columns=t.merged;const s=this.itemChanges[e.id];if(void 0!==s)for(const n of t.difference.main)void 0===this.lookUpItemField(e,n.id)&&(s[n.id]=J.formatResponseValue(n.apiColumn.type,n.apiColumn.default));else this.errorHandler.logError(new Error(`TransactionItemHandler: expected item changes for '${e.itemType}' item to be present`))}return this.resolveDerivedValues(t,i.aggregateRootColumns(),r)}itemIsDeleted(e){const t=this.deletedItems[e.itemType];return void 0!==t&&t.some((t=>t.entry===e))}clearItemResource(e){const t=this.itemResourcesPerEntry.get(e.entry);if(void 0===t)return;const s=[];for(const n of t){const t=n.deref();void 0!==t&&t!==e&&s.push(n)}this.itemResourcesPerEntry.set(e.entry,s)}processItemEntryChanges(e,t){const s=e.entry;if("QUERY"===e.mode)return null;void 0===this.itemChanges[s.id]&&t&&(this.itemChanges[s.id]={});const n=s.columns.response[s.itemType],r=this.itemChanges[s.id],i="previous"in e?e.previous:null;let o;const c=this.itemFieldSignals[s.id];if(void 0!==c)for(const t in e.changes.fields){const s=c[t];void 0!==s&&s.set(e.changes.fields[t])}if(void 0===r){if(null===i)return null;o=i}else{const t=e.changes.fields,c=this.entries.containsByEntryId(s.id);switch(o={},e.mode){case"CLEAR_ALWAYS":if(c)throw new Error("Cannot clear the fields of a local entry");for(const e in t){if(void 0===r[e]){null!==i&&void 0!==i[e]&&(o[e]=i[e]);continue}const s=n[e];void 0!==s&&(J.compareFields(s.type,t[e],r[e])||(o[e]=r[e]),delete r[e])}for(const e in r){const t=n[e];!1!==t.readOnly&&t.type!==a.ApiEnumApiType.TYPE_LINK&&(J.compareFields(t.type,this.transaction.parent.itemHandler.lookUpItemField(s,e),r[e])||(o[e]=r[e]),delete r[e])}break;case"CLEAR_WHEN_SAME":for(const e in t)void 0!==r[e]&&J.compareFields(n[e].type,t[e],r[e])&&delete r[e];break;case"KEEP_WHEN_DIFFERENT":for(const a in t){if(void 0===r[a]&&null!==i){void 0!==i[a]&&(o[a]=i[a]);continue}const l=n[a];if(void 0===l)continue;const u=c?void 0:this.transaction.parent.itemHandler.lookUpItemField(s,a),d=void 0!==u&&J.compareFields(l.type,t[a],u);if(void 0!==r[a]){if(!J.compareFields(l.type,t[a],r[a])&&(o[a]=r[a],!d)){const s=J.clone(l.type,t[a]);"categorie"===a&&null===s&&this.logEquipmentGroupNullError(e),r[a]=s}d&&delete r[a]}else if(!d){o[a]=u;const s=J.clone(l.type,t[a]);"categorie"===a&&null===s&&this.logEquipmentGroupNullError(e),r[a]=s}}}S(r)||delete this.itemChanges[s.id]}return S(o)?o:null}logEquipmentGroupNullError(e){this.dependencies.errorHandler.logDebug(JSON.stringify(e)),this.dependencies.errorHandler.logError(new Error("TransactionItemHandler: `categorie` being set to `null`"))}async fetchLocalItemEntryData(e,t,s){const n=[],r=[],i=this.requestColumnExpansionFactory.construct();for(const o of t){const t=this.entries.get(e,o);if(n.push(t),s.setContainsAllColumns(t.columns,this.transaction))continue;r.push(t);const a={object:t.columns.request,string:he.createRequestColumnSetId(t.columns.request)};i.expandWithRequestColumnsTuple(e,s.getColumnsMergedWithTuple(a,this.transaction).difference)}if(0===r.length)return n;const o=i.get()[e],a=await this.dependencies.columnHandler.fetch(e,o);return await this.expandLocalItemEntries(e,r,o,a,!0),n}}class yt extends lt{dependencies;collections={};constructor(e,t){super(e,t),this.dependencies=e}*getCollectionResources(e,t,s=!1){const n=this.collections[e]?.[t]?.collectionResources;if(void 0===n)return;let r=!1;for(const e of n){const t=e.deref();void 0===t?r=!0:yield t}s&&r&&this.cleanUpQueryString(e,t)}addCollectionResource(e){const t=this.getOrCreateCollectionTuple(e.itemType,e.entry.query.string);return void 0===t.collectionResources&&(t.collectionResources=[]),t.collectionResources.push(new WeakRef(e)),this.cleanUpQueryString(e.itemType,e.entry.query.string),e}*getUncachedCollectionsIterator(e){const t=this.collections[e];if(void 0!==t)for(const s in t){const n=t[s];void 0===n.cachedQueryItem&&void 0!==n.collectionResources&&(yield*this.getCollectionResources(e,s,!0))}}clearCollectionResource(e){const t=e.entry.itemType,s=e.entry.query.string;if(void 0===this.collections[t]||void 0===this.collections[t][s]||void 0===this.collections[t][s].collectionResources)return;const n=this.collections[t][s].collectionResources,r=[];for(const t of n){const s=t.deref();void 0===s||s.entry===e.entry||r.push(t)}this.collections[t][s].collectionResources=r,this.clearCollectionTupleIfEmpty(t,s,!0)}updateLocalItemIdReferences(e){for(const t in this.collections){const s=this.collections[t];for(const t in s){const n=s[t],r=n.cachedQueryItem;if(void 0!==r){if(this.updateQueryLocalItemIdReferences(r.query,r.queryGraph,e)){const e=this.transaction.parent.cachedQueryHandler;e instanceof ut&&e.cloneCachedQuery(r)}r.query.string!==t&&(s[r.query.string]=s[t],delete s[t])}const i=this.getCollectionResourcesByTuple(n);for(const n of i){if(void 0!==r&&n.entry.query===r.query?r.query.string!==t:this.updateQueryLocalItemIdReferences(n.entry.query,n.queryGraph,e)){const i=n.entry.parent;if(null!==i){const t=e[i.itemType]?.[i.itemId];void 0!==t&&(n.entry.parent={itemType:i.itemType,itemId:t})}void 0===r&&(s[n.entry.query.string]=s[t],delete s[t])}}}}}__maybeExpandCachedQuery(e,t,s,n){const r=this.getCachedQueryItem(e,t);if(void 0===r)throw new Error(`TransactionCachedQueryHandler: tried to expand non-existing query: ${e} - ${t}`);return!s.tupleContainsAllColumns(r.requestColumnsTuple,this.transaction)||r.itemsResolved()&&s.hasAggregateColumns()?this.transaction.parent instanceof st&&this.dependencies.queryService.containsLocalId(r.query.object)?this.mergeColumnsAndExpandLocalItems(r,s):this.transaction.parent.cachedQueryHandler.__maybeExpandCachedQuery(e,t,s,n).then((()=>this.mergeColumnsAndExpandLocalItems(r,s))):r.promise}__fetchItemEntriesByQueryData(e,t,s,n,r){if(!this.queryIsCacheable(t,n))return this.transaction.parent.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t,s,n,r).then((e=>this.resolveLocalCachedQueryItem(e)));const i=this.getCachedQueryItem(e,n.string);if(void 0!==i){if(!i.isOutdated())return this.__maybeExpandCachedQuery(e,n.string,s,r?.batchQuery);i.markUpToDate()}return this.transaction.parent instanceof st&&this.isLocal(t,n.object)?this.resolveLocalCachedQueryItem(i??this.setCachedQuery(e,n,s.getRequestColumnsTuple(this.transaction),[],r?.batchQueryGraph)):this.transaction.parent.cachedQueryHandler.__fetchItemEntriesByQueryData(e,t,s,n,r).then((t=>{const r=this.getCachedQueryItem(e,n.string);return void 0!==r?this.mergeColumnsAndExpandLocalItems(r,s):this.resolveLocalCachedQueryItem(this.cloneCachedQuery(t,!1))}))}isLocal(e,t){return void 0===e.parent?this.dependencies.queryService.containsLocalId(t):ge.isLocalId(e.parent.itemId)}async __fetchChildCachedQueryItemsByItemType(e,t){const s=t.collectionQueryTuples;if(0===s.length)return[];const n=this.dependencies.requestColumnsOperationsCacheFactory.construct(e,s[0].options.columns),r=await Promise.all(s.map((s=>this.__fetchItemEntriesByQueryData(e,s.options,n,s.parsedQuery,t)))),i=[];for(let e=0;e<s.length;e++)i.push({cachedQueryItem:r[e],options:s[e].options,children:null});return i}processChildCollectionOptions(e,t,s,n){if(0===s.length)throw new Error("Expected `parentItemIds` to have at least one element");const r=[],i=new Ve;let o;for(const a of s){const s=this.createQueryFromChildOptions(t,[a],n.query),c={itemType:t,itemId:a};let l;void 0===o?(l=o={...n,parent:c},this.expandColumnsWithQueryColumns(e,o,s)):l={...o,parent:c};const u=this.createQuery(s);i.copyEdgesFrom(this.createQueryGraph(e,u),void 0),r.push({options:l,parsedQuery:u})}return{collectionQueryTuples:r,batchQuery:this.createBatchQuery(t,s,n.query),batchQueryGraph:i}}__fetchParentCachedQueryItem(e,t){const s=this.createQueryFromRootOptions(t);return this.expandColumnsWithQueryColumns(e,t,s.object),this.__fetchParentItemEntriesByQueryData(e,t,this.dependencies.requestColumnsOperationsCacheFactory.construct(e,t.columns),s)}__fetchChildCachedQueryItems(e,t,s){if(0===t.length)return Promise.resolve([]);const n=[];for(const r in s)n.push({itemType:r,linkCollectionOptions:this.processChildCollectionOptions(r,e,t,s[r])});return this.fetchChildCachedQueryItems(n)}async __fetchParentItemEntriesByQueryData(e,t,s,n){const r=await this.__fetchItemEntriesByQueryData(e,t,s,n);return(await this.resolveParentCachedQueryItems(e,[{cachedQueryItem:r,options:t,children:null}]))[0]}async fetchChildCachedQueryItems(e){const t=await Promise.all(e.map((e=>this.__fetchChildCachedQueryItemsByItemType(e.itemType,e.linkCollectionOptions)))),s=[];for(let n=0;n<e.length;n++)s.push(this.resolveParentCachedQueryItems(e[n].itemType,t[n]));const n=await Promise.all(s),r=[];for(let t=0;t<e.length;t++)r.push({itemType:e[t].itemType,cachedQueryItemTuples:n[t]});return r}applyMatchingResultsToCollections(e){const t=[];for(const s of e){const e=s[0];for(const n of s[1].entries()){const s=this.collections[e]?.[n[0]];if(void 0===s)continue;const r=s.cachedQueryItem,i=n[1];void 0!==r&&r.handleMatchedItemEntries(i.true,i.false);const o=this.getCollectionResources(e,n[0],!0);for(const e of o)t.push(e.handleMatchedItemEntries(i.true,i.false,!1))}}return Promise.all(t)}clearCollectionTupleIfEmpty(e,t,s=!1){const n=this.collections[e],r=n[t];void 0!==r?(s||this.cleanUpQueryString(e,t),void 0!==r.cachedQueryItem||void 0!==r.collectionResources&&0!==r.collectionResources.length||delete n[t]):this.dependencies.errorHandler.logError(new Error(`TransactionCachedQueryHandler::clearCollectionTupleIfEmpty, tried to check for empty tuple with tuple not present in cache: ${e} - ${t}`))}getQueryGraphsForItemType(e){const t=this.collections[e],s=new Set;if(void 0===t)return s;for(const n in t){const r=t[n];void 0!==r.cachedQueryItem&&s.add(r.cachedQueryItem.queryGraph);const i=this.getCollectionResources(e,n,!0);if(void 0!==r.collectionResources)for(const e of i)s.add(e.queryGraph)}return s}getCollectionQueries(e,t){const s=this.collections[e]?.[t];if(void 0===s)return new Set;const n=new Set;void 0!==s.cachedQueryItem&&n.add(s.cachedQueryItem.query);let r=!1;if(void 0!==s.collectionResources)for(const e of s.collectionResources){const t=e.deref();void 0!==t?n.add(t.entry.query):r=!0}return r&&this.cleanUpQueryString(e,t),n}async processMaybeMatches(e,t,s,n){if(0===s.maybe.size)return;const r=[...this.getCollectionResources(e,t)];if(0===r.length){const s=this.getCachedQueryItem(e,t);return void 0!==s?void s.markOutdated():void this.dependencies.errorHandler.logError(new Error("TransactionCachedQueryHandler: `processMaybeMatches()` called for query without associated cached query items or collection resources"))}let i=n._getQueryResult(e,t);if(void 0===i){const s=await this.dependencies.apiRequestService.query(e,r[0].entry.query.object,{[e]:["id"]});i=n._setQueryResult(e,t,s.links[e])}for(const e of s.maybe)i.has(e.itemId)?s.true.add(e):(void 0===s.false&&(s.false=new Set),s.false.add(e))}*getCollectionResourcesByTuple(e){const t=e.collectionResources;if(void 0!==t)for(const e of t){const t=e.deref();void 0!==t&&(yield t)}}updateQueryLocalItemIdReferences(e,t,s){if("{}"===e.string)return!1;if(!new Xe(s).run(e.object))return!1;const n=this.createQuery(e.object);return e.string=n.string,e.object=n.object,t.updateLocalItemIdReferences(s),!0}async resolveParentCachedQueryItems(e,t){if(0===t.length)return t;const s=t[0].options.children;if(void 0===s)return t;const n=t.map((e=>e.cachedQueryItem.items.map((e=>e.itemId)))),r=n.flat();if(0===r.length)return t;const i=[];for(const t in s)i.push({itemType:t,linkCollectionOptions:this.processChildCollectionOptions(t,e,r,s[t])});const o=await this.fetchChildCachedQueryItems(i);for(const e of t)e.children=[];for(const e of o){const s=e.itemType,r=e.cachedQueryItemTuples;let i=0;for(let e=0;e<t.length;e++){const o=n[e].length;t[e].children.push({itemType:s,cachedQueryItemTuples:r.slice(i,i+o)}),i+=o}}return t}resolveLocalCachedQueryItem(e){return this.syncCachedQueryWithLocalItems(e).then((()=>(e.resolve(),e)),(t=>{throw void 0!==e&&e.reject(t),t}))}async mergeColumnsAndExpandLocalItems(e,t){if(await e.promise,t.tupleContainsAllColumns(e.requestColumnsTuple,this.transaction))return e;const s=t.getColumnsMergedWithTuple(e.requestColumnsTuple,this.transaction);e.requestColumnsTuple=s.merged;const n=s.difference.object,r=await this.transaction.dependencies.columnHandler.fetch(e.itemType,n);return await this.transaction.itemHandler.expandLocalItemEntries(e.itemType,this.getLocalItemEntries(e),n,r,!1),e}getLocalItemEntries(e){const t=this.transaction.itemHandler.entries;return e.items.filter((e=>t.containsByEntryId(e.id)))}matchItemEntriesWithChangesToCachedQuery(e){const t=[];for(const s of this.transaction.itemHandler.getItemEntriesWithChangesIterator())s.itemType===e.itemType&&t.push(s);const s={true:new Set};if(t.length>0){this.transaction.itemHandler.matchItemsToQueryGraph(e.queryGraph,e.query,t,s);for(const n of t)!s.true.has(n)&&e.items.includes(n)&&(void 0===s.false&&(s.false=new Set),s.false.add(n))}const n=[...this.transaction.itemHandler.getDeletedItemsIterator(e.itemType)];if(n.length>0){void 0===s.false&&(s.false=new Set);for(const e of n)s.false.add(e)}return s}async syncCachedQueryWithLocalItems(e){const t=this.matchItemEntriesWithChangesToCachedQuery(e),s=void 0===t.maybe?[...t.true]:[...t.true,...t.maybe],n=await this.transaction.dependencies.columnHandler.fetch(e.itemType,e.requestColumnsTuple.object);s.length>0&&await this.transaction.itemHandler.expandLocalItemEntries(e.itemType,s,e.requestColumnsTuple.object,n,!1),e.handleMatchedItemEntries(s,t.false)}cleanUpQueryString(e,t){const s=this.collections[e];if(void 0===s)return;const n=s[t];if(void 0===n||void 0===n.collectionResources)return;const r=[];for(const e of n.collectionResources)void 0!==e.deref()&&r.push(e);r.length!==n.collectionResources.length&&(n.collectionResources=r),this.clearCollectionTupleIfEmpty(e,t,!0)}}class gt{transaction;lastCallIdMap={global:(0,l.signal)({}),item:(0,l.signal)({})};isPendingSignal=(0,l.computed)((()=>S(this.lastCallIdMap.global())||S(this.lastCallIdMap.item())));_lastCallId=0;constructor(e){this.transaction=e}isPending(){return(0,l.untracked)((()=>this.isPendingSignal()))}setItemError(e,t,s,n,r,i=r,o=dt.error,a){const c=this.getHash(e,t,s);if(!H(n))return this.deleteLastCall(c,"item"),void this.transaction._setItemError(e,t,s,n,r,i,o,a);const l=this._lastCallId++;this.setLastCall(c,l,"item"),n.then((n=>{this.isLastCall(c,l,"item")&&(this.deleteLastCall(c,"item"),this.transaction._setItemError(e,t,s,n,r,i,o,a))}),(()=>{this.isLastCall(c,l,"item")&&this.deleteLastCall(c,"item")}))}setGlobalError(e,t,s,n=dt.error){if(!H(t))return this.deleteLastCall(e,"global"),void this.transaction._setGlobalError(e,t,s,n);const r=this._lastCallId++;this.setLastCall(e,r,"global"),t.then((t=>{this.isLastCall(e,r,"global")&&(this.deleteLastCall(e,"global"),this.transaction._setGlobalError(e,t,s,n))}),(()=>{this.isLastCall(e,r,"global")&&this.deleteLastCall(e,"global")}))}getHash(...e){return e.join("-")}deleteLastCall(e,t){this.lastCallIdMap[t].update((t=>{if(void 0===t[e])return t;const s={...t};return delete s[e],s}))}setLastCall(e,t,s){this.lastCallIdMap[s].update((s=>({...s,[e]:t})))}isLastCall(e,t,s){return this.lastCallIdMap[s]()[e]===t}}class It extends gt{hasFields(e,t){return t.every((t=>Object.prototype.hasOwnProperty.call(e,t)))}}class Ct extends gt{dependencies}class vt{itemEntryService;updated={};deleted={};_queryResults={};_queryItemTypeSet;constructor(e,t){if(this.itemEntryService=e,void 0!==t)for(const e of t)this.addQueryItemType(e)}addQueryItemType(e){this._queryItemTypeSet??=new Set,this._queryItemTypeSet.add(e)}getUpdatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.updated)}*getItemEntryIdMapIterator(e,t){if(0!==e.length)if(1!==e.length)for(const s in t){const n=t[s];e.includes(n.entry.itemType)&&(yield n)}else{const s=e[0];for(const e in t){const n=t[e];n.entry.itemType===s&&(yield n)}}else for(const e in t)yield t[e]}getUpdatedValue(e,t){const s=this.updated[e.id];if(void 0!==s)return s.changes.fields[t]}hasDeletedItem(e){const t=this.deleted[e.itemType];return void 0!==t&&t.has(e)}hasUpdatedValue(e,t){const s=this.updated[e.id];return void 0!==s&&void 0!==s.changes.fields[t]}*getDeletedItemTypesIterator(){for(const e in this.deleted)yield e}*getDeletedItemEntriesIterator(e){if(void 0===e){for(const e in this.deleted)for(const t of this.deleted[e].keys())yield t;return}const t=this.deleted[e];if(void 0!==t)for(const e of t.keys())yield e}*getDeleteTuplesIterator(e){if(void 0===e){for(const e in this.deleted)for(const t of this.deleted[e].values())yield t;return}const t=this.deleted[e];if(void 0!==t)for(const e of t.values())yield e}isEmpty(){return!S(this.updated)&&!S(this.deleted)}_setQueryResult(e,t,s){return void 0===this._queryResults[e]&&(this._queryResults[e]={}),this._queryResults[e][t]=new Set(s)}_getQueryResult(e,t){return this._queryResults[e]?.[t]}setItemDeletedByTuple(e){const t=e.entry.itemType;let s=this.deleted[t];return void 0===s&&(this.deleted[t]=s=new Map),s.set(e.entry,e),this}}class Tt extends Error{constructor(e,t){super(`Missing column '${t}' for item with type '${e.itemType}' and ID '${e.itemId}'`)}}class Rt extends vt{logMissingColumnErrors;errorHandler;itemCreateService;created=new Lt;restored={};constructor(e,t,s,n,r){super(r,t),this.logMissingColumnErrors=e,this.errorHandler=s,this.itemCreateService=n}getCreatedTuplesIterator(...e){return this.created.getTuplesIterator(e)}setItemCreated(e,t,s={}){return this.itemCreateService.createItemsFromValues(this,e,[t],null,s).then((()=>this))}setItemUpdated(e,t,s=null,n=null,r="KEEP_WHEN_DIFFERENT"){const i=e.id;if(this.hasDeletedItem(e))return this;let o=this.updated[i];if(void 0===o?o=this.updated[i]={entry:e,changes:{fields:{},columnExpansions:null===s?[]:[s]},mode:r}:(null!==s&&o.changes.columnExpansions.push(s),o.mode=r),null!==n){const s=this.itemEntryService.getLinkFieldsByParent(n,e.itemType);for(const e in s)t[e]=s[e]}let a=e.columns;if(null!==s)for(const e of o.changes.columnExpansions)a=e.run(a).merged;return J.shallowCopyFields(t,o.changes.fields,a.response[e.itemType],this.logMissingColumnErrors?t=>this.errorHandler.logError(new Tt(e,t)):void 0),this}setItemDeleted(e,t=!1){return delete this.updated[e.id],delete this.restored[e.id],this.setItemDeletedByTuple({entry:e,isCascaded:t})}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemDeletedCascaded(e){return this.setItemDeleted(e,!0),this}setItemsCreated(e,t){return this.itemCreateService.createItemsFromValues(this,e,t).then((()=>this))}_setItemCreated(e,t,s,n=null,r=!1){t.id=e;let i={};if(null!==n){i=this.itemEntryService.getLinkFieldsByParent(n,s.itemType);for(const e in i)t[e]=i[e]}if(!r){const e=this.itemEntryService.getLocalDefaultValues();for(const s in e)Object.prototype.hasOwnProperty.call(t,s)||(t[s]=e[s])}return this.created.add(e,t,s),this}setItemRestored(e,t){return this.restored[e.id]={entry:e,changes:t},this}isEmpty(){return super.isEmpty()&&this.created.isEmpty()&&!S(this.restored)}toJSON(){return{updated:this.updated,created:this.created,deleted:this.deleted}}}class Et extends vt{created={};getCreatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.created)}getCreatedValueByItemId(e,t,s){for(const n in this.created){const r=this.created[n];if(r.entry.itemType===e&&r.entry.itemId===t)return r.fields[s]}}setItemUpdated(e,t,s="KEEP_WHEN_DIFFERENT"){if(void 0===this.updated[e.id])this.updated[e.id]={entry:e,changes:{fields:t},mode:s};else{const n=this.updated[e.id];J.shallowCopyFields(t,n.changes.fields,e.columns.response[e.itemType]),n.mode=s}return this}setItemDeleted(e){return this.setItemDeletedByTuple(e)}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemCreated(e,t){this.created[e.id]={entry:e,fields:t}}isEmpty(){return super.isEmpty()&&!S(this.created)}}class St extends vt{created={};getCreatedTuplesIterator(...e){return this.getItemEntryIdMapIterator(e,this.created)}setItemUpdated(e,t,s=null,n="KEEP_WHEN_DIFFERENT"){if(void 0===this.updated[e.id])this.updated[e.id]={entry:e,changes:{fields:t},previous:s,mode:n};else{const r=this.updated[e.id],i=e.columns.response[e.itemType];J.shallowCopyFields(t,r.changes.fields,i),null!==s&&(null!==r.previous?J.shallowCopyFields(s,r.previous,i):r.previous=s),r.mode=n}return this}setItemDeleted(e){return delete this.updated[e.id],this.setItemDeletedByTuple({entry:e})}setItemsDeleted(e){for(const t of e)this.setItemDeleted(t);return this}setItemCreated(e,t){this.created[e.id]={entry:e,fields:t}}isEmpty(){return super.isEmpty()&&!S(this.created)}}const _t={forceFlush:!1,flushTimeout:window.IS_IN_TEST?0:150,limit:void 0};class bt{apiRequestService;itemType;options;deferred=N();requestColumnExpansion;createdDate=Date.now();constructor(e,t,s,n){this.apiRequestService=e,this.itemType=s,this.options=n,this.requestColumnExpansion=t.construct()}async flush(e){try{const t=await this.executeQuery();return void 0!==e&&await e(t),this.deferred.resolve(t),t}catch(e){throw this.deferred.reject(e),e}}getPromise(){return this.deferred.promise}acceptsRequestColumns(e){const t=this.requestColumnExpansion.get()[this.itemType];return void 0===t||(!0===e?!0===t:!0!==t)}compareApiRequestLimit(e,t){return void 0===e&&void 0===t||void 0!==e&&void 0!==t&&e.field===t.field&&e.order===t.order&&e.limit===t.limit}}class wt extends bt{contents={queries:new Map,singleItemIds:new Set};static constructWithSingleItems(e,t,s,n,r,i){return new wt(e,t,s,i)._addSingleItems(n,r)}static constructWithQuery(e,t,s,n,r,i){return new wt(e,t,s,i)._addQuery(n,r)}addSingleItems(e,t,s){return this.options.forceFlush===s&&this.acceptsRequestColumns(t)?this._addSingleItems(e,t):null}addQuery(e,t,s){return this.options.forceFlush===s.forceFlush&&this.acceptsRequestColumns(t.object)&&e.isLocallyMatchable?this._addQuery(e,t):null}async executeQuery(){const e=this.requestColumnExpansion.get();return{requestColumns:e,response:await this.apiRequestService.query(this.itemType,this.createAggregateQuery(),e),nonLocallyMatchableQueryString:null}}_addSingleItems(e,t){this.requestColumnExpansion.expandWithRequestColumns(this.itemType,t);for(const t of e)this.contents.singleItemIds.add(t);return this}_addQuery(e,t){return this.contents.queries.set(e.string,e),this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,t),this}createAggregateQuery(){const e=this.contents;if(void 0===e||0===e.queries.size&&0===e.singleItemIds.size)throw new Error("Tried to flush a RequestBuffer without singleItems or queries");const t=[];e.singleItemIds.size>0&&t.push({key:"id",comparator:"IN",value:[...e.singleItemIds.values()]});for(const s of e.queries.values())t.push(s.object);return 1===t.length?t[0]:{conditions:t,operator:"OR"}}}class qt extends bt{contents;constructor(e,t,s,n,r,i){super(e,t,s,i),this.contents=n,this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,r)}addSingleItems(){return null}addQuery(e,t,s){return this.options.forceFlush===s.forceFlush&&this.compareApiRequestLimit(this.options.limit,s.limit)&&this.acceptsRequestColumns(t.object)&&e.string===this.contents.string?(this.requestColumnExpansion.expandWithRequestColumnsTuple(this.itemType,t),this):null}async executeQuery(){const e=this.requestColumnExpansion.get();return{requestColumns:e,response:await this.apiRequestService.query(this.itemType,this.contents.object,e,this.options.limit),nonLocallyMatchableQueryString:this.contents.isLocallyMatchable?null:this.contents.string}}}class Ft{apiRequestService;requestColumnExpansionFactory;onBufferFlushed;pendingBufferMap={};requestsSuspended=!1;constructor(e,t,s){this.apiRequestService=e,this.requestColumnExpansionFactory=t,this.onBufferFlushed=s}suspendRequests(){this.requestsSuspended=!0}continueRequests(){this.requestsSuspended=!1,this.flushPendingBuffers()}fetchByIds(e,t,s,n){const r=this.processOptions(n),i=this.pendingBufferMap[e];if(void 0!==i)for(const e of i)if(null!==e.addSingleItems(t,s,r.forceFlush))return e.getPromise();return this.addBuffer(wt.constructWithSingleItems(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}fetchByQuery(e,t,s,n={}){const r=this.processOptions(n),i=this.pendingBufferMap[e];if(void 0!==i)for(const e of i)if(null!==e.addQuery(t,s,r))return e.getPromise();return this.addBuffer(t.isLocallyMatchable&&void 0===r.limit&&0!==n.flushTimeout?wt.constructWithQuery(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r):new qt(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}processOptions(e={}){const t={};let s;for(s in _t)t[s]=void 0!==e[s]?e[s]:_t[s];return t}addBuffer(e){let t=this.pendingBufferMap[e.itemType];return void 0===t&&(t=this.pendingBufferMap[e.itemType]=[]),t.push(e),e.options.flushTimeout>0?window.setTimeout((()=>{this.flushPendingBuffers()}),e.options.flushTimeout):this.flushPendingBuffers(),e.getPromise()}flushPendingBuffers(){const e=Date.now();for(const t in this.pendingBufferMap){const s=this.pendingBufferMap[t],n=[];for(const t of s)(!this.requestsSuspended||t.options.forceFlush)&&e-t.createdDate>=t.options.flushTimeout?t.flush(this.onBufferFlushed):n.push(t);0===n.length?delete this.pendingBufferMap[t]:this.pendingBufferMap[t]=n}}}class kt{conversionMapService;templateCache;constructor(e,t){this.conversionMapService=e,this.templateCache=t}createItemsFromValues(e,t,s,n=null,r={}){if(0===s.length)return Promise.resolve([]);const i=[];for(const o of s){const a=Object.prototype.hasOwnProperty.call(o,"id")?o.id:ge.getLocalId();i.push(this.templateCache.fetchTemplate(t,a,r,{[t]:Object.keys(s[0])},n).then((s=>{this.processTemplate(e,t,a,n,s,(()=>!0),((e,s)=>{if(e===t)for(const e in o)s[e]=o[e]}))})))}return Promise.all(i)}processTemplate(e,t,s,n,r,i=()=>!0,o){const a=this.conversionMapService.createLocalConversionMap(t,s,r.response);for(const t in r.response.links){const s=r.getColumnSet(t);for(const c of r.response.links[t]){const l=a[t][c],u=r.getFields(t,c);this.conversionMapService.updateItemValues(u,u,s.item.main,a,n),o?.(t,u,a),e._setItemCreated(l,u,s,n),this.processTemplateLinkItems(e,t,l,r,a,i,o)}}}processTemplateLinkItems(e,t,s,n,r,i=()=>!0,o){const a={},c=(t,s,l)=>{const u={itemType:t,itemId:s},d=n.response.items[t][l].links;for(const t in d)if(Object.prototype.hasOwnProperty.call(d,t)){void 0===a[t]&&(a[t]=n.getColumnSet(t));for(const s of d[t]){const l=n.getFields(t,s);if(!i(t,l))continue;const d=r[t][s];this.conversionMapService.updateItemValues(l,l,a[t].item.main,r,u),void 0!==o&&o(t,l,r),e._setItemCreated(d,l,a[t],u),c(t,d,s)}}};c(t,s,n.response.links[t][0])}}class Lt{tuples={};remove(e,t){return void 0!==this.tuples[e]&&(!!this.tuples[e].has(t)&&(this.tuples[e].delete(t),!0))}add(e,t,s){const n=s.itemType;void 0===this.tuples[n]&&(this.tuples[n]=new Map);const r=this.tuples[n].get(e);if(void 0!==r){r.columns=r.columns.expand(s.request,s.requestColumnsTrue,s.response).merged;for(const e in t)r.fields[e]=t[e]}else this.tuples[n].set(e,{itemId:e,fields:t,columns:s})}isEmpty(){return!S(this.tuples)}*getTuplesIterator(e){if(0!==e.length)if(1!==e.length)for(const t of e){if(void 0!==this.tuples[t])for(const e of this.tuples[t].values())yield e}else{const t=this.tuples[e[0]];if(void 0===t)return;for(const e of t.values())yield e}else for(const e in this.tuples)for(const t of this.tuples[e].values())yield t}forEach(e){for(const t in this.tuples){const s=this.tuples[t];for(const n of s.values())e(n,t)}}contains(e){return void 0!==this.tuples[e]}getTupleByItemId(e,t){const s=this.tuples[e];if(void 0!==s)return s.get(t)}matchTuplesToQueryGraph(e,t,s){const n=this.tuples[e];if(void 0===n)return s;for(const e of n.values())t.doMatch(e,(t=>e.fields[t]),s);return s}*[Symbol.iterator](){for(const e in this.tuples){const t=this.tuples[e];for(const e of t.values())yield e}}}class Dt{apiRequestService;columnHandler;columnSetFactory;requestColumnExpansionFactory;linkTreeService;itemEntryService;pendingTemplateBufferMap={};templateResponses={};constructor(e,t,s,n,r,i){this.apiRequestService=e,this.columnHandler=t,this.columnSetFactory=s,this.requestColumnExpansionFactory=n,this.linkTreeService=r,this.itemEntryService=i}fetchTemplate(e,t,s={},n={},r=null){let i;const o=S(s);let a;a=o||void 0===this.templateResponses[e]?this.fetchTemplateById(e,t,s):Promise.resolve(this.templateResponses[e]);const c=this.requestColumnExpansionFactory.construct();return a.then((t=>{i=t;for(const e in i.columns)for(const t of i.columns[e])this.columnHandler.setColumn(e,t);!o&&i.cacheable&&(this.templateResponses[e]=t);for(const e in n)c.expandWithRequestColumns(e,n[e]);this.expandWithDefaultRequestColumns(c,e),this.expandWithLinkedItemTypesDefaultColumns(Object.keys(i.columns),c),null!==r&&c.expandWithRequestColumns(e,this.linkTreeService.getColumnsFromLink("string"==typeof r?r:r.itemType,e));for(const e in i.columns)c.expandWithRequestColumns(e,i.columns[e].map((e=>e.id)));const s=c.get(),a=[];for(const e in s)a.push(this.columnHandler.fetch(e,s[e]));return Promise.all(a)})).then((t=>{let s={};for(const e of t)s=he.mergeResponseColumns(s,e).merged;return new T(e,i,this.columnSetFactory,this.itemEntryService,s)}))}expandWithLinkedItemTypesDefaultColumns(e,t){for(const s of e)this.expandWithDefaultRequestColumns(t,s)}fetchTemplateById(e,t="no-id",s){return void 0===this.pendingTemplateBufferMap[e]||void 0===this.pendingTemplateBufferMap[e][t]?this.constructTemplateBuffer(e,t,s):this.pendingTemplateBufferMap[e][t]}constructTemplateBuffer(e,t,s){return void 0===this.pendingTemplateBufferMap[e]&&(this.pendingTemplateBufferMap[e]={}),this.pendingTemplateBufferMap[e][t]=this.apiRequestService.template(e,s).then((s=>(delete this.pendingTemplateBufferMap[e][t],s)),(s=>{throw delete this.pendingTemplateBufferMap[e][t],s}))}expandWithDefaultRequestColumns(e,t){e.expandWithRequestColumns(t,[{creator:["displayname"]},"created","permissions"])}}const xt={get:(e,t)=>{const s=e.previous[t];return void 0!==s?s:e.itemHandler.lookUpItemField(e.itemEntry,t)}};class Mt{itemResource;fields;itemHandler;partialPrevious;itemIdConversionMap;isInitialCall;constructor(e,t,s,n,r,i=!1){this.itemResource=e,this.fields=t,this.itemHandler=s,this.partialPrevious=n,this.itemIdConversionMap=r,this.isInitialCall=i}_previous;get previous(){return void 0!==this._previous?this._previous:this._previous=new Proxy({itemEntry:this.itemResource.entry,itemHandler:this.itemHandler,previous:this.partialPrevious},xt)}compareField(e,t=!0){const s=this.partialPrevious[e];if(void 0===s)return!this.isInitialCall;if(t||void 0===this.itemIdConversionMap)return!1;const n=this.itemResource.entry.columns.response[this.itemResource.entry.itemType][e];return he.isItemColumn(n)&&void 0!==this.itemIdConversionMap[n.itemType]?.[s]}compareFields(e,t){for(const s of e)if(!this.compareField(s,t))return!1;return!0}}class Pt extends Mt{isCalledAfterSocketUpdate;constructor(e,t,s,n,r,i=!1){super(e,t.collectFields(e.entry),t,s,n,i),this.isCalledAfterSocketUpdate=r}}class Bt extends Mt{collectionResource;isCalledAfterSocketUpdate;constructor(e,t,s,n,r){super(t,t.fields,t.transaction.itemHandler,n,r),this.collectionResource=e,this.isCalledAfterSocketUpdate=s}}class Qt{transaction;previousChangesDelta;constructor(e,t){this.transaction=e,this.previousChangesDelta=t}}const At=Symbol("Skip rule"),jt=Symbol("Continue with defaults"),Ht=Symbol("Stop execution");class Ut{locals;hasFlag;getAccountSettings;confirm=null;postDependencyConfirm=null;constructor(e,t,s){this.locals=e,this.hasFlag=t,this.getAccountSettings=s}}class Ot extends Qt{constructor(e,t){super(e,t)}getItemIdsWithUpdatedField(e,t,s=!1){const n=[];if(s){const t=this.previousChangesDelta.getCreatedTuplesIterator(e);for(const e of t)n.push(e.entry.itemId)}const r=this.previousChangesDelta.getUpdatedTuplesIterator(e);for(const e of r)this.previousChangesDelta.hasUpdatedValue(e.entry,t)&&n.push(e.entry.itemId);return 0===n.length?At:n}getItemIdsWithFieldUpdatedTo(e,t,s){const n=this.previousChangesDelta.getUpdatedTuplesIterator(e),r=[];for(const e of n){const n=this.previousChangesDelta.getUpdatedValue(e.entry,t);if(void 0===n)continue;const i=e.entry.columns.response[e.entry.itemType][t];J.compareFields(i.type,n,s)&&r.push(e.entry.itemId)}return 0===r.length?At:r}}class Vt extends Qt{destinationChangesDelta;constructor(e,t,s){super(e,t),this.destinationChangesDelta=s}setItemUpdated(e,t){this.destinationChangesDelta.setItemUpdated(e,t)}setItemsDeleted(e){this.destinationChangesDelta.setItemsDeleted(e)}}function Nt(e){return function(t){t.__name=e}}function Wt(e,t,s,n){var r,i=arguments.length,o=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,s):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,s,n);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(o=(i<3?r(o):i>3?r(t,s,o):r(t,s))||o);return i>3&&o&&Object.defineProperty(t,s,o),o}Object.create;Object.create;"function"==typeof SuppressedError&&SuppressedError;const $t=["recureind","recurperiode","recurhoe"];let Gt=class extends Ut{itemType;toField;condition(e){const t=e.previousChangesDelta,s=t.getUpdatedTuplesIterator(this.itemType),n=[];for(const e of s){if(void 0!==t.getUpdatedValue(e.entry,"recureind"))continue;const s=void 0!==t.getUpdatedValue(e.entry,"recurhoe"),r=void 0!==t.getUpdatedValue(e.entry,"recurperiode");(s||r)&&n.push(e.entry.itemId)}return 0===n.length?At:n}async dependency(e,t){return e.getItemsById(this.itemType,t,{columns:[...$t,this.toField]})}apply(e,t){for(const s of t){const t=s.fields.recurhoe;if("eenmalig"===t||"specifieke_dagen"===t)continue;const n=s.fields[this.toField].clone().add(s.fields.recurperiode,this.convertRecurhoeToMomentDuration(t)).startOf("day").add(1,"day");n.isAfter(s.fields.recureind)&&e.setItemUpdated(s.entry,{recureind:n})}}convertRecurhoeToMomentDuration(e){switch(e){case"dag":case"specifieke_dagen":return"days";case"week":return"weeks";case"maand":return"months";case"jaar":return"years"}}};Gt=Wt([Nt("RecurrentItemRecureindBusinessLogicRule")],Gt);let zt=class extends Gt{itemType="Afspraak";toField="tot"};zt=Wt([Nt("AfspraakRecureindBusinessLogicRule")],zt);let Yt=class extends Gt{itemType="Beschikbaarheid";toField="plantot"};Yt=Wt([Nt("BeschikbaarheidRecureindBusinessLogicRule")],Yt);const Kt=["straat","huisnummer","postcode","stad","provincie","land"],Xt=["bezoek","post","factuur"];let Zt=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Contact"),s=[];for(const n of t)Kt.some((t=>e.previousChangesDelta.hasUpdatedValue(n.entry,`bezoek${t}`)))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){const s=[];for(const e of Xt)for(const t of Kt)s.push(`${e}${t}`);return e.getItemsById("Contact",t,{columns:s})}apply(e,t){const s=["post","factuur"];for(const n of t)for(const t of s)this.addressEqualsVisitingAddress(n,t)&&e.setItemUpdated(n.entry,Kt.reduce(((e,s)=>(e[`${t}${s}`]=n.fields[`bezoek${s}`],e)),{}))}addressEqualsVisitingAddress(e,t){for(const s of Kt)if(e.fields[t+s]!==e.initial["bezoek"+s])return!1;return!0}};Zt=Wt([Nt("ContactAddressBusinessLogicRule")],Zt);const Jt=["defaultvalue"];let es=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Customfield","linkedItemType")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:Jt})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{defaultvalue:null})}};es=Wt([Nt("CustomFieldLinkedItemTypeBusinessLogicRule")],es);const ts=["defaultvalue","attributes","type"];let ss=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Customfield","type")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ts})}apply(e,t){for(const s of t){const t=s.fields.type;let n;n="enum"===t?0:J.getDefaultValue(t),e.setItemUpdated(s.entry,{defaultvalue:n,attributes:{}})}}};ss=Wt([Nt("CustomFieldTypeBusinessLogicRule")],ss);const ns={Offerte:{opdrachtgever:"contactpersoon"},Contract:{opdrachtgever:"contactpersoon"},Factuur:{opdrachtgever:"contactpersoon"},Project:{opdrachtgever:"opdrachtgever_persoon",locatie:"locatie_persoon"},Subproject:{locatie:"locatie_persoon"},Inhuur:{locatie:"locatie_persoon",leverancier:"contactpersoon"},ProjectRequest:{aanvrager:"accountmanager"}},rs=["id","contactpersoon"];let is=class extends Ut{condition(e){const t={};let s=!1;for(const n of e.previousChangesDelta.getUpdatedTuplesIterator()){const r=ns[n.entry.itemType];if(void 0!==r)for(const i in r)if(e.previousChangesDelta.hasUpdatedValue(n.entry,i)&&!e.previousChangesDelta.hasUpdatedValue(n.entry,r[i])){const e=t[n.entry.itemType]??=new Map;let r=e.get(n.entry);void 0===r&&e.set(n.entry,r={}),r[i]=n.changes.fields[i],s=!0}}return s?t:At}dependency(e,t){const s=new Set;for(const e in t)for(const n of t[e].values())for(const e in n){const t=n[e];null!==t&&s.add(t)}return e.getItemsById("Contact",[...s],{columns:rs})}apply(e,t,s){const n=new Map(t.map((e=>[e.fields.id,e])));for(const t in s)for(const r of s[t].entries()){const[s,i]=r;for(const o in i){const i=ns[t][o],a=r[1][o];if(null===a){e.setItemUpdated(s,{[i]:null});continue}const c=n.get(a);e.setItemUpdated(s,{[i]:c.fields.contactpersoon})}}}};is=Wt([Nt("DefaultContactPersonUpdateBusinessLogicRule")],is);const os=["Factuur","Offerte","Contract","Bon","Inhuurbon","Materiaalbon","Medewerkerbon","Aanmaning","Reparatiebon","Voertuigbon"],as=["filename","betreft"];let cs=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator(...os),s={};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"template")&&(void 0===s[r.entry.itemType]&&(s[r.entry.itemType]=[]),n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}dependency(e,t){const s={};for(const n in t)s[n]=e.getItemsById(n,t[n],{columns:as});return U(s)}apply(e,t){for(const s in t)for(const n of t[s])e.setItemUpdated(n.entry,{filename:"",betreft:""})}};cs=Wt([Nt("DocumentTemplateBusinessLogicRule")],cs);const ls=["actief"];let us=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Exemplaar"),s=[],n=(0,Z.default)();for(const r of t){const t=e.getUpdatedValue(r.entry,"aanschafdatum");void 0!==t&&t.isAfter(n)&&s.push(r.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Exemplaar",t,{columns:ls})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{actief:!0})}};us=Wt([Nt("ExemplaarAanschafdatumBusinessLogicRule")],us);let ds=class extends Ut{condition({previousChangesDelta:e}){const t=e.getDeletedItemEntriesIterator("Exemplaar"),s=[];for(const e of t)s.push(e.itemId);return 0===s.length?At:s}async dependency(e,t){return(await e.getItemsByQuery("Barcode",{conditions:[{key:"itemtype",comparator:"=",value:"Exemplaar"},{key:"item",comparator:"IN",value:t}]},{columns:[]})).map((e=>e.entry))}apply(e,t){e.setItemsDeleted(t)}};ds=Wt([Nt("ExemplaarBarcodeDeleteBusinessLogicRule")],ds);const hs=["vervaldatum","datum","betalingsconditie"],ms=["id","dagen"];let ps=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","betalingsconditie")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:hs}),n=new Set;let r,i=!1;for(const e of s){const t=e.fields.betalingsconditie;null!==t?n.add(t):i=!0}i?(r=this.getAccountSettings().betalingsconditie,null!==r&&n.add(r)):r=null;return{Factuur:s,Betalingsconditie:(await e.getItemsById("Betalingsconditie",[...n],{columns:ms})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{}),defaultPaymentConditionId:r}}apply(e,t){for(const s of t.Factuur){let n=s.fields.betalingsconditie;null===n&&(n=t.defaultPaymentConditionId),null!==n&&e.setItemUpdated(s.entry,{vervaldatum:s.fields.datum.clone().add(t.Betalingsconditie[n].fields.dagen,"days")})}}};ps=Wt([Nt("FactuurBetalingsconditieBusinessLogicRule")],ps);const fs=["id","taxschema","vervaldatum","betalingsconditie","datum"],ys=["id","dagen"];let gs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","datum")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:fs}),n=[...new Set(s.map((e=>e.fields.betalingsconditie)).filter((e=>null!==e)))],r=await e.getItemsById("Betalingsconditie",n,{columns:ys}),i=await Promise.all(s.map((t=>e.core.apiRequestService.module("taxes","getTaxRateForDate",{schemaId:t.fields.taxschema,date:t.fields.datum})))),o={};for(let e=0;e<s.length;e++)o[s[e].fields.id]=i[e];return{Factuur:s,Betalingsconditie:r.reduce(((e,t)=>(e[t.fields.id]=t,e)),{}),latestTaxSchemasByDateMap:o}}apply(e,t){for(const s of t.Factuur)e.setItemUpdated(s.entry,{taxschema:t.latestTaxSchemasByDateMap[s.fields.id]}),null!==s.fields.betalingsconditie&&e.setItemUpdated(s.entry,{vervaldatum:s.fields.datum.clone().add(t.Betalingsconditie[s.fields.betalingsconditie].fields.dagen,"days")})}};gs=Wt([Nt("FactuurDatumBusinessLogicRule")],gs);const Is=["nummer"];let Cs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Factuur","numberseries")}async dependency(e,t){return e.getItemsById("Factuur",t,{columns:Is})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{nummer:null})}};var vs;Cs=Wt([Nt("FactuurNumberseriesBusinessLogicRule")],Cs);const Ts=["name","friendlyname"];let Rs=vs=class extends Ut{static getExtension(e){const t=e.lastIndexOf(".");return-1===t?null:e.slice(t)}condition(e){const t=e.previousChangesDelta,s=e.previousChangesDelta.getUpdatedTuplesIterator("Files"),n=[];for(const e of s)(t.hasUpdatedValue(e.entry,"name")||t.hasUpdatedValue(e.entry,"friendlyname"))&&n.push(e.entry.itemId);return 0===n.length?At:n}async dependency(e,t){return e.getItemsById("Files",t,{columns:Ts})}apply(e,t){for(const s of t)for(const t of Ts){const n=vs.getExtension(s.initial[t]);if(null===n)continue;const r=vs.getExtension(s.fields[t]);null!==r&&r===n||e.setItemUpdated(s.entry,{[t]:s.fields[t]+n})}}};Rs=vs=Wt([Nt("FilesNameExtensionBusinessLogicRule")],Rs);const Es=["naamintern","naamofferte"];let Ss=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Functie","naamofferte")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Es})}apply(e,t){for(const s of t)""===s.fields.naamintern.trim()&&e.setItemUpdated(s.entry,{naamintern:s.fields.naamofferte})}};Ss=Wt([Nt("FunctieNaaminternBusinessLogicRule")],Ss);let _s=class extends Gt{itemType="Functie";toField="plantot"};_s=Wt([Nt("FunctieRecureindBusinessLogicRule")],_s);const bs=["twoway","afstand","afstand_van_locatie",{subproject:[{locatie:["kilometers"]}]}];function ws(e,t){return t.getDerivedValue(["subproject","locatie","kilometers"])*(e.transaction.itemHandler.lookUpItemField(t.entry,"twoway")?2:1)}let qs=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","afstand_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:bs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:ws(e,s)})}};qs=Wt([Nt("FunctieTravelDistanceFromLocationBusinessLogicRule")],qs);let Fs=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Functie"),s=[];for(const n of t)e.previousChangesDelta.hasUpdatedValue(n.entry,"afstand")&&s.push(n.entry.itemId);return 0===s.length?At:s}dependency(e,t){return e.getItemsById("Functie",t,{columns:bs})}apply(e,t){for(const s of t){const t=ws(e,s);s.fields.afstand!==t&&e.setItemUpdated(s.entry,{afstand_van_locatie:!1})}}};Fs=Wt([Nt("FunctieTravelDistanceUnlinkLocationBusinessLogicRule")],Fs);const ks=[{subproject:[{locatie:["reistijd"]}]}];let Ls=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","reistijd_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:ks})}apply(e,t){for(const s of t){const t=s.getDerivedValue(["subproject","locatie","reistijd"]);e.setItemUpdated(s.entry,{reistijd_vooraf:t,reistijd_achteraf:t})}}};Ls=Wt([Nt("FunctieTravelTimeFromLocationBusinessLogicRule")],Ls);const Ds=["afstand","twoway"];let xs=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Functie","twoway")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ds})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:s.fields.afstand*(s.fields.twoway?2:.5)})}};xs=Wt([Nt("FunctieTwowayBusinessLogicRule")],xs);const Ms=["subproject"];let Ps=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Functiegroep"),s=[];for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"subproject");void 0!==t&&s.push({itemEntry:n.entry,newValue:t})}return 0===s.length?At:s}dependency(e,t){return Promise.all(t.map((t=>e.getItemsByQuery("Functie",{functiegroep:t.itemEntry.itemId},{columns:Ms}))))}apply(e,t,s){for(let n=0;n<s.length;n++)for(const r of t[n])e.setItemUpdated(r.entry,{subproject:s[n].newValue})}};Ps=Wt([Nt("FunctiegroepSubprojectBusinessLogicRule")],Ps);const Bs=["id","aantal","parent","materiaal"];class Qs extends Ut{itemType;condition({previousChangesDelta:e,transaction:t}){const s=e.getCreatedTuplesIterator(this.itemType),n=[];for(const e of s)null!==e.fields.materiaal&&n.push(e.entry.itemId);const r=e.getUpdatedTuplesIterator(this.itemType);for(const s of r)(e.hasUpdatedValue(s.entry,"aantal")||e.hasUpdatedValue(s.entry,"parent"))&&null!==t.itemHandler.lookUpItemField(s.entry,"materiaal")&&n.push(s.entry.itemId);return 0===n.length?At:n}async dependency(e,t,s){const n=await e.getItemsById(this.itemType,t,{columns:Bs}),r=new Set;for(const e of n)r.add(e.fields.materiaal);return{itemResources:n,materiaalPropertiesMap:await this.getMateriaalPropertiesMap(s,[...r])}}apply(e,t){for(const s of t.itemResources){const n=s.fields.aantal,r=t.materiaalPropertiesMap[s.fields.materiaal];!r.is_physical&&r.is_combination||null!==s.fields.parent||Number.isInteger(n)||e.setItemUpdated(s.entry,{aantal:Math.ceil(n)})}}async getMateriaalPropertiesMap(e,t){const s=await e.transaction.getItemsById("Materiaal",t,{columns:["id","is_physical","is_combination"]}),n={};for(const e of s)n[e.fields.id]={is_physical:e.fields.is_physical,is_combination:e.fields.is_combination};return n}}let As=class extends Qs{itemType="Inhuurmateriaal"};As=Wt([Nt("InhuurmateriaalAantalRoundUpBusinessLogicRule")],As);class js extends Error{context;constructor(e,t){super(e),this.context=t}}const Hs=["id","aantal","aantaltotaal","parent","materiaal"],Us=[...Hs,"categorie"],Os=[...Hs,"inhuurgroep"];class Vs extends Ut{condition(e){const t=[],s=e.previousChangesDelta.getCreatedTuplesIterator(this.itemType);for(const e of s)null!==e.fields.materiaal&&t.push(e.entry.itemId);const n=e.previousChangesDelta.getUpdatedTuplesIterator(this.itemType);for(const s of n)(e.previousChangesDelta.hasUpdatedValue(s.entry,"aantal")||e.previousChangesDelta.hasUpdatedValue(s.entry,"parent"))&&null!==e.transaction.itemHandler.lookUpItemField(s.entry,"materiaal")&&t.push(s.entry.itemId);return 0===t.length?At:t}async dependency(e,t,s){const n=new Set,r=await e.getItemsById(this.itemType,t,{columns:this.requestColumns});for(const e of r){const t=this.groupingProperties.columnId;n.add(e.fields[t]);const s=e.initial[t];void 0!==s&&n.add(s)}const i=await s.transaction.getLinkCollections(this.groupingProperties.itemType,[...n],this.itemType,{query:{},columns:this.requestColumns}),o=new Map,a=new Map;for(const e in i)for(const t of i[e].items){o.set(t.fields.id,t);const e=t.fields.parent;if(void 0===e)throw new js("AantaltotaalBusinessLogicRuleBase: 'parent' field missing for planned equipment item",t.collectFields());let s=a.get(e);void 0===s&&a.set(e,s=[]),s.push(t)}const c=new Set;for(const e of r){let t=e,s=t.fields.parent;for(;null!==s;){const e=o.get(s);if(void 0===e)throw new js("AantaltotaalBusinessLogicRuleBase: parent planned equipment item not available in equipment group",t.collectFields());t=e,s=t.fields.parent}c.add(t.fields.id)}return{rootItemIds:c,affectedEquipmentItemsByParent:a,affectedEquipmentItemsById:o,equipmentIsPhysicalMap:await this.fetchEquipmentIsPhysicalMap(c,o,a,s)}}apply(e,t){for(const s of t.rootItemIds)this.updatePlannedEquipmentItem(e,t.affectedEquipmentItemsById.get(s),1,t)}async fetchEquipmentIsPhysicalMap(e,t,s=new Map,n){const r=new Set,i=e=>{const n=s.get(e);if(void 0===n)return;const o=t.get(e);r.add(o.fields.materiaal);for(const e of n)i(e.fields.id)};for(const t of e)i(t);return(await n.transaction.getItemsById("Materiaal",[...r],{columns:["id","is_physical"]})).reduce(((e,t)=>e.set(t.fields.id,t.fields.is_physical)),new Map)}updatePlannedEquipmentItem(e,t,s,n){const r=t.fields.aantal*s,i=Math.ceil(r);e.setItemUpdated(t.entry,{aantaltotaal:i});const o=n.affectedEquipmentItemsByParent.get(t.fields.id);if(void 0===o)return;const a=!0===n.equipmentIsPhysicalMap.get(t.fields.materiaal)?i:r;for(const t of o)this.updatePlannedEquipmentItem(e,t,a,n)}}let Ns=class extends Vs{itemType="Inhuurmateriaal";groupingProperties={itemType:"Inhuurgroep",columnId:"inhuurgroep"};requestColumns=Os};Ns=Wt([Nt("InhuurmateriaalAantaltotaalBusinessLogicRule")],Ns);const Ws=["is_combination"],$s=["equipment"];let Gs=class extends Ut{async dependency(e,t){const s=t.filter((e=>!ge.isLocalId(e))),n=s.length>0?e.cachedQueryHandler.__fetchCachedQueryItem("Voorraadmutatie",{columns:["id"],query:{conditions:[{key:"datum",value:(0,Z.default)(),comparator:">"},{key:"materiaal",value:s,comparator:"IN"},{key:"type",value:"manual",comparator:"="}]}}):Promise.resolve(null),[r,i,o]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Ws}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:$s}),n]),a={voorraadmutatieTuples:{remote:o?.items??[],local:[]},materiaalResources:r,containerContentResources:i},c=e.getTransactionChain(!1);for(const e of c){const s=e.itemHandler.entries.getByQuery("Voorraadmutatie",{conditions:[{key:"type",value:"manual",comparator:"="},{key:"materiaal",value:t,comparator:"IN"}],operator:"AND"});a.voorraadmutatieTuples.local=a.voorraadmutatieTuples.local.concat(s)}return a}apply(e,t){e.destinationChangesDelta.setItemsDeleted(t.voorraadmutatieTuples.local),e.destinationChangesDelta.setItemsDeleted(t.voorraadmutatieTuples.remote)}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!0)}};Gs=Wt([Nt("MateriaalBulkToSerialBusinessLogicRule")],Gs);let zs=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_combination",!1)}async dependency(e,t){return(await e.getItemsByQuery("Setinhoud",{package:t},{columns:["id"]})).map((e=>e.entry))}apply(e,t){e.destinationChangesDelta.setItemsDeleted(t)}};zs=Wt([Nt("MateriaalIsCombinationBusinessLogicRule")],zs);const Ys=["is_physical","is_combination","telexemplaren","can_edit_content_during_planning"];let Ks=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)!0!==e.getUpdatedValue(n.entry,"is_combination")&&!0!==e.getUpdatedValue(n.entry,"is_physical")&&!1!==e.getUpdatedValue(n.entry,"telexemplaren")||s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:Ys})}apply(e,t){for(const s of t)s.fields.is_physical&&s.fields.is_combination&&!s.fields.telexemplaren&&e.setItemUpdated(s.entry,{can_edit_content_during_planning:!1})}};Ks=Wt([Nt("MateriaalIsPhysicalCombinationBulkBusinessLogicRule")],Ks);const Xs=["is_combination"],Zs=["equipment"];let Js=class extends Ut{async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Xs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:Zs})]);return{materiaalResources:s,containerContentResources:n}}apply(){}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!1)}};Js=Wt([Nt("MateriaalSerialToBulkBusinessLogicRule")],Js);const en=["is_combination","verhuur","can_edit_content_during_planning"];let tn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!0)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:en})}apply(e,t){const s=this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING");for(const n of t)n.fields.is_combination&&(s||e.setItemUpdated(n.entry,{can_edit_content_during_planning:!1}),e.setItemUpdated(n.entry,{verhuur:!0}))}};tn=Wt([Nt("MateriaalToPhysicalBusinessLogicRule")],tn);const sn=["is_combination","can_edit_content_during_planning"];let nn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:sn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{is_combination:!0,can_edit_content_during_planning:!0})}};nn=Wt([Nt("MateriaalToVirtualBusinessLogicRule")],nn);const rn=["type","is_combination","is_physical","can_edit_content_during_planning"];let on=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)(e.hasUpdatedValue(n.entry,"is_combination")||e.hasUpdatedValue(n.entry,"is_physical"))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:rn})}apply(e,t){for(const s of t){let t;t=s.fields.is_combination?s.fields.is_physical?"case":"set":"item",e.setItemUpdated(s.entry,{type:t})}}};on=Wt([Nt("MateriaalTypePropertiesBusinessLogicRule")],on);const an=["is_combination","is_physical"];let cn=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","verhuur",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:an})}apply(e,t){for(const s of t)s.fields.is_physical&&e.setItemUpdated(s.entry,{is_combination:!1})}};cn=Wt([Nt("MateriaalVerhuurBusinessLogicRule")],cn);const ln=["width","height","oppervlakteartikel","nieuwprijs","inhuurprijs","verhuurprijs","naam"];let un=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Materiaal"),s=[];for(const n of t)(e.hasUpdatedValue(n.entry,"width")||e.hasUpdatedValue(n.entry,"height"))&&s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:ln})}apply(e,t){for(const s of t){if(!s.fields.oppervlakteartikel)continue;let t=s.fields.width,n=s.fields.height;n<1&&(n=1),t<1&&(t=1);const r={},i=this.locals.units.dimension,o=/\((.*)\)/,a=`(${t} ${i} x ${n} ${i})`;o.test(s.fields.naam)?r.naam=s.fields.naam.replace(o,a):r.naam=`${s.fields.naam} ${a}`;const c=s.initial.width*s.initial.height;if(0!==c){const e=t*n;for(const t of["nieuwprijs","inhuurprijs","verhuurprijs"])r[t]=s.initial[t]/c*e}e.setItemUpdated(s.entry,r)}}};un=Wt([Nt("SurfaceArticleSizeBusinessLogicRule")],un);const dn=["MateriaalCat","Functie","Functiegroep"],hn=["type","isStart","defaultValue"],mn={schema_gv:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_gv_begin",value:"gebruikvan",opposite:"schema_gt",plan:"schema_pv",isStart:!0},schema_gt:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_gt_begin",value:"gebruiktot",opposite:"schema_gv",plan:"schema_pt",isStart:!1},schema_pv:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_pv_begin",value:"planvan",opposite:"schema_pt",usage:"schema_gv",isStart:!0},schema_pt:{type:a.ApiEnumApiType.TYPE_ITEM,start:"schema_pt_begin",value:"plantot",opposite:"schema_pv",usage:"schema_gt",isStart:!1},gebruikvan:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gv",opposite:"gebruiktot",plan:"planvan",isStart:!0},gebruiktot:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gt",opposite:"gebruikvan",plan:"plantot",isStart:!1},planvan:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pv",opposite:"plantot",usage:"gebruikvan",isStart:!0},plantot:{type:a.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pt",opposite:"planvan",usage:"gebruiktot",isStart:!1},schema_pv_begin:{type:a.ApiEnumApiType.TYPE_BOOL,usage:"schema_gv_begin",defaultValue:!0},schema_pt_begin:{type:a.ApiEnumApiType.TYPE_BOOL,usage:"schema_gt_begin",defaultValue:!1},schema_gv_begin:{type:a.ApiEnumApiType.TYPE_BOOL,plan:"schema_pv_begin",defaultValue:!0},schema_gt_begin:{type:a.ApiEnumApiType.TYPE_BOOL,plan:"schema_pt_begin",defaultValue:!1},duur:{type:a.ApiEnumApiType.TYPE_DURATION},timeframe:{type:a.ApiEnumApiType.TYPE_ITEM}};class pn{static columnInstances={};static schemeValueStartColumnIds=["schema_gv","schema_pv"];static schemeValueEndColumnIds=["schema_gt","schema_pt"];static schemeValueColumnIds=["schema_gv","schema_pv","schema_gt","schema_pt"];static schemeStartColumnIds=["schema_gv_begin","schema_gt_begin","schema_pv_begin","schema_pt_begin"];static valueStartColumnIds=["gebruikvan","planvan"];static valueEndColumnIds=["gebruiktot","plantot"];static valueColumnIds=["gebruikvan","planvan","gebruiktot","plantot"];static usageColumnIds=["gebruikvan","gebruiktot","schema_gv","schema_gt","schema_gv_begin","schema_gt_begin"];static planColumnIds=["planvan","plantot","schema_pv","schema_pt","schema_pv_begin","schema_pt_begin"];static isTimeColumn(e){return void 0!==mn[e]}static getColumnInstance(e){if(void 0!==this.columnInstances[e])return this.columnInstances[e];const t=mn[e],s={id:e};this.columnInstances[e]=s;for(const e in t)s[e]=hn.includes(e)?t[e]:this.getColumnInstance(t[e]);return s}static*getColumnIdIterator(e){for(const t in mn)"timeframe"===t&&"Functie"!==e||(yield t)}static getColumnIds(e){return[...this.getColumnIdIterator(e)]}static getDefaultValues(e,t={id:null,van:Z.default.invalid(),tot:Z.default.invalid()},s=t){const n={schema_gv:t.id,schema_gt:t.id,schema_pv:s.id,schema_pt:s.id,schema_pv_begin:this.getColumnInstance("schema_pv_begin").defaultValue,schema_pt_begin:this.getColumnInstance("schema_pt_begin").defaultValue,schema_gv_begin:this.getColumnInstance("schema_gv_begin").defaultValue,schema_gt_begin:this.getColumnInstance("schema_gt_begin").defaultValue,gebruiktot:t.tot.clone(),gebruikvan:t.van.clone(),plantot:s.tot.clone(),planvan:s.van.clone(),duur:Z.default.duration(t.van.isValid()&&t.tot.isValid()?t.tot.diff(t.van):0)};return"Functie"===e?{...n,timeframe:null}:n}static cloneValues(e,t,s={}){const n=this.getColumnIdIterator(e);for(const e of n)s[e]=J.clone(mn[e].type,t[e]);return s}static compareValues(e,t,s){const n=this.getColumnIdIterator(e);for(const e of n)if(!J.compareFields(mn[e].type,t[e],s[e]))return!1;return!0}}class fn extends Ut{conditionColumns;extractUpdatedTuples(e,t=!1){const s=e.previousChangesDelta.getUpdatedTuplesIterator(...dn),n=dn.reduce(((e,t)=>(e[t]=new Map,e)),{});for(const t of s){const s=t.entry;for(const t of this.conditionColumns){if(!e.previousChangesDelta.hasUpdatedValue(s,t))continue;let r=n[s.itemType].get(s);void 0===r&&n[s.itemType].set(s,r=[]),r.push(t)}}if(t){const t=e.previousChangesDelta.getCreatedTuplesIterator(...dn);for(const e of t){const t=e.entry;for(const e of this.conditionColumns){let s=n[t.itemType].get(t);void 0===s&&n[t.itemType].set(t,s=[]),s.push(e)}}}return n}extractUpdatedTuplesCondition(e){const t=this.extractUpdatedTuples(e);return dn.every((e=>0===t[e].size))?At:t}async fetchLinkedItemResourcesWithColumns(e,t,s){return U(dn.reduce(((n,r)=>(n[r]=e.getItemsById(r,[...t[r].keys()].map((e=>e.itemId)),{columns:s[r]}),n)),{}))}async fetchLinkedItemResources(e,t,s){return this.fetchLinkedItemResourcesWithColumns(e,t,dn.reduce(((e,t)=>(e[t]=s,e)),{}))}}const yn=["gebruikvan","gebruiktot"],gn=[...yn,"duur"];let In=class extends fn{conditionColumns=yn;condition(e){return this.extractUpdatedTuplesCondition(e)}apply(e,t){for(const s of dn)for(const n of t[s]){const t=n.fields.gebruikvan,s=n.fields.gebruiktot;t.isValid()&&s.isValid()&&e.setItemUpdated(n.entry,{duur:Z.default.duration(s.diff(t))})}}dependency(e,t){return this.fetchLinkedItemResources(e,t,gn)}};In=Wt([Nt("LinkedTimeItemDurationBusinessLogicRule")],In);const Cn=["van","tot","is_absolute_times_substitute"],vn=["id",...pn.valueColumnIds,...pn.schemeStartColumnIds,{schema_pv:Cn},{schema_pt:Cn},{schema_gv:Cn},{schema_gt:Cn}];let Tn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("MateriaalCat"),s=new Map;for(const n of t){const t=n.entry;for(const n of pn.valueColumnIds){if(void 0===e.previousChangesDelta.getUpdatedValue(t,n)||null===e.transaction.itemHandler.lookUpItemField(t,pn.getColumnInstance(n).scheme.id))continue;let r=s.get(t.itemId);void 0===r&&s.set(t.itemId,r=[]),r.push(n)}}return 0===s.size?At:s}dependency(e,t){return e.getItemsById("MateriaalCat",[...t.keys()],{columns:vn})}apply(e,t,s){for(const n of t){const t=s.get(n.fields.id);for(const s of t){const t=pn.getColumnInstance(s);!0===n.getDerivedValue([t.scheme.id,"is_absolute_times_substitute"])&&e.setItemUpdated(e.transaction.getLocalItemEntryByItemId("Tijd",n.fields[t.scheme.id]),{[n.fields[t.scheme.start.id]?"van":"tot"]:n.fields[s].clone()})}}}};Tn=Wt([Nt("LinkedTimeItemMateriaalCatBusinessLogicRule")],Tn);const Rn=["project","subproject"],En=pn.schemeValueColumnIds,Sn=[...En,...Rn],_n=["id","project","subproject","is_absolute_times_substitute"],bn=[...pn.schemeValueColumnIds,"timeframe"];let wn=class extends fn{conditionColumns=Rn;async condition(e){const t=this.extractUpdatedTuples(e,!0);if(dn.every((e=>0===t[e].size)))return At;const s=await this.fetchLinkedItemResourcesWithColumns(e.transaction,t,{MateriaalCat:Sn,Functie:[...Sn,"timeframe"],Functiegroep:Sn}),n=await e.transaction.getItemsById("Tijd",[...this.extractTimeItemIds(s)],{columns:_n}),r=this.validateLinkedTimes(s,n);return dn.every((e=>0===r[e].length))?At:r}apply(e,t,s){for(const t of dn)for(const n of s[t])e.setItemUpdated(n.item,this.schemeValueColumnIdArrayToFieldMap(n.invalidTimes))}dependency(){return Promise.resolve(null)}schemeValueColumnIdArrayToFieldMap(e){const t={};for(const s of e)t[s]=null;return t}validateLinkedTimes(e,t){const s={};for(const n of dn){const r=[];for(const s of e[n]){const e=this.getInvalidTimeColumnIds(s,t);e.length>0&&r.push({item:s.entry,invalidTimes:e})}s[n]=r}return s}getInvalidTimeColumnIds(e,t){const s=this.getTimeIdIterator(e),n=[];for(const r of s){const s=t.find((e=>e.fields.id===r.timeId));if(s.fields.is_absolute_times_substitute)continue;const i=s.fields.subproject;(s.fields.project!==e.fields.project||null!==i&&i!==e.fields.subproject)&&n.push(r.columnId)}return n}extractTimeItemIds(e){const t=new Set;for(const s of dn)for(const n of e[s]){const e=this.getTimeIdIterator(n);for(const s of e)t.add(s.timeId)}return t}*getTimeIdIterator(e){const t="Functie"===e.itemType?bn:En;for(const s of t){const t=e.fields[s];null!==t&&(yield{timeId:t,columnId:s})}}};wn=Wt([Nt("LinkedTimeItemSubprojectBusinessLogicRule")],wn);const qn=[...pn.valueColumnIds,...pn.schemeStartColumnIds],Fn=["id","van","tot"];let kn=class extends fn{conditionColumns=pn.schemeValueColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}async dependency(e,t,s){const[n,r]=await Promise.all([e.getItemsById("Tijd",this.getTimeItemIds(t,s.previousChangesDelta),{columns:Fn}),this.fetchLinkedItemResources(e,t,qn)]);return{timeResources:n,linkedTimeItemResources:r}}apply(e,t,s){for(const n of dn)for(const[r,i]of s[n])for(const s of i){const n=pn.getColumnInstance(s);let i=e.previousChangesDelta.getUpdatedValue(r,n.start.id);void 0===i&&e.setItemUpdated(r,{[n.start.id]:i=n.isStart});const o=e.previousChangesDelta.getUpdatedValue(r,s);if(null!==o){const s=t.timeResources.find((e=>e.fields.id===o));e.setItemUpdated(r,{[n.value.id]:i?s.fields.van:s.fields.tot})}}}getTimeItemIds(e,t){const s=new Set;for(const n of dn)for(const r of e[n]){const e=r[0];for(const n of r[1]){const r=t.getUpdatedValue(e,n);null!==r&&s.add(r)}}return[...s]}};kn=Wt([Nt("LinkedTimeItemTimeSchemeBusinessLogicRule")],kn);let Ln=class extends fn{conditionColumns=pn.schemeValueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,pn.schemeValueColumnIds)}apply(e,t,s){for(const n of dn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=pn.getColumnInstance(s),i=n.opposite.id;!e.previousChangesDelta.hasUpdatedValue(t,i)&&r.fields[n.start.id]&&r.initial[s]===r.initial[i]&&e.setItemUpdated(t,{[i]:r.fields[s]})}}}};Ln=Wt([Nt("LinkedTimeItemTimeSchemeStartBusinessLogicRule")],Ln);const Dn=[...pn.valueColumnIds,...pn.schemeValueEndColumnIds];let xn=class extends fn{conditionColumns=pn.valueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,Dn)}apply(e,t,s){for(const n of dn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=pn.getColumnInstance(s).opposite;if(e.previousChangesDelta.hasUpdatedValue(t,n.id)||null!==r.fields[n.scheme.id])continue;const i=r.initial[n.id];i.isValid()&&!i.isSame(r.initial[s])||e.setItemUpdated(t,{[n.id]:r.fields[s]})}}}};xn=Wt([Nt("LinkedTimeItemTimeValueStartBusinessLogicRule")],xn);const Mn=["vervaldatum","datum"];let Pn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Offerte","Contract"),s={Offerte:[],Contract:[]};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"datum")&&(n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}async dependency(e,t){return U({Offerte:e.getItemsById("Offerte",t.Offerte,{columns:Mn}),Contract:e.getItemsById("Contract",t.Contract,{columns:Mn})})}apply(e,t){const s=this.getAccountSettings().geldigheidofferte;for(const n of["Offerte","Contract"])for(const r of t[n])e.setItemUpdated(r.entry,{vervaldatum:r.fields.datum.clone().add(s,"days")})}};Pn=Wt([Nt("OfferteContractDatumBusinessLogicRule")],Pn);let Bn=class extends Qs{itemType="Planningmateriaal"};Bn=Wt([Nt("PlanningmateriaalAantalRoundUpBusinessLogicRule")],Bn);let Qn=class extends Vs{itemType="Planningmateriaal";groupingProperties={itemType:"MateriaalCat",columnId:"categorie"};requestColumns=Us};Qn=Wt([Nt("PlanningmateriaalAantaltotaalBusinessLogicRule")],Qn);const An=["id","optie","parent"],jn=["id","optie","categorie","parent",{materiaal:["is_combination","is_physical"]}];let Hn=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","optie")}async dependency(e,t){const s=await e.getItemsById("Planningmateriaal",t,{columns:jn}),n=new Set;for(const e of s)n.add(e.fields.categorie);return{childPlanningmateriaalResourcesInCategories:await e.getItemsByQuery("Planningmateriaal",{conditions:[{key:"categorie",value:Array.from(n.values()),comparator:"IN"},{key:"parent",value:null,comparator:"!="}]},{columns:An}),changedPlanningmateriaalResources:s}}apply(e,t){for(const s of t.changedPlanningmateriaalResources)s.getDerivedValue("materiaal>is_combination")&&!s.getDerivedValue("materiaal>is_physical")&&this.updatePlanningmateriaalByParent(s.fields.id,t.childPlanningmateriaalResourcesInCategories,s.fields.optie,e.destinationChangesDelta)}updatePlanningmateriaalByParent(e,t,s,n){for(const r of t)r.fields.parent===e&&e!==r.fields.id&&(r.fields.optie!==s&&n.setItemUpdated(r.entry,{optie:s}),this.updatePlanningmateriaalByParent(r.fields.id,t,s,n))}};Hn=Wt([Nt("PlanningmateriaalOptieBusinessLogicRule")],Hn);const Un=["parent","setcontent"];let On=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","parent")}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Un})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{setcontent:null})}};On=Wt([Nt("PlanningmateriaalParentBusinessLogicRule")],On);const Vn=["aantaltotaal","stays_at_location",{categorie:[{project:[{projecttype:["type"]}]}]}];let Nn=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","aantaltotaal",!0)}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Vn})}apply(e,t){for(const s of t)"transfer"===s.getDerivedValue(["categorie","project","projecttype","type"])&&e.setItemUpdated(s.entry,{stays_at_location:s.fields.aantaltotaal})}};Nn=Wt([Nt("PlanningmateriaalStaysAtLocationBusinessLogicRule")],Nn);const Wn={planning:"planvan",travel:"reistijd_vooraf",factor:-1},$n={planning:"plantot",travel:"reistijd_achteraf",factor:1},Gn=["vervoer","functie",Wn.planning,$n.planning],zn=["id",Wn.travel,$n.travel],Yn={geen:[],heen:[Wn],terug:[$n],retour:[Wn,$n]};let Kn=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Planningpersoneel","Planningtransport"),s={Planningpersoneel:[],Planningtransport:[]};let n=!1;for(const r of t)e.previousChangesDelta.hasUpdatedValue(r.entry,"vervoer")&&(n=!0,s[r.entry.itemType].push(r.entry.itemId));return n?s:At}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Planningpersoneel",t.Planningpersoneel,{columns:Gn}),e.getItemsById("Planningtransport",t.Planningtransport,{columns:Gn})]),r=new Set;for(const e of[s,n])for(const t of e)r.add(t.fields.functie);return{Planningpersoneel:s,Planningtransport:n,Functie:(await e.getItemsById("Functie",[...r],{columns:zn})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{})}}apply({destinationChangesDelta:e},t){for(const s of["Planningpersoneel","Planningtransport"])for(const n of t[s]){const s=t.Functie[n.fields.functie];this.updatePlanningColumns(e,n,Yn[n.initial.vervoer],-1,s.initial),this.updatePlanningColumns(e,n,Yn[n.fields.vervoer],1,s.fields)}}updatePlanningColumns(e,t,s,n,r){for(const i of s)e.setItemUpdated(t.entry,{[i.planning]:t.fields[i.planning].clone().add(n*i.factor*r[i.travel].asMilliseconds())})}};Kn=Wt([Nt("PlanningPersoneelTransportBusinessLogicRule")],Kn);const Xn=["factuurmoment","taxschema"],Zn=["korting_personeel","korting_transport","korting_verkoop","korting_verhuur","korting_totaal","verzekering"],Jn=["factuurmoment","taxschema","personeelkorting","transportkorting","verkoopkorting","verhuurkorting","totaalkorting","verzekering","verzekering_aangepast"],er={Project:{factuurmoment:"factuurmoment",taxschema:"taxschema"},Subproject:{personeelkorting:"korting_personeel",transportkorting:"korting_transport",verkoopkorting:"korting_verkoop",verhuurkorting:"korting_verhuur",totaalkorting:"korting_totaal",verzekering:"verzekering"}};let tr=class extends Ut{async condition({previousChangesDelta:e,transaction:t}){const s=e.getUpdatedTuplesIterator("Project"),n=[];for(const r of s){const s=e.getUpdatedValue(r.entry,"opdrachtgever");null!=s&&n.push(U({projectId:r.entry.itemId,clientId:s,hasEqualValues:this.valuesEqual(r.entry.itemId,s,t)}))}if(0===n.length)return At;const r=(await Promise.all(n)).filter((e=>!e.hasEqualValues));return 0===r.length?At:r.map((e=>({projectId:e.projectId,clientId:e.clientId})))}dependency(e,t){const s={};for(const n of t){const{projectId:t,clientId:r}=n;s[t]=U({projectResource:e.getItemById("Project",t,{columns:Xn}),subprojectCollection:e.getCollection("Subproject",{parent:{itemType:"Project",itemId:t},columns:Zn}),clientResource:e.getItemById("Contact",r,{columns:Jn})})}return U(s)}apply({destinationChangesDelta:e},t){for(const s in t){this.setValues(t[s].projectResource,t[s].clientResource.fields,e);for(const n of t[s].subprojectCollection.items)this.setValues(n,t[s].clientResource.fields,e)}}async valuesEqual(e,t,s){const n=await U({projectResource:s.getItemById("Project",e,{columns:Xn}),subprojectCollection:s.getCollection("Subproject",{parent:{itemType:"Project",itemId:e},columns:Zn}),clientResource:s.getItemById("Contact",t,{columns:Jn})}),r=n.subprojectCollection.items,i=n.clientResource.fields;let o,a;for(const e of r)for(o in er.Subproject)if(a=er.Subproject[o],("verzekering"!==o||i.verzekering_aangepast)&&("taxschema"!==o||null!==i.taxschema)&&e.fields[a]!==i[o])return!1;for(o in er.Project)if(a=er.Project[o],("factuurmoment"!==o||null!==i[o])&&null!==i[o]&&n.projectResource.fields[a]!==i[o])return!1;return!0}setValues(e,t,s){const n=e.entry.itemType,r=er[n],i={};for(const e in r){const s=r[e];("factuurmoment"!==e&&"taxschema"!==e||null!==t[e])&&(("verzekering"!==e||t.verzekering_aangepast)&&(i[s]=t[e]))}return s.setItemUpdated(e.entry,i)}};tr=Wt([Nt("ProjectClientChangedBusinessLogicRule")],tr);const sr=["opdrachtgever","locatie"],nr=["projectnotitie_naam","projectnotitie"],rr=["naam","omschrijving"];let ir=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Project"),s=[];for(const n of t){const t=sr.reduce(((t,s)=>{const r=e.previousChangesDelta.getUpdatedValue(n.entry,s);return null!=r?t.add(r):t}),new Set);t.size>0&&s.push({projectId:n.entry.itemId,updatedContactIds:t})}return s.length>0?s:At}async dependency(e,t){const s=Promise.all(t.map((t=>U({projectId:t.projectId,Contact:e.getItemsById("Contact",[...t.updatedContactIds],{columns:nr}),Projectnotitie:e.getItemsByQuery("Projectnotitie",{},{parent:{itemType:"Project",itemId:t.projectId},columns:rr})}))));return U({template:e.core.templateCache.fetchTemplate("Projectnotitie"),projectTuples:s})}apply(e,t){for(const s of t.projectTuples)for(const n of s.Contact){const{projectnotitie_naam:r,projectnotitie:i}=n.fields;0===r.length&&0===i.length||(s.Projectnotitie.some((e=>e.fields.naam===r&&e.fields.omschrijving===i))||e.destinationChangesDelta._setItemCreated(ge.getLocalId(),{...t.template.getFields(),naam:r,omschrijving:i,project:s.projectId},t.template.getMainColumnSet()))}}};ir=Wt([Nt("ProjectContactProjectNoteBusinessLogicRule")],ir);const or=["id","locatie"],ar=["id","locatie","locatie_persoon"];let cr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Project","locatie")}dependency(e,t){const s={};for(const n of t)s[n]=U({subprojectResources:e.getItemsByQuery("Subproject",{project:n},{columns:or}),projectResource:e.getItemById("Project",n,{columns:ar})});return U(s)}apply(e,t){for(const s in t){if(1!==t[s].subprojectResources.length)continue;const n=t[s].projectResource.fields.locatie;n!==t[s].subprojectResources[0].fields.locatie&&e.setItemUpdated(t[s].subprojectResources[0].entry,{locatie:n,locatie_persoon:t[s].projectResource.fields.locatie_persoon})}}};cr=Wt([Nt("ProjectOneSubLocationAlignBusinessLogicRule")],cr);const lr=["gebruiksperiode","planperiode","transport_pickup","transport_return"];let ur=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Project","Subproject"),s={Project:[],Subproject:[]};let n=!1;for(const r of t)for(const t of lr)if(e.getUpdatedValue(r.entry,t)){n=!0,s[r.entry.itemType].push(r.entry.itemId);break}return n?s:At}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Project",t.Project,{columns:lr}),e.getItemsById("Subproject",t.Subproject,{columns:lr})]);return{project:s,subproject:n}}apply(e,t){const s=[...t.project,...t.subproject];for(const t of s)for(const s of lr){const n=t.fields[s];if(null!==n){for(const r of lr){if(r===s)continue;if(t.fields[r]===n){if("planperiode"===r&&"gebruiksperiode"===s||"gebruiksperiode"===r&&"planperiode"===s)continue;e.setItemUpdated(t.entry,{[r]:null})}}break}}}};ur=Wt([Nt("ProjectSubprojectDefaultTimeBusinessLogicRule")],ur);const dr=["approval_status","previous_status"];let hr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","approval_status")}async dependency(e,t){return e.getItemsById("PurchaseOrder",t,{columns:dr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{previous_status:s.initial.approval_status})}};hr=Wt([Nt("PurchaseOrderApprovalStatusBusinessLogicRule")],hr);let mr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","owner")}async dependency(){return Promise.resolve()}apply(){}};mr=Wt([Nt("PurchaseOrderOwnerBusinessLogicRule")],mr);const pr=["rate_group","active","id"];let fr=class extends Ut{condition(e){const t=new Set;for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Rate"))0!==s.fields.rate_group&&t.add(s.fields.rate_group);return 0===t.size?At:t}dependency(e,t){return e.getItemsByQuery("Rate",{conditions:[{key:"rate_group",comparator:"IN",value:[...t]},{active:!0}],operator:"AND"},{columns:pr,preventCaching:!0})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{active:!1})}};fr=Wt([Nt("RateDeactivateExistingOnCreateBusinessLogicRule")],fr);const yr=["aantal"];let gr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Reparatie"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"exemplaar");null!=t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Reparatie",t,{columns:yr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{aantal:1})}};gr=Wt([Nt("ReparatiesExemplaarAantalBusinessLogicRule")],gr);const Ir=["id","asset_location"];let Cr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Reparatie","MateriaalLost"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"exemplaar");null!=t&&s.push({entry:n.entry,exemplaar:t})}return 0===s.length?At:s}async dependency(e,t){return{entries:t.map((e=>e.entry)),exemplaarResources:await e.getItemsById("Exemplaar",Array.from(new Set(t.map((e=>e.exemplaar)))),{columns:Ir})}}apply(e,t){for(const s of t.entries){const n=e.transaction.itemHandler.lookUpItemField(s,"exemplaar"),r=t.exemplaarResources.find((e=>e.fields.id===n));if(void 0===r)throw new Error(`Exemplaar ${n} linked to Repair/MateriaalLost ${s.itemId} does not exist`);e.setItemUpdated(s,{asset_location:r.fields.asset_location})}}};Cr=Wt([Nt("ReparatieLostItemExemplaarLocationBusinessLogicRule")],Cr);const vr=["general_eigen_medewerker_edit"];let Tr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"medewerkers_rechten");(void 0!==t&&"read"!==t||!0===e.getUpdatedValue(n.entry,"medewerkers_toegang"))&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:vr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{general_eigen_medewerker_edit:!0})}};Tr=Wt([Nt("RolEditOwnDataBusinessLogicRule")],Tr);const Rr=["facturen_eigen","general_bestanden_downloaden","facturen_toegang","projecten_offertes_maken","projecten_facturen_maken"];let Er=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t)!0!==e.getUpdatedValue(n.entry,"projecten_facturen_maken")&&!0!==e.getUpdatedValue(n.entry,"projecten_offertes_maken")||s.push(n.entry.itemId);return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Rr})}apply(e,t){for(const s of t){const t=s.fields.projecten_facturen_maken,n=s.fields.projecten_offertes_maken;if((t||n)&&(e.setItemUpdated(s.entry,{general_bestanden_downloaden:"all"}),t)){const t=s.fields.facturen_eigen;e.setItemUpdated(s.entry,{facturen_toegang:!0,facturen_eigen:"read"===t?"write":t})}}}};Er=Wt([Nt("RolFileAccessBusinessLogicRule")],Er);const Sr=["medewerkers_loginfields","medewerkers_lastseen"];let _r=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","medewerkers_loginfields",!1)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Sr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{medewerkers_lastseen:!1})}};_r=Wt([Nt("RolLoginFieldsLastSeenBusinessLogicRule")],_r);const br=["projecten_toegang"];let wr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","personeelsplanner_toegang",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:br})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{projecten_toegang:!0})}};wr=Wt([Nt("RolPersoneelsplannerToegangBusinessLogicRule")],wr);const qr=["materialen_tijdlijn"];let Fr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"projecten_bewerken");void 0!==t&&"no"!==t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:qr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{materialen_tijdlijn:"projects"})}};Fr=Wt([Nt("RolProjectenBewerkenBusinessLogicRule")],Fr);const kr=["uren_kosten","visibility_financials"];let Lr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","projecten_toegang",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:kr})}apply(e,t){for(const s of t)!1!==s.fields.visibility_financials&&e.setItemUpdated(s.entry,{uren_kosten:!0})}};Lr=Wt([Nt("RolProjectenToegangBusinessLogicRule")],Lr);const Dr=["purchaseorders_edit"];let xr=class extends Ut{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Rol"),s=[];for(const n of t){const t=e.getUpdatedValue(n.entry,"purchaseorders_edit");void 0!==t&&"all"!==t&&s.push(n.entry.itemId)}return 0===s.length?At:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Dr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{purchaseorders_attach_crew_plannings:!1})}};xr=Wt([Nt("RolPurchaseOrderAttachPlanningBusinessLogicRule")],xr);const Mr=["visibility_financials","facturen_toegang","projecten_facturen_maken","projecten_offertes_maken","projecten_toegang"];let Pr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Rol","visibility_financials")}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Mr})}apply(e,t){for(const s of t)s.fields.visibility_financials?s.fields.projecten_facturen_maken&&e.setItemUpdated(s.entry,{facturen_toegang:!0}):e.setItemUpdated(s.entry,{projecten_facturen_maken:!1,projecten_offertes_maken:!1,facturen_toegang:!1})}};Pr=Wt([Nt("RolVisibilityFinancialsBusinessLogicRule")],Pr);let Br=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","warehouse_trackinglog_access",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:["magazijn_toegang"]})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{magazijn_toegang:!0})}};Br=Wt([Nt("RolWarehouseTrackingLogAccessBusinessLogicRule")],Br);const Qr=["id","type","is_combination","is_physical","telexemplaren","verhuur"];let Ar=class extends Ut{condition(e){const t=[];for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Setinhoud"))void 0!==s.fields.package&&t.push(s);return 0===t.length?At:t}async dependency(e,t,s){const n=Array.from(new Set(t.flatMap((e=>[e.fields.package,e.fields.materiaal]))));return(await s.transaction.getItemsById("Materiaal",n,{columns:Qr})).reduce(((e,t)=>(e[t.fields.id]=t,e)),{})}apply(e,t,s){for(const n of s){const s=t[n.fields.package],r=t[n.fields.materiaal];e.setItemUpdated(n.entry,{is_fixed:s.fields.is_combination&&s.fields.is_physical&&r.fields.verhuur})}}};Ar=Wt([Nt("SetinhoudCreateFixedBusinessLogicRule")],Ar);const jr=["is_fixed",{package:["type"]}];let Hr=class extends Ut{condition({previousChangesDelta:e}){if(this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING"))return At;const t=e.getUpdatedTuplesIterator("Materiaal","Setinhoud"),s={Materiaal:[],Setinhoud:[]};for(const n of t)"Materiaal"===n.entry.itemType&&(e.hasUpdatedValue(n.entry,"is_physical")||e.hasUpdatedValue(n.entry,"is_combination"))&&s.Materiaal.push(n.entry.itemId),"Setinhoud"===n.entry.itemType&&e.hasUpdatedValue(n.entry,"is_fixed")&&s.Setinhoud.push(n.entry.itemId);return 0===s.Materiaal.length&&0===s.Setinhoud.length?At:s}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Setinhoud",t.Setinhoud,{columns:jr}),e.getItemsByQuery("Setinhoud",{package:t.Materiaal},{columns:jr})]);return[...s,...n.filter((e=>void 0===s.find((t=>e.entry.id!==t.entry.id))))]}apply(e,t){for(const s of t){const t=e.transaction.createItemResource(e.transaction.getLocalItemEntryByItemId("Materiaal",s.fields.package));e.setItemUpdated(s.entry,{is_fixed:t.fields.is_physical&&t.fields.is_combination})}}};Hr=Wt([Nt("SetinhoudUpdateFixedBusinessLogicRule")],Hr);const Ur=["subproject","inplanning"];let Or=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Subproject"),s=new Map;for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"inplanning");void 0!==t&&s.set(n.entry.itemId,t)}return s.size>0?s:At}async dependency(e,t){const s=await e.getItemsById("Subproject",[...t.keys()],{columns:["project"]}),n=s[0].fields.project;for(let e=1;e<s.length;e++)if(s[e].fields.project!==n)throw new Error("SubprojectInPlanningBusinessLogicRuleBase: unexpected change of multiple projects");const r=await e.getItemsByQuery("Functie",{},{parent:{itemType:"Project",itemId:n},columns:Ur}),i=new Map;for(const e of t.keys())i.set(e,[]);for(const e of r)i.get(e.fields.subproject)?.push(e);return i}apply(e,t,s){for(const n of t.entries())for(const t of n[1])e.setItemUpdated(t.entry,{inplanning:s.get(n[0])})}};Or=Wt([Nt("SubprojectInPlanningBusinessLogicRule")],Or);const Vr=["id","project","locatie","locatie_persoon"],Nr=["id","locatie"];let Wr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Subproject","locatie")}async dependency(e,t){const s={};for(const n of t){const t=await e.getItemById("Subproject",n,{columns:Vr}),r=t.fields.project;void 0===s[r]&&(s[r]={}),s[r].Subproject=t,s[r].Project=await e.getItemById("Project",r,{columns:Nr});const i=await e.getItemsByQuery("Subproject",{project:r},{columns:["id"]});s[r].amountOfSubprojects=i.length}return U(s)}apply(e,t){for(const s in t){if(1!==t[s].amountOfSubprojects)continue;const n=t[s].Subproject.fields.locatie;n!==t[s].Project.fields.locatie&&e.setItemUpdated(t[s].Project.entry,{locatie:n,locatie_persoon:t[s].Subproject.fields.locatie_persoon})}}};Wr=Wt([Nt("SubprojectOneSubLocationAlignBusinessLogicRule")],Wr);const $r=["id","naam"],Gr=["id","project","naam"];let zr=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Project","naam")}async dependency(e,t){return Promise.all(t.map((t=>U({projectResource:e.getItemById("Project",t,{columns:$r}),subprojectResources:e.getItemsByQuery("Subproject",{},{parent:{itemType:"Project",itemId:t},columns:Gr})}))))}apply(e,t){for(const s of t)1===s.subprojectResources.length&&e.setItemUpdated(s.subprojectResources[0].entry,{naam:s.projectResource.fields.naam})}};zr=Wt([Nt("SubprojectOneSubNameAlignBusinessLogicRule")],zr);const Yr=["deadline_type","deadline_relative_time_period","deadline_relative_offset_amount","deadline_relative_offset_base","deadline_relative_offset_direction","deadline_relative_offset_unit"];let Kr=class extends Ut{condition(e){return e.getItemIdsWithFieldUpdatedTo("Taak","deadline_type","absolute")}async dependency(e,t){return e.getItemsById("Taak",t,{columns:Yr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{deadline_relative_time_period:null,deadline_relative_offset_amount:0})}};Kr=Wt([Nt("TaakDeadlineTypeBusinessLogicRule")],Kr);const Xr=[{deadline_relative_time_period:["tot","van"]},"deadline_type","deadline_relative_offset_amount","deadline_relative_offset_base","deadline_relative_offset_direction","deadline_relative_offset_unit"],Zr=["id","tot","van"];let Jr=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Taak"),s=[];for(const n of t){const t=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_time_period"),r=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_amount"),i=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_unit"),o=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_direction"),a=e.previousChangesDelta.hasUpdatedValue(n.entry,"deadline_relative_offset_base");(t||r||i||o||a)&&s.push(n.entry.itemId)}return s.length>0?s:At}async dependency(e,t){const s=await e.getItemsById("Taak",t,{columns:Xr}),n=new Set;for(const e of s){const t=e.fields.deadline_relative_time_period;null!==t&&n.add(t)}return{taakResources:s,tijdResources:await e.getItemsById("Tijd",Array.from(n),{columns:Zr})}}apply(e,{taakResources:t,tijdResources:s}){const n=s.reduce(((e,t)=>(e[t.fields.id]=t,e)),{});for(const s of t){const t=s.fields.deadline_type,r=s.fields.deadline_relative_time_period;if("relative"===t&&null!=r){const t=n[r],i="end"===s.fields.deadline_relative_offset_base?t.fields.tot:t.fields.van;if(void 0!==i){const t=this.calculateTaskTimeWithOffset(e,i,s);e.setItemUpdated(s.entry,{deadline:t})}}}}calculateTaskTimeWithOffset(e,t,s){const n=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_amount"),r=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_unit"),i=e.transaction.itemHandler.lookUpItemField(s.entry,"deadline_relative_offset_direction"),o=t.clone();return void 0!==n&&n>0&&("before"===i?o.subtract(n,"day"===r?"days":"hours"):o.add(n,"day"===r?"days":"hours")),o}};Jr=Wt([Nt("TaakDeadlineOffsetBusinessLogicRule")],Jr);const ei=["naam","id"],ti=["schema_pv","schema_gv","schema_pt","schema_gt","naam"];let si=class extends Ut{condition(e){return e.getItemIdsWithUpdatedField("Tijd","naam")}async dependency(e,t){const s=await e.getItemsById("Tijd",t,{columns:ei}),n=await e.getItemsByQuery("Functiegroep",{conditions:[{key:"schema_pv",comparator:"IN",value:t},{key:"schema_pt",comparator:"IN",value:t},{key:"schema_gv",comparator:"IN",value:t},{key:"schema_gt",comparator:"IN",value:t}],operator:"OR"},{columns:ti}),r=[];for(const e of s){const t=e.fields.id,s=e.initial.naam,i=n.filter((e=>e.fields.schema_pv===t&&e.fields.schema_gv===t&&e.fields.schema_pt===t&&e.fields.schema_gt===t&&e.fields.naam===s));r.push(...i.map((t=>({tijdResource:e,functiegroepResource:t}))))}return r}apply(e,t){for(const s of t)e.setItemUpdated(s.functiegroepResource.entry,{naam:s.tijdResource.fields.naam})}};si=Wt([Nt("TijdPropagateNameToFunctiegroepBusinessLogicRule")],si);const ni=["id","gebruiksperiode","planperiode"];let ri=class extends Ut{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Tijd"),s=[];for(const n of t){const t=e.previousChangesDelta.getUpdatedValue(n.entry,"subproject");null!=t&&s.push({itemEntry:n.entry,newValue:t})}return 0===s.length?At:s}async dependency(e,t){const s=(await e.getItemsById("Tijd",t.map((e=>e.itemEntry.itemId)),{columns:["project"]})).reduce(((e,t)=>e.add(t.fields.project)),new Set);if(s.size>1)throw new Error("Updating times of multiple projects currently unsupported");return e.getItemById("Project",[...s][0],{columns:ni,children:{Subproject:{columns:ni}}})}apply(e,t,s){for(const n of s)for(const s of ni){const r=n.itemEntry.itemId;t.fields[s]===r&&e.setItemUpdated(t.entry,{[s]:null});for(const i of t.children.Subproject.items)n.newValue!==i.fields.id&&i.fields[s]===r&&e.setItemUpdated(i.entry,{[s]:null})}}};ri=Wt([Nt("TijdSubprojectChangedBusinessLogicRule")],ri);const ii=[is,Zt,es,ss,cs,us,ds,ps,gs,Cs,Rs,Ss,qs,Fs,Ls,xs,_s,Ps,Ns,As,zs,Ks,nn,tn,Gs,Js,on,cn,un,In,kn,Ln,xn,wn,Tn,Pn,Bn,Qn,Hn,On,Nn,Kn,tr,ir,cr,ur,mr,hr,fr,gr,Cr,Tr,Er,_r,wr,Fr,Lr,Pr,Br,xr,Ar,Hr,Wr,zr,Or,Kr,Jr,ri,si,zt,Yt];class oi{errorHandler;businessLogicRuleInstances;constructor(e,t){this.errorHandler=e,this.businessLogicRuleInstances=t}static constructBusinessLogicRules(e,t,s,n=ii){const r=[];for(const i of n)r.push(new i(e,t,s));return r}setBusinessLogicRuleConfirmation(e,t){this.findBusinessLogicRuleInstance(e).confirm=t}setBusinessLogicRulePostDependencyConfirmation(e,t){this.findBusinessLogicRuleInstance(e).postDependencyConfirm=t}async handleBusinessLogic(e,t,s){const n=e.createBusinessLogicChild();let r=await n.applyChangesDirectly(t),i=0;for(;!r.isEmpty()&&i<20;){const e=new Ot(n,r),t=await this.extractRulesToRun(e,s);if(null===t)return null;const o=await this.waitForRuleDependencies(t,e,s);if(null===o)return null;const a=n.createChangesDelta();this.applyRules(o,new Vt(n,r,a)),r=await n.applyChangesDirectly(a),i++}return 20===i&&this.errorHandler.logError(new Error("Business logic cycles maximum reached")),n}findBusinessLogicRuleInstance(e){const t=this.businessLogicRuleInstances.filter((t=>t instanceof e));if(0===t.length)throw new Error(`BusinessLogicManager: Could not find instance of '${e.__name}'. Have you registered it?`);if(t.length>1)throw new Error(`BusinessLogicManager: Multiple instances of '${e.__name}' found.`);return t[0]}applyRules(e,t){for(const s of e)try{s.ruleInstance.apply(t,s.dependencyResult,s.conditionResult,s.confirmResult===jt?void 0:s.confirmResult)}catch(e){this.errorHandler.logError(e)}}async waitForRuleDependencies(e,t,s){const n=await Promise.allSettled(e.map((async e=>(e.dependencyResult=await e.ruleInstance.dependency(t.transaction,e.conditionResult,t),null!==e.ruleInstance.postDependencyConfirm&&(e.confirmResult=await s(e.ruleInstance.postDependencyConfirm(e.conditionResult,e.dependencyResult,t.transaction))),e)))),r=[];for(const e of n)if("rejected"!==e.status){if(e.value.confirmResult!==At){if(e.value.confirmResult===Ht)return null;r.push(e.value)}}else{if(e.reason instanceof js)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return r}async extractRulesToRun(e,t){const s=await Promise.allSettled(this.businessLogicRuleInstances.map((async s=>{const n=await s.condition(e);let r;return null!==s.confirm&&n!==At&&(r=await t(s.confirm(n,e.transaction))),{ruleInstance:s,conditionResult:n,confirmResult:r}}))),n=[];for(const e of s)if("rejected"!==e.status){if(e.value.conditionResult!==At&&e.value.confirmResult!==At){if(e.value.confirmResult===Ht)return null;n.push(e.value)}}else{if(e.reason instanceof js)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return n}}class ai{construct(e){return new te(e)}}class ci{errorHandler;itemEntryService;queryService;requestColumnsOperationsCacheFactory;columnCache;columnSetFactory;constructor(e,t,s,n,r,i){this.errorHandler=e,this.itemEntryService=t,this.queryService=s,this.requestColumnsOperationsCacheFactory=n,this.columnCache=r,this.columnSetFactory=i}construct(e,t,s,n){const r=e.cachedQueryItem,i=e.options,o=void 0!==n?n[r.itemType]:this.constructColumnSet(e);let a;return a=void 0===i.order?new f(this,i,s,r.queryGraph,r.query,o,t):void 0===i.order.limit?new C(this,i,s,r.queryGraph,r.query,o,t):new v(this,i,s,r.queryGraph,r.query,o,t),a.initializeItems(r.items,this.constructChildCollectionResources(e.children,a,s,n)),void 0!==a.options.abortSignal&&a.options.abortSignal.aborted?(a.clearResource(),a):(s.cachedQueryHandler.addCollectionResource(a),a)}constructChildCollectionResources(e,t,s,n={}){if(null===e)return{};const r={};for(const i of e){const e=i.itemType,o=i.cachedQueryItemTuples;if(0!==o.length){void 0===n[e]&&(n[e]=this.constructColumnSet(o[0]));for(const e of o){const o=e.options.parent.itemId;void 0===r[o]&&(r[o]={}),r[o][i.itemType]=this.construct(e,t,s,n)}}}return r}constructColumnSet(e){const t=e.cachedQueryItem.itemType,s=e.options.columns,n=this.columnCache.retrieve(t,s);return(!0===n.missing||n.missing.length>0)&&this.errorHandler.logWarning("Missing columns in when constructing collection resource column set:",n.missing),this.columnSetFactory.construct(t,s,n.cached)}}class li{columnInfoFactory;constructor(e){this.columnInfoFactory=e}construct(e,t,s){return new ie(this.columnInfoFactory,e,t,s)}}class ui{constructor(){}construct(e,t){return new ae(e,t)}constructFromRootMap(e,t=null){const s=[];for(const n in e){const r=e[n],i=this.construct(r.apiColumn,t),o=this.constructFromRootMap(r.children,i);o.length>0&&i.setChildren(i.apiColumn.itemType,o),s.push(i)}return s}}class di{columnHandler;columnInfoFactory;errorHandler;constructor(e,t,s){this.columnHandler=e,this.columnInfoFactory=t,this.errorHandler=s}construct(e,t,s,n,r){return!0===t?this.constructFromResponse(e,!0,s,n):this.constructFromRequest(e,t,!1,s,n,r)}constructFromRequest(e,t,s,n,r=!0,i=!0){const o=this.expandRootColumnMap(t,e,n,{},r);i&&this.expandRootColumnMap(["id"],e,n,o,r);const a=new le(this,e,t,s,{});return this.processColumnInfo(a,this.columnInfoFactory.constructFromRootMap(o),e),a}constructFromResponse(e,t,s,n=!0){const r=this.expandRootColumnMapFromResponseColumns(e,s,{},n),i=new le(this,e,this.constructRequestColumnsFromRootColumnMap(r),t,s);return this.processColumnInfo(i,this.columnInfoFactory.constructFromRootMap(r),e),i}constructRequestColumnsFromRootColumnMap(e){const t=[];for(const s in e){const n=e[s];S(n.children)?t.push({[s]:this.constructRequestColumnsFromRootColumnMap(n.children)}):t.push(s)}return t}expandRootColumnMapFromResponseColumns(e,t,s,n,r={}){if(!0===r[e])return s;r[e]=!0;for(const i in t[e]){const o=t[e][i];if(void 0===o)continue;if(n&&this.columnHandler.setColumn(e,o),void 0===s[i]&&(s[i]={apiColumn:o,children:{}}),!he.isItemColumn(o,!1))continue;const a=t[o.itemType];void 0!==a&&S(a)&&this.expandRootColumnMapFromResponseColumns(o.itemType,t,s[i].children,n,r)}return s}processColumnInfo(e,t,s){const n=e.response;void 0===n[s]&&(n[s]={});for(const r of t)n[s][r.id]=r.apiColumn,e.groupColumnInfo(r),r.isLeaf||this.processColumnInfo(e,r.children,r.itemType)}expandRootColumnMap(e,t,s,n,r){for(const i of e){const{id:e,children:o}=he.parseRequestColumn(i);let a=s[t]?.[e];void 0!==a?(r&&(a=this.columnHandler.setColumn(t,a)),void 0===n[e]&&(n[e]={apiColumn:a,children:{}}),0!==o.length&&this.expandRootColumnMap(o,a.itemType,s,n[e].children,r)):this.errorHandler.logWarning(`No api column for request column ${e} for itemType ${t}`)}return n}}class hi{columnCache;constructor(e){this.columnCache=e}construct(e,t){return new ue(e,this.columnCache,t)}}class mi{graphQueryParserFactory;constructor(e){this.graphQueryParserFactory=e}construct(e){return new fe(this.graphQueryParserFactory,e)}}class pi{errorHandler;constructor(e){this.errorHandler=e}construct(e,t,s=!1,n){return new d(this,e,t,s,n)}}class fi{serverCache;constructor(e,t,s){this.serverCache=new st(e,t,s)}getById(e){const t=s=>{for(const n of s){if(n.id===e)return n;const s=t(n.getChildren());if(void 0!==s)return s}};return t(this.serverCache.getChildren())}construct(e,t,s){return this.serverCache.createChild(e,t,s)}getServerCache(){return this.serverCache}}class yi{linkTreeService;constructor(e){this.linkTreeService=e}construct(e){return new Te(this.linkTreeService,e)}}class gi{construct(){return new Je}}class Ii{conversionMapService;errorHandler;itemCreateService;itemEntryService;constructor(e,t,s,n){this.conversionMapService=e,this.errorHandler=t,this.itemCreateService=s,this.itemEntryService=n}construct(e,t){return new Rt(e,t,this.errorHandler,this.itemCreateService,this.itemEntryService)}cloneCreatedChanges(e,t=this.construct(e.logMissingColumnErrors)){const s={};return e.created.forEach(((e,t)=>{this.conversionMapService.expandConversionMap(t,e.itemId,s)})),e.created.forEach(((e,n)=>{const r=J.copyFields(e.fields,{},e.columns.main);this.conversionMapService.updateItemValues(r,r,e.columns.item.main,s),t.created.add(s[n][e.itemId],r,e.columns)})),t}constructChildDelta(){return new Et(this.itemEntryService)}constructParentDelta(e){const t=new St(this.itemEntryService,e?._queryItemTypeSet);if(void 0===e)return t;for(const s in e._queryResults)for(const n in e._queryResults[s])t._setQueryResult(s,n,e._queryResults[s][n]);return t}}class Ci extends Error{constructor(e,t){super(`A local item of type ${e} with ID ${t} not be created, the ID is already in use`)}}class vi extends Error{}class Ti extends Error{constructor(e,t){super(`Transaction action timed out during '${e}'. Actions in queue: [${t.join(", ")}]`)}}class Ri{linkTreeService;errorHandler;constructor(e,t){this.linkTreeService=e,this.errorHandler=t}construct(e,t){return new Ge(e,t,this.linkTreeService,this.errorHandler)}}class Ei{version="66.9.0";apiRequestService;apiResponseProcessorFactory;changesDeltaFactory;collectionResourceFactory;columnCache;columnExpansionFactory;columnHandler;columnInfoFactory;columnSetFactory;requestColumnOperationsCacheFactory;conversionMapService;itemCacheFactory;itemCreateService;itemEntryService;itemResourceFactory;lockService;moduleChangesCompilationFactory;queryService;requestColumnExpansionFactory;socketMessageHandler;templateCache;transactionCacheFactory;businessLogicManager;constructor(e,t,s,n,r,i=a.ApiFieldsOnDeleteRule,o){const c=new Ri(n,s),l=new Ze,u=new gi,d=new ye(e,n),h=new ai,m=new ee(t,h),p=new re,f=new oe(m,p),y=new ui,g=new li(y),I=new di(f,y,s),C=new hi(p),v=new Ce(m),T=new mi(c),R=new pi(s),E=new Dt(m,f,I,u,n,d),S=new me,_=new kt(S,E),b=new Ii(S,s,_,d),w=new oi(s,r),q=new ci(s,d,l,C,p,I),F=new yi(n),k=new fi({apiRequestService:m,businessLogicManager:w,changesDeltaFactory:b,collectionResourceFactory:q,columnCache:p,columnExpansionFactory:g,columnHandler:f,columnSetFactory:I,conversionMapService:S,errorHandler:s,graphQueryParserFactory:c,itemCacheFactory:T,itemCreateService:_,itemEntryService:d,itemResourceFactory:R,linkTreeService:n,lockService:v,moduleChangesCompilationFactory:F,queryService:l,requestColumnExpansionFactory:u,requestColumnsOperationsCacheFactory:C,templateCache:E,rootInjector:o},i,this),L=new et(b,p,s,u,k,m,C);this.apiRequestService=m,this.apiResponseProcessorFactory=h,this.changesDeltaFactory=b,this.collectionResourceFactory=q,this.columnCache=p,this.columnExpansionFactory=g,this.columnHandler=f,this.columnInfoFactory=y,this.columnSetFactory=I,this.requestColumnOperationsCacheFactory=C,this.conversionMapService=S,this.itemCacheFactory=T,this.itemCreateService=_,this.itemEntryService=d,this.itemResourceFactory=R,this.lockService=v,this.moduleChangesCompilationFactory=F,this.queryService=l,this.requestColumnExpansionFactory=u,this.socketMessageHandler=L,this.templateCache=E,this.transactionCacheFactory=k,this.businessLogicManager=w}}function Si(e){return e}const _i="beach_access",bi=["id","date","name","yearly"];class wi{holidayCollectionResourcesMap=new Map;rangeContainsHoliday$(e,t,s){return!this.getHolidaysInDateRangeIterator$(e,t,s).next().done}getHolidaysInDateRange$(e,t,s){return[...this.getHolidaysInDateRangeIterator$(e,t,s)]}rangeContainsHoliday(e,t,s){return(0,l.untracked)((()=>this.rangeContainsHoliday$(e,t,s)))}getHolidaysInDateRange(e,t,s){return(0,l.untracked)((()=>[...this.getHolidaysInDateRangeIterator$(e,t,s)]))}async initialize(e){const t=await e.transactionCacheFactory.construct("rm-holidays-service").getCollection("Holiday",{query:{},columns:bi});this.holidayCollectionResourcesMap.set(e,t)}clear(e){return this.holidayCollectionResourcesMap.get(e)?.transaction.destroy(),this.holidayCollectionResourcesMap.delete(e)}*getHolidaysInDateRangeIterator$(e,t,s){const n=this.getHolidaysCollection(s),r=e.clone().startOf("day").valueOf(),i=t.clone().endOf("day").valueOf(),o=e.year(),a=t.year();for(const e of n.itemsSignal()){const t=e.fieldSignals.id(),s=e.fieldSignals.date(),n=e.fieldSignals.name();if(e.fieldSignals.yearly())for(let e=o;e<=a;e++){const o=s.clone().set("year",e);o.valueOf()>=r&&o.valueOf()<=i&&(yield{uid:`hol-${t}-${e}`,name:n,date:o})}else s.valueOf()>=r&&s.valueOf()<=i&&(yield{uid:`hol-${t}`,name:n,date:s.clone()})}}getHolidaysCollection(e){const t=void 0===e?this.holidayCollectionResourcesMap.values().next().value:this.holidayCollectionResourcesMap.get(e);if(void 0===t)throw new Error("RmHolidaysService was not initialized for this core instance, call `initialize` first.");return t}}var qi=r.lp,Fi=r.Gy,ki=r.Zd,Li=r.PC,Di=r.ZN,xi=r.xV,Mi=r.M$,Pi=r.yt,Bi=r.p5,Qi=r.J0,Ai=r.s6,ji=r.mX,Hi=r.vT,Ui=r.iZ,Oi=r.Hj,Vi=r.zn,Ni=r.LQ,Wi=r.KV,$i=r.sY,Gi=r.Z4,zi=r.Ez,Yi=r.ho,Ki=r.iz,Xi=r.yd,Zi=r.qc,Ji=r.tV,eo=r.Gp,to=r.Lf,so=r.Ry,no=r.Vd,ro=r.kj,io=r.sm,oo=r.hA,ao=r.xB,co=r.Pw,lo=r.fB,uo=r.BM,ho=r.Tk,mo=r.OC,po=r.QU,fo=r.Yo,yo=r.hn,go=r.QI,Io=r.bb,Co=r.Z5,vo=r.GQ,To=r.kI,Ro=r.M,Eo=r.vK,So=r.nL,_o=r.Ec,bo=r.X1,wo=r.r,qo=r.ZS,Fo=r.R8,ko=r.y$,Lo=r.mD,Do=r.AX,xo=r.Lu,Mo=r.aA,Po=r.Dr,Bo=r.tO,Qo=r.FQ,Ao=r.n4,jo=r.K7,Ho=r.ep,Uo=r.sW,Oo=r.Xt,Vo=r.f8,No=r.X$,Wo=r.Tz,$o=r.a7,Go=r._C,zo=r.v4,Yo=r.H7,Ko=r.zw,Xo=r.bu,Zo=r.Mf,Jo=r.Fs,ea=r.O$,ta=r.cq,sa=r.aw,na=r.Tf,ra=r.vo,ia=r.Pr,oa=r.Fe,aa=r.ni,ca=r.B5,la=r.JR,ua=r.GE,da=r.qy,ha=r.Gc,ma=r.J$,pa=r.Eq,fa=r.TV,ya=r.M_,ga=r.Bj,Ia=r.ZM,Ca=r.GH,va=r.BF,Ta=r.p$,Ra=r.hw,Ea=r.r4,Sa=r.Jt,_a=r.Qn,ba=r.r2,wa=r.rU,qa=r.Qg,Fa=r.lC,ka=r.C,La=r.AO,Da=r.P$,xa=r.aI,Ma=r.ox,Pa=r.wX,Ba=r.SL,Qa=r.$A,Aa=r.Yn,ja=r.GT,Ha=r.D_,Ua=r.RV,Oa=r.NN,Va=r.cy,Na=r.I0,Wa=r.Lm,$a=r.$P,Ga=r.O9,za=r.vq,Ya=r.Tn,Ka=r.Et,Xa=r.Gv,Za=r.$X,Ja=r.gd,ec=r.Kg,tc=r.l6,sc=r.h1,nc=r.s0,rc=r.c4,ic=r.LV,oc=r.dq,ac=r.oy,cc=r.jF,lc=r.zr,uc=r.A2;export{qi as ALL_PERMISSIONS,Fi as API_COLUMN_LOCATION,ki as AbstractCache,Li as ApiFormatter,Di as ApiLinkTreeType,xi as ApiRequestService,Mi as ApiResponseProcessor,Pi as ApiResponseProcessorFactory,Bi as BLR_ABANDON_CHANGES,Qi as BLR_CONTINUE_WITH_DEFAULTS,Ai as BLR_SKIP_RULE,ji as BusinessLogicManager,Hi as BusinessLogicRule,Ui as BusinessLogicRuleApplyContext,Oi as BusinessLogicRuleConditionContext,Vi as BusinessLogicRuleContextBase,Ni as COLUMN_SEPERATOR,Wi as CachedQueryHandlerBase,$i as CachedQueryItem,Gi as ChangesCompilation,zi as ChangesDelta,Yi as ChangesDeltaBase,Ki as ChangesDeltaFactory,Xi as ChangesProcessor,Zi as ChildChangesDelta,Ji as CollectionEntry,eo as CollectionItemChangesListenerContext,to as CollectionResource,so as CollectionResourceFactory,no as ColumnCache,ro as ColumnExpansion,io as ColumnExpansionFactory,oo as ColumnHandler,ao as ColumnInfo,co as ColumnInfoFactory,lo as ColumnSet,uo as ColumnSetFactory,ho as ColumnUtil,mo as ConversionMapService,po as CreateRequest,fo as CreatedChangesDelta,yo as CriticalBusinessLogicRuleException,go as GraphQueryParser,Io as HOLIDAY_ICON,Co as ItemAlreadyExistsException,vo as ItemCache,To as ItemCacheFactory,Ro as ItemChangesListenerContext,Eo as ItemChangesListenerContextBase,So as ItemCreateService,_o as ItemEntry,bo as ItemEntryService,wo as ItemHandlerBase,qo as ItemLockedException,Fo as ItemMatcherBase,ko as ItemNotFoundException,Lo as ItemResource,Do as ItemResourceFactory,xo as KeyService,Mo as LINKED_TIME_ITEM_TYPES,Po as LimitedCollectionResource,Bo as LinkedTimeItemSubprojectBusinessLogicRule,Qo as LockService,Ao as MatchesAccumulatorMap,jo as MateriaalBulkToSerialBusinessLogicRule,Ho as MateriaalIsCombinationBusinessLogicRule,Uo as MateriaalSerialToBulkBusinessLogicRule,Oo as MateriaalToPhysicalBusinessLogicRule,Vo as MateriaalToVirtualBusinessLogicRule,No as ModuleChangesCompilation,Wo as ModuleChangesCompilationFactory,$o as OrderedCollectionResource,Go as ParentChangesDelta,zo as ProjectClientChangedBusinessLogicRule,Yo as PurchaseOrderOwnerBusinessLogicRule,Ko as QueryColumnExtractor,Xo as QueryContainsLocalIdParser,Zo as QueryParser,Jo as QueryParserBase,ea as QueryParserIdUpdater,ta as QueryService,sa as RequestBuffer,na as RequestBufferBase,ra as RequestBufferManager,ia as RequestColumnExpansion,oa as RequestColumnExpansionFactory,aa as RequestColumnsOperationsCache,ca as RequestColumnsOperationsCacheFactory,la as RmCore,ua as RmHolidaysService,da as ServerCache,ha as ServerCachedQueryHandler,ma as ServerItemHandler,pa as SingleQueryRequestBuffer,fa as SocketMessageHandler,ya as SubprojectInPlanningBusinessLogicRule,ga as Template,Ia as TemplateCache,Ca as TimeColumnUtil,va as TransactionCache,Ta as TransactionCacheFactory,Ra as TransactionCachedQueryHandler,Ea as TransactionErrorLevel,Sa as TransactionEventHandler,_a as TransactionItemHandler,ba as TransactionTimeoutException,wa as TransactionValidator,qa as TransactionValidatorWithDependencies,Fa as businessLogicRule,ka as copy,La as createPath,Da as defaultRequestBufferOptions,xa as equals,Ma as extend,Pa as fieldsSignalProxyHandler,Ba as findIndex,Qa as getFirstProperty,Aa as getPath,ja as hasProperties,Ha as identity,Ua as inArray,Oa as initialProxyHandler,Va as isArray,Na as isBlankObject,Wa as isBoolean,$a as isDate,Ga as isDefined,za as isElement,Ya as isFunction,Ka as isNumber,Xa as isObject,Za as isPromiseLike,Ja as isRegExp,ec as isString,tc as isWindow,sc as merge,nc as pathExists,rc as promiseAllObject,ic as promiseCreateDeferred,oc as promiseCreateTimeout,ac as registeredBusinessLogicRules,cc as shallowMerge,lc as timeoutPromiseSymbol,uc as transactionActionTimeoutMilliseconds};
|
|
2
2
|
//# sourceMappingURL=rm-core.js.map
|