naksha-react-ui-legacy
Version:
Visualize geohash heat map or layer map from elastic search or https://github.com/strandls/naksha
470 lines (414 loc) • 18.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _config = require('../common/config.js');
var _config2 = _interopRequireDefault(_config);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var shapefile = require('shapefile');
var Pikaday = require('pikaday');
var selectedRasterFiles = null;
var props = null;
var root_container;
var rasterLayers = null;
var fileNameForSingleRaster = null;
var MAX_ROW_COUNT = 5;
var mapColorData = [["#abc", "#abd", "#aef"], ["#123", "#124", "#345"], ["#345", "#234", "#768"]];
function init(params) {
props = params;
root_container = document.getElementById('add-layer-component');
root_container.innerHTML = createAddLayersPanel();
}
/*------------------ ADD LAYER FUNCTIONS -------------------------*/
function createAddLayersPanel() {
var html = "<div class=add-layer-panel>" + "<label>Please select input type</label><br>" + "<input type='radio' class='data-type-input' name='fileType' value='shape' onChange='setDataUploadType(this.value)' checked=true> Shape File" + "<input type='radio' class='data-type-input' name='fileType' value='raster' onChange='setDataUploadType(this.value)'> Raster File<br><br>" + "<div id='shape-file-data' class='grey-border'>" + "<label>Select shape file </label>" + "<input type='file' accept='.shp' id='inputShpFiles' name='files[]'><br><br>" + "<label>Select shx file </label>" + "<input type='file' accept='.shx' id='inputShxFiles' name='files[]'><br><br>" + "<label>Select dbf file </label>" + "<input type='file' accept='.dbf' id='inputVectorDbfFiles' name='files[]'><br><br>" + "<input type='submit' class='' id='upload-submit-shape' value='Go!' onclick='displayShapeDataForm()'>" + "<br><br>" + "<div id='dbf-data-table-div' class='dbf-table'></div>" + "</div>" + "<div id='raster-file-data' class='hide grey-border'>"
/*+ "<label>Select tiff file </label>"
+ "<input type='file' id='inputTiffFiles' name='files[]'><br><br>"
+ "<label>Select dbf file </label>"
+ "<input type='file' id='inputRasterDbfFiles' name='files[]'><br><br>"*/
+ "<label>Select Raster data folder</label>" + "<input type='file' id='inputTiffFiles' webkitdirectory mozdirectory name='files[]' onchange='displayRasterDataForm(this)'><br>" + "<div id='layer-list'></div>"
//+ "<input type='submit' class='' id='upload-submit-raster' value='Go!' onclick='displayRasterDataForm()'>"
//+ "<br><br>"
+ "</div>" + "</div>";
return html;
}
function parseRasterDataFolder(fileSelector) {
var fileList = fileSelector.files;
if (fileList.length === 0) {
// Either directory is empty or user clicked 'Cancel'.
// There is no way of knowing this. So we'll treat both
// cases in the same way and display a message and exit.
alert('Please select a valid directory!');
return;
}
// User has selected a directory with files.
// We'll find .tif files in the directory
console.log('files:', fileList);
var n = fileList.length;
rasterLayers = [];
for (var i = 0; i < n; i++) {
var file = fileList[i];
console.log(file.name);
var words = file.name.split('.');
if (words.length === 1) // no file extension, ignore this file
continue;
var name = words[0];
var ext = words[words.length - 1];
if (ext === 'tif') // valid extension
rasterLayers.push(name);
}
var html;
if (rasterLayers.length === 0) {
// no tif files found in directory
alert('No tif files present in the selected directory');
return false;
}
if (rasterLayers.length === 1) {
// if single layer detected, show layer name to user
html = "<p>Layer detected: <b>" + rasterLayers[0] + "</b><p>";
} else {
// if multiple layer selected, ask user which layer to upload
var optionsHtml;
for (var key in rasterLayers) {
optionsHtml += "<option>" + rasterLayers[key] + "</option>";
}
html = "<span>Multiple layers found in directory. Please select layer to upload: " + "<select id='raster_upload_layer'>" + optionsHtml + "</select></span>";
}
document.getElementById('layer-list').innerHTML = html;
}
function displayShapeDataForm() {
handleShapeFileSelect(addMetadataComponent);
}
function displayRasterDataForm(fileSelector) {
parseRasterDataFolder(fileSelector);
//document.getElementById('upload-submit-raster').classList.add('hide');
//handleRasterFileSelect();
if (document.getElementById('raster-file-data').getElementsByClassName('metadata').length === 0) addMetadataComponent(null);
}
/*function displayShapeDataForm() {
var pr = new Promise(handleShapeFileSelect)
.then(function(){
addMetadataComponent();
);
}*/
function addMetadataComponent(col_names) {
console.log('adding metadata component');
var dataType = document.querySelector('input[name="fileType"]:checked').value;
var html = "<div id='metadata-component' class='metadata'>";
var styleColumnHtml = "";
if (col_names) {
styleColumnHtml = "<tr><td data-name='color_by'>Default Styling Column</td><td>" + "<select id='default_style_column'>";
col_names.forEach(function (column) {
styleColumnHtml += "<option value='" + column + "'>" + column + "</option>";
});
styleColumnHtml += "</select>" + "</td></tr>";
}
if (dataType === 'raster') {
styleColumnHtml = "<fieldset><legend class='style-legend'>Style</legend>" + "<p>How do you want to style the layer?</p>" + "<input type='radio' name='rasterStyleType' value='default'>Default grey-scale<br>" + "<input type='radio' name='rasterStyleType' value='sld'>Upload sld file " + "<input type='file' accept='.sld' id='rasterSldFile' name='files[]'><br>" + "<input type='radio' name='rasterStyleType' value='dbf'>Upload dbf file " + "<input type='file' accept='.dbf' id='rasterDbfFile' name='files[]'><br>" + "<input type='radio' name='rasterStyleType' value='ramp'>Choose Color ramp<br>" + "<div style='margin-left:20px'>" + getRampUI() + "</div>" + "</fieldset>";
}
var detailsHtml = "<table id='metadata-table'>" + styleColumnHtml + "<tr><td data-name='layer_name'>Layer Name</td><td><input/></td></tr>" + "<tr><td data-name='layer_description'>Layer Description</td><td><textarea style='width:100%' rows='5' cols='50'></textarea></td></tr>";
if (dataType === "shape") {
detailsHtml += "<tr><td data-name='layer_type'>Layer Type</td><td>" + getLayerTypeSelector() + "</td></tr>";
}
detailsHtml += "<tr><td data-name='created_by'>Contributor</td><td><input/></td></tr>" + "<tr><td data-name='attribution'>Attribution</td><td><input/></td></tr>" + "<tr><td data-name='tags'>Tags</td><td><input/></td></tr>" + "<tr><td data-name='license'>License</td><td>" + getLicenseSelector() + "</td></tr>" + "<tr><td data-name='created_date'>Data Curation Date</td><td><input id='curation_date_picker'></td></tr>" + "<table>";
//html += "<label>Default styling column </label>" + styleColumnHtml;
html += detailsHtml;
html += "</div>";
document.getElementById(dataType + '-file-data').insertAdjacentHTML('beforeend', html);
// add date picker on curation date picker element
var maxDate = new Date(); // current date
var yearRange = [1800, maxDate.getFullYear()];
var picker = new Pikaday({
field: document.getElementById('curation_date_picker'),
maxDate: maxDate,
yearRange: yearRange
});
addSubmitButton(dataType);
}
function getRampUI() {
var result = "";
for (var i = 0; i < mapColorData.length; i++) {
result = result + "<input style='position:absolute' type='radio' value=" + i + " name='colorGrid'" + "><ul class='ulStyle' style='border:solid 1px black;display: inline-block'>";
for (var j = 0; j < mapColorData[i].length; j++) {
result = result + "<li class='listItemStyle' style='background-color:" + mapColorData[i][j] + ";height:30px;width:40px" + "'" + "> </li>";
}
result = result + "</ul> </input>";
}
return result;
}
function addSubmitButton(dataType) {
var html = "<button id='shape_submit_btn' class='submit-btn' onClick='uploadFiles()'>Upload</button>";
document.getElementById(dataType + '-file-data').insertAdjacentHTML('beforeend', html);
}
function getLicenseSelector() {
var html = "<select>";
var licenseOptions = ["CC-BY", "CC-HI"];
licenseOptions.forEach(function (lic) {
html += "<option value='" + lic + "'>" + lic + "</option>";
});
html += "</select>";
return html;
}
function getLayerTypeSelector() {
var html = "<select>";
var licenseOptions = ["POINT", "MULTIPOINT", "MULTILINESTRING", "MULTIPOLYGON"];
licenseOptions.forEach(function (lic) {
html += "<option value='" + lic + "'>" + lic + "</option>";
});
html += "</select>";
return html;
}
function setDataUploadType(type) {
console.log('upload data type changed: ', type);
if (type === 'shape') {
document.getElementById('shape-file-data').classList.remove('hide');
document.getElementById('raster-file-data').classList.add('hide');
} else if (type === 'raster') {
document.getElementById('shape-file-data').classList.add('hide');
document.getElementById('raster-file-data').classList.remove('hide');
}
}
function handleShapeFileSelect(callback) {
var shpFiles = document.getElementById('inputShpFiles').files; // FileList object
var shxFiles = document.getElementById('inputShxFiles').files; // FileList object
var dbfFiles = document.getElementById('inputVectorDbfFiles').files;
if (shpFiles.length === 0) {
alert('Please select a shape file.');
return false;
}
if (shxFiles.length === 0) {
alert('Please select a shx file.');
return false;
}
if (dbfFiles.length === 0) {
alert('Please select a dbf file');
return false;
}
// hide the 'Go!' button
document.getElementById('upload-submit-shape').classList.add('hide');
var shpReader = new FileReader();
var dbfReader = new FileReader();
dbfReader.onload = function () {
shapefile.openDbf(dbfReader.result).then(function (source) {
return createDataTable(source, callback);
}).catch(function (error) {
return console.error(error.stack);
});
};
dbfReader.readAsArrayBuffer(dbfFiles[0]);
return true;
}
function handleRasterFileSelect() {
var tiffFiles = document.getElementById('inputTiffFiles').files; // FileList object
var dbfFiles = document.getElementById('inputRasterDbfFiles').files;
if (tiffFiles.length === 0) {
alert('Please select a TIFF file.');
return false;
}
if (dbfFiles.length === 0) {
alert('Please select a dbf file');
return false;
}
}
function createDataTable(source, callback) {
var fixed_col_html = getFixedColumnHTML();
var row_count = 0;
var table_html = "<table id='dbf-data-table'>";
source.read().then(function (result) {
var col_names = Object.keys(result.value);
// construct table header row
table_html += "<tr>";
col_names.forEach(function (col) {
table_html += "<th>" + col + "</th>";
});
table_html += "</tr>";
table_html += "<tr>";
col_names.forEach(function (col) {
table_html += "<td><input value='" + col + "'></input></td>";
});
table_html += "</tr>";
// contruct table rows
function addRow(result1) {
table_html += "<tr>";
Object.values(result1.value).forEach(function (value) {
table_html += "<td>" + value + "</td>";
});
table_html += "</tr>";
row_count += 1;
source.read().then(function (res) {
if (!res.done && row_count < MAX_ROW_COUNT) addRow(res);else {
table_html += getAdditionalRows(col_names);
table_html += "</table>";
console.log('finished creating table');
document.getElementById('dbf-data-table-div').innerHTML = "<div>"
//+ fixed_col_html
+ "</div>" + "<div>" + table_html + "</div>";
callback(col_names);
}
});
}
addRow(result);
});
return;
}
function getAdditionalRows(columns) {
// add radio button row to select title column
var html = "<tr>";
var checked = "checked";
columns.forEach(function (col) {
html += "<td style='text-align:center'><input type='radio' " + checked + " name='titleColumn' value='" + col + "'>Title Column</input></td>";
checked = "";
});
html += "</tr>";
// add checkbox row to select summary columns
html += "<tr>";
columns.forEach(function (col) {
html += "<td style='text-align:center'><input type='checkbox' name='summaryColumn' value='" + col + "'>Summary Column</td>";
});
html += "</tr>";
return html;
}
function getFixedColumnHTML() {
var html = "";
html += "<table>";
html += "<tr><th>Field Name</th></tr>";
html += "<tr><th>Field Description</th></tr>";
html += "<tr><th></th></tr>";
html += "<tr><th>Field Name</th></tr>";
html += "<tr><th>Field Name</th></tr>";
html += "<tr><th>Field Name</th></tr>";
html += "</table>";
return html;
}
function uploadFiles() {
var metadata_json = {};
var dataType = document.querySelector('input[name="fileType"]:checked').value;
if (dataType === 'shape') {
var title_column = "'" + document.querySelector('input[name="titleColumn"]:checked').value + "'";
var summary_columns = document.querySelectorAll('input[name="summaryColumn"]:checked');
var summary_columns_names = [];
summary_columns.forEach(function (col) {
summary_columns_names.push("'" + col.value + "'");
});
metadata_json['title_column'] = title_column;
metadata_json['summary_columns'] = summary_columns_names;
} else if (dataType === 'raster') {
// read the styling information. how to style and required files/ inputs
var styleType = document.querySelector('input[name="rasterStyleType"]:checked').value;
if (styleType === 'sld') {
var sldFiles = document.getElementById('rasterSldFile').files;
for (var i = 0; i < files.length; i++) {}
metadata_json["styleType"] = "sld";
}
if (styleType == 'dbf') {
var dbfFiles = document.getElementById('rasterDbfFile').files;
metadata_json["styleType"] = "dbf";
}
if (styleType == 'ramp') {
var selected = document.querySelector('input[name="colorGrid"]:checked').value;
if (selected) {
metadata_json["styleType"] = "ramp";
metadata_json["value"] = mapColorData[parseInt(selected)];
}
}
}
var meta_table = document.getElementById('metadata-table');
var num_rows = meta_table.rows.length;
// parse the input fields and create a JSON of all values.
for (var i = 0; i < num_rows; i++) {
var keyCells = meta_table.rows[i].cells[0];
var objCells = meta_table.rows[i].cells[1].children[0];
var key = keyCells.getAttribute('data-name');
var value = objCells.value;
if (key === 'color_by') value = "'" + value + "'";
metadata_json[keyCells.getAttribute('data-name')] = value;
console.log(objCells.value);
}
console.log('metadata', metadata_json);
var data = new FormData();
if (dataType === 'shape') {
var shpFile = document.getElementById('inputShpFiles').files[0];
metadata_json['layer_tablename'] = shpFile.name.replace(".shp", "").toLowerCase();
data.append('shp', shpFile);
data.append('shx', document.getElementById('inputShxFiles').files[0]);
data.append('dbf', document.getElementById('inputVectorDbfFiles').files[0]);
} else if (dataType === 'raster') {
// depending on the layer selected to be uploaded, select and upload all
// handle single layer case
// handle multiple layer present in dir.. upload the one which is selected by user.
// for the selected layer, upload all files of the type 'Layer_name'.<any_extension>
var files = document.getElementById('inputTiffFiles').files;
var fileNameToSearch;
if (rasterLayers.length === 1) {
// if single layer is present in the selected directory
fileNameToSearch = rasterLayers[0];
} else {
// if multiple layers present in selected directory,
// check which layer is selected by the user to be uploaded.
var layerName = document.getElementById("raster_upload_layer").value;
if (layerName) {
fileNameToSearch = layerName;
} else {
alert("Please select a layer to upload!");
return;
}
}
var k = 1;
// add all files related to that layer.
for (var i = 0; i < files.length; i++) {
var name = files[i].name.split(".")[0];
if (name === fileNameToSearch) {
data.append("raster" + k, files[i]);
k++;
}
}
}
metadata_json['status'] = 1;
data.append('metadata', createMetadataFile(dataType, metadata_json));
// url to be used for raster upload is /naksha/layer/uplaodRaster
var url = "http://localhost:8081" + "/naksha/layer/upload" + (dataType === 'shape' ? 'shp' : 'raster');
console.log(url);
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState === 4) {
document.getElementById('upload-loader').style.display = 'none';
console.log('response type: ', _typeof(xmlHttp.response));
if (xmlHttp.response === 0 || xmlHttp.response === '0') alert('Layer added successfully!');else if (xmlHttp.response === 1 || xmlHttp.response === '1') alert('Layer creation failed.');else alert('Oops! Something went wrong.');
}
};
xmlHttp.open("POST", url, true);
xmlHttp.send(data);
document.getElementById('shape_submit_btn').disabled = true;
document.getElementById('shape_submit_btn').style.opacity = 0.5;
document.getElementById('add-layer-component').insertAdjacentHTML('beforeend', '<div id="upload-loader" class="loader"></div>');
}
function addDataFiles() {}
function createMetadataFile(dataType, metadata_json) {
var content = "";
content += "*Meta_Layer\n";
for (var key in metadata_json) {
content += key + " : " + metadata_json[key] + "\n";
}
content += "\n$Layer_Column_Description\n";
if (dataType === "shape") {
var dataTable = document.getElementById('dbf-data-table');
var col_names = dataTable.rows[0];
var col_names_desc = dataTable.rows[1];
var num_cols = col_names.childElementCount;
for (var i = 0; i < num_cols; i++) {
content += col_names.cells[i].textContent + " : " + col_names_desc.cells[i].children[0].value + "\n";
}
}
console.log(content);
return new Blob([content], { type: 'text/plain' });
}
exports.default = {
init: init
};
window.handleShapeFileSelect = handleShapeFileSelect;
window.setDataUploadType = setDataUploadType;
window.displayShapeDataForm = displayShapeDataForm;
window.uploadFiles = uploadFiles;
window.displayRasterDataForm = displayRasterDataForm;
window.parseRasterDataFolder = parseRasterDataFolder;