rutile
Version:
Factory automation for Mobile Enterprise.
1,172 lines (1,020 loc) • 59.9 kB
JavaScript
console.log("start client generator");
var fs = require('fs');
var path = require('path');
var program_file = process.argv[1];
var LIB_PATH = path.resolve(program_file,"../../lib/node_modules/rutile/lib");
var WORKING_DIR = process.cwd();
var tools = require(path.resolve(LIB_PATH,'tools.js'));
var Generator = require(path.resolve(LIB_PATH,'Generator_client'));
// $ rutile generate server ./Config.js
var config_file = process.argv[4];
if( config_file.match(/^\./) ){
config_file = path.resolve(WORKING_DIR,config_file);
}else{
throw new Error("invalid config file: "+config_file);
}
var MyAppConfig = require(config_file);
var CONFIG_PATH = path.resolve(config_file,'..');
var incject_autosetter;
var incject_autosetter_file = path.resolve(WORKING_DIR,'Inject/Autosetter.js');
if( fs.existsSync(incject_autosetter_file) ){
incject_autosetter = require(incject_autosetter_file);
}
// pre-check auto logic implementation
var hasAutoLogicImpl = false;
var ImplAuthLogic = false;
var AuthPassword = false;
if( MyAppConfig.AuthPassword ){
hasAutoLogicImpl = true;
ImplAuthLogic = true;
AuthPassword = true;
}
var UISideMenu = false;
if( MyAppConfig.UIGenerateOption ){
var uioptions = MyAppConfig.UIGenerateOption.split(',');
for( var i=0; i<uioptions.length; i++ ){
switch ( uioptions[i] ) {
case "SideMenu":
UISideMenu = true;
break;
}
}
}
// * * * * * * * * * * * * * * * * * * * *
console.log("loading config...");
var APP_NAME = MyAppConfig.APP_NAME;
var CLIENT_NAME = APP_NAME + "Client";
console.log("APP_NAME : "+APP_NAME);
console.log("CLIENT_NAME : "+CLIENT_NAME);
var Protocol = MyAppConfig.Protocol || 'websocket';
var AppHost = MyAppConfig.AppHost || '127.0.0.1';
var AppPort = MyAppConfig.AppPort || 3000;
var Segments = [];
var SegmentMap = {};
for( var i=0; i<MyAppConfig.segments.length; i++ ){
var SegmentDef = MyAppConfig.segments[i];
var SegmentModule = require(path.resolve(CONFIG_PATH,SegmentDef.file));
Segments.push({
name : SegmentModule.name,
segment : SegmentModule.name, // alias
module : SegmentModule.Entities,
ui_segmentName : SegmentModule.ui_segmentName,
});
SegmentMap[SegmentModule.name] = {
module : SegmentModule.Entities
};
console.log("segment name :"+SegmentModule.name);
console.log("segment module:"+SegmentModule);
}
Segments[Segments.length-1].last = true;
var Entities = []; // list of all entities
var SegmentedEntities = []; // list of entities organized by segment
var SegmentedEntities_pure = []; // list of entities organized by segment without Collection
for( var i=0; i<Segments.length; i++ ){
var segmentName = Segments[i].segment;
var segmentDef = Segments[i].module;
var entityNames = Object.keys(segmentDef);
var this_entities = [];
var this_entities_pure = [];
for( var j=0; j<entityNames.length; j++ ){
var entityName = entityNames[j];
Entities.push({
segment : segmentName,
entity : entityName,
});
this_entities.push({
entity : entityName,
});
var entityDef = segmentDef[entityName];
if( entityDef.type === 'Entity' ){
this_entities_pure.push({
entity : entityName,
});
}
}
this_entities[this_entities.length-1].lastOfEntities = true;
this_entities_pure[this_entities_pure.length-1].lastOfEntities = true;
SegmentedEntities.push({
segment : segmentName,
Entities : this_entities
});
SegmentedEntities_pure.push({
segment : segmentName,
Entities : this_entities_pure
});
if( i == Segments.length-1 ){
this_entities[this_entities.length-1].lastOfSegmentedEntities = true;
}
}
Entities[Entities.length-1].last = true;
SegmentedEntities[SegmentedEntities.length-1].lastOfSegments = true;
SegmentedEntities_pure[SegmentedEntities_pure.length-1].lastOfSegments = true;
var config = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
Protocol : Protocol,
template_dir : LIB_PATH,
output_dir : WORKING_DIR,
tools : tools,
};
console.log("start generating "+CLIENT_NAME);
//
// prepare titanium project
//
// auto generated titanium project by 'titanium create PROJECT' and 'alloy new'
//
//
// prepare generation
//
// at first prepare generated files in to the temporary directory,
// those should be installed into the appropriate location in Titanium Mobile Project
//
// app : includes index.js, static Framework, generated Component and KitchenSink app
// i18n : i18n files
// lib : includes static libraries and Rutile Models
// modules : includes tipm-socket.io
// Resource : includes FontAwesome
//
// ********** Component/EditForm **********
// EditForm/Segment/Entity/fieldName,Collection
var FieldTypeEditorMap = {
primaryKey : "Component/EditForm/Segment/Entity/PrimaryKey",
int : "Component/EditForm/Segment/Entity/Number",
int2 : "Component/EditForm/Segment/Entity/Number",
int4 : "Component/EditForm/Segment/Entity/Number",
text : "Component/EditForm/Segment/Entity/TextField",
textArea : "Component/EditForm/Segment/Entity/TextArea",
textField : "Component/EditForm/Segment/Entity/TextField",
date : "Component/EditForm/Segment/Entity/Date",
timestamp : "Component/EditForm/Segment/Entity/Timestamp",
extkey : "Component/EditForm/Segment/Entity/Extkey",
image : "Component/EditForm/Segment/Entity/Image",
geography : "Component/EditForm/Segment/Entity/Geography",
collection : "Component/EditForm/Segment/Entity/Collection",
collection_img : "Component/EditForm/Segment/Entity/Collection_Img",
};
// predefined autosetters
var EditFormAutosetter = {
"imageSelected" : {
type : fs.readFileSync(path.resolve(LIB_PATH,"MyAppClient_TMPL/snippet/EditFormAutosetter/ImageSelectedMimeType.js")).toString(),
mimeType : fs.readFileSync(path.resolve(LIB_PATH,"MyAppClient_TMPL/snippet/EditFormAutosetter/ImageSelectedMimeType.js")).toString(),
width : fs.readFileSync(path.resolve(LIB_PATH,"MyAppClient_TMPL/snippet/EditFormAutosetter/ImageSelectedWidth.js")).toString(),
height : fs.readFileSync(path.resolve(LIB_PATH,"MyAppClient_TMPL/snippet/EditFormAutosetter/ImageSelectedHeight.js")).toString(),
length : fs.readFileSync(path.resolve(LIB_PATH,"MyAppClient_TMPL/snippet/EditFormAutosetter/ImageSelectedLength.js")).toString(),
},
};
for( var i=0; i<Segments.length; i++ ){
var segmentName = Segments[i].segment;
var segmentDef = Segments[i].module;
var entityNames = Object.keys(segmentDef);
for( var j=0; j<entityNames.length; j++ ){
var entityName = entityNames[j];
var entityDef = segmentDef[entityName];
// Segment/Entity
if( entityDef.type === 'Entity' ){
var fieldsDef = entityDef.fields;
var fieldNames = Object.keys(fieldsDef);
// editor for primarykey (read only ui)
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
fieldName : entityDef.primary_key.field,
segment_joined : '',
entity_joined : '',
featuredFieldName_joined : '',
};
// force generate read only editor element for primarykey
console.log("generating EditForm for " + segmentName + '/' + entityName + "." + entityDef.primary_key.field);
Generator.generate(FieldTypeEditorMap["primaryKey"], "controllers", config);
Generator.generate(FieldTypeEditorMap["primaryKey"], "styles", config);
Generator.generate(FieldTypeEditorMap["primaryKey"], "views", config);
// editor for fields
for( var k=0; k<fieldNames.length; k++ ){
var fieldName = fieldNames[k];
var fieldDef = fieldsDef[fieldName];
var helper = fieldDef.helper;
var editor = fieldDef.editor || fieldDef.type;
var segment_joined;
var entity_joined;
var featuredFieldName_joined;
if( helper ){ // type:extkey
var helper_segment_entity = helper.split('/');
segment_joined = helper_segment_entity[0];
entity_joined = helper_segment_entity[1];
var joined_segmentDef = SegmentMap[segment_joined].module;
var joined_entityDef = joined_segmentDef[entity_joined];
featuredFieldName_joined = joined_entityDef.featuredFields[0]; // multiple featured fields allowed
editor = "extkey";
}
var autoset_event = '';
var autosetter = '';
if( fieldDef.autoset ){
autoset_event = fieldDef.autoset;
if( incject_autosetter && incject_autosetter[autoset_event] && incject_autosetter[autoset_event][segmentName+'/'+entityName+'.'+fieldName] ){
// prioritize user injection
autosetter = incject_autosetter[autoset_event][segmentName+'/'+entityName+'.'+fieldName];
}else{
// preset
autosetter = EditFormAutosetter[fieldDef.autoset][fieldName];
}
}
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
fieldName : fieldName,
autoset_event : autoset_event,
autosetter : autosetter,
segment_joined : segment_joined,
entity_joined : entity_joined,
featuredFieldName_joined : featuredFieldName_joined,
};
console.log("generating EditForm for " + segmentName + '/' + entityName + "." + fieldName + ", editor:"+editor);
Generator.generate(FieldTypeEditorMap[editor], "controllers", config);
Generator.generate(FieldTypeEditorMap[editor], "styles", config);
Generator.generate(FieldTypeEditorMap[editor], "views", config);
}
// editor for collection
if( entityDef.aggregate ){
var aggregate_segment_entities = entityDef.aggregate.split(',');
for( var k=0; k<aggregate_segment_entities.length; k++ ){
var aggregate_segment_entity = aggregate_segment_entities[k];
var array_aggregate_segment_entity = aggregate_segment_entity.split('/');
var aggregate_segmentName = array_aggregate_segment_entity[0];
var aggregate_entityName = array_aggregate_segment_entity[1];
var aggregate_segmentDef = SegmentMap[aggregate_segmentName].module;
var aggregate_entityDef = aggregate_segmentDef[aggregate_entityName];
if( aggregate_entityDef.type === 'Collection' ){
var collector_segment_entity = aggregate_entityDef.collector.entity.split('/');
var collector_segment = collector_segment_entity[0];
var collector_entity = collector_segment_entity[1];
var collected_segment_entity = aggregate_entityDef.collected.entity.split('/');
var collected_segment = collected_segment_entity[0];
var collected_entity = collected_segment_entity[1];
var collected_segmentDef = SegmentMap[collected_segment].module;
var collected_entityDef = collected_segmentDef[collected_entity];
var featuredFieldName_collected = collected_entityDef.featuredFields[0]; // multiple featured fields allowed
if( collected_entityDef.featuringImage ){
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
fieldName : collected_entityDef.primary_key.field, // pseudo field for colleciton
segment_collected : collector_segment,
entity_collected : collected_entity,
imageFieldName_collected : collected_entityDef.imageFields[0], // multiple image fields allowed
featuredFieldName_collected : featuredFieldName_collected,
};
console.log("generating EditForm(collection) for " + segmentName + '/' + entityName + "." + collected_entityDef.primary_key.field + " [featuringImage]");
Generator.generate(FieldTypeEditorMap["collection_img"], "controllers", config);
Generator.generate(FieldTypeEditorMap["collection_img"], "styles", config);
Generator.generate(FieldTypeEditorMap["collection_img"], "views", config);
}else{
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
fieldName : collected_entityDef.primary_key.field, // pseudo field for colleciton
segment_collected : collector_segment,
entity_collected : collected_entity,
featuredFieldName_collected : featuredFieldName_collected,
};
console.log("generating EditForm(collection) for " + segmentName + '/' + entityName + "." + collected_entityDef.primary_key.field);
Generator.generate(FieldTypeEditorMap["collection"], "controllers", config);
Generator.generate(FieldTypeEditorMap["collection"], "styles", config);
Generator.generate(FieldTypeEditorMap["collection"], "views", config);
}
}
}
}
}
// no Editor for Collection itself
else if( entityDef.type === 'Collection' ){
console.log("no Editor for Collection itself:"+entityName);
}
}
}
// ********** Component/SearchForm **********
// SearchForm/Segment/Entity/fieldName,Collection
var SearchTypeSearchFormMap = {
key : "Component/SearchForm/Segment/Entity/SelectbyKey",
like : "Component/SearchForm/Segment/Entity/SelectbyLike",
num : "Component/SearchForm/Segment/Entity/SelectbyNum",
date : "Component/SearchForm/Segment/Entity/SelectbyDate",
timestamp : "Component/SearchForm/Segment/Entity/SelectbyTimestamp",
area : "Component/SearchForm/Segment/Entity/SelectbyArea",
nearby : "Component/SearchForm/Segment/Entity/SelectbyNearby",
};
for( var i=0; i<Segments.length; i++ ){
var segmentName = Segments[i].segment;
var segmentDef = Segments[i].module;
var entityNames = Object.keys(segmentDef);
for( var j=0; j<entityNames.length; j++ ){
var entityName = entityNames[j];
var entityDef = segmentDef[entityName];
// no component for collection
if( entityDef.type === 'Collection' ){ continue; }
// prep manifest
var Selectbys = []; // [{ field:field name, search_type:search type, key,like,num,timestamp etc, last:0|1 }],
var Orderbys = []; // [{ field:field name, last:0|1, } ],
// search form for primary_key
var primary_key_search_def = entityDef.primary_key.search;
if( primary_key_search_def ){
var primary_key_searches = primary_key_search_def.split(',');
for( var k=0; k<primary_key_searches.length; k++ ){
var search_type = primary_key_searches[k];
if( search_type === 'orderby' ){
Orderbys.push({
segment_orderby : segmentName,
entity_orderby : entityName,
fieldName_orderby : entityDef.primary_key.field,
});
}else{
//
// segment and entity defines module location and module name
//
// ex)
// searching Product/Product with Product/ProductProduct.productName as like type
// module location : Component/SearchForm/Product/Product/
// module name : SelectbyProductProductProductNameLike.js
//
// * module location : Component/SearchForm/<target segment>/<target entity>/
// * module name : Selectby<constrain segment><constrain entity><constrain field><search type>.js
//
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
constraint_segment : segmentName,
constraint_entity : entityName,
constraint_fieldName : entityDef.primary_key.field,
search_type : search_type,
};
console.log("generating SearchForm(primaryKey) for " + segmentName + '/' + entityName + "." + entityDef.primary_key.field);
Generator.generate(SearchTypeSearchFormMap[search_type], "controllers", config);
Generator.generate(SearchTypeSearchFormMap[search_type], "styles", config);
Generator.generate(SearchTypeSearchFormMap[search_type], "views", config);
}
}
}
var fieldsDef = entityDef.fields;
var fieldNames = Object.keys(fieldsDef);
for( var k=0; k<fieldNames.length; k++ ){
var fieldName = fieldNames[k];
var fieldDef = fieldsDef[fieldName];
var field_search_def = fieldDef.search;
if( !field_search_def ){ continue; }
var field_searches = field_search_def.split(',');
for( var l=0; l<field_searches.length; l++ ){
var search_type = field_searches[l];
if( search_type == 'join' ){
// get joined entity info and loop the field,
var joined_segment_entity = fieldDef.helper;
var array_segment_entity = joined_segment_entity.split('/');
var joined_segmentName = array_segment_entity[0];
var joined_entityName = array_segment_entity[1];
var joined_segmentDef = SegmentMap[joined_segmentName].module;
var joined_entityDef = joined_segmentDef[joined_entityName];
var joined_fieldsDef = joined_entityDef.fields;
var joined_fieldNames = Object.keys(joined_fieldsDef);
for( var m=0; m<joined_fieldNames.length; m++ ){
var joined_fieldName = joined_fieldNames[m];
var joined_fieldDef = joined_fieldsDef[joined_fieldName];
var joined_field_search_def = joined_fieldDef.search;
if( !joined_field_search_def ){ continue; }
var joined_field_searches = joined_field_search_def.split(',');
for( var n=0; n<joined_field_searches.length; n++ ){
var joined_search_type = joined_field_searches[n];
if( joined_search_type === 'join' ){ continue; }
if( joined_search_type === 'orderby' ){
Orderbys.push({
segment_orderby : joined_segmentName,
entity_orderby : joined_entityName,
fieldName_orderby : joined_fieldName,
});
}else{
//
// segment_joined,entity_joined,field_joined,search_type_joined
// should be re-mapped to segment,entity,field,search_type in concrete generaotr
//
// segment and entity defines module location,
// segment_joined,entity_joined,field_joined,searh_type_joined defeines module name.
//
// ex)
// searching Product/Product with Product/ProductClass.productClassCode as key type
// module location : Component/SearchForm/Product/Product/
// module name : SelectbyProductClassProductClassProductClassCodeKey.js
//
// * module location : Component/SearchForm/<target segment>/<target entity>/
// * module name : Selectby<constrain segment><constrain entity><constrain field><search type>.js
//
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
constraint_segment : joined_segmentName, // segment of the joined entity,
constraint_entity : joined_entityName, // joined entity,
constraint_fieldName : joined_fieldName, // field of the joined entity,
search_type : joined_search_type, // search type of the joined field,
};
console.log("generating SearchForm(join) for " + segmentName + '/' + entityName + "." + entityDef.primary_key.field + " by " + joined_segmentName + '/' + joined_entityName + '.' + joined_fieldName);
Generator.generate(SearchTypeSearchFormMap[joined_search_type], "controllers", config);
Generator.generate(SearchTypeSearchFormMap[joined_search_type], "styles", config);
Generator.generate(SearchTypeSearchFormMap[joined_search_type], "views", config);
}
}
}
}
else{
if( search_type === 'orderby' ){
Orderbys.push({
segment_orderby : segmentName,
entity_orderby : entityName,
fieldName_orderby : fieldName,
});
}else{
//
// segment and entity defines module location and module name
//
// ex)
// searching Product/Product with Product/ProductProduct.price as number
// module location : Component/SearchForm/Product/Product/
// module name : SelectbyProductProductPriceNum.js
//
// * module location : Component/SearchForm/<target segment>/<target entity>/
// * module name : Selectby<constrain segment><constrain entity><constrain field><search type>.js
//
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
constraint_segment : segmentName,
constraint_entity : entityName,
constraint_fieldName : fieldName,
search_type : search_type,
};
console.log("generating SearchForm(plain) for " + segmentName + '/' + entityName + "." + entityDef.primary_key.field);
Generator.generate(SearchTypeSearchFormMap[search_type], "controllers", config);
Generator.generate(SearchTypeSearchFormMap[search_type], "styles", config);
Generator.generate(SearchTypeSearchFormMap[search_type], "views", config);
}
}
}
}
// junction table
if( entityDef.aggregate ){
var jnx_segment_entities = entityDef.aggregate.split(',');
for( var k=0; k<jnx_segment_entities.length; k++ ){
var jnx_segment_entity = jnx_segment_entities[k];
var array_segment_entity = jnx_segment_entity.split('/');
var jnx_segmentName = array_segment_entity[0];
var jnx_entityName = array_segment_entity[1];
var jnx_segmentDef = SegmentMap[jnx_segmentName].module;
var jnx_entityDef = jnx_segmentDef[jnx_entityName];
var col_segment_entity = jnx_entityDef.collected.entity;
var array_segment_entity = col_segment_entity.split('/');
var col_segmentName = array_segment_entity[0];
var col_entityName = array_segment_entity[1];
var col_segmentDef = SegmentMap[col_segmentName].module;
var col_entityDef = col_segmentDef[col_entityName];
var col_fieldsDef = col_entityDef.fields;
var col_fieldNames = Object.keys(col_fieldsDef);
var col_primary_key = col_entityDef.primary_key.field;
for( var l=0; l<col_fieldNames.length; l++ ){
var col_fieldName = col_fieldNames[l];
var col_fieldDef = col_fieldsDef[col_fieldName];
var col_field_search_def = col_fieldDef.search;
if( !col_field_search_def ){ continue; }
var col_field_searches = col_field_search_def.split(',');
for( var m=0; m<col_field_searches.length; m++ ){
var col_search_type = col_field_searches[m];
if( col_search_type === 'join' ){ continue; }
if( col_search_type === 'orderby' ){ continue; } // orderby via junction is not supported
if( col_search_type === 'orderby' ){
// orderby via junction is not supported
}else{
//
// segment_jnx,entity_jnx,field_jnx,search_type_jnx
// should be re-mapped to segment,entity,field,search_type in concrete generaotr
//
// segment and entity defines module location,
// segment_jnx,entity_jnx,field_jnx,searh_type_jnx defeines module name.
// ex)
// searching Product/Product with Product/ProductImage.width as number connected by ProductProductImage
// module location : Component/SearchForm/Product/Product/
// module name : SelectbyProductProductImageWidthNum.js
//
// * module location : Component/SearchForm/<target segment>/<target entity>/
// * module name : Selectby<constrain segment><constrain entity><constrain field><search type>.js
//
// there is no info about junction table in SearchForm that creates query,
// it is matter of server side, and is defined in ConstraintManifest for each target entity.
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
//junction : jnx_entityName, // might be not used
//primary_key_jnx : col_entityDef.primary_key.field, // primary key of collected entity
constraint_segment : col_segmentName, // segment of the collected entity,
constraint_entity : col_entityName, // collected entity,
constraint_fieldName : col_fieldName, // field of the collected entity,
search_type : col_search_type, // search type of the field,
};
console.log("generating SearchForm(jnx) for " + segmentName + '/' + entityName + "." + collected_entity.primary_key);
Generator.generate(SearchTypeSearchFormMap[col_search_type], "controllers", config);
Generator.generate(SearchTypeSearchFormMap[col_search_type], "styles", config);
Generator.generate(SearchTypeSearchFormMap[col_search_type], "views", config);
}
}
}
}
}
// orderbys
if( Orderbys.length > 0 ){ Orderbys[Orderbys.length-1].last = true; }
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field, // pk of this entity,
Orderbys : Orderbys,
};
console.log("generating SearchForm(orderby) for " + segmentName + '/' + entityName);
Generator.generate("Component/SearchForm/Segment/Entity/Orderbys", "controllers", config);
Generator.generate("Component/SearchForm/Segment/Entity/Orderbys", "styles", config);
Generator.generate("Component/SearchForm/Segment/Entity/Orderbys", "views", config);
}
}
// ********** Framework **********
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
};
console.log("generating(writing) Framework");
Generator.generate("Framework", "controllers", config);
Generator.generate("Framework", "styles", config);
Generator.generate("Framework", "views", config);
// ********** KitchenSink/index **********
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
ImplAuthLogic : ImplAuthLogic,
AuthPassword : AuthPassword,
};
if( MyAppConfig.GeoTools ){
config.view.GeoTools = true;
config.view.GeoTools_DefaultRegion_longitude = MyAppConfig.GeoTools.DefaultRegion.longitude;
config.view.GeoTools_DefaultRegion_longitudeDelta = MyAppConfig.GeoTools.DefaultRegion.longitudeDelta;
config.view.GeoTools_DefaultRegion_latitude = MyAppConfig.GeoTools.DefaultRegion.latitude;
config.view.GeoTools_DefaultRegion_latitudeDelta = MyAppConfig.GeoTools.DefaultRegion.latitudeDelta;
config.view.GeoTools_DefaultLongitudeDelta = MyAppConfig.GeoTools.DefaultLongitudeDelta;
config.view.GeoTools_DefaultLatitudeDelta = MyAppConfig.GeoTools.DefaultLatitudeDelta;
}
console.log("generating KitchenSink index");
if( UISideMenu ){
Generator.generate("KitchenSink/indexWithMenu", "controllers", config);
Generator.generate("KitchenSink/indexWithMenu", "styles", config);
Generator.generate("KitchenSink/indexWithMenu", "views", config);
}else{
Generator.generate("KitchenSink/index", "controllers", config);
Generator.generate("KitchenSink/index", "styles", config);
Generator.generate("KitchenSink/index", "views", config);
}
// ********** KitchenSink/EntityList **********
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
SegmentsDef : SegmentedEntities_pure, // [{ segment:, Entities:, last:0|1 }] without collection
};
console.log("generating KitchenSink EntityList");
Generator.generate("KitchenSink/EntityList", "controllers", config);
Generator.generate("KitchenSink/EntityList", "styles", config);
Generator.generate("KitchenSink/EntityList", "views", config);
// ********** KitchenSink logics **********
// KitchenSink/Segment/Entity/*
for( var i=0; i<Segments.length; i++ ){
var segmentName = Segments[i].segment;
var segmentDef = Segments[i].module;
var entityNames = Object.keys(segmentDef);
for( var j=0; j<entityNames.length; j++ ){
var entityName = entityNames[j];
var entityDef = segmentDef[entityName];
// Segment/Entity
var PrimaryKeySearches = [];
var Fields = [];
var Fields_joined_all = [];
var Fields_joined_all_grouped = [];
var Fields_collected_all = [];
var Fields_collected_all_grouped = [];
var Orderbys = [];
var Orderbys_joined_all = [];
// orderby collected item is not allowed
if( entityDef.type === 'Entity' ){
// primaykey of this entity
var pk_search_def = entityDef.primary_key.search;
var pk_search_types = [];
var pk_searches = pk_search_def.split(',');
for( var l=0; l<pk_searches.length; l++ ){
var search_type_pk = pk_searches[l];
if( search_type_pk == 'orderby' ){
Orderbys.push({
segment_orderby : segmentName,
entity_orderby : entityName,
fieldName_orderby : entityDef.primary_key.field,
});
}else{
pk_search_types.push({
search_type : search_type_pk,
});
}
}
PrimaryKeySearches.push({
fieldName : entityDef.primary_key.field,
search_types : pk_search_types,
is_primary_key : true,
});
// seek fields
var featuredFieldName = entityDef.featuredFields[0]; // multiple featured fields allowed
var fieldsDef = entityDef.fields;
var fieldNames = Object.keys(fieldsDef);
var aggregation_joins = [];
var aggregation_junctions = [];
for( var k=0; k<fieldNames.length; k++ ){
var fieldName = fieldNames[k];
var fieldDef = fieldsDef[fieldName];
var helper = fieldDef.helper;
var field_search_def = fieldDef.search;
var search_types = [];
if( field_search_def ){
var field_searches = field_search_def.split(',');
for( var l=0; l<field_searches.length; l++ ){
var search_type = field_searches[l];
if( search_type == 'join' ){ continue; }
if( search_type == 'orderby' ){
Orderbys.push({
segment_orderby : segmentName,
entity_orderby : entityName,
fieldName_orderby : fieldName,
});
}else{
search_types.push({
search_type : search_type
});
}
}
}
Fields.push({
fieldName : fieldName,
helper : helper,
search_types : search_types,
});
if( helper ){ // type:extkey
var helper_segment_entity = helper.split('/');
var segment_joined = helper_segment_entity[0];
var entity_joined = helper_segment_entity[1];
var joined_segmentDef = SegmentMap[segment_joined].module;
var joined_entityDef = joined_segmentDef[entity_joined];
var primary_key_joined = joined_entityDef.primary_key;
var featuredFieldName_joined = joined_entityDef.featuredFields[0]; // multiple featured fields allowed
aggregation_joins.push({
fieldName : fieldName,
segment_joined : segment_joined,
entity_joined : entity_joined,
});
var PrimaryKeySearches_joined = [];
var Fields_joined = [];
var Orderbys_joined = [];
// primaykey of joined entity
var pk_search_def_joined = joined_entityDef.primary_key.search;
var pk_search_types_joined = [];
var pk_searches_joined = pk_search_def_joined.split(',');
for( var l=0; l<pk_searches_joined.length; l++ ){
var search_type_joined_pk = pk_searches_joined[l];
if( search_type_joined_pk == 'orderby' ){
Orderbys_joined.push({
segment_orderby : segment_joined,
entity_orderby : entity_joined,
fieldName_orderby : primary_key_joined.field,
});
Orderbys_joined_all.push({
segment_orderby : segment_joined,
entity_orderby : entity_joined,
fieldName_orderby : primary_key_joined.field,
});
}else{
pk_search_types_joined.push({
search_type : search_type_joined_pk, // for selecting joined item
search_type_joined : search_type_joined_pk, // for searching base entity
});
}
}
PrimaryKeySearches_joined.push({
fieldName : primary_key_joined.field,
search_types : pk_search_types_joined,
});
// fields of joined entity
var fieldsDef_joined = joined_entityDef.fields;
var fieldNames_joined = Object.keys(fieldsDef_joined);
for( var l=0; l<fieldNames_joined.length; l++ ){
var fieldName_joined = fieldNames_joined[l];
var fieldDef_joined = fieldsDef_joined[fieldName_joined];
var field_search_def_joined = fieldDef_joined.search;
if( !field_search_def_joined ){ continue; }
var search_types_joined = [];
var field_searches_joined = field_search_def_joined.split(',');
for( var m=0; m<field_searches_joined.length; m++ ){
var search_type_joined = field_searches_joined[m];
if( search_type_joined == 'join' ){ continue; }
if( search_type_joined == 'orderby' ){
Orderbys_joined.push({
segment_orderby : segment_joined,
entity_orderby : entity_joined,
fieldName_orderby : fieldName_joined,
});
Orderbys_joined_all.push({
segment_orderby : segment_joined,
entity_orderby : entity_joined,
fieldName_orderby : primary_key_joined.field,
});
}else{
search_types_joined.push({
search_type : search_type_joined, // for selecting joined item
search_type_joined : search_type_joined, // for searching base entity
});
}
}
Fields_joined.push({
fieldName : fieldName_joined,
search_types : search_types_joined,
fieldName_joined : fieldName_joined,
search_types_joined : search_types_joined,
});
Fields_joined_all.push({
segment_joined : segment_joined,
entity_joined : entity_joined,
fieldName_joined : fieldName_joined,
search_types_joined : search_types_joined,
});
}
Fields_joined[Fields_joined.length-1].last = true;
Fields_joined_all_grouped.push({
segment_joined : segment_joined,
entity_joined : entity_joined,
Fields : Fields_joined,
});
// generate extkey selector for this field
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
segment_joined : segment_joined,
entity_joined : entity_joined,
primary_key_joined : primary_key_joined.field,
PrimaryKeySearches_joined : PrimaryKeySearches_joined,
featuredFieldName_joined : featuredFieldName_joined,
Fields_joined : Fields_joined,
Orderbys_joined : Orderbys_joined,
hasOrderbys : Orderbys_joined.length > 0 ? true : false,
};
/*
console.log("generating Extkey SearchForm for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Extkey/SearchForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/SearchForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/SearchForm", "views", config);
console.log("generating Extkey List view for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Extkey/List", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/List", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/List", "views", config);
console.log("generating Extkey New Editor for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Extkey/NewForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/NewForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Extkey/NewForm", "views", config);
*/
}
}
Fields[Fields.length-1].last = true;
if( Fields_joined_all.length > 0 ){
Fields_joined_all[Fields_joined_all.length-1].last = true;
}
// editor for collection
if( entityDef.aggregate ){
var aggregate_segment_entities = entityDef.aggregate.split(',');
for( var k=0; k<aggregate_segment_entities.length; k++ ){
var aggregate_segment_entity = aggregate_segment_entities[k];
var array_aggregate_segment_entity = aggregate_segment_entity.split('/');
var aggregate_segmentName = array_aggregate_segment_entity[0];
var aggregate_entityName = array_aggregate_segment_entity[1];
var aggregate_segmentDef = SegmentMap[aggregate_segmentName].module;
var aggregate_entityDef = aggregate_segmentDef[aggregate_entityName];
if( aggregate_entityDef.type === 'Collection' ){
var collector_segment_entity = aggregate_entityDef.collector.entity.split('/');
var collector_segment = collector_segment_entity[0];
var collector_entity = collector_segment_entity[1];
var collected_segment_entity = aggregate_entityDef.collected.entity.split('/');
var collected_segment = collected_segment_entity[0];
var collected_entity = collected_segment_entity[1];
var collected_segmentDef = SegmentMap[collected_segment].module;
var collected_entityDef = collected_segmentDef[collected_entity];
var primary_key_collected = collected_entityDef.primary_key;
var featuredFieldName_collected = collected_entityDef.featuredFields[0]; // multiple featured fields allowed
aggregation_junctions.push({
segment_collected : collected_segment,
entity_collected : collected_entity,
});
var PrimaryKeySearches_collected = [];
var Fields_collected = [];
var Orderbys_collected = [];
// primaykey of collected entity
var pk_search_def_collected = collected_entityDef.primary_key.search;
var pk_search_types_collected = [];
var pk_searches_collected = pk_search_def_collected.split(',');
for( var l=0; l<pk_searches_collected.length; l++ ){
var search_type_collected_pk = pk_searches_collected[l];
if( search_type_collected_pk == 'orderby' ){
Orderbys_collected.push({
segment_orderby : collected_segment,
entity_orderby : collected_entity,
fieldName_orderby : primary_key_collected.field,
});
}else{
pk_search_types_collected.push({
search_type : search_type_collected_pk, // for selecting collected item
search_type_collected : search_type_collected_pk, // for searching base entity
});
}
}
PrimaryKeySearches_collected.push({
fieldName : primary_key_collected.field,
search_types : pk_search_types_collected,
});
// fields of collected entity
var fieldsDef_collected = collected_entityDef.fields;
var fieldNames_collected = Object.keys(fieldsDef_collected);
for( var l=0; l<fieldNames_collected.length; l++ ){
var fieldName_collected = fieldNames_collected[l];
var fieldDef_collected = fieldsDef_collected[fieldName_collected];
var field_search_def_collected = fieldDef_collected.search;
//if( !field_search_def_collected ){ continue; }
var search_types_collected = [];
if( field_search_def_collected ){
var field_searches_collected = field_search_def_collected.split(',');
for( var m=0; m<field_searches_collected.length; m++ ){
var search_type_collected = field_searches_collected[m];
if( search_type_collected == 'join' ){ continue; }
if( search_type_collected == 'orderby' ){
Orderbys_collected.push({
segment_orderby : collected_segment,
entity_orderby : collected_entity,
fieldName_orderby : fieldName_collected,
});
}else{
search_types_collected.push({
search_type : search_type_collected, // for selecting collected item
search_type_collected : search_type_collected, // for searching base entity
});
}
}
}
Fields_collected.push({
fieldName : fieldName_collected,
search_types : search_types_collected,
fieldName_collected : fieldName_collected,
search_types_collected : search_types_collected,
});
Fields_collected_all.push({
fieldName_collected : fieldName_collected,
segment_collected : collected_segment,
entity_collected : collected_entity,
search_types_collected : search_types_collected,
});
}
Fields_collected[Fields_collected.length-1].last = true;
Fields_collected_all_grouped.push({
segment_collected : collected_segment,
entity_collected : collected_entity,
Fields : Fields_collected,
});
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
segment_collected : collected_segment,
entity_collected : collected_entity,
primary_key_collected : collected_entityDef.primary_key.field,
PrimaryKeySearches_collected : PrimaryKeySearches_collected,
featuredFieldName_collected : featuredFieldName_collected,
Fields_collected : Fields_collected,
Orderbys_collected : Orderbys_collected,
hasOrderbys : Orderbys_collected.length > 0 ? true : false,
};
/*
if( collected_entityDef.featuringImage ){
// generate collection item selector for this field (case: image oriented item)
console.log("generating image oriented collected item SearchForm for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/SearchForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/SearchForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/SearchForm", "views", config);
console.log("generating image oriented collected item List view for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/List", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/List", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/List", "views", config);
console.log("generating image oriented collected item New Editor for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/NewForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/NewForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection_Img/NewForm", "views", config);
}
else{
// generate collection item selector for this field (case: ordinary item)
console.log("generating collected item SearchForm for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection/SearchForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/SearchForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/SearchForm", "views", config);
console.log("generating collected item List view for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection/List", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/List", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/List", "views", config);
console.log("generating collected item New Editor for " + segmentName + '/' + entityName + '.' + fieldName);
Generator.generate("KitchenSink/Segment/Entity/Collection/NewForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/NewForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/Collection/NewForm", "views", config);
}
*/
}
}
}
if( Fields_collected_all.length > 0 ){
Fields_collected_all[Fields_collected_all.length-1].last = true;
}
config.view = {
APP_NAME : APP_NAME,
CLIENT_NAME : CLIENT_NAME,
segment : segmentName,
entity : entityName,
primary_key : entityDef.primary_key.field,
featuredFieldName : featuredFieldName,
aggregation_joins : aggregation_joins,
aggregation_junctions : aggregation_junctions,
PrimaryKeySearches : PrimaryKeySearches,
Fields : Fields,
Fields_joined : Fields_joined_all,
Fields_joined_grouped : Fields_joined_all_grouped,
Fields_collected : Fields_collected_all,
Fields_collected_grouped : Fields_collected_all_grouped,
Orderbys : Orderbys,
Orderbys_joined : Orderbys_joined_all,
hasOrderbys : (Orderbys.length + Orderbys_joined_all.length) > 0 ? true : false,
};
// full ui modules
console.log("generating EditForm for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/EditForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/EditForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/EditForm", "views", config);
console.log("generating SearchForm for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/SearchForm", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/SearchForm", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/SearchForm", "views", config);
if( entityDef.featuringImage ){
console.log("generating List(Img) for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/List_Img", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/List_Img", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/List_Img", "views", config);
}else{
console.log("generating List for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/List", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/List", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/List", "views", config);
}
// reusable simple ui modules
console.log("generating Reusable EditForm for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/EditFormReusable", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/EditFormReusable", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/EditFormReusable", "views", config);
console.log("generating Reusable SearchForm for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/SearchFormReusable", "controllers", config);
Generator.generate("KitchenSink/Segment/Entity/SearchFormReusable", "styles", config);
Generator.generate("KitchenSink/Segment/Entity/SearchFormReusable", "views", config);
if( entityDef.featuringImage ){
console.log("generating Reusable List(Img) for " + segmentName + '/' + entityName);
Generator.generate("KitchenSink/Segment/Entity/ListReusable_Img", "controllers", config);
Generator.