Files
Unify/framework/unify/renderCollection.js
2025-12-25 11:16:59 +01:00

486 lines
8.7 KiB
JavaScript

/*
Copyright (c) 2020, 2023, The Unified Company.
This code is part of Unify.
This program is free software; you can redistribute it and/or modify
it under the terms of the ESA Software Community License - Strong Copyleft LICENSE,
as published by the ESA.
See the ESA Software Community License - Strong Copyleft LICENSE, for more details.
https://unifyjs.org
*/
import tools from '../unify/tools.js';
import baseRenderCollection from '../server/renderCollection.js';
import shared from '../unify/shared.js';
import defaultObject from '../unify/defaultObject.js';
import collection from '../unify/collection.js';
import document from '../unify/document.js';
import userManager from '../server/userManager.js';
import searchable from '../unify/sql/searchable.js';
import unify from '../unify/unify.js';
import placeholder from '../unify/placeholder.js';
export default class renderCollection extends baseRenderCollection {
object;
collections = new Array();
collection = false; // Future
storageCollection = false;
type = "renderCollection";
rows = new Array();
filterObject = false;
processAsync = false;
handleRenderCollection( renderCollection ) {
var currentCollection = renderCollection.getCollection();
if( !renderCollection.storageCollection ) {
renderCollection.storageCollection = new collection( currentCollection.object );
renderCollection.storageCollection.enabled = false;
}
collection1 = renderCollection.storageCollection;
}
handleCollection( argument ) {
this.storageCollection = new collection( argument.object );
this.storageCollection.name = "storageCollection";
var defaultObjectInstance = new defaultObject();
defaultObjectInstance.exposeMethodsToObject( this.storageCollection );
this.setCollection( argument );
}
handleSecondArgument( argument ) {
switch( argument.type ) {
case "renderCollection":
this.handleRenderCollection( argument );
break;
case "collection":
this.handleCollection( argument );
break;
}
}
constructor( object, secondArgument ) {
super();
if( secondArgument ) {
this.handleSecondArgument( secondArgument );
} else {
if( object ) {
//return false;
//this.logMissingArgument();
}
}
this.object = object;
}
logMissingArgument() {
console.log("\n_______________________________________________\n\n\n\n");
console.error( '\x1b[31m%s\x1b[0m', 'Collection of renderCollection Not set:\n ' );
console.log("This renderCollection will not load anything, There is probably an typo in the second argument or no collection present as second argument. \n");
console.log( this )
console.log("\n_______________________________________________\n\n\n\n");
}
createInstance() {
var object = new this.object();
unify.extend( object );
return object;
}
setupObject( sourceObject, client, rowID ) {
var object = this.createInstance();
// todo : caution : this wasn't commented and can cause problems, But this can probably be removed because of multi extend.
//object.extend( this.getCollection().createInstance() );
object.id = sourceObject.id;
object.parent = this;
object.dynamic = true;
object.propertyName = object.getClassName() + object.id;
object.load = false;
object.rowID = rowID;
object.serialize( sourceObject, client );
return object;
}
callMethods( object, client ) {
if( client ) {
if( object.process ) {
object.process( object );
}
}
}
bindAsChild( object ) {
this[ object.propertyName ] = object;
}
updatePermissionsClientAndServer( object, client ) {
if( client ) {
this.getPermissionForHierarchy( object, client.user );
} else {
object.updatePermissions( object.permissions );
}
return object;
}
addToCollection( object ) {
var collection = this.getCollection();
collection.rows.push( object );
}
addRow( sourceObject, client, rowID ) {
var object = this.setupObject( sourceObject, client, rowID );
this.callMethods( object, client )
this.bindAsChild( object );
this.getCore().parse( object, client );
this.updatePermissionsClientAndServer( object, client );
this.addToCollection( object );
return object;
}
getPermissionForHierarchy( object, user ) {
object.permissions = userManager.computePermissions( object, user );
var children = object.getChildren();
for (var i = 0; i < children.length; i++) {
var child = children[i];
if( child.isAllowed ) {
this.getPermissionForHierarchy( child, user )
}
}
}
async addRowSync( sourceObject, client, rowID ) {
var object = this.setupObject( sourceObject, client, rowID );
this.callMethods( object, client )
this.bindAsChild( object );
if( client ) {
await this.getCore().parse( object, client );
} else {
await this.getCore().parse( object, true );
}
this.updatePermissionsClientAndServer( object, client );
this.addToCollection( object );
return object;
}
setCollection( collection ) {
if( !collection ) {
this.collections = new Array();
} else {
this.collections = [ collection ];
}
}
setCollectionObject( collectionObject ) {
var newCollection = new collection( collectionObject );
this.setCollection( newCollection );
this.object = collectionObject;
}
getCollection() {
return this.collections[0];
}
createFilterObject() {
if( !this.filterObject ) {
this.filterObject = new placeholder();
}
this.filterObject.__className = "placeholder";
unify.extend( this.filterObject );
}
createCollectionSearchable( collection, child ) {
var tableName = collection.createInstance().getClassName();
//tableName
var search = new searchable( "./" + collection.propertyName + "/" + child.propertyName );
this.filterObject[ collection.propertyName ][ child.propertyName ] = search;
}
handleFilterCollectionChildren( collectionObject, collection ) {
var collectionChildren = collectionObject.getChildren();
for( var b = 0; b < collectionChildren.length; b++ ) {
var child = collectionChildren[b];
this.createCollectionSearchable( collection, child );
}
}
handleCollectionSearchables( child ) {
if( child.type == "collection") {
var collectionObject = child.createInstance();
unify.extend( collectionObject );
this.filterObject[ child.propertyName ].tableName = collectionObject.getClassName()
this.filterObject[ child.propertyName ].type = "collection";
this.handleFilterCollectionChildren( collectionObject, child )
}
}
createSearchable( child, parent ) {
//console.log("get news from this", parent);
var search = new searchable( parent.getClassName() + "/" + child.propertyName );
this.filterObject[ child.propertyName ] = search;
}
createSearchables( object ) {
var children = object.getChildren();
for( var c = 0; c < children.length; c++ ) {
var child = children[c];
this.createSearchable( child, object );
this.handleCollectionSearchables( child );
}
}
createSearchableID() {
var search = new searchable( "./id" );
this.filterObject[ "id" ] = search;
}
getCollectionObject() {
var collection = this.getCollection();
var realObject = new collection.object();
unify.extend( realObject );
return realObject;
}
getFilter() {
/*
var collection = this.getCollection();
return collection.getFilter();
*/
this.createFilterObject();
this.createSearchableID();
var object = this.getCollectionObject();
this.createSearchables( object );
//console.log("this.filterObject", this.filterObject);
return this.filterObject;
}
createInstance() {
return new this.object();
}
getChildrenRenderCollections2( object, client ) {
var children = object.getChildren( );
for( var c = 0; c < children.length; c++ ) {
var child = children[ c ];
if( child.type == "renderCollection" ) {
child.id = object.id;
child = this.get( child, client );
}
}
}
getChildrenRenderCollections( client ) {
var rows = this.rows;
for( var b = 0; b < rows.length; b++ ) {
var row = rows[b];
this.getChildrenRenderCollections2( row, client );
}
}
}