import * as storage from './storage';
import * as vistorian from './vistorian';
import * as utils from './utils';
import * as datamanager from 'vistorian-core/src/datamanager';
import * as main from 'vistorian-core/src/main';
var DATA_TABLE_MAX_LENGTH = 200;
var files = document.getElementById('files');
if (files)
files.addEventListener('change', getFileInfos, false);
var nodeTableUpload = document.getElementById('nodeTableUpload');
if (nodeTableUpload)
nodeTableUpload.addEventListener('change', uploadNodeTable, false);
var linkTableUpload = document.getElementById('linkTableUpload');
if (linkTableUpload)
linkTableUpload.addEventListener('change', uploadLinkTable, false);
var SESSION_NAME = utils.getUrlVars()['session'];
storage.saveSessionId(SESSION_NAME); // save id for later retrieve
var tables = storage.getUserTables(SESSION_NAME);
// user's currently selected network. All visualizations will visualize this network
export var currentNetwork: vistorian.Network;
// visualizations among which the user can chose
// format: [shown name, codename]
var visualizations = [
['Node Link', 'nodelink'],
['Adjacency Matrix', 'matrix'],
['Time Arcs', 'dynamicego'],
['Map', 'map'],
]
var messages: string[] = [];
init()
export function init() {
loadVisualizationList()
loadNetworkList()
loadTableList()
var networkids = storage.getNetworkIds(SESSION_NAME);
if (networkids.length > 0)
showNetwork(networkids[0])
}
// loads the list of available visualizations and displays them on the left
export function loadVisualizationList() {
// create visualization links
visualizations.forEach(function (v) {
$('#visualizationList')
.append('
\
\
')
})
$('#visualizationList')
.append('
\
')
$('#visualizationList')
.append('
\
')
}
// loads the list of tables in this session and displays them on the left
export function loadTableList() {
$('#tableList').empty()
var tableNames = storage.getTableNames(SESSION_NAME)
tableNames.forEach(t => {
var shownName = t;
if (t.length > 30)
shownName = t.substring(0, 30) + '..';
$('#tableList').append('
')
})
}
// loads the list of networks for this session and displays them on the left
export function loadNetworkList() {
$('#networkList').empty()
var networkNames = storage.getNetworkIds(SESSION_NAME)
var network: vistorian.Network;
networkNames.forEach((t: any) => {
network = storage.getNetwork(t, SESSION_NAME);
$('#networkList').append('\
')
})
}
// VISUALIZATIONS
// creates a new visualization of the passed type
export function loadVisualization(visType: any) {
window.open(visType + '.html?session=' + SESSION_NAME + '&datasetName=' + currentNetwork.name);
}
// CREATE NETWORK //
export function createNetwork() {
var networkIds = storage.getNetworkIds(SESSION_NAME);
var id = new Date().getTime();
currentNetwork = new vistorian.Network(id);
currentNetwork.name = 'Network-' + currentNetwork.id;
currentNetwork.directed = false;
storage.saveNetwork(currentNetwork, SESSION_NAME);
showNetwork(currentNetwork.id);
loadNetworkList();
}
export function setNodeTable(list: any) {
var tableName = list.value;
if (tableName != '---') {
var table: vistorian.VTable = storage.getUserTable(tableName, SESSION_NAME);
currentNetwork.userNodeTable = table;
showTable(table, '#nodeTableDiv', false, currentNetwork.userNodeSchema)
} else {
unshowTable('#nodeTableDiv');
currentNetwork.userNodeTable = undefined;
}
updateNetworkStatusIndication();
}
export function setLinkTable(list: any) {
var tableName = list.value;
if (tableName != '---') {
var table: vistorian.VTable = storage.getUserTable(tableName, SESSION_NAME);
currentNetwork.userLinkTable = table;
showTable(table, '#linkTableDiv', false, currentNetwork.userLinkSchema);
} else {
unshowTable('#linkTableDiv');
currentNetwork.userLinkTable = undefined;
}
updateNetworkStatusIndication();
saveCurrentNetwork(false);
}
export function setLocationTable(list: any) {
var tableName = list.value;
if (tableName != '---') {
var table: vistorian.VTable = storage.getUserTable(tableName, SESSION_NAME);
currentNetwork.userLocationTable = table;
currentNetwork.userLocationSchema = new datamanager.LocationSchema(0, 1, 2, 3, 4);
showTable(table, '#locationTableDiv', true, currentNetwork.userLocationSchema);
} else {
unshowTable('#locationTableDiv');
currentNetwork.userLocationTable = undefined;
}
}
// saves/updates and normalizes current network.
export function saveCurrentNetwork(failSilently: boolean) {
saveCellChanges();
currentNetwork.name = $('#networknameInput').val();
if (currentNetwork.userNodeSchema)
if (currentNetwork.userNodeSchema.time != -1) {
currentNetwork.timeFormat = $('#timeFormatInput_' + currentNetwork.userNodeSchema.name).val()
}
if (currentNetwork.userLinkSchema)
if (currentNetwork.userLinkSchema.time != -1) {
currentNetwork.timeFormat = $('#timeFormatInput_' + currentNetwork.userLinkSchema.name).val()
}
// check dates if apply
checkTimeFormatting(currentNetwork);
storage.saveNetwork(currentNetwork, SESSION_NAME);
if (!currentNetwork.userNodeTable && !currentNetwork.userLinkTable) {
if (!failSilently)
showMessage("Cannot save without a Node table or a Link Table", 2000);
return;
}
var dataset: datamanager.DataSet | undefined = vistorian.importIntoNetworkcube(currentNetwork, SESSION_NAME, failSilently)
updateNetworkStatusIndication();
var {normalizedLocationSchema, normalizedLocationTable, locationName, locationLabels} = vistorian.createAndNormaliseLocationTable(currentNetwork)
if (!currentNetwork.userLocationTable && normalizedLocationTable.length > 2) {
currentNetwork.userLocationTable = new vistorian.VTable('userLocationTable', normalizedLocationTable);
// set header
currentNetwork.userLocationTable.data.splice(0, 0, ['Id', 'User Name', 'Geoname', 'Longitude', 'Latitude'])
currentNetwork.userLocationSchema = normalizedLocationSchema;
storage.saveUserTable(currentNetwork.userLocationTable, SESSION_NAME);
showTable(currentNetwork.userLocationTable, '#locationTableDiv', true, currentNetwork.userLocationSchema)
$('#locationtableSelect')
.append('')
$('#locationtableSelect').val('userLocationTable');
loadTableList();
storage.saveNetwork(currentNetwork, SESSION_NAME);
}
loadNetworkList();
}
export function deleteCurrentNetwork() {
// removes the network from the vistorian front-ed
storage.deleteNetwork(currentNetwork, SESSION_NAME);
// deletes the network from the networkcube
main.deleteData(currentNetwork.name);
unshowNetwork();
loadNetworkList();
}
export function showNetwork(networkId: number) {
unshowNetwork();
currentNetwork = storage.getNetwork(networkId.toString(), SESSION_NAME);
if (currentNetwork == null)
return;
// unshow individual tables
$('#individualTables').css('display', 'none');
$('#networkTables').css('display', 'inline');
// set network name
$('#networknameInput').val(currentNetwork.name);
// get all tables for this user so that he can select those
// he wants to create his network from.
var tables = storage.getUserTables(SESSION_NAME)
$('#nodetableSelect').append('')
$('#linktableSelect').append('')
$('#locationtableSelect').append('')
$('#nodeTableContainer').css('display', 'inline')
$('#linkTableContainer').css('display', 'inline')
if (currentNetwork.networkConfig.indexOf('node') > -1) {
$('#linkTableContainer').css('display', 'none')
}
if (currentNetwork.networkConfig.indexOf('link') > -1) {
$('#nodeTableContainer').css('display', 'none')
}
if (currentNetwork.networkConfig == undefined) {
$('#linkTableContainer').css('display', 'none')
$('#nodeTableContainer').css('display', 'none')
}
tables.forEach(t => {
$('#nodetableSelect')
.append('')
$('#linktableSelect')
.append('')
$('#locationtableSelect')
.append('')
});
// if this network already has tables, show them
if (currentNetwork.userNodeTable) {
showTable(currentNetwork.userNodeTable, '#nodeTableDiv', false, currentNetwork.userNodeSchema);
$('#nodetableSelect').val(currentNetwork.userNodeTable.name);
}
if (currentNetwork.userLinkTable) {
showTable(currentNetwork.userLinkTable, '#linkTableDiv', false, currentNetwork.userLinkSchema);
$('#linktableSelect').val(currentNetwork.userLinkTable.name);
}
if (currentNetwork.userLocationTable) {
showTable(currentNetwork.userLocationTable, '#locationTableDiv', true, currentNetwork.userLocationSchema);
$('#locationtableSelect').val(currentNetwork.userLocationTable.name);
}
$('#tileViewLink').attr('href', 'sites/tileview.html?session=' + SESSION_NAME + '&datasetName=' + currentNetwork.name.split(' ').join('___'))
$('#mat-nlViewLink').attr('href', 'sites/mat-nl.html?session=' + SESSION_NAME + '&datasetName=' + currentNetwork.name.split(' ').join('___'))
updateNetworkStatusIndication()
}
export function updateNetworkStatusIndication() {
if (currentNetwork.ready) {
$('#networkStatus')
.text('Ready for visualization. Select a visualization from the menu on the top.')
.css('color', '#fff')
.css('background', '#2b0')
}else if("userNodeTable" in currentNetwork && currentNetwork.userNodeTable && currentNetwork.userNodeTable.data.length == 1){
$('#networkStatus')
.text('Network not ready for visualization. Uploaded node table is empty.')
.css('background', '#f63')
.css('color', '#fff')
}else if("userLinkTable" in currentNetwork && currentNetwork.userLinkTable && currentNetwork.userLinkTable.data.length == 1){
$('#networkStatus')
.text('Network not ready for visualization. Uploaded link table is empty.')
.css('background', '#f63')
.css('color', '#fff')
} else {
$('#networkStatus')
.text('Network not ready for visualization. Table or Schema specifications missing.')
.css('background', '#f63')
.css('color', '#fff')
}
}
// removes a displayed table from the DOM
export function unshowNetwork() {
$('#nodetableSelect').empty();
$('#linktableSelect').empty();
$('#locationtableSelect').empty();
unshowTable('#linkTableDiv');
unshowTable('#nodeTableDiv');
unshowTable('#locationTableDiv');
$('#networkTables').css('display', 'none');
$('#tileViewLink').attr('href', 'tileview.html?session=' + SESSION_NAME)
$('#mat-nlViewLink').attr('href', 'mat-nl.html?session=' + SESSION_NAME)
}
// TABLES ///
// removes a displayed table from the DOM
export function unshowTable(elementName: string) {
$(elementName).empty();
}
export function linkRowMouseOver(tableRow: any){
var rowID = tableRow.id - 1; //indexed from 1 in showTable function
var bc = new BroadcastChannel('row_hovered_over_link');
bc.postMessage({"id": rowID});
}
export function nodeRowMouseOver(tableRow: any){
var rowID = tableRow.id - 1; //indexed from 1 in showTable function
var bc = new BroadcastChannel('row_hovered_over_node');
bc.postMessage({"id": rowID});
}
var currentTable: vistorian.VTable;
export function showSingleTable(tableName: string) {
currentTable = storage.getUserTable(tableName, SESSION_NAME);
showTable(currentTable, '#individualTable', false);
$('#individualTables').css('display', 'inline');
$('#networkTables').css('display', 'none');
}
// displays a table into the DOM
// - if schema is passed, shows the schema on the dropdown
// - if user selects a time field, displays field to specify time format
var currentTableId: string;
var currentCell: any;
export function showTable(table: vistorian.VTable, elementName: string, isLocationTable: boolean, schema?: vistorian.VTableSchema) {
var tHead, tBody;
currentTable = table;
$(elementName).empty();
// table name
var tableId = 'datatable_' + table.name;
currentTableId = tableId
$('#' + tableId).remove();
var tableDiv = $('');
$(elementName).append(tableDiv);
var tableMenu = $(elementName).prev()
tableMenu.find('.tableMenuButton').remove();
var data = table.data
if (data.length > DATA_TABLE_MAX_LENGTH) {
var info = $('
Table shows first 200 rows out of ' + data.length + ' rows in total.
');
tableDiv.append(info);
}
// CREATE TABLE MENU
// export button
var csvExportButton = $('')
tableMenu.append(csvExportButton);
// create table
var tab = $('
');
tableDiv.append(tab);
tab.addClass('datatable stripe hover cell-border and order-column compact');
// create head
tHead = $('');
tab.append(tHead);
var tr = $('
').addClass('tableheader');
tHead.append(tr);
for (var c = 0; c < data[0].length; c++) {
var td = $('
').addClass('th').attr('contenteditable', 'false');
tr.append(td);
td.html(data[0][c]);
}
tBody = $('');
tab.append(tBody);
// Load data into html table
for (var r = 1; r < Math.min(data.length, DATA_TABLE_MAX_LENGTH); r++) {
if(elementName == "#nodeTableDiv"){
tr = $('