@rentman/rm-core 64.0.2-RM4-47618 → 64.0.2

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 CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@rentman/backend-types"),require("@angular/core"),require("moment")):"function"==typeof define&&define.amd?define(["@rentman/backend-types","@angular/core","moment"],t):"object"==typeof exports?exports.RmCore=t(require("@rentman/backend-types"),require("@angular/core"),require("moment")):e.RmCore=t(e["@rentman/backend-types"],e["@angular/core"],e.moment)}(self,((e,t,s)=>(()=>{"use strict";var n={860:e=>{e.exports=t},174:t=>{t.exports=e},416:e=>{e.exports=s}},r={};function i(e){var t=r[e];if(void 0!==t)return t.exports;var s=r[e]={exports:{}};return n[e](s,s.exports,i),s.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};i.r(o),i.d(o,{ALL_PERMISSIONS:()=>a,API_COLUMN_LOCATION:()=>me,AbstractCache:()=>nt,ApiFormatter:()=>te,ApiLinkTreeType:()=>l,ApiRequestService:()=>se,ApiResponseProcessor:()=>ne,ApiResponseProcessorFactory:()=>ui,BLR_ABANDON_CHANGES:()=>Ot,BLR_CONTINUE_WITH_DEFAULTS:()=>Ut,BLR_SKIP_RULE:()=>Ht,BusinessLogicManager:()=>li,BusinessLogicRule:()=>Vt,BusinessLogicRuleApplyContext:()=>Wt,BusinessLogicRuleConditionContext:()=>Nt,BusinessLogicRuleContextBase:()=>jt,COLUMN_SEPERATOR:()=>c,CachedQueryHandlerBase:()=>dt,CachedQueryItem:()=>p,ChangesCompilation:()=>re,ChangesDelta:()=>_t,ChangesDeltaBase:()=>Rt,ChangesDeltaFactory:()=>Ti,ChangesProcessor:()=>ie,ChildChangesDelta:()=>bt,CollectionEntry:()=>f,CollectionItemChangesListenerContext:()=>At,CollectionResource:()=>g,CollectionResourceFactory:()=>di,ColumnCache:()=>oe,ColumnExpansion:()=>ae,ColumnExpansionFactory:()=>hi,ColumnHandler:()=>ce,ColumnInfo:()=>le,ColumnInfoFactory:()=>mi,ColumnSet:()=>de,ColumnSetFactory:()=>pi,ColumnUtil:()=>pe,ConversionMapService:()=>fe,CreateRequest:()=>ye,CreatedChangesDelta:()=>xt,CriticalBusinessLogicRuleException:()=>Us,GraphQueryParser:()=>Ye,HOLIDAY_ICON:()=>qi,ItemAlreadyExistsException:()=>Ri,ItemCache:()=>ge,ItemCacheFactory:()=>yi,ItemChangesListenerContext:()=>Qt,ItemChangesListenerContextBase:()=>Bt,ItemCreateService:()=>Dt,ItemEntry:()=>h,ItemEntryService:()=>Ie,ItemHandlerBase:()=>lt,ItemLockedException:()=>Ei,ItemMatcherBase:()=>ot,ItemNotFoundException:()=>y,ItemResource:()=>m,ItemResourceFactory:()=>gi,KeyService:()=>Ce,LINKED_TIME_ITEM_TYPES:()=>mn,LimitedCollectionResource:()=>R,LinkedTimeItemSubprojectBusinessLogicRule:()=>Fn,LockService:()=>Te,MatchesAccumulatorMap:()=>it,MateriaalBulkToSerialBusinessLogicRule:()=>Ys,MateriaalIsCombinationBusinessLogicRule:()=>Ks,MateriaalSerialToBulkBusinessLogicRule:()=>tn,MateriaalToPhysicalBusinessLogicRule:()=>nn,MateriaalToVirtualBusinessLogicRule:()=>on,ModuleChangesCompilation:()=>Ee,ModuleChangesCompilationFactory:()=>Ci,OrderedCollectionResource:()=>T,ParentChangesDelta:()=>St,ProjectClientChangedBusinessLogicRule:()=>nr,PurchaseOrderOwnerBusinessLogicRule:()=>fr,QueryColumnExtractor:()=>Ke,QueryContainsLocalIdParser:()=>Xe,QueryParser:()=>Je,QueryParserBase:()=>be,QueryParserIdUpdater:()=>Ze,QueryService:()=>et,RequestBuffer:()=>Ft,RequestBufferBase:()=>qt,RequestBufferManager:()=>Lt,RequestColumnExpansion:()=>tt,RequestColumnExpansionFactory:()=>vi,RequestColumnsOperationsCache:()=>he,RequestColumnsOperationsCacheFactory:()=>fi,RmCore:()=>Si,RmHolidaysService:()=>ki,SavingInProgressException:()=>_i,ServerCache:()=>rt,ServerCachedQueryHandler:()=>ht,ServerItemHandler:()=>ut,SingleQueryRequestBuffer:()=>kt,SocketMessageHandler:()=>st,SubprojectInPlanningBusinessLogicRule:()=>Or,Template:()=>E,TemplateCache:()=>Pt,TimeColumnUtil:()=>yn,TransactionCache:()=>ft,TransactionCacheFactory:()=>Ii,TransactionCachedQueryHandler:()=>It,TransactionErrorLevel:()=>pt,TransactionEventHandler:()=>ve,TransactionItemHandler:()=>gt,TransactionValidator:()=>vt,TransactionValidatorWithDependencies:()=>Tt,businessLogicRule:()=>$t,copy:()=>J,createPath:()=>k,defaultRequestBufferOptions:()=>wt,equals:()=>X,extend:()=>x,fieldsSignalProxyHandler:()=>ct,findIndex:()=>_,getFirstProperty:()=>w,getPath:()=>L,hasProperties:()=>S,identity:()=>wi,inArray:()=>q,initialProxyHandler:()=>yt,isArray:()=>H,isBlankObject:()=>B,isBoolean:()=>z,isDate:()=>j,isDefined:()=>K,isElement:()=>G,isFunction:()=>U,isNumber:()=>A,isObject:()=>M,isPromiseLike:()=>O,isRegExp:()=>$,isString:()=>Q,isWindow:()=>Y,merge:()=>P,pathExists:()=>F,promiseAllObject:()=>V,promiseCreateDeferred:()=>W,promiseWrapTimeout:()=>N,registeredBusinessLogicRules:()=>ci,shallowMerge:()=>b});const a=7,c=">";var l,u=i(174);!function(e){e.ITEMTABLE="itemtable",e.DIRECT="direct"}(l||(l={}));var d=i(860);class h{itemType;columns;static currentId=0;id=++h.currentId;isLockableSignal=(0,d.signal)(this.isLockable());isLocalSignal=(0,d.signal)(this.isLocal());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 Ce.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 m{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,d.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){const t=this.columns;for(const s in e){void 0===t[s]&&this.factory.errorHandler.logWarning(`setFields: no column found for ${s}`)}const s=this.transaction.createChangesDelta();return s.setItemUpdated(this.entry,e),this.transaction.applyChangesDelta(s).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]=te.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 te.compareFields(s.type,this.fields[e],t[e])}hasChanges(){return this.transaction.itemHandler.detectEntryChanges(this.entry.id)}setTransactionParameters(e){k(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(c),s=e):(n=e,s=e.join(c)),void 0!==this.derivedFieldSignals[s])return this.derivedFieldSignals[s];return this.derivedFieldSignals[s]=(0,d.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(!pe.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 p{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=W(),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 f{queryService;options;query;columns;static currentId=0;id=f.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):Ce.isLocalId(e.itemId)}expandColumns(e){this.columns=e.run(this.columns).merged,this.options.columns=this.columns.request}}class y 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 g{factory;options;transaction;queryGraph;parentCollection;itemType;entry;columns;items=[];itemsSignal=(0,d.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 f(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 y)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 At(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 I=(e,t)=>Number(e)-Number(t),C=(e,t)=>e.localeCompare(t);function v(e){switch(e){case u.ApiEnumApiType.TYPE_NUMBER:case u.ApiEnumApiType.TYPE_DATETIME:case u.ApiEnumApiType.TYPE_TIMESTAMP:case u.ApiEnumApiType.TYPE_TIMESTAMP_MS:case u.ApiEnumApiType.TYPE_DATE:case u.ApiEnumApiType.TYPE_DURATION:case u.ApiEnumApiType.TYPE_VOLUME:case u.ApiEnumApiType.TYPE_WEIGHT:case u.ApiEnumApiType.TYPE_DIMENSION:case u.ApiEnumApiType.TYPE_PRICE:case u.ApiEnumApiType.TYPE_DOUBLE:case u.ApiEnumApiType.TYPE_INT:case u.ApiEnumApiType.TYPE_CURRENT:case u.ApiEnumApiType.TYPE_POWER:case u.ApiEnumApiType.TYPE_DISTANCE:case u.ApiEnumApiType.TYPE_ORDER:return I;case u.ApiEnumApiType.TYPE_TEXT:case u.ApiEnumApiType.TYPE_LONGTEXT:case u.ApiEnumApiType.TYPE_HTML:case u.ApiEnumApiType.TYPE_TIME:return C;default:throw new Error(`ApiType ${e} does not have a sort function`)}}class T extends g{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:v(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 R extends T{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 E{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=pe.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]&&(te.isExpensiveFormat(t.type)?ne.addLazyFormattingFunction(t.id,t.type,t.default,s):s[t.id]=te.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 _(e,t){for(let s=0;s<e.length;s++)if(t(e[s]))return s;return-1}function b(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 w(e){if("object"!=typeof e)return null;for(const t in e)return t;return null}function q(e,t){for(const s of t)if(e==s)return!0;return!1}function F(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 k(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 L(e,t,s=!1){if(void 0!==e){for(const n of t)if(void 0===(e=e[n])&&!s)return;return e}}function D(e,t,s){for(let n=0,r=t.length;n<r;++n){const r=t[n];if(!M(r)&&!U(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&&M(o)?j(o)?e[n]=new Date(o.valueOf()):$(o)?e[n]=new RegExp(o):o.nodeName?e[n]=o.cloneNode(!0):G(o)?e[n]=o.clone():(M(e[n])||(e[n]=H(o)?[]:{}),D(e[n],[o],!0)):e[n]=o}}return e}function x(e,...t){return D(e,t,!1)}function P(e,...t){return D(e,t,!0)}function M(e){return null!==e&&"object"==typeof e}function B(e){return null!==e&&"object"==typeof e&&!Object.getPrototypeOf(e)}function Q(e){return"string"==typeof e}function A(e){return"number"==typeof e}function j(e){return"[object Date]"===toString.call(e)}const H=Array.isArray;function U(e){return"function"==typeof e}function O(e){return e&&U(e.then)}function V(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}))}function N(e,t,s){return Promise.race([e,new Promise(((e,n)=>{window.setTimeout((()=>n(t())),s)}))])}function W(){const e={};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e}function $(e){return"[object RegExp]"===toString.call(e)}function z(e){return"boolean"==typeof e}function G(e){return!(!e||!(e.nodeName||e.prop&&e.attr&&e.find))}function Y(e){return e&&e.window===e}function K(e){return void 0!==e}function X(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(!H(e)){if(j(e))return!!j(t)&&(o=e.getTime(),a=t.getTime(),o===a||o!=o&&a!=a);if($(e))return!!$(t)&&e.toString()===t.toString();if(Y(e)||Y(t)||H(t)||j(t)||$(t))return!1;for(r in i=Object.create(null),e)if(!U(e[r])){if(!X(e[r],t[r]))return!1;i[r]=!0}for(r in t)if(!(r in i)&&K(t[r])&&!U(t[r]))return!1;return!0}if(!H(t))return!1;if(n=e.length,e.length===t.length){for(r=0;r<n;r++)if(!X(e[r],t[r]))return!1;return!0}}var o,a;return!1}function J(e,t,s){const n=[],r=[];if(s=function(e){return A(e)&&e>0}(s)?s:NaN,t){if(e===t)throw new Error("Can't copy! Source and destination are identical.");if(H(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(H(e))for(let n=0,r=e.length;n<r;n++)t.push(o(e[n],s));else if(B(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(!M(e))return e;const s=n.indexOf(e);if(-1!==s)return r[s];if(Y(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(U(e.cloneNode))return e.cloneNode(!0)}(e);return void 0===c&&(c=H(e)?[]:Object.create(Object.getPrototypeOf(e)),a=!0),n.push(e),r.push(c),a?i(e,c,t):c}}var Z=i(416),ee=i.n(Z);class te{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]=te.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"double":case"power":case"volume":case"weight":case"coordinate":case"price":case"percentage":return this.compareFloats(t,s);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 X(t,s)}}static compareFloats(e,t){const s=Math.abs(e),n=Math.abs(t),r=Math.abs(e-t),i=119e-9;return e===t||(0===e||0===t||r<Number.MIN_VALUE?r<i*Number.MIN_VALUE:r/Math.min(s+n,Number.MAX_VALUE)<i)}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?ee().invalid():ee()(e,ee().ISO_8601)}static formatResponseDuration(e){return ee().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 ee().invalid();case"duration":return ee().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 ee().isMoment(t)&&t.isValid();case"duration":return ee().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 ee()(t);case"json":return J(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 ee().duration(e)}static cloneDate(e){return e.clone()}static identity(e){return e}}class se{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 ne{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]=te.formatResponseValue(t,s))})}fetchColumnObject(e){return this.columnMap[e]}fetchDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(c));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(!pe.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 te.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]=te.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];te.isExpensiveFormat(r.type)?ne.addLazyFormattingFunction(r.id,r.type,s[t],n):n[r.id]=te.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(!u.TempItemTypeWithoutFixedIds.includes(e))continue;const t=[];for(const s of this.links[e]){const n=Ce.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 re{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){k(this.compilation.delete,[e.itemType],[[]]).push(e)}addUpdateEntry(e){k(this.compilation.update,[e.itemType,e.itemId],[{},e])}addCreateEntry(e){let t=this.transaction.getParent(e.entry);null===t&&(t=this.getDefaultParent()),k(this.compilation.create,[t.itemType,t.itemId,e.entry.itemType,e.entry.itemId],[{},{},{},e])}}class ie{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 ye(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=L(this.transaction.tabRequestParameters,[e,s]);a.values=o,void 0!==c&&(a.parameters=c),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)q(e.itemId,n)?s.setItemDeleted(e):this.errorHandler.logWarning("Delete failed!",e);return this.serverCache.applyChangesFromParent(s,!0)}))}}class oe{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=pe.parseRequestColumn(s);delete this.pendingCache[e]?.[t.id]}}setPendingColumns(e,t,s){for(const n of t){const t=pe.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=pe.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 ae{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 ce{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=>pe.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];pe.isCustomColumn(r)&&pe.hasLocationProperty(r,me.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 le{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+c+s,this.tailPath=0===t.level?s:t.tailPath+c+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 ue=0;class de{columnSetFactory;itemType;request;requestColumnsTrue;response;id=++ue;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===u.ApiEnumApiType.TYPE_LINK&&(this.link=e),this.main.push(e)),e.isLeaf?this.leaf[n].push(e):s||this.root.push(e),pe.isFilteredColumn(t)&&this.filtered[n].push(e),pe.isSearchableColumn(t)&&this.searchable[n].push(e),pe.isCustomColumn(t)&&this.custom[n].push(e),pe.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(!pe.containsColumn(t,this.request))return!1;return!0}mergeRequestColumns(e){return pe.mergeRequestColumns(this.request,e)}mergeResponseColumns(e){return pe.mergeResponseColumns(this.response,e).merged}expand(e,t,s){const n=pe.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 he{itemType;columnCache;requestColumnsTuple;aggregateColumnsTuple;expandedRequestColumnsTuple;columnsMergedWithTupleMap={};expandedColumnsMergedWithTupleMap={};setContainsAllColumnsMap={};setContainsAllExpandedColumnsMap={};constructor(e,t,s){this.itemType=e,this.columnCache=t,this.requestColumnsTuple=this.createRequestColumnsTuple(pe.copyRequestColumns(s))}getRequestColumnsTuple(e){return e instanceof rt?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 rt?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 rt?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=pe.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=pe.parseRequestColumn(n),r=this.columnCache.getColumn(t,e.id);if(void 0===r)continue;if(pe.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:pe.createRequestColumnSetId(e)}}}var me;!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"}(me||(me={}));class pe{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=w(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)K(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 fe{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??=Ce.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 a;o.type===u.ApiEnumApiType.TYPE_LINK&&void 0===e[s]?null!==r&&(a=r.itemId):a=this.getConversionValue(o.itemType,e[s],n),void 0!==a&&(t[s]=a)}}expandLocalConversionMap(e,t,s,n,r=Ce.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:Ce.getLocalId();const a=s.items[e][o].links;for(const e in a)this.expandLocalConversionMap(e,a[e],s,n,null)}}}class ye{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(Ce.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)Ce.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=L(this.compilation,[i,c.itemId]),u=n.items[i][c.itemId]={},d=L(this.transaction.tabRequestParameters,[i,c.itemId]);if(null!==t&&(n.parentId[c.itemId]=t),s.columns.expandWithColumnSet(c.columns),r[i][o]=c,u.values=te.formatRequestLocal(a.fields,c.columns.main),u.parameters=d,void 0===l)continue;const h=u.links={};for(const e in l){h[e]=[];for(const t in l[e])h[e].push(parseInt(t,10))}this.extendRequest(l,null,s)}}}}class ge{graphQueryParserFactory;transaction;entries={};entriesByEntryId={};constructor(e,t){this.graphQueryParserFactory=e,this.transaction=t}getByEntryId(e){if(void 0===this.entriesByEntryId[e])throw new y(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 y(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 Ie{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===l.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:a,creator:this.userId,created:ee()()}}}class Ce{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 ve{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 Te{apiRequestService;lockItems=(0,d.signal)({});promises={};constructor(e){this.apiRequestService=e}getLocksSignal(){return this.lockItems.asReadonly()}getLocks(){return(0,d.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",Ce.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 Re={};class Ee{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 ft){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}:Re}getItemsByParent(e,t){return this.itemsMappedOnParent[e]?.[t]??{}}}const _e={"=":"!=","!=":"=",">":"<=","<":">=","<=":">",">=":"<"};class be{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(be.isLinkedToQuery(e))return this.parseLinkedToQuery(e.linkedTo,e.query??{},e.reverse??!1,e.not??!1,t);if(be.isCustomQuery(e))return this.parseCustomQuery(e.custom,e.parameters,e.not??!1);if(be.isSearchQuery(e))return this.parseSearchQuery(e.search,e.not??!1);if(be.isQueryWithConditions(e))return this.parseComplexQuery(e.conditions,be.normalizeOperator(e.operator),e.not??!1,t);if(be.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=w(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?_e[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 we 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 qe extends we{apiQuery;constructor(e,t){super(e),this.apiQuery=t}match(e,t,s,n){return Se.matchQueryNodes(this.connectedNodesTuple,e,t,"maybe",n)}}class Fe extends qe{constructor(e){super("CUSTOM:",e)}clone(e){return new Fe(this.apiQuery).copyEdgesFrom(this,e)}}const ke=Symbol("Unsupported query value"),Le={queryToEdgeValue:e=>"number"==typeof e?e:ke,fieldToEdgeValue:e=>e,edgeToEdgeCompareValue:e=>e},De={queryToEdgeValue:e=>null===e?null:"string"==typeof e?e.toLowerCase():ke,fieldToEdgeValue:e=>null===e?e:e.toLowerCase()},xe={queryToEdgeValue:e=>null===e||"number"==typeof e||"boolean"==typeof e?e:ke,fieldToEdgeValue:e=>e},Pe={queryToEdgeValue:e=>"NOW"===e?"NOW":ee().isMoment(e)&&e.isValid()?e.valueOf():ke,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>"NOW"!==e?e:ee().now()},Me={queryToEdgeValue:e=>ee().isMoment(e)?e.isValid()?e.valueOf():null:ke,fieldToEdgeValue:e=>e.isValid()?e.valueOf():null},Be={queryToEdgeValue:e=>ee().isDuration(e)?e.valueOf():ke,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>e};class Qe 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)!==ke)return s;return null}connectLeafNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===ke&&(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===ke&&(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===xe&&e.valueTransformer===De&&(this.valueTransformer=De);for(const s of e.edgeMap.entries())Qe.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&&(Qe.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 Ae=[Le,Pe,Be];class je extends Qe{comparator;compareValue;constructor(e,t,s,n){super(`${t}:${e}`,e,s,n),this.comparator=t,this.compareValue=je.getCompareFunction(this.comparator)}static construct(e,t,s,n){if(!je.isSupportedComparator(s))return null;const r=Qe.findValueTransformer(t,Ae);return null===r?null:new je(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 je(this.columnId,this.comparator,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}const He=[xe,De,Me,Be];class Ue extends Qe{constructor(e,t,s){super(`IS:${e}`,e,t,s)}static construct(e,t,s,n){if("="!==s)return null;const r=Qe.findValueTransformer(t,He);return null===r?null:new Ue(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 Ue(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class Oe extends qe{clone(e){return new Oe(this.apiQuery).copyEdgesFrom(this,e)}constructor(e){super("LI",e)}}const Ve=[xe,De,Me,Be];class Ne extends Qe{constructor(e,t,s){super(`!IS:${e}`,e,t,s)}static construct(e,t,s,n){if("!="!==s)return null;const r=Qe.findValueTransformer(t,Ve);return null===r?null:new Ne(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 Ne(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class We extends we{constructor(e){super("R",e)}clone(e){return(new We).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 $e extends qe{constructor(e){super(`SEARCH:${e.search}`,e)}clone(e){return new $e(this.apiQuery).copyEdgesFrom(this,e)}}class ze extends qe{constructor(e){super("SUB",e)}clone(e){return new ze(this.apiQuery).copyEdgesFrom(this,e)}}const Ge=[Ue,Ne,je];class Ye extends be{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 We,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 l.DIRECT:{const e=new Ue(i.field,xe,r);for(const t of s)e.connectLeafNode(t.value,t.node);return e}case l.ITEMTABLE:{const e=new Ue("item",xe,r);for(const t of s)e.connectLeafNode(t.value,t.node);return new Ue("itemtype",De,r).connectBranchNode(t,e)}}}parseComparatorQuery(e,t,s){let n=null;for(const r of Ge)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=He.find((e=>t.every((t=>e.queryToEdgeValue(t)!==ke))));if(void 0===n)throw new Error(`Could not find supported comparator node: ${e} ${t}`);if(!s){const s=new Ue(e,n,this.errorHandler);for(const e of t)s.connectLeafNode(e,this.queryId);return[s]}const r=new Ne(e,n,this.errorHandler);let i=r;for(let s=0;s<t.length-1;s++)i.connectBranchNode(t[s],i=new Ne(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 Oe({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[Ye.createLinkedToComparatorQueryNode(this.itemType,e,t.map((e=>({value:e,node:this.queryId}))),this.linkTreeService,this.errorHandler)]}return[new Oe({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)]}parseSubQuery(e,t,s,n,r){return[new ze({key:e,itemType:t,field:s,query:n,not:r}).connectLeafNode(this.queryId)]}parseSearchQuery(e,t){return[new $e({search:e,not:t}).connectLeafNode(this.queryId)]}parseCustomQuery(e,t,s){return[new Fe({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 Ke extends be{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 Xe extends be{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 Ce.isLocalId(t)}parseInQuery(e,t){return t.some((e=>Ce.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 Je extends be{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():ee().isMoment(e)?ee()(e):ee().isDuration(e)?ee().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:Je.formatStringParameters("subField",e,t??"",s,o.string,r),isLocallyMatchable:!1}}parseSearchQuery(e,t){const s=Je.formatValue(e);return{object:{search:s.object,not:t},string:Je.formatStringParameters("search",s.string,t),isLocallyMatchable:!1}}parseCustomQuery(e,t,s){if(void 0===t)return{object:{custom:e,not:s},string:Je.formatStringParameters(e,s),isLocallyMatchable:!1};const n=this.parseCustomParameters(t);return{object:{custom:e,parameters:n.object,not:s},string:Je.formatStringParameters(e,n.string,s),isLocallyMatchable:!1}}parseComparatorQuery(e,t,s){const n=Je.formatValue(t);return{object:{key:e,value:n.object,comparator:s},string:Je.formatStringParameters(s,e,n.string),isLocallyMatchable:!0}}parseInQuery(e,t,s){const n=Je.formatValue(t);return{object:{key:e,value:n.object,comparator:"IN",not:s},string:Je.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:Je.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:Je.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=Je.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)=>Je.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 Ze extends be{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 et{containsLocalId(e){return(new Xe).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 tt{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)pe.mergeRequestColumn(n,s[e])}else{const t=s[e];if(!0===t)return;void 0!==t&&pe.containsDerivedColumns(t)||(s[e]=!0)}}get(){return this.columns}}class st{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 Lt(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;"delete"!==e.eventType?this.processMessage(e,s,n,r,t):this.handleDelete(e,s)}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]=te.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 We,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=pe.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 nt{dependencies;core;children=[];itemHandler;cachedQueryHandler;parent;constructor(e,t){this.dependencies=e,this.core=t}*getDescendantsIterator(){for(const e of this.children)yield e,yield*e.getDescendantsIterator()}onChildDestroy(e){const t=this.children.indexOf(e);-1!==t&&this.children.splice(t,1)}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=u.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=u.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 _t?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 bt?e.setItemDeleted({entry:t,changes:this.itemHandler.itemChanges[t.id],isCascaded:!0}):e instanceof St?e.setItemDeleted(t):e.setItemDeletedCascaded(t);const s=u.ApiFieldsOnDeleteRule[t.itemType]?.foreign??{};for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}}}class rt extends nt{dependencies;apiFieldsOnDeleteRule;requestBufferManager;itemHandler;cachedQueryHandler;onDeltaAppliedCallbacks=[];parent=null;constructor(e,t,s){super(e,s),this.dependencies=e,this.apiFieldsOnDeleteRule=t,this.requestBufferManager=new Lt(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 ut(e.errorHandler,e.columnCache,e.itemCacheFactory,e.itemEntryService,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,this),this.cachedQueryHandler=new ht(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 ft(this.dependencies,this.core,this,e,t,s);return this.children.push(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.children.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===l.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 ie(n.apiRequestService,n.changesDeltaFactory,n.errorHandler,this.requestBufferManager,n.requestColumnExpansionFactory,e,new re(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.children.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 it{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 ot{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 it;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];ot.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 it;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())ot.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&&ot.addItemsToMatchingResults(r,t,"maybe",s.maybe),ot.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){ot.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&&ot.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 at={get:(e,t)=>{const s=e.itemHandler.lookUpItemField(e.itemEntry,t);return"displayname"!==t||void 0!==s&&""!==s?s:e.itemHandler.getDisplayName(e.itemEntry)}},ct={get:(e,t)=>e.itemHandler.getItemFieldSignal(e.itemEntry,t)};class lt extends ot{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,d.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},at)}constructSignalFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},ct)}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 te.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(c));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 h(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(!pe.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(!pe.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 ut extends lt{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()??ee().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(),a=[],c=u.TempItemTypeWithoutFixedIds.includes(e);for(const r of t){if(c){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)){a.push(t);continue}throw new y(e,r)}if(Ce.isLocalId(r))throw new y(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()){a.push(t);continue}i.push(r),o.expandWithRequestColumnsTuple(e,s.getAggregateColumns())}else{const n={object:t.columns.request,string:pe.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 a;await this.transaction.requestBufferManager.fetchByIds(e,i,o.get()[e],{forceFlush:r});for(const t of i)a.push(this.entries.get(e,t));return a}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]=te.clone(c.type,s[n]);continue}const l=this.itemFieldLastModified[t.id][n];void 0!==l&&void 0!==i&&l>=i&&!c.isDisplayname&&!pe.isAggregateColumn(c)||(te.compareFields(c.type,s[n],r[n])||("QUERY"===e.mode&&(e.mode="CLEAR_WHEN_SAME"),null===a&&(a={}),a[n]=r[n],r[n]=te.clone(c.type,s[n]),"aggregate"!==c.fieldtype&&"method"!==c.fieldtype&&(this.itemFieldLastModified[t.id][n]=i??ee().now())))}if(void 0!==s.id){const e=t.itemId;t.updateId(s.id),this.entries.updateItemId(t,e)}return a}}class dt{dependencies;transaction;collections={};constructor(e,t){this.dependencies=e,this.transaction=t}createQuery(e){return(new Je).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 it;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.createQueryFromOptions(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 l.ITEMTABLE:o={conditions:[{itemtype:e.itemType},{item:e.itemId}]};break;case l.DIRECT:o={[r.field]:e.itemId}}const a=this.createQuery(i).string,c=this.createQuery(o).string;delete n[a],delete n[c]}}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 We;for(const e of s)n.copyEdgesFrom(e,void 0);if(void 0!==t){const s=new Ue("id",xe,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}createQueryFromOptions(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 Ke(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 p(e,t,r,s,n)}createQueryGraph(e,t){return this.dependencies.graphQueryParserFactory.construct(e,t).run(t.object)}}class ht extends dt{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.children)};s(this),n(this.transaction.children)}*getUncachedCollectionsOnChildTransactionsIterator(e){const t=[],s=e=>{for(const n of e)t.push(n),s(n.children)};s(this.transaction.children);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()}}class mt extends Error{}var pt;!function(e){e.warning="warning",e.error="error"}(pt||(pt={}));class ft extends nt{id;errors={item:(0,d.signal)({}),global:(0,d.signal)({})};firstError=(0,d.computed)((()=>{const e=this.errors.global();for(const t in e){const s=e[t];if(s.level===pt.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===pt.error)return s}}}}));firstErrorString=(0,d.computed)((()=>this.firstError()?.string));rootItemSignal=(0,d.signal)(void 0);rootItemToBeSet;tabRequestParameters={};hasChangesSignal=(0,d.signal)(!1);parent;itemHandler;cachedQueryHandler;eventHandler;validator;validatorWithDependencies;options;actionsQueue=Promise.resolve();numPendingActions=0;transactionStateSignal=(0,d.signal)("Ready");isSavingSignal=(0,d.computed)((()=>"Saving"===this.transactionStateSignal()));isReadySignal=(0,d.computed)((()=>"Ready"===this.transactionStateSignal()));isPendingSignal=(0,d.computed)((()=>{if(this.isSavingSignal()||"Pending"===this.transactionStateSignal())return!0;if(this.children.length>0)for(const e of this.children)if(e.isPendingSignal())return!0;return!1}));isDestroyedSignal=(0,d.signal)(!1);isValidSignal=(0,d.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,...i},this.validator=void 0===r?void 0:r.construct(this),this.parent=s,this.itemHandler=new gt(e,this),this.cachedQueryHandler=new It(e,this),this.eventHandler=new ve(e.errorHandler)}enqueueAction(e,t){return void 0!==t&&this.transactionStateSignal.set(t),this.numPendingActions++,this.actionsQueue=this.actionsQueue.then((()=>N(e(),(()=>new Error("Transaction action timeout out")),8e3))).catch((e=>{this.dependencies.errorHandler.logError(e)})).finally((()=>{this.numPendingActions--,0===this.numPendingActions&&this.transactionStateSignal.set("Ready")}))}get rootItem(){return(0,d.untracked)((()=>this.rootItemSignal()))}get hasChanges(){return(0,d.untracked)((()=>this.hasChangesSignal()))}get isSaving(){return(0,d.untracked)((()=>this.isSavingSignal()))}get isReady(){return(0,d.untracked)((()=>this.isReadySignal()))}get isValid(){return(0,d.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 Qt(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,d.untracked)((()=>this.isPendingSignal()))}setPending(e){return this.enqueueAction("function"==typeof e?()=>e((e=>this.doApplyChangesFromUser(e))):()=>e,"Pending")}createChild(e,t,s){if(this.options.transparent)return this.parent.createChild(e,t,s);const n=new ft(this.dependencies,this.core,this,e,t,s);return this.children.push(n),n}createBusinessLogicChild(){return new ft(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)}isDestroyed(){return(0,d.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(null===r.parent)throw new Error("TransactionCache: invalid collection map passed to expandCollectionResources");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.createBatchLinkedToQuery(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,d.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();k(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.children.map((e=>e.applyChangesFromParent(n,t,s))));for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}applyChangesDelta(e){this.isDestroyed()&&this.dependencies.errorHandler.logWarning(`TransactionCache: tried to apply changes to destroyed transaction with id: '${this.id}'`);const t=W();return this.enqueueAction((()=>this.doApplyChangesFromUser(e).then((e=>(t.resolve(e),e.allChildrenDonePromise))).catch((e=>t.reject(e))))),t.promise}async doApplyChangesFromUser(e){if(e.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};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 t=await this.dependencies.businessLogicManager.handleBusinessLogic(this,e);return null===t?{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()}:this.doApplyChangesFromChild(t)}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 rt?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&&e.isLockable()}async save(e=!1,t={},s,n){if("Pending"===this.transactionStateSignal())throw new mt("TransactionCache: Transaction cannot be saved since it (or its children) are pending");return await this.fetchLock(),await this.eventHandler.executeCallbacks("onBeforeSave",(e=>e(this)),e),this.enqueueAction((()=>this.doSave(e,t,s,n)),"Saving")}async doSave(e=!1,t={},s,n){let r;return this.parent instanceof ft?(await this.parent.applyChangesFromChild(this,P(this.tabRequestParameters,t)),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),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 Ei(e.message)})):Promise.resolve()}detectChanges(e=!1){return!(!this.hasChanges||e)||(this.itemHandler.detectChanges()?(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=e.options.parent.itemId,s=this.dependencies.collectionResourceFactory.construct(e,null,this,i);o[t]=s,a.push(s)}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,Ce.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){return this.tabRequestParameters=P(this.tabRequestParameters,t),this.enqueueAction((()=>this.doApplyChangesFromChild(e)))}async doApplyChangesFromChild(e){for(const t of e.cachedQueryHandler.getCachedQueryItemIterator())void 0===this.cachedQueryHandler.getCachedQueryItem(t.itemType,t.query.string)&&this.cachedQueryHandler.cloneCachedQuery(t);const t=e.getDelta();this.handleCascadingDeletes(t);const s=this.dependencies.changesDeltaFactory.constructParentDelta(t),n=[];for(const e in t.created){const r=t.created[e];n.push(this.itemHandler.entries.add(r.entry));const i=this.itemHandler.itemChanges[r.entry.id]=this.itemHandler.copyTransactionItemEntryChanges(r.fields,r.entry);s.setItemCreated(r.entry,i),this.itemHandler.maybeSetRootItem(r.entry)}await this.expandLocalItemsFromDelta(s.created,t.updated),this.itemHandler.processUpdatesFromDelta(t.updated,!0,s);for(const e of t.getDeleteTuplesIterator())s.setItemDeleted(e.entry),this.itemHandler.addToDeletedItems(e.entry,e.isCascaded);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(s,void 0,!0),i=await this.cachedQueryHandler.applyMatchingResultsToCollections(r);if(this.runChangesListenersAndValidators(i,s,void 0,!1),this.clearChildCollectionResources(i),void 0!==this.validator)try{this.validator.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}return{changesDelta:t,created:n,allChildrenDonePromise:Promise.all(this.children.map((e=>e.applyChangesFromParent(s)))).then((()=>{for(const e of t.getDeleteTuplesIterator())this.clearItemEntry(e.entry);this.detectChanges(!0)}))}}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({})}updateSignals(e,t){for(const t of e){const e=t.collectionResource;(t.addedItems.length>0||t.removedItems.length>0)&&e.itemsSignal.set([...e.items])}for(const e in t.updated){const s=this.itemHandler.itemFieldSignals[e];if(void 0===s)continue;const n=t.updated[e].changes.fields;for(const e in n)s[e]?.set(n[e])}}runChangesListenersAndValidators(e,t,s,n){if(this.updateSignals(e,t),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 Qt(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 Qt(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 yt={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 gt extends lt{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},yt)}*getItemEntriesWithChangesIterator(){for(const e in this.itemChanges)try{yield this.transaction.getLocalItemEntry(Number(e))}catch(e){this.dependencies.errorHandler.logError(e)}}processUpdatesFromDelta(e,t,s){for(const n in e){const r=e[n];if(this.itemIsDeleted(r.entry))continue;const i=this.processItemEntryChanges(r,t);s.setItemUpdated(r.entry,r.changes.fields,i,r.mode)}}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];for(const n of r.columns.item.main)n.apiColumn.itemType===e&&i[n.id]===t&&(i[n.id]=s);const o=r.columns.response[r.itemType];"itemtype"in o&&"item"in o&&i.itemtype===e&&i.item===t&&(i.item=s)}}registerFieldChangeCallback(e,t,s){k(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]=te.copyFields(e.fields,{},e.columns.main),this.itemChanges[t.id].id=t.itemId,t}formatRequest(e){return void 0===this.itemChanges[e.id]?{}:te.formatRequestLocal(this.itemChanges[e.id],e.columns.main)}detectChanges(){for(const e in this.itemChanges)return!0;for(const e in this.deletedItems)if(this.deletedItems[e].length>0)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=te.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 Ri(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 Ri(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||Ce.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 e of t.difference.main)void 0===s[e.id]&&(s[e.id]=te.formatResponseValue(e.apiColumn.type,e.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 a=this.itemFieldSignals[s.id];if(void 0!==a)for(const t in e.changes.fields){const s=a[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,a=this.entries.containsByEntryId(s.id);switch(o={},e.mode){case"CLEAR_ALWAYS":if(a)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&&(te.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!==u.ApiEnumApiType.TYPE_LINK&&(te.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]&&te.compareFields(n[e].type,t[e],r[e])&&delete r[e];break;case"KEEP_WHEN_DIFFERENT":for(const e in t){if(void 0===r[e]&&null!==i){void 0!==i[e]&&(o[e]=i[e]);continue}const c=n[e];if(void 0===c)continue;const l=a?void 0:this.transaction.parent.itemHandler.lookUpItemField(s,e),u=void 0!==l&&te.compareFields(c.type,t[e],l);void 0!==r[e]?(te.compareFields(c.type,t[e],r[e])||(o[e]=r[e],u||(r[e]=te.clone(c.type,t[e]))),u&&delete r[e]):u||(o[e]=l,r[e]=te.clone(c.type,t[e]))}}S(r)||delete this.itemChanges[s.id]}return S(o)?o: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:pe.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 It extends dt{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 ht&&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 rt&&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 rt&&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):Ce.isLocalId(e.parent.itemId)}async __fetchLinkedCachedQueryItems(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}createBatchLinkedToQuery(e,t,s){let n={conditions:[{linkedTo:e,query:{id:t}}]};return void 0!==s&&(n=this.dependencies.queryService.addAndCondition(n,s)),this.createQuery(n)}processLinkCollectionOptions(e,t,s,n){if(0===s.length)throw new Error("Expected `parentItemIds` to have at least one element");const r=[],i=[];let o;for(const a of s){let s,c;void 0===o?(s=this.cloneOptions(n,{itemType:t,itemId:a}),c=this.createQueryFromOptions(s),this.expandColumnsWithQueryColumns(e,s,c.object),o=s):(s=this.cloneOptions(o,{itemType:t,itemId:a}),c=this.createQueryFromOptions(s)),r.push({options:s,parsedQuery:c}),i.push({value:a,node:c})}const a=void 0===o.query?new We:this.dependencies.graphQueryParserFactory.construct(e,i[0].node).run(o.query);return{collectionQueryTuples:r,batchQuery:this.createBatchLinkedToQuery(t,s,n.query),batchQueryGraph:a.clone((s=>{s.leafNodes=[],Se.addBranchNode(s,Ye.createLinkedToComparatorQueryNode(e,t,i,this.dependencies.linkTreeService,this.dependencies.errorHandler))}))}}__fetchParentCachedQueryItem(e,t){const s=this.createQueryFromOptions(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.processLinkCollectionOptions(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}])).cachedQueryItemTuples[0]}cloneOptions(e,t){const s={...e};void 0!==t&&(s.parent=t);const n=e.children;if(void 0!==n){const e={};for(const t in n)e[t]=this.cloneOptions(n[t]);s.children=e}return s}async fetchChildCachedQueryItems(e){const t=await Promise.all(e.map((e=>this.__fetchLinkedCachedQueryItems(e.itemType,e.linkCollectionOptions)))),s=[];for(let n=0;n<e.length;n++)s.push(this.resolveParentCachedQueryItems(e[n].itemType,t[n]));return Promise.all(s)}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 Ze(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{itemType:e,cachedQueryItemTuples:t};const s=t[0].options.children;if(null===s)return{itemType:e,cachedQueryItemTuples:t};const n=t.map((e=>e.cachedQueryItem.items.map((e=>e.itemId)))),r=n.flat();if(0===r.length)return{itemType:e,cachedQueryItemTuples:t};const i=[];for(const t in s)i.push({itemType:t,linkCollectionOptions:this.processLinkCollectionOptions(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{itemType:e,cachedQueryItemTuples: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 Ct{transaction;lastCallIdMap={global:(0,d.signal)({}),item:(0,d.signal)({})};isPendingSignal=(0,d.computed)((()=>S(this.lastCallIdMap.global())||S(this.lastCallIdMap.item())));_lastCallId=0;constructor(e){this.transaction=e}isPending(){return(0,d.untracked)((()=>this.isPendingSignal()))}setItemError(e,t,s,n,r,i=r,o=pt.error,a){const c=this.getHash(e,t,s);if(!O(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=pt.error){if(!O(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 vt extends Ct{hasFields(e,t){return t.every((t=>Object.prototype.hasOwnProperty.call(e,t)))}}class Tt extends Ct{dependencies}class Rt{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 Et extends Error{constructor(e,t){super(`Missing column '${t}' for item with type '${e.itemType}' and ID '${e.itemId}'`)}}class _t extends Rt{logMissingColumnErrors;errorHandler;itemCreateService;created=new xt;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 te.shallowCopyFields(t,o.changes.fields,a.response[e.itemType],this.logMissingColumnErrors?t=>this.errorHandler.logError(new Et(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 bt extends Rt{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];te.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 Rt{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];te.shallowCopyFields(t,r.changes.fields,i),null!==s&&(null!==r.previous?te.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 wt={forceFlush:!1,flushTimeout:window.IS_IN_TEST?0:150,limit:void 0};class qt{apiRequestService;itemType;options;deferred=W();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 Ft extends qt{contents={queries:new Map,singleItemIds:new Set};static constructWithSingleItems(e,t,s,n,r,i){return new Ft(e,t,s,i)._addSingleItems(n,r)}static constructWithQuery(e,t,s,n,r,i){return new Ft(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 kt extends qt{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 Lt{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(Ft.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?Ft.constructWithQuery(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r):new kt(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}processOptions(e={}){const t={};let s;for(s in wt)t[s]=void 0!==e[s]?e[s]:wt[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 Dt{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:Ce.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 xt{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){const t=this.tuples[e[0]];return void 0===t?{next:function(){return{value:void 0,done:!0}},[Symbol.iterator]:function(){return this}}:t.values()}for(const t of e){if(void 0!==this.tuples[t])for(const e of this.tuples[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 Pt{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=pe.mergeResponseColumns(s,e).merged;return new E(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 Mt={get:(e,t)=>{const s=e.previous[t];return void 0!==s?s:e.itemHandler.lookUpItemField(e.itemEntry,t)}};class Bt{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},Mt)}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 pe.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 Qt extends Bt{isCalledAfterSocketUpdate;constructor(e,t,s,n,r,i=!1){super(e,t.collectFields(e.entry),t,s,n,i),this.isCalledAfterSocketUpdate=r}}class At extends Bt{collectionResource;isCalledAfterSocketUpdate;constructor(e,t,s,n,r){super(t,t.fields,t.transaction.itemHandler,n,r),this.collectionResource=e,this.isCalledAfterSocketUpdate=s}}class jt{transaction;previousChangesDelta;constructor(e,t){this.transaction=e,this.previousChangesDelta=t}}const Ht=Symbol("Skip rule"),Ut=Symbol("Continue with defaults"),Ot=Symbol("Stop execution");class Vt{locals;hasFlag;getAccountSettings;confirm=null;postDependencyConfirm=null;constructor(e,t,s){this.locals=e,this.hasFlag=t,this.getAccountSettings=s}}class Nt extends jt{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?Ht: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];te.compareFields(i.type,n,s)&&r.push(e.entry.itemId)}return 0===r.length?Ht:r}}class Wt extends jt{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 $t(e){return function(t){t.__name=e}}function zt(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}const Gt=["recureind","recurperiode","recurhoe"];let Yt=class extends Vt{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?Ht:n}async dependency(e,t){return e.getItemsById(this.itemType,t,{columns:[...Gt,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"}}};Yt=zt([$t("RecurrentItemRecureindBusinessLogicRule")],Yt);let Kt=class extends Yt{itemType="Afspraak";toField="tot"};Kt=zt([$t("AfspraakRecureindBusinessLogicRule")],Kt);let Xt=class extends Yt{itemType="Beschikbaarheid";toField="plantot"};Xt=zt([$t("BeschikbaarheidRecureindBusinessLogicRule")],Xt);const Jt=["straat","huisnummer","postcode","stad","provincie","land"],Zt=["bezoek","post","factuur"];let es=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Contact"),s=[];for(const n of t)Jt.some((t=>e.previousChangesDelta.hasUpdatedValue(n.entry,`bezoek${t}`)))&&s.push(n.entry.itemId);return 0===s.length?Ht:s}async dependency(e,t){const s=[];for(const e of Zt)for(const t of Jt)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,Jt.reduce(((e,t)=>(e[`prefix${t}`]=n.fields[`bezoek${t}`],e)),{}))}addressEqualsVisitingAddress(e,t){for(const s of Jt)if(e.fields[t+s]!==e.fields["bezoek"+s])return!1;return!0}};es=zt([$t("ContactAddressBusinessLogicRule")],es);const ts=["defaultvalue"];let ss=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Customfield","linkedItemType")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ts})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{defaultvalue:null})}};ss=zt([$t("CustomFieldLinkedItemTypeBusinessLogicRule")],ss);const ns=["defaultvalue","attributes","type"];let rs=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Customfield","type")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ns})}apply(e,t){for(const s of t){const t=s.fields.type;let n;n="enum"===t?0:te.getDefaultValue(t),e.setItemUpdated(s.entry,{defaultvalue:n,attributes:{}})}}};rs=zt([$t("CustomFieldTypeBusinessLogicRule")],rs);const is={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"}},os=["id","contactpersoon"];let as=class extends Vt{condition(e){const t={};let s=!1;for(const n of e.previousChangesDelta.getUpdatedTuplesIterator()){const r=is[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:Ht}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:os})}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=is[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})}}}};as=zt([$t("DefaultContactPersonUpdateBusinessLogicRule")],as);const cs=["Factuur","Offerte","Contract","Bon","Inhuurbon","Materiaalbon","Medewerkerbon","Aanmaning","Reparatiebon","Voertuigbon"],ls=["filename","betreft"];let us=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator(...cs),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:Ht}dependency(e,t){const s={};for(const n in t)s[n]=e.getItemsById(n,t[n],{columns:ls});return V(s)}apply(e,t){for(const s in t)for(const n of t[s])e.setItemUpdated(n.entry,{filename:"",betreft:""})}};us=zt([$t("DocumentTemplateBusinessLogicRule")],us);const ds=["actief"];let hs=class extends Vt{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Exemplaar"),s=[],n=ee()();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?Ht:s}async dependency(e,t){return e.getItemsById("Exemplaar",t,{columns:ds})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{actief:!0})}};hs=zt([$t("ExemplaarAanschafdatumBusinessLogicRule")],hs);let ms=class extends Vt{condition({previousChangesDelta:e}){const t=e.getDeletedItemEntriesIterator("Exemplaar"),s=[];for(const e of t)s.push(e.itemId);return 0===s.length?Ht: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)}};ms=zt([$t("ExemplaarBarcodeDeleteBusinessLogicRule")],ms);const ps=["vervaldatum","datum","betalingsconditie"],fs=["id","dagen"];let ys=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","betalingsconditie")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:ps}),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:fs})).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")})}}};ys=zt([$t("FactuurBetalingsconditieBusinessLogicRule")],ys);const gs=["id","taxschema","vervaldatum","betalingsconditie","datum"],Is=["id","dagen"];let Cs=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","datum")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:gs}),n=[...new Set(s.map((e=>e.fields.betalingsconditie)).filter((e=>null!==e)))],r=await e.getItemsById("Betalingsconditie",n,{columns:Is}),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")})}};Cs=zt([$t("FactuurDatumBusinessLogicRule")],Cs);const vs=["nummer"];let Ts=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","numberseries")}async dependency(e,t){return e.getItemsById("Factuur",t,{columns:vs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{nummer:null})}};var Rs;Ts=zt([$t("FactuurNumberseriesBusinessLogicRule")],Ts);const Es=["name","friendlyname"];let _s=Rs=class extends Vt{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?Ht:n}async dependency(e,t){return e.getItemsById("Files",t,{columns:Es})}apply(e,t){for(const s of t)for(const t of Es){const n=Rs.getExtension(s.initial[t]);if(null===n)continue;const r=Rs.getExtension(s.fields[t]);null!==r&&r===n||e.setItemUpdated(s.entry,{[t]:s.fields[t]+n})}}};_s=Rs=zt([$t("FilesNameExtensionBusinessLogicRule")],_s);const bs=["naamintern","naamofferte"];let Ss=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Functie","naamofferte")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:bs})}apply(e,t){for(const s of t)""===s.fields.naamintern.trim()&&e.setItemUpdated(s.entry,{naamintern:s.fields.naamofferte})}};Ss=zt([$t("FunctieNaaminternBusinessLogicRule")],Ss);let ws=class extends Yt{itemType="Functie";toField="plantot"};ws=zt([$t("FunctieRecureindBusinessLogicRule")],ws);const qs=["twoway","afstand","afstand_van_locatie",{subproject:[{locatie:["kilometers"]}]}];function Fs(e,t){return t.getDerivedValue(["subproject","locatie","kilometers"])*(e.transaction.itemHandler.lookUpItemField(t.entry,"twoway")?2:1)}let ks=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","afstand_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:qs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:Fs(e,s)})}};ks=zt([$t("FunctieTravelDistanceFromLocationBusinessLogicRule")],ks);let Ls=class extends Vt{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?Ht:s}async dependency(e,t){return(await e.getItemsById("Functie",t,{columns:qs})).filter((e=>e.fields.afstand_van_locatie))}apply(e,t){for(const s of t){const t=Fs(e,s);s.fields.afstand!==t&&e.setItemUpdated(s.entry,{afstand_van_locatie:!1})}}};Ls=zt([$t("FunctieTravelDistanceUnlinkLocationBusinessLogicRule")],Ls);const Ds=[{subproject:[{locatie:["reistijd"]}]}];let xs=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","reistijd_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ds})}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})}}};xs=zt([$t("FunctieTravelTimeFromLocationBusinessLogicRule")],xs);const Ps=["afstand","twoway"];let Ms=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Functie","twoway")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ps})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:s.fields.afstand*(s.fields.twoway?2:.5)})}};Ms=zt([$t("FunctieTwowayBusinessLogicRule")],Ms);const Bs=["subproject"];let Qs=class extends Vt{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?Ht:s}dependency(e,t){return Promise.all(t.map((t=>e.getItemsByQuery("Functie",{functiegroep:t.itemEntry.itemId},{columns:Bs}))))}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})}};Qs=zt([$t("FunctiegroepSubprojectBusinessLogicRule")],Qs);const As=["id","aantal","parent","materiaal"];class js extends Vt{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?Ht:n}async dependency(e,t,s){const n=await e.getItemsById(this.itemType,t,{columns:As}),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 Hs=class extends js{itemType="Inhuurmateriaal"};Hs=zt([$t("InhuurmateriaalAantalRoundUpBusinessLogicRule")],Hs);class Us extends Error{context;constructor(e,t){super(e),this.context=t}}const Os=["id","aantal","aantaltotaal","parent","materiaal"],Vs=[...Os,"categorie"],Ns=[...Os,"inhuurgroep"];class Ws extends Vt{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?Ht: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 Us("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 Us("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 $s=class extends Ws{itemType="Inhuurmateriaal";groupingProperties={itemType:"Inhuurgroep",columnId:"inhuurgroep"};requestColumns=Ns};$s=zt([$t("InhuurmateriaalAantaltotaalBusinessLogicRule")],$s);const zs=["is_combination"],Gs=["equipment"];let Ys=class extends Vt{async dependency(e,t){const s=t.filter((e=>!Ce.isLocalId(e))),n=s.length>0?e.cachedQueryHandler.__fetchCachedQueryItem("Voorraadmutatie",{columns:["id"],query:{conditions:[{key:"datum",value:ee()(),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:zs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:Gs}),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)}};Ys=zt([$t("MateriaalBulkToSerialBusinessLogicRule")],Ys);let Ks=class extends Vt{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)}};Ks=zt([$t("MateriaalIsCombinationBusinessLogicRule")],Ks);const Xs=["is_physical","is_combination","telexemplaren","can_edit_content_during_planning"];let Js=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:Xs})}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})}};Js=zt([$t("MateriaalIsPhysicalCombinationBulkBusinessLogicRule")],Js);const Zs=["is_combination"],en=["equipment"];let tn=class extends Vt{async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Zs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:en})]);return{materiaalResources:s,containerContentResources:n}}apply(){}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!1)}};tn=zt([$t("MateriaalSerialToBulkBusinessLogicRule")],tn);const sn=["is_combination","verhuur","can_edit_content_during_planning"];let nn=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!0)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:sn})}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}))}};nn=zt([$t("MateriaalToPhysicalBusinessLogicRule")],nn);const rn=["is_combination","can_edit_content_during_planning"];let on=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:rn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{is_combination:!0,can_edit_content_during_planning:!0})}};on=zt([$t("MateriaalToVirtualBusinessLogicRule")],on);const an=["type","is_combination","is_physical","can_edit_content_during_planning"];let cn=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:an})}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})}}};cn=zt([$t("MateriaalTypePropertiesBusinessLogicRule")],cn);const ln=["is_combination","is_physical"];let un=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","verhuur",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:ln})}apply(e,t){for(const s of t)s.fields.is_physical&&e.setItemUpdated(s.entry,{is_combination:!1})}};un=zt([$t("MateriaalVerhuurBusinessLogicRule")],un);const dn=["width","height","oppervlakteartikel","nieuwprijs","inhuurprijs","verhuurprijs","naam"];let hn=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:dn})}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)}}};hn=zt([$t("SurfaceArticleSizeBusinessLogicRule")],hn);const mn=["MateriaalCat","Functie","Functiegroep"],pn=["type","isStart","defaultValue"],fn={schema_gv:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_gv_begin",value:"gebruikvan",opposite:"schema_gt",plan:"schema_pv",isStart:!0},schema_gt:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_gt_begin",value:"gebruiktot",opposite:"schema_gv",plan:"schema_pt",isStart:!1},schema_pv:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_pv_begin",value:"planvan",opposite:"schema_pt",usage:"schema_gv",isStart:!0},schema_pt:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_pt_begin",value:"plantot",opposite:"schema_pv",usage:"schema_gt",isStart:!1},gebruikvan:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gv",opposite:"gebruiktot",plan:"planvan",isStart:!0},gebruiktot:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gt",opposite:"gebruikvan",plan:"plantot",isStart:!1},planvan:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pv",opposite:"plantot",usage:"gebruikvan",isStart:!0},plantot:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pt",opposite:"planvan",usage:"gebruiktot",isStart:!1},schema_pv_begin:{type:u.ApiEnumApiType.TYPE_BOOL,usage:"schema_gv_begin",defaultValue:!0},schema_pt_begin:{type:u.ApiEnumApiType.TYPE_BOOL,usage:"schema_gt_begin",defaultValue:!1},schema_gv_begin:{type:u.ApiEnumApiType.TYPE_BOOL,plan:"schema_pv_begin",defaultValue:!0},schema_gt_begin:{type:u.ApiEnumApiType.TYPE_BOOL,plan:"schema_pt_begin",defaultValue:!1},duur:{type:u.ApiEnumApiType.TYPE_DURATION},timeframe:{type:u.ApiEnumApiType.TYPE_ITEM}};class yn{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!==fn[e]}static getColumnInstance(e){if(void 0!==this.columnInstances[e])return this.columnInstances[e];const t=fn[e],s={id:e};this.columnInstances[e]=s;for(const e in t)s[e]=pn.includes(e)?t[e]:this.getColumnInstance(t[e]);return s}static*getColumnIdIterator(e){for(const t in fn)"timeframe"===t&&"Functie"!==e||(yield t)}static getColumnIds(e){return[...this.getColumnIdIterator(e)]}static getDefaultValues(e,t={id:null,van:ee().invalid(),tot:ee().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:ee().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]=te.clone(fn[e].type,t[e]);return s}static compareValues(e,t,s){const n=this.getColumnIdIterator(e);for(const e of n)if(!te.compareFields(fn[e].type,t[e],s[e]))return!1;return!0}}class gn extends Vt{conditionColumns;extractUpdatedTuples(e,t=!1){const s=e.previousChangesDelta.getUpdatedTuplesIterator(...mn),n=mn.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(...mn);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 mn.every((e=>0===t[e].size))?Ht:t}async fetchLinkedItemResourcesWithColumns(e,t,s){return V(mn.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,mn.reduce(((e,t)=>(e[t]=s,e)),{}))}}const In=["gebruikvan","gebruiktot"],Cn=[...In,"duur"];let vn=class extends gn{conditionColumns=In;condition(e){return this.extractUpdatedTuplesCondition(e)}apply(e,t){for(const s of mn)for(const n of t[s]){const t=n.fields.gebruikvan,s=n.fields.gebruiktot;t.isValid()&&s.isValid()&&e.setItemUpdated(n.entry,{duur:ee().duration(s.diff(t))})}}dependency(e,t){return this.fetchLinkedItemResources(e,t,Cn)}};vn=zt([$t("LinkedTimeItemDurationBusinessLogicRule")],vn);const Tn=["van","tot","is_absolute_times_substitute"],Rn=["id",...yn.valueColumnIds,...yn.schemeStartColumnIds,{schema_pv:Tn},{schema_pt:Tn},{schema_gv:Tn},{schema_gt:Tn}];let En=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("MateriaalCat"),s=new Map;for(const n of t){const t=n.entry;for(const n of yn.valueColumnIds){if(void 0===e.previousChangesDelta.getUpdatedValue(t,n)||null===e.transaction.itemHandler.lookUpItemField(t,yn.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?Ht:s}dependency(e,t){return e.getItemsById("MateriaalCat",[...t.keys()],{columns:Rn})}apply(e,t,s){for(const n of t){const t=s.get(n.fields.id);for(const s of t){const t=yn.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()})}}}};En=zt([$t("LinkedTimeItemMateriaalCatBusinessLogicRule")],En);const _n=["project","subproject"],bn=yn.schemeValueColumnIds,Sn=[...bn,..._n],wn=["id","project","subproject","is_absolute_times_substitute"],qn=[...yn.schemeValueColumnIds,"timeframe"];let Fn=class extends gn{conditionColumns=_n;async condition(e){const t=this.extractUpdatedTuples(e,!0);if(mn.every((e=>0===t[e].size)))return Ht;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:wn}),r=this.validateLinkedTimes(s,n);return mn.every((e=>0===r[e].length))?Ht:r}apply(e,t,s){for(const t of mn)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 mn){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 mn)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?qn:bn;for(const s of t){const t=e.fields[s];null!==t&&(yield{timeId:t,columnId:s})}}};Fn=zt([$t("LinkedTimeItemSubprojectBusinessLogicRule")],Fn);const kn=[...yn.valueColumnIds,...yn.schemeStartColumnIds],Ln=["id","van","tot"];let Dn=class extends gn{conditionColumns=yn.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:Ln}),this.fetchLinkedItemResources(e,t,kn)]);return{timeResources:n,linkedTimeItemResources:r}}apply(e,t,s){for(const n of mn)for(const[r,i]of s[n])for(const s of i){const n=yn.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 mn)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]}};Dn=zt([$t("LinkedTimeItemTimeSchemeBusinessLogicRule")],Dn);let xn=class extends gn{conditionColumns=yn.schemeValueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,yn.schemeValueColumnIds)}apply(e,t,s){for(const n of mn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=yn.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]})}}}};xn=zt([$t("LinkedTimeItemTimeSchemeStartBusinessLogicRule")],xn);const Pn=[...yn.valueColumnIds,...yn.schemeValueEndColumnIds];let Mn=class extends gn{conditionColumns=yn.valueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,Pn)}apply(e,t,s){for(const n of mn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=yn.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]})}}}};Mn=zt([$t("LinkedTimeItemTimeValueStartBusinessLogicRule")],Mn);const Bn=["vervaldatum","datum"];let Qn=class extends Vt{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:Ht}async dependency(e,t){return V({Offerte:e.getItemsById("Offerte",t.Offerte,{columns:Bn}),Contract:e.getItemsById("Contract",t.Contract,{columns:Bn})})}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")})}};Qn=zt([$t("OfferteContractDatumBusinessLogicRule")],Qn);let An=class extends js{itemType="Planningmateriaal"};An=zt([$t("PlanningmateriaalAantalRoundUpBusinessLogicRule")],An);let jn=class extends Ws{itemType="Planningmateriaal";groupingProperties={itemType:"MateriaalCat",columnId:"categorie"};requestColumns=Vs};jn=zt([$t("PlanningmateriaalAantaltotaalBusinessLogicRule")],jn);const Hn=["id","optie","parent"],Un=["id","optie","categorie","parent",{materiaal:["is_combination","is_physical"]}];let On=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","optie")}async dependency(e,t){const s=await e.getItemsById("Planningmateriaal",t,{columns:Un}),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:Hn}),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))}};On=zt([$t("PlanningmateriaalOptieBusinessLogicRule")],On);const Vn=["parent","setcontent"];let Nn=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","parent")}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Vn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{setcontent:null})}};Nn=zt([$t("PlanningmateriaalParentBusinessLogicRule")],Nn);const Wn=["aantaltotaal","stays_at_location",{categorie:[{project:[{projecttype:["type"]}]}]}];let $n=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","aantaltotaal",!0)}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Wn})}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})}};$n=zt([$t("PlanningmateriaalStaysAtLocationBusinessLogicRule")],$n);const zn={planning:"planvan",travel:"reistijd_vooraf",factor:-1},Gn={planning:"plantot",travel:"reistijd_achteraf",factor:1},Yn=["vervoer","functie",zn.planning,Gn.planning],Kn=["id",zn.travel,Gn.travel],Xn={geen:[],heen:[zn],terug:[Gn],retour:[zn,Gn]};let Jn=class extends Vt{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:Ht}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Planningpersoneel",t.Planningpersoneel,{columns:Yn}),e.getItemsById("Planningtransport",t.Planningtransport,{columns:Yn})]),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:Kn})).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,Xn[n.initial.vervoer],-1,s.initial),this.updatePlanningColumns(e,n,Xn[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())})}};Jn=zt([$t("PlanningPersoneelTransportBusinessLogicRule")],Jn);const Zn=["factuurmoment","taxschema"],er=["korting_personeel","korting_transport","korting_verkoop","korting_verhuur","korting_totaal","verzekering"],tr=["factuurmoment","taxschema","personeelkorting","transportkorting","verkoopkorting","verhuurkorting","totaalkorting","verzekering","verzekering_aangepast"],sr={Project:{factuurmoment:"factuurmoment",taxschema:"taxschema"},Subproject:{personeelkorting:"korting_personeel",transportkorting:"korting_transport",verkoopkorting:"korting_verkoop",verhuurkorting:"korting_verhuur",totaalkorting:"korting_totaal",verzekering:"verzekering"}};let nr=class extends Vt{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(V({projectId:r.entry.itemId,clientId:s,hasEqualValues:this.valuesEqual(r.entry.itemId,s,t)}))}if(0===n.length)return Ht;const r=(await Promise.all(n)).filter((e=>!e.hasEqualValues));return 0===r.length?Ht: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]=V({projectResource:e.getItemById("Project",t,{columns:Zn}),subprojectCollection:e.getCollection("Subproject",{parent:{itemType:"Project",itemId:t},columns:er}),clientResource:e.getItemById("Contact",r,{columns:tr})})}return V(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 V({projectResource:s.getItemById("Project",e,{columns:Zn}),subprojectCollection:s.getCollection("Subproject",{parent:{itemType:"Project",itemId:e},columns:er}),clientResource:s.getItemById("Contact",t,{columns:tr})}),r=n.subprojectCollection.items,i=n.clientResource.fields;let o,a;for(const e of r)for(o in sr.Subproject)if(a=sr.Subproject[o],("verzekering"!==o||i.verzekering_aangepast)&&("taxschema"!==o||null!==i.taxschema)&&e.fields[a]!==i[o])return!1;for(o in sr.Project)if(a=sr.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=sr[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)}};nr=zt([$t("ProjectClientChangedBusinessLogicRule")],nr);const rr=["opdrachtgever","locatie"],ir=["projectnotitie_naam","projectnotitie"],or=["naam","omschrijving"];let ar=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Project"),s=[];for(const n of t){const t=rr.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:Ht}async dependency(e,t){const s=Promise.all(t.map((t=>V({projectId:t.projectId,Contact:e.getItemsById("Contact",[...t.updatedContactIds],{columns:ir}),Projectnotitie:e.getItemsByQuery("Projectnotitie",{},{parent:{itemType:"Project",itemId:t.projectId},columns:or})}))));return V({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(Ce.getLocalId(),{...t.template.getFields(),naam:r,omschrijving:i,project:s.projectId},t.template.getMainColumnSet()))}}};ar=zt([$t("ProjectContactProjectNoteBusinessLogicRule")],ar);const cr=["id","locatie"],lr=["id","locatie","locatie_persoon"];let ur=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Project","locatie")}dependency(e,t){const s={};for(const n of t)s[n]=V({subprojectResources:e.getItemsByQuery("Subproject",{project:n},{columns:cr}),projectResource:e.getItemById("Project",n,{columns:lr})});return V(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})}}};ur=zt([$t("ProjectOneSubLocationAlignBusinessLogicRule")],ur);const dr=["gebruiksperiode","planperiode","transport_pickup","transport_return"];let hr=class extends Vt{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Project","Subproject"),s={Project:[],Subproject:[]};let n=!1;for(const r of t)for(const t of dr)if(e.getUpdatedValue(r.entry,t)){n=!0,s[r.entry.itemType].push(r.entry.itemId);break}return n?s:Ht}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Project",t.Project,{columns:dr}),e.getItemsById("Subproject",t.Subproject,{columns:dr})]);return{project:s,subproject:n}}apply(e,t){const s=[...t.project,...t.subproject];for(const t of s)for(const s of dr){const n=t.fields[s];if(null!==n){for(const r of dr){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}}}};hr=zt([$t("ProjectSubprojectDefaultTimeBusinessLogicRule")],hr);const mr=["approval_status","previous_status"];let pr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","approval_status")}async dependency(e,t){return e.getItemsById("PurchaseOrder",t,{columns:mr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{previous_status:s.initial.approval_status})}};pr=zt([$t("PurchaseOrderApprovalStatusBusinessLogicRule")],pr);let fr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","owner")}async dependency(){return Promise.resolve()}apply(){}};fr=zt([$t("PurchaseOrderOwnerBusinessLogicRule")],fr);const yr=["rate_group","active","id"];let gr=class extends Vt{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?Ht:t}dependency(e,t){return e.getItemsByQuery("Rate",{conditions:[{key:"rate_group",comparator:"IN",value:[...t]},{active:!0}],operator:"AND"},{columns:yr,preventCaching:!0})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{active:!1})}};gr=zt([$t("RateDeactivateExistingOnCreateBusinessLogicRule")],gr);const Ir=["aantal"];let Cr=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Reparatie",t,{columns:Ir})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{aantal:1})}};Cr=zt([$t("ReparatiesExemplaarAantalBusinessLogicRule")],Cr);const vr=["id","asset_location"];let Tr=class extends Vt{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?Ht: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:vr})}}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})}}};Tr=zt([$t("ReparatieLostItemExemplaarLocationBusinessLogicRule")],Tr);const Rr=["general_eigen_medewerker_edit"];let Er=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Rr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{general_eigen_medewerker_edit:!0})}};Er=zt([$t("RolEditOwnDataBusinessLogicRule")],Er);const _r=["facturen_eigen","general_bestanden_downloaden","facturen_toegang","projecten_offertes_maken","projecten_facturen_maken"];let br=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:_r})}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})}}}};br=zt([$t("RolFileAccessBusinessLogicRule")],br);const Sr=["projecten_toegang"];let wr=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Rol","personeelsplanner_toegang",!0)}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Sr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{projecten_toegang:!0})}};wr=zt([$t("RolPersoneelsplannerToegangBusinessLogicRule")],wr);const qr=["materialen_tijdlijn"];let Fr=class extends Vt{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?Ht: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=zt([$t("RolProjectenBewerkenBusinessLogicRule")],Fr);const kr=["uren_kosten","visibility_financials"];let Lr=class extends Vt{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=zt([$t("RolProjectenToegangBusinessLogicRule")],Lr);const Dr=["purchaseorders_edit"];let xr=class extends Vt{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?Ht: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=zt([$t("RolPurchaseOrderAttachPlanningBusinessLogicRule")],xr);const Pr=["visibility_financials","facturen_toegang","projecten_facturen_maken","projecten_offertes_maken","projecten_toegang"];let Mr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Rol","visibility_financials")}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Pr})}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})}};Mr=zt([$t("RolVisibilityFinancialsBusinessLogicRule")],Mr);let Br=class extends Vt{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=zt([$t("RolWarehouseTrackingLogAccessBusinessLogicRule")],Br);const Qr=["id","type","is_combination","is_physical","telexemplaren","verhuur"];let Ar=class extends Vt{condition(e){const t=[];for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Setinhoud"))void 0!==s.fields.package&&t.push(s);return 0===t.length?Ht: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=zt([$t("SetinhoudCreateFixedBusinessLogicRule")],Ar);const jr=["is_fixed",{package:["type"]}];let Hr=class extends Vt{condition({previousChangesDelta:e}){if(this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING"))return Ht;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?Ht: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=zt([$t("SetinhoudUpdateFixedBusinessLogicRule")],Hr);const Ur=["subproject","inplanning"];let Or=class extends Vt{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:Ht}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=zt([$t("SubprojectInPlanningBusinessLogicRule")],Or);const Vr=["id","project","locatie","locatie_persoon"],Nr=["id","locatie"];let Wr=class extends Vt{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 V(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=zt([$t("SubprojectOneSubLocationAlignBusinessLogicRule")],Wr);const $r=["id","naam"],zr=["id","project","naam"];let Gr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Project","naam")}async dependency(e,t){return Promise.all(t.map((t=>V({projectResource:e.getItemById("Project",t,{columns:$r}),subprojectResources:e.getItemsByQuery("Subproject",{},{parent:{itemType:"Project",itemId:t},columns:zr})}))))}apply(e,t){for(const s of t)1===s.subprojectResources.length&&e.setItemUpdated(s.subprojectResources[0].entry,{naam:s.projectResource.fields.naam})}};Gr=zt([$t("SubprojectOneSubNameAlignBusinessLogicRule")],Gr);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 Vt{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=zt([$t("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"],Jr=["id","tot","van"];let Zr=class extends Vt{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:Ht}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:Jr})}}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}};Zr=zt([$t("TaakDeadlineOffsetBusinessLogicRule")],Zr);const ei=["naam","id"],ti=["schema_pv","schema_gv","schema_pt","schema_gt","naam"];let si=class extends Vt{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=zt([$t("TijdPropagateNameToFunctiegroepBusinessLogicRule")],si);const ni=["id","gebruiksperiode","planperiode"];let ri=class extends Vt{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?Ht: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=zt([$t("TijdSubprojectChangedBusinessLogicRule")],ri);const ii=["id","naam"],oi=[{categorie:["project"]}];let ai=class extends Vt{condition(e){const t=new Set;for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Planningmateriaal"))null===s.fields.schema_pv&&null===s.fields.schema_gv&&t.add(s.fields.id);return 0===t.size?Ht:t}async dependency(e,t){const s=await e.getItemsById("Planningmateriaal",[...t],{columns:oi}),n=await e.getItemById("Project",s[0].getDerivedValue("categorie>project"),{columns:["gebruiksperiode","planperiode"]}),[r,i]=await Promise.all([null!==n.fields.planperiode?e.getItemById("Tijd",n.fields.planperiode,{columns:ii}):null,null!==n.fields.gebruiksperiode?e.getItemById("Tijd",n.fields.gebruiksperiode,{columns:ii}):null]);return{gebruiksperiode:i,planperiode:r,planningmateriaalItems:s}}apply(e,t){for(const s of t.planningmateriaalItems)e.destinationChangesDelta.setItemUpdated(s.entry,{schema_pv:t.planperiode?.fields.id??null,schema_pv_begin:!0,schema_pt:t.planperiode?.fields.id??null,schema_pt_begin:!1,schema_gv:t.gebruiksperiode?.fields.id??null,schema_gv_begin:!0,schema_gt:t.gebruiksperiode?.fields.id??null,schema_gt_begin:!1})}};ai=zt([$t("PlanningmateriaalCreatePeriodBusinessLogicRule")],ai);const ci=[as,es,ss,rs,us,hs,ms,ys,Cs,Ts,_s,Ss,ks,Ls,xs,Ms,ws,Qs,$s,Hs,Ks,Js,on,nn,Ys,tn,cn,un,hn,vn,Dn,xn,Mn,Fn,En,Qn,An,jn,On,Nn,$n,ai,Jn,nr,ar,ur,hr,fr,pr,gr,Cr,Tr,Er,br,wr,Fr,Lr,Mr,Br,xr,Ar,Hr,Wr,Gr,Or,Kr,Zr,ri,si,Kt,Xt];class li{errorHandler;businessLogicRuleInstances;constructor(e,t){this.errorHandler=e,this.businessLogicRuleInstances=t}static constructBusinessLogicRules(e,t,s,n=ci){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){const s=e.createBusinessLogicChild();let n=await s.applyChangesDirectly(t),r=0;for(;!n.isEmpty()&&r<20;){const e=new Nt(s,n),t=await this.extractRulesToRun(e);if(null===t)return null;const i=await this.waitForRuleDependencies(t,e);if(null===i)return null;const o=s.createChangesDelta();this.applyRules(i,new Wt(s,n,o)),n=await s.applyChangesDirectly(o),r++}return 20===r&&this.errorHandler.logError(new Error("Business logic cycles maximum reached")),s}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===Ut?void 0:s.confirmResult)}catch(e){this.errorHandler.logError(e)}}async waitForRuleDependencies(e,t){const s=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 e.ruleInstance.postDependencyConfirm(e.conditionResult,e.dependencyResult,t.transaction)),e)))),n=[];for(const e of s)if("rejected"!==e.status){if(e.value.confirmResult!==Ht){if(e.value.confirmResult===Ot)return null;n.push(e.value)}}else{if(e.reason instanceof Us)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return n}async extractRulesToRun(e){const t=await Promise.allSettled(this.businessLogicRuleInstances.map((async t=>{const s=await t.condition(e);let n;return null!==t.confirm&&s!==Ht&&(n=await t.confirm(s,e.transaction)),{ruleInstance:t,conditionResult:s,confirmResult:n}}))),s=[];for(const e of t)if("rejected"!==e.status){if(e.value.conditionResult!==Ht&&e.value.confirmResult!==Ht){if(e.value.confirmResult===Ot)return null;s.push(e.value)}}else{if(e.reason instanceof Us)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return s}}class ui{construct(e){return new ne(e)}}class di{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 g(this,i,s,r.queryGraph,r.query,o,t):void 0===i.order.limit?new T(this,i,s,r.queryGraph,r.query,o,t):new R(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 hi{columnInfoFactory;constructor(e){this.columnInfoFactory=e}construct(e,t,s){return new ae(this.columnInfoFactory,e,t,s)}}class mi{constructor(){}construct(e,t){return new le(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 pi{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 de(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 de(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:{}}),!pe.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}=pe.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 fi{columnCache;constructor(e){this.columnCache=e}construct(e,t){return new he(e,this.columnCache,t)}}class yi{graphQueryParserFactory;constructor(e){this.graphQueryParserFactory=e}construct(e){return new ge(this.graphQueryParserFactory,e)}}class gi{errorHandler;constructor(e){this.errorHandler=e}construct(e,t,s=!1,n){return new m(this,e,t,s,n)}}class Ii{serverCache;constructor(e,t,s){this.serverCache=new rt(e,t,s)}getById(e){const t=s=>{for(const n of s){if(n.id===e)return n;const s=t(n.children);if(void 0!==s)return s}};return t(this.serverCache.children)}construct(e,t,s){return this.serverCache.createChild(e,t,s)}getServerCache(){return this.serverCache}}class Ci{linkTreeService;constructor(e){this.linkTreeService=e}construct(e){return new Ee(this.linkTreeService,e)}}class vi{construct(){return new tt}}class Ti{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 _t(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=te.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 bt(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 Ri 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 Ei extends Error{}class _i extends Error{}class bi{linkTreeService;errorHandler;constructor(e,t){this.linkTreeService=e,this.errorHandler=t}construct(e,t){return new Ye(e,t,this.linkTreeService,this.errorHandler)}}class Si{version="64.0.2-RM4-47618";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=u.ApiFieldsOnDeleteRule){const o=new bi(n,s),a=new et,c=new vi,l=new Ie(e,n),d=new ui,h=new se(t,d),m=new oe,p=new ce(h,m),f=new mi,y=new hi(f),g=new pi(p,f,s),I=new fi(m),C=new Te(h),v=new yi(o),T=new gi(s),R=new Pt(h,p,g,c,n,l),E=new fe,_=new Dt(E,R),b=new Ti(E,s,_,l),S=new li(s,r),w=new di(s,l,a,I,m,g),q=new Ci(n),F=new Ii({apiRequestService:h,businessLogicManager:S,changesDeltaFactory:b,collectionResourceFactory:w,columnCache:m,columnExpansionFactory:y,columnHandler:p,columnSetFactory:g,conversionMapService:E,errorHandler:s,graphQueryParserFactory:o,itemCacheFactory:v,itemCreateService:_,itemEntryService:l,itemResourceFactory:T,linkTreeService:n,lockService:C,moduleChangesCompilationFactory:q,queryService:a,requestColumnExpansionFactory:c,requestColumnsOperationsCacheFactory:I,templateCache:R},i,this),k=new st(b,m,s,c,F,h,I);this.apiRequestService=h,this.apiResponseProcessorFactory=d,this.changesDeltaFactory=b,this.collectionResourceFactory=w,this.columnCache=m,this.columnExpansionFactory=y,this.columnHandler=p,this.columnInfoFactory=f,this.columnSetFactory=g,this.requestColumnOperationsCacheFactory=I,this.conversionMapService=E,this.itemCacheFactory=v,this.itemCreateService=_,this.itemEntryService=l,this.itemResourceFactory=T,this.lockService=C,this.moduleChangesCompilationFactory=q,this.queryService=a,this.requestColumnExpansionFactory=c,this.socketMessageHandler=k,this.templateCache=R,this.transactionCacheFactory=F,this.businessLogicManager=S}}function wi(e){return e}const qi="beach_access",Fi=["id","date","name","yearly"];class ki{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,d.untracked)((()=>this.rangeContainsHoliday$(e,t,s)))}getHolidaysInDateRange(e,t,s){return(0,d.untracked)((()=>[...this.getHolidaysInDateRangeIterator$(e,t,s)]))}async initialize(e){const t=await e.transactionCacheFactory.construct("rm-holidays-service").getCollection("Holiday",{query:{},columns:Fi});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){return void 0===e?this.holidayCollectionResourcesMap.values().next().value:this.holidayCollectionResourcesMap.get(e)}}return o})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@rentman/backend-types"),require("@angular/core"),require("moment")):"function"==typeof define&&define.amd?define(["@rentman/backend-types","@angular/core","moment"],t):"object"==typeof exports?exports.RmCore=t(require("@rentman/backend-types"),require("@angular/core"),require("moment")):e.RmCore=t(e["@rentman/backend-types"],e["@angular/core"],e.moment)}(self,((e,t,s)=>(()=>{"use strict";var n={860:e=>{e.exports=t},174:t=>{t.exports=e},416:e=>{e.exports=s}},r={};function i(e){var t=r[e];if(void 0!==t)return t.exports;var s=r[e]={exports:{}};return n[e](s,s.exports,i),s.exports}i.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return i.d(t,{a:t}),t},i.d=(e,t)=>{for(var s in t)i.o(t,s)&&!i.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var o={};i.r(o),i.d(o,{ALL_PERMISSIONS:()=>a,API_COLUMN_LOCATION:()=>me,AbstractCache:()=>nt,ApiFormatter:()=>te,ApiLinkTreeType:()=>l,ApiRequestService:()=>se,ApiResponseProcessor:()=>ne,ApiResponseProcessorFactory:()=>ai,BLR_ABANDON_CHANGES:()=>Ot,BLR_CONTINUE_WITH_DEFAULTS:()=>Ut,BLR_SKIP_RULE:()=>Ht,BusinessLogicManager:()=>oi,BusinessLogicRule:()=>Vt,BusinessLogicRuleApplyContext:()=>Wt,BusinessLogicRuleConditionContext:()=>Nt,BusinessLogicRuleContextBase:()=>jt,COLUMN_SEPERATOR:()=>c,CachedQueryHandlerBase:()=>dt,CachedQueryItem:()=>p,ChangesCompilation:()=>re,ChangesDelta:()=>_t,ChangesDeltaBase:()=>Rt,ChangesDeltaFactory:()=>Ii,ChangesProcessor:()=>ie,ChildChangesDelta:()=>St,CollectionEntry:()=>f,CollectionItemChangesListenerContext:()=>At,CollectionResource:()=>g,CollectionResourceFactory:()=>ci,ColumnCache:()=>oe,ColumnExpansion:()=>ae,ColumnExpansionFactory:()=>li,ColumnHandler:()=>ce,ColumnInfo:()=>le,ColumnInfoFactory:()=>ui,ColumnSet:()=>de,ColumnSetFactory:()=>di,ColumnUtil:()=>pe,ConversionMapService:()=>fe,CreateRequest:()=>ye,CreatedChangesDelta:()=>xt,CriticalBusinessLogicRuleException:()=>Us,GraphQueryParser:()=>Ye,HOLIDAY_ICON:()=>Si,ItemAlreadyExistsException:()=>Ci,ItemCache:()=>ge,ItemCacheFactory:()=>mi,ItemChangesListenerContext:()=>Qt,ItemChangesListenerContextBase:()=>Bt,ItemCreateService:()=>Dt,ItemEntry:()=>h,ItemEntryService:()=>Ie,ItemHandlerBase:()=>lt,ItemLockedException:()=>vi,ItemMatcherBase:()=>ot,ItemNotFoundException:()=>y,ItemResource:()=>m,ItemResourceFactory:()=>pi,KeyService:()=>Ce,LINKED_TIME_ITEM_TYPES:()=>mn,LimitedCollectionResource:()=>R,LinkedTimeItemSubprojectBusinessLogicRule:()=>Fn,LockService:()=>Te,MatchesAccumulatorMap:()=>it,MateriaalBulkToSerialBusinessLogicRule:()=>Ys,MateriaalIsCombinationBusinessLogicRule:()=>Ks,MateriaalSerialToBulkBusinessLogicRule:()=>tn,MateriaalToPhysicalBusinessLogicRule:()=>nn,MateriaalToVirtualBusinessLogicRule:()=>on,ModuleChangesCompilation:()=>Ee,ModuleChangesCompilationFactory:()=>yi,OrderedCollectionResource:()=>T,ParentChangesDelta:()=>bt,ProjectClientChangedBusinessLogicRule:()=>nr,PurchaseOrderOwnerBusinessLogicRule:()=>fr,QueryColumnExtractor:()=>Ke,QueryContainsLocalIdParser:()=>Xe,QueryParser:()=>Je,QueryParserBase:()=>Se,QueryParserIdUpdater:()=>Ze,QueryService:()=>et,RequestBuffer:()=>Ft,RequestBufferBase:()=>qt,RequestBufferManager:()=>Lt,RequestColumnExpansion:()=>tt,RequestColumnExpansionFactory:()=>gi,RequestColumnsOperationsCache:()=>he,RequestColumnsOperationsCacheFactory:()=>hi,RmCore:()=>Ei,RmHolidaysService:()=>wi,SavingInProgressException:()=>Ti,ServerCache:()=>rt,ServerCachedQueryHandler:()=>ht,ServerItemHandler:()=>ut,SingleQueryRequestBuffer:()=>kt,SocketMessageHandler:()=>st,SubprojectInPlanningBusinessLogicRule:()=>Or,Template:()=>E,TemplateCache:()=>Pt,TimeColumnUtil:()=>yn,TransactionCache:()=>ft,TransactionCacheFactory:()=>fi,TransactionCachedQueryHandler:()=>It,TransactionErrorLevel:()=>pt,TransactionEventHandler:()=>ve,TransactionItemHandler:()=>gt,TransactionValidator:()=>vt,TransactionValidatorWithDependencies:()=>Tt,businessLogicRule:()=>$t,copy:()=>J,createPath:()=>k,defaultRequestBufferOptions:()=>wt,equals:()=>X,extend:()=>x,fieldsSignalProxyHandler:()=>ct,findIndex:()=>_,getFirstProperty:()=>w,getPath:()=>L,hasProperties:()=>b,identity:()=>_i,inArray:()=>q,initialProxyHandler:()=>yt,isArray:()=>H,isBlankObject:()=>B,isBoolean:()=>G,isDate:()=>j,isDefined:()=>K,isElement:()=>z,isFunction:()=>U,isNumber:()=>A,isObject:()=>M,isPromiseLike:()=>O,isRegExp:()=>$,isString:()=>Q,isWindow:()=>Y,merge:()=>P,pathExists:()=>F,promiseAllObject:()=>V,promiseCreateDeferred:()=>W,promiseWrapTimeout:()=>N,registeredBusinessLogicRules:()=>ii,shallowMerge:()=>S});const a=7,c=">";var l,u=i(174);!function(e){e.ITEMTABLE="itemtable",e.DIRECT="direct"}(l||(l={}));var d=i(860);class h{itemType;columns;static currentId=0;id=++h.currentId;isLockableSignal=(0,d.signal)(this.isLockable());isLocalSignal=(0,d.signal)(this.isLocal());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 Ce.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 m{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,d.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){const t=this.columns;for(const s in e){void 0===t[s]&&this.factory.errorHandler.logWarning(`setFields: no column found for ${s}`)}const s=this.transaction.createChangesDelta();return s.setItemUpdated(this.entry,e),this.transaction.applyChangesDelta(s).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]=te.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 te.compareFields(s.type,this.fields[e],t[e])}hasChanges(){return this.transaction.itemHandler.detectEntryChanges(this.entry.id)}setTransactionParameters(e){k(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(c),s=e):(n=e,s=e.join(c)),void 0!==this.derivedFieldSignals[s])return this.derivedFieldSignals[s];return this.derivedFieldSignals[s]=(0,d.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(!pe.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 p{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=W(),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 f{queryService;options;query;columns;static currentId=0;id=f.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):Ce.isLocalId(e.itemId)}expandColumns(e){this.columns=e.run(this.columns).merged,this.options.columns=this.columns.request}}class y 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 g{factory;options;transaction;queryGraph;parentCollection;itemType;entry;columns;items=[];itemsSignal=(0,d.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 f(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 y)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 At(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 I=(e,t)=>Number(e)-Number(t),C=(e,t)=>e.localeCompare(t);function v(e){switch(e){case u.ApiEnumApiType.TYPE_NUMBER:case u.ApiEnumApiType.TYPE_DATETIME:case u.ApiEnumApiType.TYPE_TIMESTAMP:case u.ApiEnumApiType.TYPE_TIMESTAMP_MS:case u.ApiEnumApiType.TYPE_DATE:case u.ApiEnumApiType.TYPE_DURATION:case u.ApiEnumApiType.TYPE_VOLUME:case u.ApiEnumApiType.TYPE_WEIGHT:case u.ApiEnumApiType.TYPE_DIMENSION:case u.ApiEnumApiType.TYPE_PRICE:case u.ApiEnumApiType.TYPE_DOUBLE:case u.ApiEnumApiType.TYPE_INT:case u.ApiEnumApiType.TYPE_CURRENT:case u.ApiEnumApiType.TYPE_POWER:case u.ApiEnumApiType.TYPE_DISTANCE:case u.ApiEnumApiType.TYPE_ORDER:return I;case u.ApiEnumApiType.TYPE_TEXT:case u.ApiEnumApiType.TYPE_LONGTEXT:case u.ApiEnumApiType.TYPE_HTML:case u.ApiEnumApiType.TYPE_TIME:return C;default:throw new Error(`ApiType ${e} does not have a sort function`)}}class T extends g{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:v(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 R extends T{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 E{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=pe.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]&&(te.isExpensiveFormat(t.type)?ne.addLazyFormattingFunction(t.id,t.type,t.default,s):s[t.id]=te.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 _(e,t){for(let s=0;s<e.length;s++)if(t(e[s]))return s;return-1}function S(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 b(e){for(const t in e)return!0;return!1}function w(e){if("object"!=typeof e)return null;for(const t in e)return t;return null}function q(e,t){for(const s of t)if(e==s)return!0;return!1}function F(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 k(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 L(e,t,s=!1){if(void 0!==e){for(const n of t)if(void 0===(e=e[n])&&!s)return;return e}}function D(e,t,s){for(let n=0,r=t.length;n<r;++n){const r=t[n];if(!M(r)&&!U(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&&M(o)?j(o)?e[n]=new Date(o.valueOf()):$(o)?e[n]=new RegExp(o):o.nodeName?e[n]=o.cloneNode(!0):z(o)?e[n]=o.clone():(M(e[n])||(e[n]=H(o)?[]:{}),D(e[n],[o],!0)):e[n]=o}}return e}function x(e,...t){return D(e,t,!1)}function P(e,...t){return D(e,t,!0)}function M(e){return null!==e&&"object"==typeof e}function B(e){return null!==e&&"object"==typeof e&&!Object.getPrototypeOf(e)}function Q(e){return"string"==typeof e}function A(e){return"number"==typeof e}function j(e){return"[object Date]"===toString.call(e)}const H=Array.isArray;function U(e){return"function"==typeof e}function O(e){return e&&U(e.then)}function V(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}))}function N(e,t,s){return Promise.race([e,new Promise(((e,n)=>{window.setTimeout((()=>n(t())),s)}))])}function W(){const e={};return e.promise=new Promise(((t,s)=>{e.resolve=t,e.reject=s})),e}function $(e){return"[object RegExp]"===toString.call(e)}function G(e){return"boolean"==typeof e}function z(e){return!(!e||!(e.nodeName||e.prop&&e.attr&&e.find))}function Y(e){return e&&e.window===e}function K(e){return void 0!==e}function X(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(!H(e)){if(j(e))return!!j(t)&&(o=e.getTime(),a=t.getTime(),o===a||o!=o&&a!=a);if($(e))return!!$(t)&&e.toString()===t.toString();if(Y(e)||Y(t)||H(t)||j(t)||$(t))return!1;for(r in i=Object.create(null),e)if(!U(e[r])){if(!X(e[r],t[r]))return!1;i[r]=!0}for(r in t)if(!(r in i)&&K(t[r])&&!U(t[r]))return!1;return!0}if(!H(t))return!1;if(n=e.length,e.length===t.length){for(r=0;r<n;r++)if(!X(e[r],t[r]))return!1;return!0}}var o,a;return!1}function J(e,t,s){const n=[],r=[];if(s=function(e){return A(e)&&e>0}(s)?s:NaN,t){if(e===t)throw new Error("Can't copy! Source and destination are identical.");if(H(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(H(e))for(let n=0,r=e.length;n<r;n++)t.push(o(e[n],s));else if(B(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(!M(e))return e;const s=n.indexOf(e);if(-1!==s)return r[s];if(Y(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(U(e.cloneNode))return e.cloneNode(!0)}(e);return void 0===c&&(c=H(e)?[]:Object.create(Object.getPrototypeOf(e)),a=!0),n.push(e),r.push(c),a?i(e,c,t):c}}var Z=i(416),ee=i.n(Z);class te{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]=te.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"double":case"power":case"volume":case"weight":case"coordinate":case"price":case"percentage":return this.compareFloats(t,s);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 X(t,s)}}static compareFloats(e,t){const s=Math.abs(e),n=Math.abs(t),r=Math.abs(e-t),i=119e-9;return e===t||(0===e||0===t||r<Number.MIN_VALUE?r<i*Number.MIN_VALUE:r/Math.min(s+n,Number.MAX_VALUE)<i)}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?ee().invalid():ee()(e,ee().ISO_8601)}static formatResponseDuration(e){return ee().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 ee().invalid();case"duration":return ee().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 ee().isMoment(t)&&t.isValid();case"duration":return ee().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 ee()(t);case"json":return J(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 ee().duration(e)}static cloneDate(e){return e.clone()}static identity(e){return e}}class se{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 ne{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]=te.formatResponseValue(t,s))})}fetchColumnObject(e){return this.columnMap[e]}fetchDerivedValue(e,t,s){"string"==typeof t&&(t=t.split(c));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(!pe.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 te.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]=te.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];te.isExpensiveFormat(r.type)?ne.addLazyFormattingFunction(r.id,r.type,s[t],n):n[r.id]=te.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(!u.TempItemTypeWithoutFixedIds.includes(e))continue;const t=[];for(const s of this.links[e]){const n=Ce.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 re{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){k(this.compilation.delete,[e.itemType],[[]]).push(e)}addUpdateEntry(e){k(this.compilation.update,[e.itemType,e.itemId],[{},e])}addCreateEntry(e){let t=this.transaction.getParent(e.entry);null===t&&(t=this.getDefaultParent()),k(this.compilation.create,[t.itemType,t.itemId,e.entry.itemType,e.entry.itemId],[{},{},{},e])}}class ie{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 ye(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(!b(o))continue;const a=n[e][s]={},c=L(this.transaction.tabRequestParameters,[e,s]);a.values=o,void 0!==c&&(a.parameters=c),r.expandWithColumnSet(i.columns)}if(!b(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)q(e.itemId,n)?s.setItemDeleted(e):this.errorHandler.logWarning("Delete failed!",e);return this.serverCache.applyChangesFromParent(s,!0)}))}}class oe{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=pe.parseRequestColumn(s);delete this.pendingCache[e]?.[t.id]}}setPendingColumns(e,t,s){for(const n of t){const t=pe.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=pe.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 ae{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 ce{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=>pe.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];pe.isCustomColumn(r)&&pe.hasLocationProperty(r,me.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 le{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+c+s,this.tailPath=0===t.level?s:t.tailPath+c+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 ue=0;class de{columnSetFactory;itemType;request;requestColumnsTrue;response;id=++ue;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===u.ApiEnumApiType.TYPE_LINK&&(this.link=e),this.main.push(e)),e.isLeaf?this.leaf[n].push(e):s||this.root.push(e),pe.isFilteredColumn(t)&&this.filtered[n].push(e),pe.isSearchableColumn(t)&&this.searchable[n].push(e),pe.isCustomColumn(t)&&this.custom[n].push(e),pe.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(!pe.containsColumn(t,this.request))return!1;return!0}mergeRequestColumns(e){return pe.mergeRequestColumns(this.request,e)}mergeResponseColumns(e){return pe.mergeResponseColumns(this.response,e).merged}expand(e,t,s){const n=pe.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 he{itemType;columnCache;requestColumnsTuple;aggregateColumnsTuple;expandedRequestColumnsTuple;columnsMergedWithTupleMap={};expandedColumnsMergedWithTupleMap={};setContainsAllColumnsMap={};setContainsAllExpandedColumnsMap={};constructor(e,t,s){this.itemType=e,this.columnCache=t,this.requestColumnsTuple=this.createRequestColumnsTuple(pe.copyRequestColumns(s))}getRequestColumnsTuple(e){return e instanceof rt?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 rt?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 rt?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=pe.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=pe.parseRequestColumn(n),r=this.columnCache.getColumn(t,e.id);if(void 0===r)continue;if(pe.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:pe.createRequestColumnSetId(e)}}}var me;!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"}(me||(me={}));class pe{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=w(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)K(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 fe{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??=Ce.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 a;o.type===u.ApiEnumApiType.TYPE_LINK&&void 0===e[s]?null!==r&&(a=r.itemId):a=this.getConversionValue(o.itemType,e[s],n),void 0!==a&&(t[s]=a)}}expandLocalConversionMap(e,t,s,n,r=Ce.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:Ce.getLocalId();const a=s.items[e][o].links;for(const e in a)this.expandLocalConversionMap(e,a[e],s,n,null)}}}class ye{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(Ce.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)Ce.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=L(this.compilation,[i,c.itemId]),u=n.items[i][c.itemId]={},d=L(this.transaction.tabRequestParameters,[i,c.itemId]);if(null!==t&&(n.parentId[c.itemId]=t),s.columns.expandWithColumnSet(c.columns),r[i][o]=c,u.values=te.formatRequestLocal(a.fields,c.columns.main),u.parameters=d,void 0===l)continue;const h=u.links={};for(const e in l){h[e]=[];for(const t in l[e])h[e].push(parseInt(t,10))}this.extendRequest(l,null,s)}}}}class ge{graphQueryParserFactory;transaction;entries={};entriesByEntryId={};constructor(e,t){this.graphQueryParserFactory=e,this.transaction=t}getByEntryId(e){if(void 0===this.entriesByEntryId[e])throw new y(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 y(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 Ie{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===l.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:a,creator:this.userId,created:ee()()}}}class Ce{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 ve{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 Te{apiRequestService;lockItems=(0,d.signal)({});promises={};constructor(e){this.apiRequestService=e}getLocksSignal(){return this.lockItems.asReadonly()}getLocks(){return(0,d.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",Ce.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 Re={};class Ee{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 ft){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=b(s),i=b(n);return r&&i?{values:s,links:n}:r?{values:s}:i?{links:n}:Re}getItemsByParent(e,t){return this.itemsMappedOnParent[e]?.[t]??{}}}const _e={"=":"!=","!=":"=",">":"<=","<":">=","<=":">",">=":"<"};class Se{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(Se.isLinkedToQuery(e))return this.parseLinkedToQuery(e.linkedTo,e.query??{},e.reverse??!1,e.not??!1,t);if(Se.isCustomQuery(e))return this.parseCustomQuery(e.custom,e.parameters,e.not??!1);if(Se.isSearchQuery(e))return this.parseSearchQuery(e.search,e.not??!1);if(Se.isQueryWithConditions(e))return this.parseComplexQuery(e.conditions,Se.normalizeOperator(e.operator),e.not??!1,t);if(Se.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=w(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?_e[n]:n,s);case"in":case"IN":return this.parseInQuery(e,t,r);default:throw new Error(`QueryParserBase: unknown comparator: ${n}`)}}}class be{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 we extends be{connectedNodesTuple;constructor(e,t={leafNodes:[],branchNodeMap:null}){super(e),this.connectedNodesTuple=t}connectLeafNode(e){return this.connectedNodesTuple.leafNodes.push(e),this}connectBranchNode(e){return be.addBranchNode(this.connectedNodesTuple,e),this}updateLocalItemIdReferences(e){return be._updateLocalItemIdReferences(this.connectedNodesTuple.branchNodeMap,e)}copyEdgesFrom(e,t){return be.cloneQueryNodesInto(this.connectedNodesTuple,e.connectedNodesTuple,t),this}}class qe extends we{apiQuery;constructor(e,t){super(e),this.apiQuery=t}match(e,t,s,n){return be.matchQueryNodes(this.connectedNodesTuple,e,t,"maybe",n)}}class Fe extends qe{constructor(e){super("CUSTOM:",e)}clone(e){return new Fe(this.apiQuery).copyEdgesFrom(this,e)}}const ke=Symbol("Unsupported query value"),Le={queryToEdgeValue:e=>"number"==typeof e?e:ke,fieldToEdgeValue:e=>e,edgeToEdgeCompareValue:e=>e},De={queryToEdgeValue:e=>null===e?null:"string"==typeof e?e.toLowerCase():ke,fieldToEdgeValue:e=>null===e?e:e.toLowerCase()},xe={queryToEdgeValue:e=>null===e||"number"==typeof e||"boolean"==typeof e?e:ke,fieldToEdgeValue:e=>e},Pe={queryToEdgeValue:e=>"NOW"===e?"NOW":ee().isMoment(e)&&e.isValid()?e.valueOf():ke,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>"NOW"!==e?e:ee().now()},Me={queryToEdgeValue:e=>ee().isMoment(e)?e.isValid()?e.valueOf():null:ke,fieldToEdgeValue:e=>e.isValid()?e.valueOf():null},Be={queryToEdgeValue:e=>ee().isDuration(e)?e.valueOf():ke,fieldToEdgeValue:e=>e.valueOf(),edgeToEdgeCompareValue:e=>e};class Qe extends be{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)!==ke)return s;return null}connectLeafNode(e,t){let s=this.valueTransformer.queryToEdgeValue(e);return s===ke&&(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===ke&&(this.errorHandler.logError(new Error(`Unsupported query value '${e}' passed to 'connectBranchNode'`)),s=e),be.addBranchNode(this.getQueryNodeTuple(s),t),this}copyEdgesFrom(e,t){this.valueTransformer===xe&&e.valueTransformer===De&&(this.valueTransformer=De);for(const s of e.edgeMap.entries())Qe.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&&(Qe.cloneQueryNodesInto(this.getQueryNodeTuple(e[s][n]),i,void 0),this.edgeMap.delete(r),t=!0)}for(const s of this.edgeMap.values())be._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())be.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 Ae=[Le,Pe,Be];class je extends Qe{comparator;compareValue;constructor(e,t,s,n){super(`${t}:${e}`,e,s,n),this.comparator=t,this.compareValue=je.getCompareFunction(this.comparator)}static construct(e,t,s,n){if(!je.isSupportedComparator(s))return null;const r=Qe.findValueTransformer(t,Ae);return null===r?null:new je(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]))&&be.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 je(this.columnId,this.comparator,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}const He=[xe,De,Me,Be];class Ue extends Qe{constructor(e,t,s){super(`IS:${e}`,e,t,s)}static construct(e,t,s,n){if("="!==s)return null;const r=Qe.findValueTransformer(t,He);return null===r?null:new Ue(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:be.matchQueryNodes(i,e,t,s,n)}clone(e){return new Ue(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class Oe extends qe{clone(e){return new Oe(this.apiQuery).copyEdgesFrom(this,e)}constructor(e){super("LI",e)}}const Ve=[xe,De,Me,Be];class Ne extends Qe{constructor(e,t,s){super(`!IS:${e}`,e,t,s)}static construct(e,t,s,n){if("!="!==s)return null;const r=Qe.findValueTransformer(t,Ve);return null===r?null:new Ne(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]&&be.matchQueryNodes(i[1],e,t,s,n);return n}clone(e){return new Ne(this.columnId,this.valueTransformer,this.errorHandler).copyEdgesFrom(this,e)}}class We extends we{constructor(e){super("R",e)}clone(e){return(new We).copyEdgesFrom(this,e)}match(e,t,s,n){return be.matchQueryNodes(this.connectedNodesTuple,e,t,s,n)}doMatch(e,t,s=new Map){return be.matchQueryNodes(this.connectedNodesTuple,e,t,!0,s)}}class $e extends qe{constructor(e){super(`SEARCH:${e.search}`,e)}clone(e){return new $e(this.apiQuery).copyEdgesFrom(this,e)}}class Ge extends qe{constructor(e){super("SUB",e)}clone(e){return new Ge(this.apiQuery).copyEdgesFrom(this,e)}}const ze=[Ue,Ne,je];class Ye extends Se{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 We,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 l.DIRECT:{const e=new Ue(i.field,xe,r);for(const t of s)e.connectLeafNode(t.value,t.node);return e}case l.ITEMTABLE:{const e=new Ue("item",xe,r);for(const t of s)e.connectLeafNode(t.value,t.node);return new Ue("itemtype",De,r).connectBranchNode(t,e)}}}parseComparatorQuery(e,t,s){let n=null;for(const r of ze)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=He.find((e=>t.every((t=>e.queryToEdgeValue(t)!==ke))));if(void 0===n)throw new Error(`Could not find supported comparator node: ${e} ${t}`);if(!s){const s=new Ue(e,n,this.errorHandler);for(const e of t)s.connectLeafNode(e,this.queryId);return[s]}const r=new Ne(e,n,this.errorHandler);let i=r;for(let s=0;s<t.length-1;s++)i.connectBranchNode(t[s],i=new Ne(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 Oe({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[Ye.createLinkedToComparatorQueryNode(this.itemType,e,t.map((e=>({value:e,node:this.queryId}))),this.linkTreeService,this.errorHandler)]}return[new Oe({linkedTo:e,query:t,reverse:s,not:n}).connectLeafNode(this.queryId)]}parseSubQuery(e,t,s,n,r){return[new Ge({key:e,itemType:t,field:s,query:n,not:r}).connectLeafNode(this.queryId)]}parseSearchQuery(e,t){return[new $e({search:e,not:t}).connectLeafNode(this.queryId)]}parseCustomQuery(e,t,s){return[new Fe({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=>{be.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 Ke extends Se{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 Xe extends Se{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 Ce.isLocalId(t)}parseInQuery(e,t){return t.some((e=>Ce.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 Je extends Se{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():ee().isMoment(e)?ee()(e):ee().isDuration(e)?ee().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:Je.formatStringParameters("subField",e,t??"",s,o.string,r),isLocallyMatchable:!1}}parseSearchQuery(e,t){const s=Je.formatValue(e);return{object:{search:s.object,not:t},string:Je.formatStringParameters("search",s.string,t),isLocallyMatchable:!1}}parseCustomQuery(e,t,s){if(void 0===t)return{object:{custom:e,not:s},string:Je.formatStringParameters(e,s),isLocallyMatchable:!1};const n=this.parseCustomParameters(t);return{object:{custom:e,parameters:n.object,not:s},string:Je.formatStringParameters(e,n.string,s),isLocallyMatchable:!1}}parseComparatorQuery(e,t,s){const n=Je.formatValue(t);return{object:{key:e,value:n.object,comparator:s},string:Je.formatStringParameters(s,e,n.string),isLocallyMatchable:!0}}parseInQuery(e,t,s){const n=Je.formatValue(t);return{object:{key:e,value:n.object,comparator:"IN",not:s},string:Je.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:Je.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:Je.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=Je.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)=>Je.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 Ze extends Se{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 et{containsLocalId(e){return(new Xe).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 tt{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)pe.mergeRequestColumn(n,s[e])}else{const t=s[e];if(!0===t)return;void 0!==t&&pe.containsDerivedColumns(t)||(s[e]=!0)}}get(){return this.columns}}class st{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 Lt(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;"delete"!==e.eventType?this.processMessage(e,s,n,r,t):this.handleDelete(e,s)}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]=te.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 We,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=pe.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 nt{dependencies;core;children=[];itemHandler;cachedQueryHandler;parent;constructor(e,t){this.dependencies=e,this.core=t}*getDescendantsIterator(){for(const e of this.children)yield e,yield*e.getDescendantsIterator()}onChildDestroy(e){const t=this.children.indexOf(e);-1!==t&&this.children.splice(t,1)}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=u.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=u.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 _t?e.setItemUpdated(t,r,null,null,"KEEP_WHEN_DIFFERENT"):e instanceof bt?e.setItemUpdated(t,r,{[s]:n},"KEEP_WHEN_DIFFERENT"):e.setItemUpdated(t,r,"KEEP_WHEN_DIFFERENT")}else if("cascade"===r){e instanceof St?e.setItemDeleted({entry:t,changes:this.itemHandler.itemChanges[t.id],isCascaded:!0}):e instanceof bt?e.setItemDeleted(t):e.setItemDeletedCascaded(t);const s=u.ApiFieldsOnDeleteRule[t.itemType]?.foreign??{};for(const n in s)for(const r of s[n])this.cascadeDeleteByItemType(e,n,r,t.itemId)}}}}class rt extends nt{dependencies;apiFieldsOnDeleteRule;requestBufferManager;itemHandler;cachedQueryHandler;onDeltaAppliedCallbacks=[];parent=null;constructor(e,t,s){super(e,s),this.dependencies=e,this.apiFieldsOnDeleteRule=t,this.requestBufferManager=new Lt(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 ut(e.errorHandler,e.columnCache,e.itemCacheFactory,e.itemEntryService,e.requestColumnExpansionFactory,e.requestColumnsOperationsCacheFactory,this),this.cachedQueryHandler=new ht(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 ft(this.dependencies,this.core,this,e,t,s);return this.children.push(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.children.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===l.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 ie(n.apiRequestService,n.changesDeltaFactory,n.errorHandler,this.requestBufferManager,n.requestColumnExpansionFactory,e,new re(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.children.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 it{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 ot{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 it;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];ot.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 it;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())ot.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&&ot.addItemsToMatchingResults(r,t,"maybe",s.maybe),ot.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){ot.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&&ot.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 at={get:(e,t)=>{const s=e.itemHandler.lookUpItemField(e.itemEntry,t);return"displayname"!==t||void 0!==s&&""!==s?s:e.itemHandler.getDisplayName(e.itemEntry)}},ct={get:(e,t)=>e.itemHandler.getItemFieldSignal(e.itemEntry,t)};class lt extends ot{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,d.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},at)}constructSignalFieldsProxy(e){return new Proxy({itemEntry:e,itemHandler:this},ct)}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 te.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(c));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 h(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(!pe.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(!pe.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 ut extends lt{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()??ee().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(),a=[],c=u.TempItemTypeWithoutFixedIds.includes(e);for(const r of t){if(c){const t=this.entries.get(e,r);if(s.setContainsAllColumns(t.columns,this.transaction)){a.push(t);continue}throw new y(e,r)}if(Ce.isLocalId(r))throw new y(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()){a.push(t);continue}i.push(r),o.expandWithRequestColumnsTuple(e,s.getAggregateColumns())}else{const n={object:t.columns.request,string:pe.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 a;await this.transaction.requestBufferManager.fetchByIds(e,i,o.get()[e],{forceFlush:r});for(const t of i)a.push(this.entries.get(e,t));return a}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]=te.clone(c.type,s[n]);continue}const l=this.itemFieldLastModified[t.id][n];void 0!==l&&void 0!==i&&l>=i&&!c.isDisplayname&&!pe.isAggregateColumn(c)||(te.compareFields(c.type,s[n],r[n])||("QUERY"===e.mode&&(e.mode="CLEAR_WHEN_SAME"),null===a&&(a={}),a[n]=r[n],r[n]=te.clone(c.type,s[n]),"aggregate"!==c.fieldtype&&"method"!==c.fieldtype&&(this.itemFieldLastModified[t.id][n]=i??ee().now())))}if(void 0!==s.id){const e=t.itemId;t.updateId(s.id),this.entries.updateItemId(t,e)}return a}}class dt{dependencies;transaction;collections={};constructor(e,t){this.dependencies=e,this.transaction=t}createQuery(e){return(new Je).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 it;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.createQueryFromOptions(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 l.ITEMTABLE:o={conditions:[{itemtype:e.itemType},{item:e.itemId}]};break;case l.DIRECT:o={[r.field]:e.itemId}}const a=this.createQuery(i).string,c=this.createQuery(o).string;delete n[a],delete n[c]}}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 We;for(const e of s)n.copyEdgesFrom(e,void 0);if(void 0!==t){const s=new Ue("id",xe,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}createQueryFromOptions(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 Ke(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 p(e,t,r,s,n)}createQueryGraph(e,t){return this.dependencies.graphQueryParserFactory.construct(e,t).run(t.object)}}class ht extends dt{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.children)};s(this),n(this.transaction.children)}*getUncachedCollectionsOnChildTransactionsIterator(e){const t=[],s=e=>{for(const n of e)t.push(n),s(n.children)};s(this.transaction.children);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()}}class mt extends Error{}var pt;!function(e){e.warning="warning",e.error="error"}(pt||(pt={}));class ft extends nt{id;errors={item:(0,d.signal)({}),global:(0,d.signal)({})};firstError=(0,d.computed)((()=>{const e=this.errors.global();for(const t in e){const s=e[t];if(s.level===pt.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===pt.error)return s}}}}));firstErrorString=(0,d.computed)((()=>this.firstError()?.string));rootItemSignal=(0,d.signal)(void 0);rootItemToBeSet;tabRequestParameters={};hasChangesSignal=(0,d.signal)(!1);parent;itemHandler;cachedQueryHandler;eventHandler;validator;validatorWithDependencies;options;actionsQueue=Promise.resolve();numPendingActions=0;transactionStateSignal=(0,d.signal)("Ready");isSavingSignal=(0,d.computed)((()=>"Saving"===this.transactionStateSignal()));isReadySignal=(0,d.computed)((()=>"Ready"===this.transactionStateSignal()));isPendingSignal=(0,d.computed)((()=>{if(this.isSavingSignal()||"Pending"===this.transactionStateSignal())return!0;if(this.children.length>0)for(const e of this.children)if(e.isPendingSignal())return!0;return!1}));isDestroyedSignal=(0,d.signal)(!1);isValidSignal=(0,d.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,...i},this.validator=void 0===r?void 0:r.construct(this),this.parent=s,this.itemHandler=new gt(e,this),this.cachedQueryHandler=new It(e,this),this.eventHandler=new ve(e.errorHandler)}enqueueAction(e,t){return void 0!==t&&this.transactionStateSignal.set(t),this.numPendingActions++,this.actionsQueue=this.actionsQueue.then((()=>N(e(),(()=>new Error("Transaction action timeout out")),8e3))).catch((e=>{this.dependencies.errorHandler.logError(e)})).finally((()=>{this.numPendingActions--,0===this.numPendingActions&&this.transactionStateSignal.set("Ready")}))}get rootItem(){return(0,d.untracked)((()=>this.rootItemSignal()))}get hasChanges(){return(0,d.untracked)((()=>this.hasChangesSignal()))}get isSaving(){return(0,d.untracked)((()=>this.isSavingSignal()))}get isReady(){return(0,d.untracked)((()=>this.isReadySignal()))}get isValid(){return(0,d.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 Qt(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,d.untracked)((()=>this.isPendingSignal()))}setPending(e){return this.enqueueAction("function"==typeof e?()=>e((e=>this.doApplyChangesFromUser(e))):()=>e,"Pending")}createChild(e,t,s){if(this.options.transparent)return this.parent.createChild(e,t,s);const n=new ft(this.dependencies,this.core,this,e,t,s);return this.children.push(n),n}createBusinessLogicChild(){return new ft(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)}isDestroyed(){return(0,d.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(!b(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(null===r.parent)throw new Error("TransactionCache: invalid collection map passed to expandCollectionResources");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.createBatchLinkedToQuery(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,d.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();k(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.children.map((e=>e.applyChangesFromParent(n,t,s))));for(const t of e.getDeletedItemEntriesIterator())this.clearItemEntry(t)}applyChangesDelta(e){this.isDestroyed()&&this.dependencies.errorHandler.logWarning(`TransactionCache: tried to apply changes to destroyed transaction with id: '${this.id}'`);const t=W();return this.enqueueAction((()=>this.doApplyChangesFromUser(e).then((e=>(t.resolve(e),e.allChildrenDonePromise))).catch((e=>t.reject(e))))),t.promise}async doApplyChangesFromUser(e){if(e.isEmpty())return{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()};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 t=await this.dependencies.businessLogicManager.handleBusinessLogic(this,e);return null===t?{changesDelta:this.dependencies.changesDeltaFactory.constructChildDelta(),created:[],allChildrenDonePromise:Promise.resolve()}:this.doApplyChangesFromChild(t)}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 rt?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&&e.isLockable()}async save(e=!1,t={},s,n){if("Pending"===this.transactionStateSignal())throw new mt("TransactionCache: Transaction cannot be saved since it (or its children) are pending");return await this.fetchLock(),await this.eventHandler.executeCallbacks("onBeforeSave",(e=>e(this)),e),this.enqueueAction((()=>this.doSave(e,t,s,n)),"Saving")}async doSave(e=!1,t={},s,n){let r;return this.parent instanceof ft?(await this.parent.applyChangesFromChild(this,P(this.tabRequestParameters,t)),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),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){return!(!this.hasChanges||e)||(this.itemHandler.detectChanges()?(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=e.options.parent.itemId,s=this.dependencies.collectionResourceFactory.construct(e,null,this,i);o[t]=s,a.push(s)}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,Ce.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){return this.tabRequestParameters=P(this.tabRequestParameters,t),this.enqueueAction((()=>this.doApplyChangesFromChild(e)))}async doApplyChangesFromChild(e){for(const t of e.cachedQueryHandler.getCachedQueryItemIterator())void 0===this.cachedQueryHandler.getCachedQueryItem(t.itemType,t.query.string)&&this.cachedQueryHandler.cloneCachedQuery(t);const t=e.getDelta();this.handleCascadingDeletes(t);const s=this.dependencies.changesDeltaFactory.constructParentDelta(t),n=[];for(const e in t.created){const r=t.created[e];n.push(this.itemHandler.entries.add(r.entry));const i=this.itemHandler.itemChanges[r.entry.id]=this.itemHandler.copyTransactionItemEntryChanges(r.fields,r.entry);s.setItemCreated(r.entry,i),this.itemHandler.maybeSetRootItem(r.entry)}await this.expandLocalItemsFromDelta(s.created,t.updated),this.itemHandler.processUpdatesFromDelta(t.updated,!0,s);for(const e of t.getDeleteTuplesIterator())s.setItemDeleted(e.entry),this.itemHandler.addToDeletedItems(e.entry,e.isCascaded);const r=await this.cachedQueryHandler.matchItemsToCollectionQueries(s,void 0,!0),i=await this.cachedQueryHandler.applyMatchingResultsToCollections(r);if(this.runChangesListenersAndValidators(i,s,void 0,!1),this.clearChildCollectionResources(i),void 0!==this.validator)try{this.validator.validateTransaction()}catch(e){this.dependencies.errorHandler.logError(e)}return{changesDelta:t,created:n,allChildrenDonePromise:Promise.all(this.children.map((e=>e.applyChangesFromParent(s)))).then((()=>{for(const e of t.getDeleteTuplesIterator())this.clearItemEntry(e.entry);this.detectChanges(!0)}))}}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],b(n[e][t])||delete n[e][t],b(n[e])||delete n[e],{...n}))):this.errors.item.update((s=>s[e]?(delete s[e][t],b(s[e])||delete s[e],{...s}):s)):this.errors.item.update((t=>(delete t[e],{...t}))):this.errors.item.set({})}updateSignals(e,t){for(const t of e){const e=t.collectionResource;(t.addedItems.length>0||t.removedItems.length>0)&&e.itemsSignal.set([...e.items])}for(const e in t.updated){const s=this.itemHandler.itemFieldSignals[e];if(void 0===s)continue;const n=t.updated[e].changes.fields;for(const e in n)s[e]?.set(n[e])}}runChangesListenersAndValidators(e,t,s,n){if(this.updateSignals(e,t),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 Qt(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 Qt(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 yt={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 gt extends lt{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},yt)}*getItemEntriesWithChangesIterator(){for(const e in this.itemChanges)try{yield this.transaction.getLocalItemEntry(Number(e))}catch(e){this.dependencies.errorHandler.logError(e)}}processUpdatesFromDelta(e,t,s){for(const n in e){const r=e[n];if(this.itemIsDeleted(r.entry))continue;const i=this.processItemEntryChanges(r,t);s.setItemUpdated(r.entry,r.changes.fields,i,r.mode)}}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];for(const n of r.columns.item.main)n.apiColumn.itemType===e&&i[n.id]===t&&(i[n.id]=s);const o=r.columns.response[r.itemType];"itemtype"in o&&"item"in o&&i.itemtype===e&&i.item===t&&(i.item=s)}}registerFieldChangeCallback(e,t,s){k(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]=te.copyFields(e.fields,{},e.columns.main),this.itemChanges[t.id].id=t.itemId,t}formatRequest(e){return void 0===this.itemChanges[e.id]?{}:te.formatRequestLocal(this.itemChanges[e.id],e.columns.main)}detectChanges(){for(const e in this.itemChanges)return!0;for(const e in this.deletedItems)if(this.deletedItems[e].length>0)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=te.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||Ce.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 e of t.difference.main)void 0===s[e.id]&&(s[e.id]=te.formatResponseValue(e.apiColumn.type,e.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 a=this.itemFieldSignals[s.id];if(void 0!==a)for(const t in e.changes.fields){const s=a[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,a=this.entries.containsByEntryId(s.id);switch(o={},e.mode){case"CLEAR_ALWAYS":if(a)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&&(te.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!==u.ApiEnumApiType.TYPE_LINK&&(te.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]&&te.compareFields(n[e].type,t[e],r[e])&&delete r[e];break;case"KEEP_WHEN_DIFFERENT":for(const e in t){if(void 0===r[e]&&null!==i){void 0!==i[e]&&(o[e]=i[e]);continue}const c=n[e];if(void 0===c)continue;const l=a?void 0:this.transaction.parent.itemHandler.lookUpItemField(s,e),u=void 0!==l&&te.compareFields(c.type,t[e],l);void 0!==r[e]?(te.compareFields(c.type,t[e],r[e])||(o[e]=r[e],u||(r[e]=te.clone(c.type,t[e]))),u&&delete r[e]):u||(o[e]=l,r[e]=te.clone(c.type,t[e]))}}b(r)||delete this.itemChanges[s.id]}return b(o)?o: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:pe.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 It extends dt{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 ht&&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 rt&&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 rt&&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):Ce.isLocalId(e.parent.itemId)}async __fetchLinkedCachedQueryItems(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}createBatchLinkedToQuery(e,t,s){let n={conditions:[{linkedTo:e,query:{id:t}}]};return void 0!==s&&(n=this.dependencies.queryService.addAndCondition(n,s)),this.createQuery(n)}processLinkCollectionOptions(e,t,s,n){if(0===s.length)throw new Error("Expected `parentItemIds` to have at least one element");const r=[],i=[];let o;for(const a of s){let s,c;void 0===o?(s=this.cloneOptions(n,{itemType:t,itemId:a}),c=this.createQueryFromOptions(s),this.expandColumnsWithQueryColumns(e,s,c.object),o=s):(s=this.cloneOptions(o,{itemType:t,itemId:a}),c=this.createQueryFromOptions(s)),r.push({options:s,parsedQuery:c}),i.push({value:a,node:c})}const a=void 0===o.query?new We:this.dependencies.graphQueryParserFactory.construct(e,i[0].node).run(o.query);return{collectionQueryTuples:r,batchQuery:this.createBatchLinkedToQuery(t,s,n.query),batchQueryGraph:a.clone((s=>{s.leafNodes=[],be.addBranchNode(s,Ye.createLinkedToComparatorQueryNode(e,t,i,this.dependencies.linkTreeService,this.dependencies.errorHandler))}))}}__fetchParentCachedQueryItem(e,t){const s=this.createQueryFromOptions(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.processLinkCollectionOptions(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}])).cachedQueryItemTuples[0]}cloneOptions(e,t){const s={...e};void 0!==t&&(s.parent=t);const n=e.children;if(void 0!==n){const e={};for(const t in n)e[t]=this.cloneOptions(n[t]);s.children=e}return s}async fetchChildCachedQueryItems(e){const t=await Promise.all(e.map((e=>this.__fetchLinkedCachedQueryItems(e.itemType,e.linkCollectionOptions)))),s=[];for(let n=0;n<e.length;n++)s.push(this.resolveParentCachedQueryItems(e[n].itemType,t[n]));return Promise.all(s)}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 Ze(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{itemType:e,cachedQueryItemTuples:t};const s=t[0].options.children;if(null===s)return{itemType:e,cachedQueryItemTuples:t};const n=t.map((e=>e.cachedQueryItem.items.map((e=>e.itemId)))),r=n.flat();if(0===r.length)return{itemType:e,cachedQueryItemTuples:t};const i=[];for(const t in s)i.push({itemType:t,linkCollectionOptions:this.processLinkCollectionOptions(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{itemType:e,cachedQueryItemTuples: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 Ct{transaction;lastCallIdMap={global:(0,d.signal)({}),item:(0,d.signal)({})};isPendingSignal=(0,d.computed)((()=>b(this.lastCallIdMap.global())||b(this.lastCallIdMap.item())));_lastCallId=0;constructor(e){this.transaction=e}isPending(){return(0,d.untracked)((()=>this.isPendingSignal()))}setItemError(e,t,s,n,r,i=r,o=pt.error,a){const c=this.getHash(e,t,s);if(!O(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=pt.error){if(!O(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 vt extends Ct{hasFields(e,t){return t.every((t=>Object.prototype.hasOwnProperty.call(e,t)))}}class Tt extends Ct{dependencies}class Rt{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!b(this.updated)&&!b(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 Et extends Error{constructor(e,t){super(`Missing column '${t}' for item with type '${e.itemType}' and ID '${e.itemId}'`)}}class _t extends Rt{logMissingColumnErrors;errorHandler;itemCreateService;created=new xt;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 te.shallowCopyFields(t,o.changes.fields,a.response[e.itemType],this.logMissingColumnErrors?t=>this.errorHandler.logError(new Et(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()&&!b(this.restored)}toJSON(){return{updated:this.updated,created:this.created,deleted:this.deleted}}}class St extends Rt{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];te.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()&&!b(this.created)}}class bt extends Rt{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];te.shallowCopyFields(t,r.changes.fields,i),null!==s&&(null!==r.previous?te.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()&&!b(this.created)}}const wt={forceFlush:!1,flushTimeout:window.IS_IN_TEST?0:150,limit:void 0};class qt{apiRequestService;itemType;options;deferred=W();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 Ft extends qt{contents={queries:new Map,singleItemIds:new Set};static constructWithSingleItems(e,t,s,n,r,i){return new Ft(e,t,s,i)._addSingleItems(n,r)}static constructWithQuery(e,t,s,n,r,i){return new Ft(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 kt extends qt{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 Lt{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(Ft.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?Ft.constructWithQuery(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r):new kt(this.apiRequestService,this.requestColumnExpansionFactory,e,t,s,r))}processOptions(e={}){const t={};let s;for(s in wt)t[s]=void 0!==e[s]?e[s]:wt[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 Dt{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:Ce.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 xt{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!b(this.tuples)}*getTuplesIterator(e){if(0!==e.length){if(1===e.length){const t=this.tuples[e[0]];return void 0===t?{next:function(){return{value:void 0,done:!0}},[Symbol.iterator]:function(){return this}}:t.values()}for(const t of e){if(void 0!==this.tuples[t])for(const e of this.tuples[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 Pt{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=b(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=pe.mergeResponseColumns(s,e).merged;return new E(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 Mt={get:(e,t)=>{const s=e.previous[t];return void 0!==s?s:e.itemHandler.lookUpItemField(e.itemEntry,t)}};class Bt{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},Mt)}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 pe.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 Qt extends Bt{isCalledAfterSocketUpdate;constructor(e,t,s,n,r,i=!1){super(e,t.collectFields(e.entry),t,s,n,i),this.isCalledAfterSocketUpdate=r}}class At extends Bt{collectionResource;isCalledAfterSocketUpdate;constructor(e,t,s,n,r){super(t,t.fields,t.transaction.itemHandler,n,r),this.collectionResource=e,this.isCalledAfterSocketUpdate=s}}class jt{transaction;previousChangesDelta;constructor(e,t){this.transaction=e,this.previousChangesDelta=t}}const Ht=Symbol("Skip rule"),Ut=Symbol("Continue with defaults"),Ot=Symbol("Stop execution");class Vt{locals;hasFlag;getAccountSettings;confirm=null;postDependencyConfirm=null;constructor(e,t,s){this.locals=e,this.hasFlag=t,this.getAccountSettings=s}}class Nt extends jt{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?Ht: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];te.compareFields(i.type,n,s)&&r.push(e.entry.itemId)}return 0===r.length?Ht:r}}class Wt extends jt{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 $t(e){return function(t){t.__name=e}}function Gt(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}const zt=["recureind","recurperiode","recurhoe"];let Yt=class extends Vt{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?Ht:n}async dependency(e,t){return e.getItemsById(this.itemType,t,{columns:[...zt,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"}}};Yt=Gt([$t("RecurrentItemRecureindBusinessLogicRule")],Yt);let Kt=class extends Yt{itemType="Afspraak";toField="tot"};Kt=Gt([$t("AfspraakRecureindBusinessLogicRule")],Kt);let Xt=class extends Yt{itemType="Beschikbaarheid";toField="plantot"};Xt=Gt([$t("BeschikbaarheidRecureindBusinessLogicRule")],Xt);const Jt=["straat","huisnummer","postcode","stad","provincie","land"],Zt=["bezoek","post","factuur"];let es=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Contact"),s=[];for(const n of t)Jt.some((t=>e.previousChangesDelta.hasUpdatedValue(n.entry,`bezoek${t}`)))&&s.push(n.entry.itemId);return 0===s.length?Ht:s}async dependency(e,t){const s=[];for(const e of Zt)for(const t of Jt)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,Jt.reduce(((e,t)=>(e[`prefix${t}`]=n.fields[`bezoek${t}`],e)),{}))}addressEqualsVisitingAddress(e,t){for(const s of Jt)if(e.fields[t+s]!==e.fields["bezoek"+s])return!1;return!0}};es=Gt([$t("ContactAddressBusinessLogicRule")],es);const ts=["defaultvalue"];let ss=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Customfield","linkedItemType")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ts})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{defaultvalue:null})}};ss=Gt([$t("CustomFieldLinkedItemTypeBusinessLogicRule")],ss);const ns=["defaultvalue","attributes","type"];let rs=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Customfield","type")}async dependency(e,t){return e.getItemsById("Customfield",t,{columns:ns})}apply(e,t){for(const s of t){const t=s.fields.type;let n;n="enum"===t?0:te.getDefaultValue(t),e.setItemUpdated(s.entry,{defaultvalue:n,attributes:{}})}}};rs=Gt([$t("CustomFieldTypeBusinessLogicRule")],rs);const is={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"}},os=["id","contactpersoon"];let as=class extends Vt{condition(e){const t={};let s=!1;for(const n of e.previousChangesDelta.getUpdatedTuplesIterator()){const r=is[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:Ht}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:os})}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=is[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})}}}};as=Gt([$t("DefaultContactPersonUpdateBusinessLogicRule")],as);const cs=["Factuur","Offerte","Contract","Bon","Inhuurbon","Materiaalbon","Medewerkerbon","Aanmaning","Reparatiebon","Voertuigbon"],ls=["filename","betreft"];let us=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator(...cs),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:Ht}dependency(e,t){const s={};for(const n in t)s[n]=e.getItemsById(n,t[n],{columns:ls});return V(s)}apply(e,t){for(const s in t)for(const n of t[s])e.setItemUpdated(n.entry,{filename:"",betreft:""})}};us=Gt([$t("DocumentTemplateBusinessLogicRule")],us);const ds=["actief"];let hs=class extends Vt{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Exemplaar"),s=[],n=ee()();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?Ht:s}async dependency(e,t){return e.getItemsById("Exemplaar",t,{columns:ds})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{actief:!0})}};hs=Gt([$t("ExemplaarAanschafdatumBusinessLogicRule")],hs);let ms=class extends Vt{condition({previousChangesDelta:e}){const t=e.getDeletedItemEntriesIterator("Exemplaar"),s=[];for(const e of t)s.push(e.itemId);return 0===s.length?Ht: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)}};ms=Gt([$t("ExemplaarBarcodeDeleteBusinessLogicRule")],ms);const ps=["vervaldatum","datum","betalingsconditie"],fs=["id","dagen"];let ys=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","betalingsconditie")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:ps}),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:fs})).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")})}}};ys=Gt([$t("FactuurBetalingsconditieBusinessLogicRule")],ys);const gs=["id","taxschema","vervaldatum","betalingsconditie","datum"],Is=["id","dagen"];let Cs=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","datum")}async dependency(e,t){const s=await e.getItemsById("Factuur",t,{columns:gs}),n=[...new Set(s.map((e=>e.fields.betalingsconditie)).filter((e=>null!==e)))],r=await e.getItemsById("Betalingsconditie",n,{columns:Is}),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")})}};Cs=Gt([$t("FactuurDatumBusinessLogicRule")],Cs);const vs=["nummer"];let Ts=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Factuur","numberseries")}async dependency(e,t){return e.getItemsById("Factuur",t,{columns:vs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{nummer:null})}};var Rs;Ts=Gt([$t("FactuurNumberseriesBusinessLogicRule")],Ts);const Es=["name","friendlyname"];let _s=Rs=class extends Vt{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?Ht:n}async dependency(e,t){return e.getItemsById("Files",t,{columns:Es})}apply(e,t){for(const s of t)for(const t of Es){const n=Rs.getExtension(s.initial[t]);if(null===n)continue;const r=Rs.getExtension(s.fields[t]);null!==r&&r===n||e.setItemUpdated(s.entry,{[t]:s.fields[t]+n})}}};_s=Rs=Gt([$t("FilesNameExtensionBusinessLogicRule")],_s);const Ss=["naamintern","naamofferte"];let bs=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Functie","naamofferte")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ss})}apply(e,t){for(const s of t)""===s.fields.naamintern.trim()&&e.setItemUpdated(s.entry,{naamintern:s.fields.naamofferte})}};bs=Gt([$t("FunctieNaaminternBusinessLogicRule")],bs);let ws=class extends Yt{itemType="Functie";toField="plantot"};ws=Gt([$t("FunctieRecureindBusinessLogicRule")],ws);const qs=["twoway","afstand","afstand_van_locatie",{subproject:[{locatie:["kilometers"]}]}];function Fs(e,t){return t.getDerivedValue(["subproject","locatie","kilometers"])*(e.transaction.itemHandler.lookUpItemField(t.entry,"twoway")?2:1)}let ks=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","afstand_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:qs})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:Fs(e,s)})}};ks=Gt([$t("FunctieTravelDistanceFromLocationBusinessLogicRule")],ks);let Ls=class extends Vt{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?Ht:s}async dependency(e,t){return(await e.getItemsById("Functie",t,{columns:qs})).filter((e=>e.fields.afstand_van_locatie))}apply(e,t){for(const s of t){const t=Fs(e,s);s.fields.afstand!==t&&e.setItemUpdated(s.entry,{afstand_van_locatie:!1})}}};Ls=Gt([$t("FunctieTravelDistanceUnlinkLocationBusinessLogicRule")],Ls);const Ds=[{subproject:[{locatie:["reistijd"]}]}];let xs=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Functie","reistijd_van_locatie",!0)}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ds})}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})}}};xs=Gt([$t("FunctieTravelTimeFromLocationBusinessLogicRule")],xs);const Ps=["afstand","twoway"];let Ms=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Functie","twoway")}async dependency(e,t){return e.getItemsById("Functie",t,{columns:Ps})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{afstand:s.fields.afstand*(s.fields.twoway?2:.5)})}};Ms=Gt([$t("FunctieTwowayBusinessLogicRule")],Ms);const Bs=["subproject"];let Qs=class extends Vt{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?Ht:s}dependency(e,t){return Promise.all(t.map((t=>e.getItemsByQuery("Functie",{functiegroep:t.itemEntry.itemId},{columns:Bs}))))}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})}};Qs=Gt([$t("FunctiegroepSubprojectBusinessLogicRule")],Qs);const As=["id","aantal","parent","materiaal"];class js extends Vt{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?Ht:n}async dependency(e,t,s){const n=await e.getItemsById(this.itemType,t,{columns:As}),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 Hs=class extends js{itemType="Inhuurmateriaal"};Hs=Gt([$t("InhuurmateriaalAantalRoundUpBusinessLogicRule")],Hs);class Us extends Error{context;constructor(e,t){super(e),this.context=t}}const Os=["id","aantal","aantaltotaal","parent","materiaal"],Vs=[...Os,"categorie"],Ns=[...Os,"inhuurgroep"];class Ws extends Vt{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?Ht: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 Us("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 Us("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 $s=class extends Ws{itemType="Inhuurmateriaal";groupingProperties={itemType:"Inhuurgroep",columnId:"inhuurgroep"};requestColumns=Ns};$s=Gt([$t("InhuurmateriaalAantaltotaalBusinessLogicRule")],$s);const Gs=["is_combination"],zs=["equipment"];let Ys=class extends Vt{async dependency(e,t){const s=t.filter((e=>!Ce.isLocalId(e))),n=s.length>0?e.cachedQueryHandler.__fetchCachedQueryItem("Voorraadmutatie",{columns:["id"],query:{conditions:[{key:"datum",value:ee()(),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:Gs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:zs}),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)}};Ys=Gt([$t("MateriaalBulkToSerialBusinessLogicRule")],Ys);let Ks=class extends Vt{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)}};Ks=Gt([$t("MateriaalIsCombinationBusinessLogicRule")],Ks);const Xs=["is_physical","is_combination","telexemplaren","can_edit_content_during_planning"];let Js=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:Xs})}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})}};Js=Gt([$t("MateriaalIsPhysicalCombinationBulkBusinessLogicRule")],Js);const Zs=["is_combination"],en=["equipment"];let tn=class extends Vt{async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Materiaal",t,{columns:Zs}),e.getItemsByQuery("ContainerContent",{equipment:t},{columns:en})]);return{materiaalResources:s,containerContentResources:n}}apply(){}condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","telexemplaren",!1)}};tn=Gt([$t("MateriaalSerialToBulkBusinessLogicRule")],tn);const sn=["is_combination","verhuur","can_edit_content_during_planning"];let nn=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!0)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:sn})}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}))}};nn=Gt([$t("MateriaalToPhysicalBusinessLogicRule")],nn);const rn=["is_combination","can_edit_content_during_planning"];let on=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","is_physical",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:rn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{is_combination:!0,can_edit_content_during_planning:!0})}};on=Gt([$t("MateriaalToVirtualBusinessLogicRule")],on);const an=["type","is_combination","is_physical","can_edit_content_during_planning"];let cn=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:an})}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})}}};cn=Gt([$t("MateriaalTypePropertiesBusinessLogicRule")],cn);const ln=["is_combination","is_physical"];let un=class extends Vt{condition(e){return e.getItemIdsWithFieldUpdatedTo("Materiaal","verhuur",!1)}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:ln})}apply(e,t){for(const s of t)s.fields.is_physical&&e.setItemUpdated(s.entry,{is_combination:!1})}};un=Gt([$t("MateriaalVerhuurBusinessLogicRule")],un);const dn=["width","height","oppervlakteartikel","nieuwprijs","inhuurprijs","verhuurprijs","naam"];let hn=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Materiaal",t,{columns:dn})}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)}}};hn=Gt([$t("SurfaceArticleSizeBusinessLogicRule")],hn);const mn=["MateriaalCat","Functie","Functiegroep"],pn=["type","isStart","defaultValue"],fn={schema_gv:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_gv_begin",value:"gebruikvan",opposite:"schema_gt",plan:"schema_pv",isStart:!0},schema_gt:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_gt_begin",value:"gebruiktot",opposite:"schema_gv",plan:"schema_pt",isStart:!1},schema_pv:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_pv_begin",value:"planvan",opposite:"schema_pt",usage:"schema_gv",isStart:!0},schema_pt:{type:u.ApiEnumApiType.TYPE_ITEM,start:"schema_pt_begin",value:"plantot",opposite:"schema_pv",usage:"schema_gt",isStart:!1},gebruikvan:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gv",opposite:"gebruiktot",plan:"planvan",isStart:!0},gebruiktot:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_gt",opposite:"gebruikvan",plan:"plantot",isStart:!1},planvan:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pv",opposite:"plantot",usage:"gebruikvan",isStart:!0},plantot:{type:u.ApiEnumApiType.TYPE_DATETIME,scheme:"schema_pt",opposite:"planvan",usage:"gebruiktot",isStart:!1},schema_pv_begin:{type:u.ApiEnumApiType.TYPE_BOOL,usage:"schema_gv_begin",defaultValue:!0},schema_pt_begin:{type:u.ApiEnumApiType.TYPE_BOOL,usage:"schema_gt_begin",defaultValue:!1},schema_gv_begin:{type:u.ApiEnumApiType.TYPE_BOOL,plan:"schema_pv_begin",defaultValue:!0},schema_gt_begin:{type:u.ApiEnumApiType.TYPE_BOOL,plan:"schema_pt_begin",defaultValue:!1},duur:{type:u.ApiEnumApiType.TYPE_DURATION},timeframe:{type:u.ApiEnumApiType.TYPE_ITEM}};class yn{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!==fn[e]}static getColumnInstance(e){if(void 0!==this.columnInstances[e])return this.columnInstances[e];const t=fn[e],s={id:e};this.columnInstances[e]=s;for(const e in t)s[e]=pn.includes(e)?t[e]:this.getColumnInstance(t[e]);return s}static*getColumnIdIterator(e){for(const t in fn)"timeframe"===t&&"Functie"!==e||(yield t)}static getColumnIds(e){return[...this.getColumnIdIterator(e)]}static getDefaultValues(e,t={id:null,van:ee().invalid(),tot:ee().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:ee().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]=te.clone(fn[e].type,t[e]);return s}static compareValues(e,t,s){const n=this.getColumnIdIterator(e);for(const e of n)if(!te.compareFields(fn[e].type,t[e],s[e]))return!1;return!0}}class gn extends Vt{conditionColumns;extractUpdatedTuples(e,t=!1){const s=e.previousChangesDelta.getUpdatedTuplesIterator(...mn),n=mn.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(...mn);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 mn.every((e=>0===t[e].size))?Ht:t}async fetchLinkedItemResourcesWithColumns(e,t,s){return V(mn.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,mn.reduce(((e,t)=>(e[t]=s,e)),{}))}}const In=["gebruikvan","gebruiktot"],Cn=[...In,"duur"];let vn=class extends gn{conditionColumns=In;condition(e){return this.extractUpdatedTuplesCondition(e)}apply(e,t){for(const s of mn)for(const n of t[s]){const t=n.fields.gebruikvan,s=n.fields.gebruiktot;t.isValid()&&s.isValid()&&e.setItemUpdated(n.entry,{duur:ee().duration(s.diff(t))})}}dependency(e,t){return this.fetchLinkedItemResources(e,t,Cn)}};vn=Gt([$t("LinkedTimeItemDurationBusinessLogicRule")],vn);const Tn=["van","tot","is_absolute_times_substitute"],Rn=["id",...yn.valueColumnIds,...yn.schemeStartColumnIds,{schema_pv:Tn},{schema_pt:Tn},{schema_gv:Tn},{schema_gt:Tn}];let En=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("MateriaalCat"),s=new Map;for(const n of t){const t=n.entry;for(const n of yn.valueColumnIds){if(void 0===e.previousChangesDelta.getUpdatedValue(t,n)||null===e.transaction.itemHandler.lookUpItemField(t,yn.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?Ht:s}dependency(e,t){return e.getItemsById("MateriaalCat",[...t.keys()],{columns:Rn})}apply(e,t,s){for(const n of t){const t=s.get(n.fields.id);for(const s of t){const t=yn.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()})}}}};En=Gt([$t("LinkedTimeItemMateriaalCatBusinessLogicRule")],En);const _n=["project","subproject"],Sn=yn.schemeValueColumnIds,bn=[...Sn,..._n],wn=["id","project","subproject","is_absolute_times_substitute"],qn=[...yn.schemeValueColumnIds,"timeframe"];let Fn=class extends gn{conditionColumns=_n;async condition(e){const t=this.extractUpdatedTuples(e,!0);if(mn.every((e=>0===t[e].size)))return Ht;const s=await this.fetchLinkedItemResourcesWithColumns(e.transaction,t,{MateriaalCat:bn,Functie:[...bn,"timeframe"],Functiegroep:bn}),n=await e.transaction.getItemsById("Tijd",[...this.extractTimeItemIds(s)],{columns:wn}),r=this.validateLinkedTimes(s,n);return mn.every((e=>0===r[e].length))?Ht:r}apply(e,t,s){for(const t of mn)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 mn){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 mn)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?qn:Sn;for(const s of t){const t=e.fields[s];null!==t&&(yield{timeId:t,columnId:s})}}};Fn=Gt([$t("LinkedTimeItemSubprojectBusinessLogicRule")],Fn);const kn=[...yn.valueColumnIds,...yn.schemeStartColumnIds],Ln=["id","van","tot"];let Dn=class extends gn{conditionColumns=yn.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:Ln}),this.fetchLinkedItemResources(e,t,kn)]);return{timeResources:n,linkedTimeItemResources:r}}apply(e,t,s){for(const n of mn)for(const[r,i]of s[n])for(const s of i){const n=yn.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 mn)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]}};Dn=Gt([$t("LinkedTimeItemTimeSchemeBusinessLogicRule")],Dn);let xn=class extends gn{conditionColumns=yn.schemeValueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,yn.schemeValueColumnIds)}apply(e,t,s){for(const n of mn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=yn.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]})}}}};xn=Gt([$t("LinkedTimeItemTimeSchemeStartBusinessLogicRule")],xn);const Pn=[...yn.valueColumnIds,...yn.schemeValueEndColumnIds];let Mn=class extends gn{conditionColumns=yn.valueStartColumnIds;condition(e){return this.extractUpdatedTuplesCondition(e)}dependency(e,t){return this.fetchLinkedItemResources(e,t,Pn)}apply(e,t,s){for(const n of mn)for(const r of t[n]){const t=r.entry,i=s[n].get(t);for(const s of i){const n=yn.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]})}}}};Mn=Gt([$t("LinkedTimeItemTimeValueStartBusinessLogicRule")],Mn);const Bn=["vervaldatum","datum"];let Qn=class extends Vt{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:Ht}async dependency(e,t){return V({Offerte:e.getItemsById("Offerte",t.Offerte,{columns:Bn}),Contract:e.getItemsById("Contract",t.Contract,{columns:Bn})})}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")})}};Qn=Gt([$t("OfferteContractDatumBusinessLogicRule")],Qn);let An=class extends js{itemType="Planningmateriaal"};An=Gt([$t("PlanningmateriaalAantalRoundUpBusinessLogicRule")],An);let jn=class extends Ws{itemType="Planningmateriaal";groupingProperties={itemType:"MateriaalCat",columnId:"categorie"};requestColumns=Vs};jn=Gt([$t("PlanningmateriaalAantaltotaalBusinessLogicRule")],jn);const Hn=["id","optie","parent"],Un=["id","optie","categorie","parent",{materiaal:["is_combination","is_physical"]}];let On=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","optie")}async dependency(e,t){const s=await e.getItemsById("Planningmateriaal",t,{columns:Un}),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:Hn}),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))}};On=Gt([$t("PlanningmateriaalOptieBusinessLogicRule")],On);const Vn=["parent","setcontent"];let Nn=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","parent")}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Vn})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{setcontent:null})}};Nn=Gt([$t("PlanningmateriaalParentBusinessLogicRule")],Nn);const Wn=["aantaltotaal","stays_at_location",{categorie:[{project:[{projecttype:["type"]}]}]}];let $n=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Planningmateriaal","aantaltotaal",!0)}async dependency(e,t){return e.getItemsById("Planningmateriaal",t,{columns:Wn})}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})}};$n=Gt([$t("PlanningmateriaalStaysAtLocationBusinessLogicRule")],$n);const Gn={planning:"planvan",travel:"reistijd_vooraf",factor:-1},zn={planning:"plantot",travel:"reistijd_achteraf",factor:1},Yn=["vervoer","functie",Gn.planning,zn.planning],Kn=["id",Gn.travel,zn.travel],Xn={geen:[],heen:[Gn],terug:[zn],retour:[Gn,zn]};let Jn=class extends Vt{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:Ht}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Planningpersoneel",t.Planningpersoneel,{columns:Yn}),e.getItemsById("Planningtransport",t.Planningtransport,{columns:Yn})]),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:Kn})).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,Xn[n.initial.vervoer],-1,s.initial),this.updatePlanningColumns(e,n,Xn[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())})}};Jn=Gt([$t("PlanningPersoneelTransportBusinessLogicRule")],Jn);const Zn=["factuurmoment","taxschema"],er=["korting_personeel","korting_transport","korting_verkoop","korting_verhuur","korting_totaal","verzekering"],tr=["factuurmoment","taxschema","personeelkorting","transportkorting","verkoopkorting","verhuurkorting","totaalkorting","verzekering","verzekering_aangepast"],sr={Project:{factuurmoment:"factuurmoment",taxschema:"taxschema"},Subproject:{personeelkorting:"korting_personeel",transportkorting:"korting_transport",verkoopkorting:"korting_verkoop",verhuurkorting:"korting_verhuur",totaalkorting:"korting_totaal",verzekering:"verzekering"}};let nr=class extends Vt{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(V({projectId:r.entry.itemId,clientId:s,hasEqualValues:this.valuesEqual(r.entry.itemId,s,t)}))}if(0===n.length)return Ht;const r=(await Promise.all(n)).filter((e=>!e.hasEqualValues));return 0===r.length?Ht: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]=V({projectResource:e.getItemById("Project",t,{columns:Zn}),subprojectCollection:e.getCollection("Subproject",{parent:{itemType:"Project",itemId:t},columns:er}),clientResource:e.getItemById("Contact",r,{columns:tr})})}return V(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 V({projectResource:s.getItemById("Project",e,{columns:Zn}),subprojectCollection:s.getCollection("Subproject",{parent:{itemType:"Project",itemId:e},columns:er}),clientResource:s.getItemById("Contact",t,{columns:tr})}),r=n.subprojectCollection.items,i=n.clientResource.fields;let o,a;for(const e of r)for(o in sr.Subproject)if(a=sr.Subproject[o],("verzekering"!==o||i.verzekering_aangepast)&&("taxschema"!==o||null!==i.taxschema)&&e.fields[a]!==i[o])return!1;for(o in sr.Project)if(a=sr.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=sr[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)}};nr=Gt([$t("ProjectClientChangedBusinessLogicRule")],nr);const rr=["opdrachtgever","locatie"],ir=["projectnotitie_naam","projectnotitie"],or=["naam","omschrijving"];let ar=class extends Vt{condition(e){const t=e.previousChangesDelta.getUpdatedTuplesIterator("Project"),s=[];for(const n of t){const t=rr.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:Ht}async dependency(e,t){const s=Promise.all(t.map((t=>V({projectId:t.projectId,Contact:e.getItemsById("Contact",[...t.updatedContactIds],{columns:ir}),Projectnotitie:e.getItemsByQuery("Projectnotitie",{},{parent:{itemType:"Project",itemId:t.projectId},columns:or})}))));return V({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(Ce.getLocalId(),{...t.template.getFields(),naam:r,omschrijving:i,project:s.projectId},t.template.getMainColumnSet()))}}};ar=Gt([$t("ProjectContactProjectNoteBusinessLogicRule")],ar);const cr=["id","locatie"],lr=["id","locatie","locatie_persoon"];let ur=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Project","locatie")}dependency(e,t){const s={};for(const n of t)s[n]=V({subprojectResources:e.getItemsByQuery("Subproject",{project:n},{columns:cr}),projectResource:e.getItemById("Project",n,{columns:lr})});return V(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})}}};ur=Gt([$t("ProjectOneSubLocationAlignBusinessLogicRule")],ur);const dr=["gebruiksperiode","planperiode","transport_pickup","transport_return"];let hr=class extends Vt{condition({previousChangesDelta:e}){const t=e.getUpdatedTuplesIterator("Project","Subproject"),s={Project:[],Subproject:[]};let n=!1;for(const r of t)for(const t of dr)if(e.getUpdatedValue(r.entry,t)){n=!0,s[r.entry.itemType].push(r.entry.itemId);break}return n?s:Ht}async dependency(e,t){const[s,n]=await Promise.all([e.getItemsById("Project",t.Project,{columns:dr}),e.getItemsById("Subproject",t.Subproject,{columns:dr})]);return{project:s,subproject:n}}apply(e,t){const s=[...t.project,...t.subproject];for(const t of s)for(const s of dr){const n=t.fields[s];if(null!==n){for(const r of dr){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}}}};hr=Gt([$t("ProjectSubprojectDefaultTimeBusinessLogicRule")],hr);const mr=["approval_status","previous_status"];let pr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","approval_status")}async dependency(e,t){return e.getItemsById("PurchaseOrder",t,{columns:mr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{previous_status:s.initial.approval_status})}};pr=Gt([$t("PurchaseOrderApprovalStatusBusinessLogicRule")],pr);let fr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("PurchaseOrder","owner")}async dependency(){return Promise.resolve()}apply(){}};fr=Gt([$t("PurchaseOrderOwnerBusinessLogicRule")],fr);const yr=["rate_group","active","id"];let gr=class extends Vt{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?Ht:t}dependency(e,t){return e.getItemsByQuery("Rate",{conditions:[{key:"rate_group",comparator:"IN",value:[...t]},{active:!0}],operator:"AND"},{columns:yr,preventCaching:!0})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{active:!1})}};gr=Gt([$t("RateDeactivateExistingOnCreateBusinessLogicRule")],gr);const Ir=["aantal"];let Cr=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Reparatie",t,{columns:Ir})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{aantal:1})}};Cr=Gt([$t("ReparatiesExemplaarAantalBusinessLogicRule")],Cr);const vr=["id","asset_location"];let Tr=class extends Vt{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?Ht: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:vr})}}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})}}};Tr=Gt([$t("ReparatieLostItemExemplaarLocationBusinessLogicRule")],Tr);const Rr=["general_eigen_medewerker_edit"];let Er=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Rr})}apply(e,t){for(const s of t)e.setItemUpdated(s.entry,{general_eigen_medewerker_edit:!0})}};Er=Gt([$t("RolEditOwnDataBusinessLogicRule")],Er);const _r=["facturen_eigen","general_bestanden_downloaden","facturen_toegang","projecten_offertes_maken","projecten_facturen_maken"];let Sr=class extends Vt{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?Ht:s}async dependency(e,t){return e.getItemsById("Rol",t,{columns:_r})}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})}}}};Sr=Gt([$t("RolFileAccessBusinessLogicRule")],Sr);const br=["projecten_toegang"];let wr=class extends Vt{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=Gt([$t("RolPersoneelsplannerToegangBusinessLogicRule")],wr);const qr=["materialen_tijdlijn"];let Fr=class extends Vt{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?Ht: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=Gt([$t("RolProjectenBewerkenBusinessLogicRule")],Fr);const kr=["uren_kosten","visibility_financials"];let Lr=class extends Vt{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=Gt([$t("RolProjectenToegangBusinessLogicRule")],Lr);const Dr=["purchaseorders_edit"];let xr=class extends Vt{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?Ht: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=Gt([$t("RolPurchaseOrderAttachPlanningBusinessLogicRule")],xr);const Pr=["visibility_financials","facturen_toegang","projecten_facturen_maken","projecten_offertes_maken","projecten_toegang"];let Mr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Rol","visibility_financials")}async dependency(e,t){return e.getItemsById("Rol",t,{columns:Pr})}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})}};Mr=Gt([$t("RolVisibilityFinancialsBusinessLogicRule")],Mr);let Br=class extends Vt{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=Gt([$t("RolWarehouseTrackingLogAccessBusinessLogicRule")],Br);const Qr=["id","type","is_combination","is_physical","telexemplaren","verhuur"];let Ar=class extends Vt{condition(e){const t=[];for(const s of e.previousChangesDelta.getCreatedTuplesIterator("Setinhoud"))void 0!==s.fields.package&&t.push(s);return 0===t.length?Ht: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=Gt([$t("SetinhoudCreateFixedBusinessLogicRule")],Ar);const jr=["is_fixed",{package:["type"]}];let Hr=class extends Vt{condition({previousChangesDelta:e}){if(this.hasFlag("FUNCTIONALITY_FLEXIBLE_COMBINATION_IN_PLANNING"))return Ht;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?Ht: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=Gt([$t("SetinhoudUpdateFixedBusinessLogicRule")],Hr);const Ur=["subproject","inplanning"];let Or=class extends Vt{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:Ht}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=Gt([$t("SubprojectInPlanningBusinessLogicRule")],Or);const Vr=["id","project","locatie","locatie_persoon"],Nr=["id","locatie"];let Wr=class extends Vt{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 V(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=Gt([$t("SubprojectOneSubLocationAlignBusinessLogicRule")],Wr);const $r=["id","naam"],Gr=["id","project","naam"];let zr=class extends Vt{condition(e){return e.getItemIdsWithUpdatedField("Project","naam")}async dependency(e,t){return Promise.all(t.map((t=>V({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=Gt([$t("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 Vt{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=Gt([$t("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"],Jr=["id","tot","van"];let Zr=class extends Vt{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:Ht}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:Jr})}}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}};Zr=Gt([$t("TaakDeadlineOffsetBusinessLogicRule")],Zr);const ei=["naam","id"],ti=["schema_pv","schema_gv","schema_pt","schema_gt","naam"];let si=class extends Vt{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=Gt([$t("TijdPropagateNameToFunctiegroepBusinessLogicRule")],si);const ni=["id","gebruiksperiode","planperiode"];let ri=class extends Vt{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?Ht: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=Gt([$t("TijdSubprojectChangedBusinessLogicRule")],ri);const ii=[as,es,ss,rs,us,hs,ms,ys,Cs,Ts,_s,bs,ks,Ls,xs,Ms,ws,Qs,$s,Hs,Ks,Js,on,nn,Ys,tn,cn,un,hn,vn,Dn,xn,Mn,Fn,En,Qn,An,jn,On,Nn,$n,Jn,nr,ar,ur,hr,fr,pr,gr,Cr,Tr,Er,Sr,wr,Fr,Lr,Mr,Br,xr,Ar,Hr,Wr,zr,Or,Kr,Zr,ri,si,Kt,Xt];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){const s=e.createBusinessLogicChild();let n=await s.applyChangesDirectly(t),r=0;for(;!n.isEmpty()&&r<20;){const e=new Nt(s,n),t=await this.extractRulesToRun(e);if(null===t)return null;const i=await this.waitForRuleDependencies(t,e);if(null===i)return null;const o=s.createChangesDelta();this.applyRules(i,new Wt(s,n,o)),n=await s.applyChangesDirectly(o),r++}return 20===r&&this.errorHandler.logError(new Error("Business logic cycles maximum reached")),s}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===Ut?void 0:s.confirmResult)}catch(e){this.errorHandler.logError(e)}}async waitForRuleDependencies(e,t){const s=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 e.ruleInstance.postDependencyConfirm(e.conditionResult,e.dependencyResult,t.transaction)),e)))),n=[];for(const e of s)if("rejected"!==e.status){if(e.value.confirmResult!==Ht){if(e.value.confirmResult===Ot)return null;n.push(e.value)}}else{if(e.reason instanceof Us)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return n}async extractRulesToRun(e){const t=await Promise.allSettled(this.businessLogicRuleInstances.map((async t=>{const s=await t.condition(e);let n;return null!==t.confirm&&s!==Ht&&(n=await t.confirm(s,e.transaction)),{ruleInstance:t,conditionResult:s,confirmResult:n}}))),s=[];for(const e of t)if("rejected"!==e.status){if(e.value.conditionResult!==Ht&&e.value.confirmResult!==Ht){if(e.value.confirmResult===Ot)return null;s.push(e.value)}}else{if(e.reason instanceof Us)return this.errorHandler.notifyError(e.reason),null;this.errorHandler.logError(e.reason)}return s}}class ai{construct(e){return new ne(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 g(this,i,s,r.queryGraph,r.query,o,t):void 0===i.order.limit?new T(this,i,s,r.queryGraph,r.query,o,t):new R(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 ae(this.columnInfoFactory,e,t,s)}}class ui{constructor(){}construct(e,t){return new le(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 de(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 de(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];b(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:{}}),!pe.isItemColumn(o,!1))continue;const a=t[o.itemType];void 0!==a&&b(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}=pe.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 he(e,this.columnCache,t)}}class mi{graphQueryParserFactory;constructor(e){this.graphQueryParserFactory=e}construct(e){return new ge(this.graphQueryParserFactory,e)}}class pi{errorHandler;constructor(e){this.errorHandler=e}construct(e,t,s=!1,n){return new m(this,e,t,s,n)}}class fi{serverCache;constructor(e,t,s){this.serverCache=new rt(e,t,s)}getById(e){const t=s=>{for(const n of s){if(n.id===e)return n;const s=t(n.children);if(void 0!==s)return s}};return t(this.serverCache.children)}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 Ee(this.linkTreeService,e)}}class gi{construct(){return new tt}}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 _t(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=te.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 St(this.itemEntryService)}constructParentDelta(e){const t=new bt(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{}class Ri{linkTreeService;errorHandler;constructor(e,t){this.linkTreeService=e,this.errorHandler=t}construct(e,t){return new Ye(e,t,this.linkTreeService,this.errorHandler)}}class Ei{version="64.0.2";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=u.ApiFieldsOnDeleteRule){const o=new Ri(n,s),a=new et,c=new gi,l=new Ie(e,n),d=new ai,h=new se(t,d),m=new oe,p=new ce(h,m),f=new ui,y=new li(f),g=new di(p,f,s),I=new hi(m),C=new Te(h),v=new mi(o),T=new pi(s),R=new Pt(h,p,g,c,n,l),E=new fe,_=new Dt(E,R),S=new Ii(E,s,_,l),b=new oi(s,r),w=new ci(s,l,a,I,m,g),q=new yi(n),F=new fi({apiRequestService:h,businessLogicManager:b,changesDeltaFactory:S,collectionResourceFactory:w,columnCache:m,columnExpansionFactory:y,columnHandler:p,columnSetFactory:g,conversionMapService:E,errorHandler:s,graphQueryParserFactory:o,itemCacheFactory:v,itemCreateService:_,itemEntryService:l,itemResourceFactory:T,linkTreeService:n,lockService:C,moduleChangesCompilationFactory:q,queryService:a,requestColumnExpansionFactory:c,requestColumnsOperationsCacheFactory:I,templateCache:R},i,this),k=new st(S,m,s,c,F,h,I);this.apiRequestService=h,this.apiResponseProcessorFactory=d,this.changesDeltaFactory=S,this.collectionResourceFactory=w,this.columnCache=m,this.columnExpansionFactory=y,this.columnHandler=p,this.columnInfoFactory=f,this.columnSetFactory=g,this.requestColumnOperationsCacheFactory=I,this.conversionMapService=E,this.itemCacheFactory=v,this.itemCreateService=_,this.itemEntryService=l,this.itemResourceFactory=T,this.lockService=C,this.moduleChangesCompilationFactory=q,this.queryService=a,this.requestColumnExpansionFactory=c,this.socketMessageHandler=k,this.templateCache=R,this.transactionCacheFactory=F,this.businessLogicManager=b}}function _i(e){return e}const Si="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,d.untracked)((()=>this.rangeContainsHoliday$(e,t,s)))}getHolidaysInDateRange(e,t,s){return(0,d.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){return void 0===e?this.holidayCollectionResourcesMap.values().next().value:this.holidayCollectionResourcesMap.get(e)}}return o})()));
2
2
  //# sourceMappingURL=rm-core.js.map