First commit
This commit is contained in:
427
framework/client/table.js
Normal file
427
framework/client/table.js
Normal file
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
|
||||
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 GNU AFFERO GENERAL PUBLIC LICENSE,
|
||||
as published by the Free Software Foundation.
|
||||
See the GNU AFFERO GENERAL PUBLIC LICENSE, for more details.
|
||||
|
||||
https://unifyjs.org
|
||||
|
||||
*/
|
||||
|
||||
import tools from "../unify/tools.js";
|
||||
|
||||
export default class table{
|
||||
|
||||
__className = "table";
|
||||
|
||||
type = "table";
|
||||
|
||||
id = 0;
|
||||
|
||||
collection = false;
|
||||
|
||||
collections = new Array();
|
||||
|
||||
load = true;
|
||||
|
||||
synced = false;
|
||||
|
||||
useCustomElement = false;
|
||||
|
||||
useCache = false;
|
||||
|
||||
createOnSync = true;
|
||||
|
||||
deleteProperty( child ) {
|
||||
|
||||
if( child.rowID ) {
|
||||
|
||||
delete this[ child.propertyName ];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
cleanChildren( object ) {
|
||||
|
||||
if( object.getChildren ) {
|
||||
|
||||
var children = object.getChildren();
|
||||
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
|
||||
var child = children[i];
|
||||
|
||||
if( child.rows ) {
|
||||
|
||||
child.rows = new Array();
|
||||
|
||||
}
|
||||
|
||||
this.deleteProperty( child );
|
||||
|
||||
this.cleanChildren( child );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
destroyEventListener( object ) {
|
||||
|
||||
if( object.render ) {
|
||||
|
||||
// this could be enabled to destory the render functions still running.
|
||||
// But this causes problems when loading a new page, and then
|
||||
// loading the old one again, The render method is not called.
|
||||
if( object.autoDestroyRenderLoop ) {
|
||||
|
||||
window.cancelAnimationFrame( object.requestAnimationFrameID );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if( object.destroy ) {
|
||||
|
||||
object.destroy();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
destroyEventListeners( element ) {
|
||||
|
||||
if( element.object ) {
|
||||
|
||||
var object = element.object;
|
||||
|
||||
this.destroyEventListener( object );
|
||||
|
||||
}
|
||||
|
||||
var children = element.childNodes;
|
||||
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
|
||||
var child = children[i];
|
||||
|
||||
this.destroyEventListeners(child);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
logSync() {
|
||||
|
||||
if( this.debug | document.debugALL ) {
|
||||
|
||||
console.log( "" );
|
||||
console.log("%ctable::sync", "background: #5dc2d6;" );
|
||||
|
||||
|
||||
console.log( "className: ", this.getClassName() );
|
||||
console.log( "Path: ", this.applicationPathString );
|
||||
console.log( this );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async loadObject( sign ) {
|
||||
|
||||
if( this.load ) {
|
||||
|
||||
//this.cleanChildren( this );
|
||||
|
||||
//this.destroyEventListeners( this.element );
|
||||
|
||||
if( !this.id ) {
|
||||
|
||||
await this.createObject( sign );
|
||||
|
||||
} else {
|
||||
|
||||
await this.updateObject();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
scrollPage( show ) {
|
||||
|
||||
if( show ) {
|
||||
|
||||
this.show();
|
||||
|
||||
if( this.element ) {
|
||||
|
||||
this.element.scrollTo( 0, 0 );
|
||||
|
||||
}
|
||||
|
||||
if( this.boxElement ) {
|
||||
|
||||
this.boxElement.scrollTo( 0, 0 );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
hasURL() {
|
||||
|
||||
var hasUrl = false
|
||||
|
||||
if( this.parent.type != "table" ) {
|
||||
|
||||
hasUrl = true;
|
||||
|
||||
}
|
||||
|
||||
if( this.parent.type == "renderCollection" ) {
|
||||
|
||||
hasUrl = false;
|
||||
|
||||
}
|
||||
|
||||
if( this.title && this.title.value == "" ) {
|
||||
|
||||
hasUrl = false;
|
||||
|
||||
}
|
||||
|
||||
if( !this.title ) {
|
||||
|
||||
hasUrl = false;
|
||||
|
||||
}
|
||||
|
||||
return hasUrl;
|
||||
|
||||
}
|
||||
|
||||
composePath() {
|
||||
|
||||
var urlPath = new Array();
|
||||
|
||||
urlPath.push( this.propertyName );
|
||||
|
||||
if( this.id ) {
|
||||
|
||||
urlPath.push( this.id );
|
||||
|
||||
}
|
||||
|
||||
if( this.title ) {
|
||||
|
||||
if( this.title.value == "" ) {
|
||||
|
||||
urlPath.push( this.propertyName.replaceAll(" ", "_") + ".html" );
|
||||
|
||||
} else {
|
||||
|
||||
urlPath.push( this.title.value.replaceAll(" ", "_") + ".html" );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
urlPath.push( this.propertyName.replaceAll(" ", "_") + ".html" );
|
||||
|
||||
}
|
||||
|
||||
return urlPath.join("/");
|
||||
|
||||
}
|
||||
|
||||
async createUrl( pass ) {
|
||||
|
||||
var hasURL = this.hasURL();
|
||||
|
||||
if( hasURL || pass ) {
|
||||
|
||||
var path = this.composePath();
|
||||
|
||||
|
||||
var state = new Object();
|
||||
|
||||
state.id = this.id;
|
||||
|
||||
state.applicationPath = this.applicationPath;
|
||||
|
||||
state.table = this;
|
||||
|
||||
document.states.push( state );
|
||||
|
||||
var url = window.location;
|
||||
|
||||
await history.pushState( { id: document.states.length-1 }, "Unify", "/" + path );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async sync( sign = false, show = true, createUrl = true ) {
|
||||
|
||||
var sign = true;
|
||||
|
||||
this.setApplicationPath();
|
||||
|
||||
this.logSync();
|
||||
|
||||
await this.loadObject( sign );
|
||||
|
||||
if( createUrl ) {
|
||||
|
||||
//this.createUrl();
|
||||
|
||||
}
|
||||
|
||||
this.scrollPage( show );
|
||||
|
||||
this.getCore().communicateVisibleElements();
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
async createObject( sign ) {
|
||||
|
||||
if( sign ) {
|
||||
|
||||
var table = await this.socketManager.get( "table", "create", this, "sign" );
|
||||
|
||||
} else {
|
||||
|
||||
var table = await this.socketManager.get( "table", "create", this );
|
||||
|
||||
}
|
||||
|
||||
this.setID( table.id );
|
||||
|
||||
this.updatePermissions( table.permissions );
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
async getObject() {
|
||||
|
||||
if( this.useCache ) {
|
||||
|
||||
var object = document.cacheManager.getLocalObject( this, this.id, tools.getTableName( this ) );
|
||||
|
||||
} else {
|
||||
|
||||
var object = false;
|
||||
|
||||
}
|
||||
|
||||
if( !object ) {
|
||||
|
||||
var object = await this.socketManager.get( "table", "get", this );
|
||||
|
||||
//document.cacheManager.addObject( object, this.id, tools.getTableName( this ) );
|
||||
|
||||
}
|
||||
|
||||
|
||||
return object;
|
||||
|
||||
}
|
||||
|
||||
updateChildrenPermissionsClient( object ) {
|
||||
|
||||
if( object.permissions && object.updatePermissions ) {
|
||||
|
||||
|
||||
|
||||
object.updatePermissions( object.permissions );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
if( object.getChildren ) {
|
||||
|
||||
var children = object.getChildren();
|
||||
|
||||
for (var i = 0; i < children.length; i++) {
|
||||
|
||||
var child = children[i]
|
||||
|
||||
console.log( "updateChildrenPermissions", child.propertyName);
|
||||
|
||||
this.updateChildrenPermissionsClient( child );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async prepareObject( object ) {
|
||||
|
||||
this.setID( object.id );
|
||||
|
||||
this.serialize( object );
|
||||
|
||||
console.log("after serialize", this);
|
||||
|
||||
//this.updatePermissions( object.permissions );
|
||||
|
||||
this.updateChildrenPermissionsClient( this );
|
||||
|
||||
await this.setupChildren();
|
||||
|
||||
if( this.create && this.createOnSync ) {
|
||||
|
||||
await this.create();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async updateObject() {
|
||||
|
||||
var object = await this.getObject();
|
||||
|
||||
await this.prepareObject( object );
|
||||
|
||||
this.getCore().appendAllToSelector();
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
async setupChildren() {
|
||||
|
||||
var children = this.getChildren();
|
||||
|
||||
for( var c = 0; c < children.length; c++ ) {
|
||||
|
||||
var child = children[c];
|
||||
|
||||
if( child.setup ) {
|
||||
|
||||
await child.setup();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user