I have put the devexpress map to my application. It refreshes every 20 seconds, and the map moves to a certain location.
However, when it refreshes, I want it to stay in the same location. I tried changing the longitude/latitude and auto refresh, but it just goes to different locations, not the one I am at.
The code of the auto refresh:
var query = {
iType: eType
};
$.ajax({
type: "POST",
url: "WebMethods.aspx/GetLiveMapData",
//headers: { "Accept-Encoding": "gzip" },
data: JSON.stringify(query),
contentType: "application/json; charset=utf-8",
dataType: "json",
async: true,
success: function (result) {
if (AppPopup == null) { return; }
var map = $("#PopupContainer").dxForm("instance").getEditor("MapField");
var markers = [];
var sData;
var oData;
var fisShown = false;
sData = eval('(' + result.d + ')');
oData = JSON.parse(sData.data);
for (var item in oData) {
if (oData[item]['SHOWTOOLTIP'] == 1) {
fisShown = true;
} else {
fisShown = false;
}
markers.push({
location: { lat: oData[item]['ML_LATITUDE'], lng: oData[item]['ML_LONGITUDE'] },
iconSrc: oData[item]['ICON'], //"Content/Icons/map-marker.png",
onClick: function (args) { },
tooltip: {
isShown: fisShown,
text: oData[item]['TOOLTIP']
}
});
}
map.beginUpdate();
if (e == 0) {
map.option("autoAdjust", true);
map.option("zoom", 10);
} else {
map.option("autoAdjust", false);
//map.resetOption("autoAdjust");
}
map.option("markers", markers);
map.endUpdate();
setTimeout(function () {
LiveMapRefresh(1);
}, 20000);
},
failure: function (msg) {
},
error: function (a, b, c) {
ODAlertError(c + ' - ' + a.responseText);
}
});
};
var showCallback = function (e) {
var iMapHeight = $(window).height();
iMapHeight = iMapHeight - 160;
$("#PopupContainer").dxForm({
labelLocation: "top",
//height: $(window).height(),
items: [
{
itemType: "group",
colCount: 1,
items: [
{
itemType: "group",
colCount: 2,
colSpan: 2,
caption: "",
items: [
]
},
{
colSpan: 2,
template: "<div class='legends-div' id='LegendsDiv'></div>"
},
{
itemType: "group",
cssClass: "MapGroup",
colCount: 1,
colSpan: 2,
caption: ODGetMsg(1661),
items: [
{
colSpan: 1,
dataField: "MapField",
label: { visible: false, text: ODGetMsg(10434) },
editorType: "dxMap",
editorOptions: {
provider: "google",
type: "roadmap",
controls: true,
zoom: 10,
autoAdjust: false,
width: "100%",
height: iMapHeight,
onReady: function (e) {
setTimeout(function () {
var map = $("#PopupContainer").dxForm("instance").getEditor("MapField");
var markers = [];
markers.push({
location: { lat: 39.0742, lng: 21.8243 },
iconSrc: "Content/Icons/map-marker.png",
onClick: function (args) { },
tooltip: {
isShown: false
}
});
map.option("zoom", 5);
map.option("markers", markers);
LiveMapRefresh(0);
}, 0);
},
apiKey: {
bing: "",
google: "AIzaSyADwkYePzXKCgV0GoUvEiMgunuzxBBHh3w",
googleStatic: ""
}
}
}
]
}
]
}]
});
$("#PopupContainer").dxForm("instance").validate();
}
OpenPopup(ODGetMsg(4412), oPopupContent, OkCallback, showCallback, null, true, false, validateCallback)
}```
Related
I do not know what I am missing or what is wrong with my code, I already tried tracing it from the console but the TransmittedDataTable.on('draw' does not work. What's wrong with my code?
Javascript Code:
$(document).ready(function () {
GetData()
});
function GetData() {
var TransmittedDataTable = $('#tbtransmitteddata').dataTable({
autoWidth: true,
initComplete: function () {
//this.api().columns([0, 1, 2, 3, 4]).every(function () {
this.api().columns().every(function () {
var column = this;
var select = $('<select><option value=""></option></select>')
.appendTo($(column.footer()).empty())
.on('change', function () {
var val = $.fn.dataTable.util.escapeRegex(
$(this).val()
);
column
.search(val ? '^' + val + '$' : '', true, false)
.draw(function () {
});
});
column.data().unique().sort().each(function (d, j) {
select.append('<option value="' + d + '">' + d + '</option>')
});
});
},
'drawCallback': function (settings) {
//var api = this.api();
// Output the data for the visible rows to the browser's console
//console.log(api.rows({ page: 'current' }).data());
},
processing: true,
ajax: {
type: 'post',
contentType: 'application/json; charset=utf-8',
url: '../Application/ApplicationWS.asmx/GetDepEdTransmittal2',
dataSrc: function (json) {
return JSON.parse(json.d);
}
},
columns: [
{ data: "Region" },
{ data: "Division" },
{ data: "Station" },
{ data: "EmployeeNumber" },
{ data: "EmployeeName" },
{ data: "DednCode" },
{ data: "PolicyNo" },
{ data: "EffectDate" },
{ data: "TermDate" },
{ data: "Amount" },
{ data: "LoanAmount" },
{ data: "InterestAmount" },
{ data: "OtherCharges" },
{ data: "BillingType" },
{ data: "UpdateCode" }
],
//deferLoading: 57,
'columnDefs': [
{ 'targets': 4, 'title': 'Employee Name' },
{ 'targets': 5, 'title': 'Deduction Code' },
{ 'targets': 7, 'title': 'Effectivity Date' },
{ 'targets': 8, 'title': 'Termination Date' },
{ 'targets': 9, 'title': 'Deduction Amount' },
{ 'targets': 10, 'title': 'Loan Amount' },
{ 'targets': 11, 'title': 'Interest Amount' },
{ 'targets': 12, 'title': 'Other Charges' },
{ 'targets': 13, 'title': 'Billing Type' },
{ 'targets': 14, 'title': 'Update Code' }
//{ "targets": [13], "visible": false, "searchable": false }
]
//,scrollY:'50vh',
, dom: 'Blfrtip'
, colReorder: true
, buttons: [{
extend: 'pdfHtml5',
download: 'open',
orientation: 'landscape',
pageSize: 'LEGAL',
title: 'BILLING LIST & PROMISORRY NOTES',
//message: 'BILLING LIST & PROMISORRY NOTES',
exportOptions: {
//columns: [0, 1, 2, 3, 4, 5]
},
customize: function (doc) {
doc.content.splice(0, 0, {
margin: [0, 0, 0, 10],
alignment: 'center',
image: 'data:image/png;base64,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'
});
//console.log(doc.content[2]);
//doc.content[2].table.widths = [40, 40, 40, 60, 100, 40];
}
}]
});
TransmittedDataTable.on('draw.dt', function () {
TransmittedDataTable.columns().indexes().each(function (idx) {
var select = $(TransmittedDataTable.column(idx).footer()).find('select');
if (select.val() === '') {
select
.empty()
.append('<option value=""/>');
TransmittedDataTable.column(idx, { search: 'applied' }).data().unique().sort().each(function (d, j) {
select.append('<option value="' + d + '">' + d + '</option>');
});
}
});
});
}
I already updated my code, tried draw.dt but a new error came out, in browers console an error shows Uncaught TypeError: TransmittedDataTable.columns is not a function(…)
You should add .dt to event name if you've used jQuery object or initialized your table with dataTable(), see example below.
TransmittedDataTable.on('draw.dt', function(){
});
If you initialized your table with DataTable(), .dt suffix is not needed.
Since you're trying to access other API methods using TransmittedDataTable variable, initialize your table with DataTable() and everything would work as expected.
See Events for more information.
So I'm a beginner using jsGrid to make a calendar grid, which looks like this
http://i.stack.imgur.com/gU4V9.png
I've created the header fields as such:
var headerFields = [{
name: "name",
title: "", type: "text",
width: 60
}];
for(var i = 1; i <= 31; i++){
headerFields[i] = {
name: String(i),
title: String(i),
type: "text",
width: 20,
sorting: false,
inserting: false
};
}
headerFields.push({ type: "control", width: 24, editButton: false });
And then that's initialized in the jsGrid itself as such:
$("#jsGrid").jsGrid({
...
fields: headerFields,
...
}
Aside from all months having 31 days I feel like this is a very non-kosher way of doing this, because if I want to reference a cell by a certain day it's done like "item[17]" which is so ambiguous, it feels like it should have another layer like "item.day(17)" but I'm having a hard time figuring out how to apply that.
Any thoughts?
working example of jsgrid date field
var db = {
loadData: function(filter) {
return $.grep(this.users, function(user) {
return (!filter.Name || user.Name.indexOf(filter.Name) > -1);
});
},
insertItem: function(item) {
this.users.push(item);
},
deleteItem: function(item) {
var index = $.inArray(item, this.users);
this.users.splice(index, 1);
}
};
window.db = db;
db.users = [
{
"Account": "D89FF524-1233-0CE7-C9E1-56EFF017A321",
"Name": "Prescott Griffin",
"RegisterDate": "2011-02-22T05:59:55-08:00"
},
{
"Account": "06FAAD9A-5114-08F6-D60C-961B2528B4F0",
"Name": "Amir Saunders",
"RegisterDate": "2014-08-13T09:17:49-07:00"
},
{
"Account": "EED7653D-7DD9-A722-64A8-36A55ECDBE77",
"Name": "Derek Thornton",
"RegisterDate": "2012-02-27T01:31:07-08:00"
},
{
"Account": "2A2E6D40-FEBD-C643-A751-9AB4CAF1E2F6",
"Name": "Fletcher Romero",
"RegisterDate": "2010-06-25T15:49:54-07:00"
},
{
"Account": "3978F8FA-DFF0-DA0E-0A5D-EB9D281A3286",
"Name": "Thaddeus Stein",
"RegisterDate": "2013-11-10T07:29:41-08:00"
}
];
var MyDateField = function (config) {
jsGrid.Field.call(this, config);
};
MyDateField.prototype = new jsGrid.Field({
sorter: function (date1, date2) {
return new Date(date1) - new Date(date2);
},
itemTemplate: function (value) {
return new Date(value).toDateString();
},
insertTemplate: function (value) {
return this._insertPicker = $("<input class='date-picker'>").datetimepicker();
},
editTemplate: function (value) {
return this._editPicker = $("<input class='date-picker'>").datetimepicker();
},
insertValue: function () {
return this._insertPicker.data("DateTimePicker").useCurrent();
},
editValue: function () {
return this._editPicker.data("DateTimePicker").useCurrent();
}
});
jsGrid.fields.date = MyDateField;
$("#jsGrid").jsGrid({
height: "90%",
width: "100%",
inserting: true,
filtering: true,
editing: true,
paging: true,
autoload: true,
controller: db,
fields: [
{ name: "Account", width: 150, align: "center" },
{ name: "Name", type: "text" },
{ name: "RegisterDate", type: "date", width: 100, align: "center" },
{ type: "control", editButton: false }
]
});
Refference: http://jsfiddle.net/tabalinas/L6wbmvfo/
if you're using Moment, this worked for me:
var DateField = function (config) {
jsGrid.Field.call(this, config);
};
DateField.prototype = new jsGrid.Field({
sorter: function (date1, date2) {
return moment(date1) - moment(date2);
},
itemTemplate: function (value) {
return moment(value).locale('en').format('YYYY-MM-DD HH:mm:ss');
},
});
jsGrid.fields.date = DateField;
I just ignored edit & insert functions because I don't need them.
I have working on Keno UI grid and I have added a comboBox as a column in the grid which also supports autocomplete feature. Apparently, comboBox is working fine but when I type half of world and focus out of the comboBox cell then it shows undefined. I have tried to handle it on combobox change event, but it is still showing undefined value? Below is my code for combobox and grid.
function productDropDownEditor(container, options) {
$('<input id="ProductDropDown" style="width:250px;" data-bind="value:' + options.field + '"/>')
.appendTo(container).kendoComboBox({
dataSource: dataSource,
autoBind: false,
dataTextField: 'ProductName',
dataValueField: 'ProductID',
filter: "contains",
suggest: true,
index: 3,
change: function (e) {
debugger;
var cmb = this;
// selectedIndex of -1 indicates custom value
if (cmb.selectedIndex < 0) {
cmb.value(0); // or set to the first item in combobox
}
},
close: function (e) {
debugger;
var cmb = this;
}
});
And here is following code for kendo grid.
$(function () {
$("#grid").kendoGrid({
columns: [
{
field: "Products", width: "250px",
editor: productDropDownEditor,
title: "Product",
template: "#=Products.ProductName#",
attributes: {
"class": "select2_single"
}
},
{ field: "PurchasePrice", width: "150px" },
{ field: "PurchaseQuantity", width: "150px" },
{ field: "SaleRate", title: "Sale Rate", width: "150px" },
{ field: "Amount", title: "Amount", width: "150px" },
{ command: "destroy", title: "Delete", width: "110px" },
],
editable: true, // enable editing
pageable: true,
navigatable: true,
sortable: true,
editable: "incell",
toolbar: ["create"], // specify toolbar commands
edit: function (e) {
//debugger;
//// var parentItem = parentGrid.dataSource.get(e.model.PurchaseID);
////e.model.set("ShipCountry", parentItem.Country);
//if (e.model.isNew()) {
// // set the value of the model property like this
// e.model.set("PropertyName", Value);
// // for setting all fields, you can loop on
// // the grid columns names and set the field
//}
},
//editable: "inline",
dataSource: {
serverPaging: true,
requestStart: function () {
kendo.ui.progress($("#loading"), true);
},
requestEnd: function () {
kendo.ui.progress($("#loading"), false);
},
serverFiltering: true,
serverSorting: true,
batch: true,
pageSize: 3,
schema: {
data: "data",
total: "Total",
model: { // define the model of the data source. Required for validation and property types.
id: "Id",
fields: {
PurchaseID: { editable: false, nullable: true },
PurchasePrice: { nullable: true },
PurchaseQuantity: { validation: { required: true, min: 1 } },
SaleRate: { validation: { required: true, min: 1 } },
Amount: { type: "number", editable: false },
Products: {
nullable: false,
validation: { required: true},
defaultValue: {ProductID:1, ProductName:"Googo" },
//from: "Products.ProductName",
parse: function (data) {
debugger;
if (data == null) {
data = { ProductID: 1};
}
return data;
},
type: "object"
}
}
}
},
batch: true, // enable batch editing - changes will be saved when the user clicks the "Save changes" button
change: function (e) {
debugger;
if (e.action === "itemchange" && e.field !== "Amount") {
var model = e.items[0],
type = model.Type,
currentValue = model.PurchasePrice * model.PurchaseQuantity;//formulas[type](model);
if (currentValue !== model.Amount) {
model.Amount = currentValue;
$("#grid").find("tr[data-uid='" + model.uid + "'] td:eq(4)").text(currentValue);
}
//if (e.field == "Products") {
// $("#grid").find("tr[data-uid='" + model.uid + "'] td:eq(0)").text(model.Products);
//}
}
},
transport: {
read: {
url: "#Url.Action("Read", "Purchase")", //specify the URL which should return the records. This is the Read method of the HomeController.
contentType: "application/json",
type: "POST", //use HTTP POST request as by default GET is not allowed by ASP.NET MVC
},
parameterMap: function (data, operation) {
debugger;
if (operation != "read") {
// post the products so the ASP.NET DefaultModelBinder will understand them:
// data.models[0].ProductID = data.models[0].Product.ProductID;
var result = {};
// data.models[0].ProductID = $("#ProductDropDown").val();
for (var i = 0; i < data.models.length; i++) {
var purchase = data.models[i];
for (var member in purchase) {
result["purchaseDetail[" + i + "]." + member] = purchase[member];
}
}
return result;
} else {
var purchaseID = $("#hdnPurchaseId").val();
//output = '{ purchaseID: ' + purchaseID + '}';
data.purchaseID = purchaseID; // Got value from MVC view model.
return JSON.stringify(data)
}
}
}
},
}).data("kendoGrid");
I want to modify json object inside a function and then use the received value at another function. This is as a glimpse what I've coded:
$(document).ready(function () {
var json
$("#ok").click(function(){
function plotReglaFalsa(respuesta) {
json = respuesta
}
....
....
plotReglaFalsa(anyJSON)
function populateTable () {
console.log(json)
}
populateTable()
})
However json is not being modified, I do call functions required to the to the point of json being modified and the console.log statement prints undefined. I also know respuesta is a valid object.
However, plotReglaFalsa is actually a callback argument in an AJAX request, this is my full code:
$(document).ready(function () {
var json
$.plot($("#placeholder"), [ [] ], { yaxis: { show: true, max: 100, min: -100 }, xaxis: { show: true, max: 100, min: -100} });
$("#ok").click(function(){
var args = { algorithm: 'ReglaFalsa.py',
parameters: "\'"+$("#fx").val() + "\' " +
$("#a").val() + " " +
$("#b").val() + " " +
$("#tolerancia").val() + " " +
$("#iteracionesMaximas").val()
}
function plotReglaFalsa(respuesta) {
json = respuesta
var result = []
for (var series in respuesta) {
if (series!="x" && series != "y")
result.push({
data : [ [respuesta[series].a,respuesta[series].F], [respuesta[series].b, respuesta[series].G]]
})
}
result.push({
label: "fx",
color: "#FB2365",
data: _.zip(respuesta['x'], respuesta['y'])
})
var plot = $.plot( $("#placeholder"),
result,
{ selection:{mode: "xy"},
zoom: { interactive: true },
pan: { interactive: true },
grid: { markings: [{ xaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 1 }, { yaxis: { from: 0.0, to: 0.0 }, color: 'black', lineWidth: 1 }] }
})
plot.getOptions().selection.mode = null
}
getSendingJSON("/plot",args,plotReglaFalsa)
populateTable()
function populateTable () {
console.log(json)
$("body").append("<table id='resultados' class='table table-bordered'><thead><th>i</th><th>a</th><th>F</th><th>b</th><th>G</th><th>w</th></thead><tbody></tbody></table>")
$('#resultados').dynatable({
features: {
paginate: false,
sort: false,
search: false,
perPageSelect: false,
recordCount: false
},
dataset: { records: json }
})
}
})
})
And this is populate table function:
function getSendingJSON(url,reqObject,callBack) {
$.ajax({
type: "get",
data: reqObject,
dataType: "json",
url: url,
success: function(response){
callBack(response);
}
});
}
Understanding that the issue is around the AJAX nature, what's the easiest workaround to assign response to a variable?
I have a json object returned in the format below.
`{
"ParkingFacilities": [
{
"VendorID": 1200,
"FacilityID": 902,
"ParkingType": "Garage",
"BARTValidationRequired": null,
"LotName": "California and Steiner Lot",
"City": "San Francisco",
"Street": "2450 California Street",
"Neighborhood": "Fillmore",
"Latitude": "37.790000",
"Longitude": "-122.430000",
"Distance": "",
"Availability": "Space Available: <b>30%</b> (210/65) <br>Current Price: $8/hr-$35/hr max <br />Open Today:",
"Details": null,
"Hours": "",
"Entrance": "",
"Contact": "",
"TodayTimings": null,
"TotalParkingSpace": 45,
"AvailableParkingSpace": 16,
"OccupiedParkingSpace": 29,
"PercentFull": 64,
"Rendering": 2,
"OwnershipAgencyType": null
}
],
"ParkingZones": [
{
"ZoneID": 1,
"City": "San Francisco",
"Neighborhood": "Fisherman's Wharf",
"CentralLatitude": 37.80696471,
"CentralLongitude": -122.41867077,
"LocationDescription": "Leavenworth & Beach",
"Total": 197,
"Available": 45,
"Availability": "Space Available: <b>45%</b> (89/197)",
"Occupied": 89,
"Distance": "0.4 Miles",
"Rendering": 3
}
]
}`
I would like to know how do i create a model for this json structure and use then render it to draw points on the map.
Ext.regModel("parking.models.Facility", {
fields:
[
{ name: 'VendorID', type: 'int' },
{ name: 'FacilityID', type: 'int' },
{ name: 'ParkingType', type: 'string' },
{ name: 'BARTValidationRequired', type: 'auto' },
{ name: 'LotName', type: 'string' },
{ name: 'City', type: 'string' },
{ name: 'Neighborhood', type: 'string' },
{ name: 'Latitude', type: 'auto' },
{ name: 'Longitude', type: 'auto' },
{ name: 'Distance', type: 'auto' },
{ name: 'Availability', type: 'string' },
{ name: 'Details', type: 'string' },
{ name: 'Hours', type: 'auto' },
{ name: 'Entrance', type: 'string' },
{ name: 'Contact', type: 'auto' },
{ name: 'TodayTimings', type: 'auto' },
{ name: 'TotalParkingSpace', type: 'float' },
{ name: 'AvailableParkingSpace', type: 'float' },
{ name: 'OccupiedParkingSpace', type: 'float' },
{ name: 'PercentFull', type: 'auto' },
{ name: 'Rendering', type: 'int' },
{ name: 'OwnershipAgencyType', type: 'auto' }
]
});
Ext.regModel("parking.models.Zones", {
fields:
[
{ name: 'ZoneID', type: 'int' },
{ name: 'City', type: 'string' },
{ name: 'Neighborhood', type: 'string' },
{ name: 'CentralLatitude', type: 'auto' },
{ name: 'CentralLongitude', type: 'auto' },
{ name: 'LocationDescription', type: 'string' },
{ name: 'Total', type: 'float' },
{ name: 'Available', type: 'float' },
{ name: 'Availability', type: 'string' },
{ name: 'Occupied', type: 'float' },
{ name: 'Distance', type: 'auto' },
{ name: 'Rendering', type: 'int' }
]
});
Store I have created for parking Facility:
parking.stores.parkingFacility = new Ext.data.Store({
model: 'parking.models.Facility',
proxy: {
type: 'ajax',
url: 'GetParkingFacilityByCity.json',
reader: {
type: 'json',
root: 'ParkingFacilities'
}
},
autoLoad:true
});
This is how i render it in my view
var map = new Ext.Map({
title: 'Map',
useCurrentLocation: true,
mapOptions: {
center: new google.maps.LatLng(37.381592, -122.135672),
zoom: 12,
mapTypeId: google.maps.MapTypeId.ROADMAP,
navigationControl: true,
navigationControlOptions: {
style: google.maps.NavigationControlStyle.DEFAULT
}
},
listeners: {
maprender: function (comp, map) {
var image = 'icon_blueP.png';
***data = parking.stores.parkingFacility;
for (var i = 0, ln = data.data.length; i < ln; i++) {
addMarkers(data.data.items[i], image);
}***
}
}
});
var addMarkers = function (data,image) {
var latLng = new google.maps.LatLng(data.get('Latitude'), data.get('Longitude'));
var marker = new google.maps.Marker({
map: map.map,
position: latLng,
icon:image
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map, marker);
});
// setTimeout( function(){ map.panTo (position); } , 1000);
}
Question is rather than creating 2 separate store. can i use a single store and then when rendering in the google maps use the single store to get all the information.
this is where the problem happends
> ***data = parking.stores.parkingFacility;
> for (var i = 0, ln = data.data.length; i < ln; i++) {
> addMarkers(data.data.items[i], image);
> }***
do i need to call something like
data 2= parking.stores.zones
for (var i = 0, ln = data.data.length; i < ln; i++) {
addMarkers(data.data.items[i], image);
}
or is there a better way to do this. can some one help me with samples.
Thanks
Pawan
I solution is by creating a data store with type as auto as shown below.
Ext.regModel("PF", {
fields:
[
{ name: 'ParkingFacilities', type: 'auto' },
{ name: 'ParkingZones', type: 'auto' }
]
});
Hope this helps some one.