Kendu Grid - Function inside row template always undefined - css

I am trying to use a custom row template on my grid so i can give various class declarations to individual cells in the grid.
The function i am trying to call to return the string for the css class is always undefined, no matter where i declare it.
This is the code for my grid declaration file:
(function(){
'use strict';
var logPrefix = 'sampleRequestTrackingGrid --> ';
var rowTemplateString =
'<tr data-uid="#= uid #">' +
'<td>#: requestedBy #</td>' +
'<td>#: site #</td>' +
'<td>#: sampleLot#</td>' +
'<td>#: sampleProcess #</td>' +
'<td>#: workOrderId #</td>' +
'<td>#: equipmentId #</td>' +
'<td>#: area #</td>' +
'<td>#: cell #</td>' +
'<td>#: station #</td>' +
'<td>#: testMethods #</td>' +
'<td>#: requestedDate #</td>' +
'<td class="#: getStatus(requestStatus) #">#: requestStatus #</td>' +
'<td>#: requestStatusMsg #</td>' +
'<td>#: requestId #</td>' +
'</tr';
function getStatus(requestStatus){
if(requestStatus === 'In Queue'){
return 'inQueue';
}
else if(requestStatus === 'In Progress'){
return 'inProgress';
}
else if(requestStatus === 'Complete'){
return 'complete';
}
else if(requestStatus === 'Failed'){
return 'failed';
}
}
angular.module('wm.sampleRequestTracking')
.constant('SampleRequestTrackingGrid', {
options: function(model){
return {
dataBound: model.onGridDataBound,
dataSource: {
data: model.gridData,
schema: {
model: {
id: "requestSysI",
fields: {
requestSysI: {editable: false},
requestedBy: {editable: false},
site: {editable: false},
sampleLot: {editable: false},
sampleProcess: {editable: false},
workOrderId: {editable: false},
equipmentId: {editable: false},
area: {editable: false},
cell: {editable: false},
station: {editable: false},
testMethods: {editable: false},
requestedDate: {editable: false, type: "datetime"},
requestStatus: {editable: false},
requestStatusMsg: {editable: false},
requestId: {editable: false}
}
}
},
pageSize: 200
},
scrollable: true,
resizable: true,
reorderable: true,
pageable: true,
groupable:true,
filterable: true,
autobind: false,
columnMenu: true,
navigatable: true,
selectable: true,
sortable: {mode: "multiple"},
columns: [
{field: "requestedBy", title: "Requested By", width: "100px", hidden: false},
{field: "site", title: "Site", width: "100px", hidden: false},
{field: "sampleLot", title: "Lot", width: "100px", hidden: false},
{field: "sampleProcess", title: "Process", width: "100px", hidden: false},
{field: "workOrderId", title: "Work Order", width: "100px", hidden: false},
{field: "equipmentId", title: "Equipment", width: "100px", hidden: false},
{field: "area", title: "Request Area", width: "100px", hidden: false},
{field: "cell", title: "Request Cell", width: "100px", hidden: false},
{field: "station", title: "Request Station", width: "100px", hidden: false},
{field: "testMethods", title: "Test Methods", width: "100px", hidden: false},
{field: "requestedDate", title: "Request Date", width: "100px", hidden: false},
{field: "requestStatus", title: "Request Status", width: "100px", template: "<span id='reqStatus'>#=requestStatus#</span>"},
{field: "requestId", title: "Request Id", width: "100px", hidden: false}
],
rowTemplate: rowTemplateString
};
}
});
})();
Assuming everything was working correctly, I would change the background color of the classes using the following CSS inside a .less file
.inQueue {
background-color: white;
}
.inProgress {
background-color: #fda;
}
.complete {
background-color: #ced;
}
.failed {
background-color: #fdd;
}
But, every time i run the code and try to load the grid i get an error telling me that getStatus() function is not defined.
Can anyone offer some assistance in figuring out what i am doing wrong here?
For reference: the Telerik article i was following is
https://docs.telerik.com/kendo-ui/controls/data-management/grid/how-to/Layout/style-rows-cells-based-on-data-item-values

I ended up not using a row template, as i realized it was a little unnecessary and too complex for what i needed, and instead modified my field template.
Also, as #Soham commented, placing the getStatus function outside the IIFE did work. I had done that previously, but perhaps it was because of my typo on the tr that it failed before.
(function(){
'use strict';
var logPrefix = 'sampleRequestTrackingGrid --> ';
angular.module('wm.sampleRequestTracking')
.constant('SampleRequestTrackingGrid', {
options: function(model){
return {
dataBound: model.onGridDataBound,
dataSource: {
data: model.gridData,
schema: {
model: {
id: "requestSysI",
fields: {
requestSysI: {editable: false},
requestedBy: {editable: false},
batteryId: {editable: false},
site: {editable: false},
sampleLot: {editable: false},
sampleProcess: {editable: false},
workOrderId: {editable: false},
equipmentId: {editable: false},
area: {editable: false},
cell: {editable: false},
station: {editable: false},
testMethods: {editable: false},
requestedDate: {editable: false, type: "datetime"},
requestStatus: {editable: false},
requestStatusMsg: {editable: false},
requestId: {editable: false}
}
}
},
pageSize: 200
},
scrollable: true,
resizable: true,
reorderable: true,
pageable: true,
groupable:true,
filterable: true,
autobind: false,
columnMenu: true,
navigatable: true,
selectable: true,
sortable: {mode: "multiple"},
columns: [
{field: "requestedBy", title: "Requested By", width: "100px", hidden: false},
{field: "batteryId", title: "Battery", width: "100px", hidden: false},
{field: "site", title: "Site", width: "100px", hidden: false},
{field: "sampleLot", title: "Lot", width: "150px", hidden: false},
{field: "sampleProcess", title: "Process", width: "150px", hidden: false},
{field: "workOrderId", title: "Work Order", width: "100px", hidden: false},
{field: "equipmentId", title: "Equipment", width: "100px", hidden: false},
{field: "area", title: "Request Area", width: "100px", hidden: false},
{field: "cell", title: "Request Cell", width: "100px", hidden: false},
{field: "station", title: "Request Station", width: "100px", hidden: false},
{field: "testMethods", title: "Test Methods", width: "100px", hidden: false},
{field: "requestedDate", title: "Request Date", width: "100px", hidden: false},
{field: "requestStatus", title: "Request Status", width: "100px", template: "<div class='#=getStatus(requestStatus)#' id='reqStatus' style='text-align: center'>#=requestStatus#</div>"},
{field: "requestId", title: "Request Id", width: "100px", hidden: false}
]
};
}
});
})();
function getStatus(requestStatus){
if(requestStatus === 'In Queue'){
return 'inQueue';
}
else if(requestStatus === 'In Progress'){
return 'inProgress';
}
else if(requestStatus === 'Complete'){
return 'complete';
}
else if(requestStatus === 'Failed'){
return 'failed';
}
}
With the end result being:
screenshot of column

Related

UI-Grid: columns resizing ends in overflowing the grid

I have a grid that consists of several columns. I defined columnDefs including width and min width. In addition I have disabled the horizontal scrollbar.
When resizing the columns to the right they "exit" the grid and I can see them by scrolling (although there is no scroll). How can I force the columns to stay in the grid boundaries?
This is the regular view:
After resizing to the right and scrolling to the right, you can see that the "name" column is off boundaries (on the left side)
Grid Config
columnDefs: this.queueConfig.columns,
rowHeight: 24,
rowTemplate: rowtpl,
enableHorizontalScrollbar: this.uiGridConstants.scrollbars.NEVER,
enableColumnMenus: false,
enableRowSelection: true,
enableRowHeaderSelection: false,
enableFiltering: true,
modifierKeysToMultiSelect: true,
multiSelect: true
Column Definitions
This is a function that returns the columnDefs for the grid.
The details are not important, only to notice the width definition for our issue.
private buildGridColumns(): any {
const colMinWidth = "100";
const columnsMap = {
name: {
name: this.$translate.instant('Name'),
field: "documentName",
minWidth: colMinWidth
},
step: {
name: this.$translate.instant('Col_Step'),
field: "status",
width: "150",
minWidth: colMinWidth,
cellFilter: "printStatus"
},
submitted: {
name: "Submitted",
field: "createdTime",
width: "150",
minWidth: colMinWidth,
cellFilter: "date: 'd/M/yy h:mm a'",
sort: {
direction: this.uiGridConstants.DESC
}
},
pagesNum: {
name: this.$translate.instant('NumPages'),
field: "numPages",
width: "80",
minWidth: colMinWidth,
cellFilter: "foreignDocument: this"
},
quantity: {
name: this.$translate.instant('Quantity'),
field: "numCopies",
width: "80",
minWidth: colMinWidth,
cellFilter: "foreignDocument: this"
},
progress: {
name: "Progress",
field: "PercentComplete",
minWidth: colMinWidth,
cellTemplate:
"<kd-progress-bar ng-if='!row.entity.isForeign' percentage='row.entity.percentComplete'></kd-progress-bar>" +
"<div ng-if='row.entity.isForeign' class='kd-progress-unavailable'>N/A</div>"
},
duration: {
name: this.$translate.instant('Duration'),
field: "estimatedTime",
minWidth: colMinWidth,
cellFilter: "foreignDocument: this"
},
status: {
name: this.$translate.instant('Status'),
field: "docState",
minWidth: colMinWidth,
cellFilter: "documentState"
},
press: {
name: this.$translate.instant('Press'),
field: "dfeName",
minWidth: colMinWidth
},
created: {
name: this.$translate.instant('Created'),
field: "createdDtm",
minWidth: colMinWidth,
cellFilter: "date: 'd/M/yy h:mm a'",
sort: {
direction: this.uiGridConstants.DESC
}
},
time: {
name: this.$translate.instant("Time"),
field: "createdTime",
minWidth: colMinWidth,
cellFilter: "date: 'd/M/yy h:mm a'",
width: "120",
sort: {
direction: this.uiGridConstants.DESC
}
},
failTime: {
name: this.$translate.instant('FailureTime'),
field: "lastUpdateTime",
minWidth: colMinWidth,
cellFilter: "date: 'd/M/yy h:mm a'",
width: "120",
sort: {
direction: this.uiGridConstants.DESC
}
},
completeTime: {
name: this.$translate.instant('CompletionTime'),
field: "lastUpdateTime",
minWidth: colMinWidth,
cellFilter: "date: 'short'",
width: "120",
sort: {
direction: this.uiGridConstants.DESC
}
}
};
return columnsMap;
}

how do I access an element outside the jqGrid?

I have a button and a grid (using jqGrid) but wanted to disable the button that is off the grid when the user clicks the checkbox that is within the grid. How do I do?
I'm trying to do this in LoadComplete.
<table id="Grid"></table>
<div id="GridPager"></div>
<br />
<button id="btnDownload" disabled="disabled">Download Selected</button>
<iframe id="ifr" style="display: none"></iframe>
<script>
$(document).ready(function () {
// make jQuery UI button
$("#btnDownload").button();
$("#btnDownload").click(function () {
var selectedIDs = jQuery('#Grid').jqGrid('getGridParam', 'selarrrow');
$("#ifr").attr("src", "/Handler/ExportInvoiceHandler.ashx?selectedIDs=" + selectedIDs);
});
$("#Grid").jqGrid({
url: '/Handler/InvoiceHandler.ashx',
datatype: 'json',
autowidth: true,
height: "100%",
emptyRecords: "No records found",
colNames: ['PO', 'SKU', 'Status', 'Date', ''],
colModel: [
{ name: 'PO', width: 80, sortable: true, stype: 'string', resizable: false },
{ name: 'SKU', width: 200, sortable: true, stype: 'string', resizable: false },
{ name: 'Status', width: 100, sortable: true, stype: 'string', resizable: false },
{
name: 'Date', width: 80, sorttype: "date", sortable: true, align: 'center', resizable: false,
searchoptions: {
dataInit: function (element) {
$(element).datepicker({ dateFormat: 'mm/dd/yy' })
}
}
},
{ name: 'Id', width: 50, sortable: false, search: false, index: 'Id', editable: true, formatter: returnHyperLink, align: 'center', resizable: false },
],
loadComplete: function () {
$("input[type=checkbox]").click(function () {
var chkSelected = $("#Grid input[type='checkbox']:checked").length;
var btn = $("#btnDownload");
alert(btn);
if (chkSelected != 0) {
btn.removeAttr('disabled');
}
else {
btn.attr('disabled', 'disabled');
}
});
},
rowNum: 10,
rowList: [10, 20, 30],
pager: '#GridPager',
multiselect: true,
sortname: 'PO',
viewrecords: true,
sortorder: 'asc',
loadonce: true
}).navGrid('#GridPager', { add: false, edit: false, del: false, refresh: false, search: true, refresh: true }, {}, {}, {}, { multipleSearch: true }, { closeOnEscape: true });
});
function returnHyperLink(cellValue, options, rowdata, action) {
return "<a href='/Handler/ExportInvoiceHandler.ashx?Id=" + options.rowId + "' target='ifr'>Download</a>";
}
</script>

ExtJS 4.2.3 floating image between window header and body

Here is the output I require!
Here is how I try to achieve this:
win = Ext.create('Ext.window.Window', {
height: 650,
width: 500,
layout: 'fit',
border: false,
bodyPadding: 10,
modal:true,
itemId:'serviceCallWindow',
header: {
cls: 'n-service-call-window-header',
height: 80,
items:[{
xtype: 'component',
floating: true,
autoShow: true,
shadow: false,
focusOnToFront:false,
defaultAlign: 't',
autoEl: {
tag: 'img',
src: NG.serverMapPath('~/resources/images/support/support_icon.png')
},
componentCls: 'n-service-call-support-icon'
}]
},
items: [{
xtype: 'servicecall',
border: false,
bodyPadding: 10
}]
});
The challenge is to get the service call icon between the window header and body.
How can I achieve this?
This is achievable through manipulating CSS and the various layouts. You would perhaps also need to get rid of the header and actually make your own "close" button which would fire the windows close method.
such as below:
Ext.application({
name: 'Fiddle',
launch: function() {
win = Ext.create('Ext.window.Window', {
height: 300,
width: 500,
border: false,
bodyPadding: 10,
header: false,
modal: true,
layout: 'vbox',
itemId: 'serviceCallWindow',
items: [{
xtype: 'container',
/*layout: {
type: 'hbox',
pack: 'center'
},*/
width: '100%',
items: [{
xtype: 'image',
cls: 'testLogo',
style: {
margin: '0 auto',
width: '50px',
display: 'block'
},
src: 'http://placehold.it/50x50'
}, {
xtype: 'button',
cls: 'testClose',
style: {
top: 0,
right: 0,
position: 'absolute'
},
icon: 'http://placehold.it/20x20',
listeners: {
click: function() {
win.close();
}
}
}],
}, {
xtype: 'container',
border: false,
bodyPadding: 10,
html: 'this is the content of another container'
}]
});
win.show();
}
});
Demo: https://fiddle.sencha.com/#fiddle/g6t

jqgrid rowattr not applying class

I want to apply background color to row of jqGrid row based on value of column, however the basic rowattr is not applying class to rows.
Below is the code (for simplicity I have removed the condition on which color needs to be applied)
jQuery("#employeeSalarysGrid").jqGrid({
height: 250,
url: 'http://localhost:50570/api/Test/Get',
mtype: "GET",
contentType: "application/json; charset=utf-8",
datatype: "json",
serializeGridData: function (postData) {
return JSON.stringify(postData);
},
jsonReader: {
root: function (obj) { return obj; },
page: function (obj) { return 1; },
total: function (obj) { return 1; },
records: function (obj) { return obj.length; },
id: "0",
cell: "",
repeatitems: false
},
datatype: "json",
colNames: ['Id', 'Bank Name', 'Bank Name', 'Employee name', 'Joining date', 'Salary amount', 'Comments'],
colModel: [
{ name: 'Id', align: "center", hidden: true },
{ name: 'BankName', index: 'BankName', align: 'center', editable: false },
{
name: 'BankId', index: 'BankId', align: "center", hidden: true, required: true,
viewable: true, editrules: { edithidden: true, required: true },
editable: true,
edittype: 'select',
editoptions: {
dataUrl: '/api/Test/GetBanks',
buildSelect: function (data) {
var response = jQuery.parseJSON(data);
var s = '<select>';
if (response && response.length) {
for (var i = 0, l = response.length; i < l; i++) {
var bank = response[i];
s += "<option value=" + bank.BankId + ">" + bank.Name + "</option>";
}
}
return s + "</select>";
}
}
},
{ name: 'EmployeeName', align: "center", editable: true, editrules: { required: true } },
{ name: 'JoiningDate', align: "center", editable: true, editrules: { custom: true, custom_func: datecheck },
formatter: 'date', formatoptions: { srcformat: 'y-m-d', newformat: 'd-M-y' }, edittype: 'text', editable: true,
editoptions: { dataInit: function (el) { setTimeout(function () { $(el).datepicker({ dateFormat: 'd-M-y' }); }, 200); } }
},
//{ name: 'cdate', index: 'cdate', width: 80, align: 'right', formatter: 'date', srcformat: 'yyyy-mm-dd', newformat: 'm-d-Y', edittype: 'text', editable: true, editoptions: { dataInit: function (el) { setTimeout(function () { $(el).datepicker(); }, 200); } } },
{ name: 'SalaryAmount', align: "center", editable: true, editrules: { required: true } },
{ name: 'Comments ', align: "center", editable: true }
],
gridview: true,
autoencode: true,
ignorecase: true,
loadonce: true,
sortname: "InstallmentDate",
sortorder: "asc",
viewrecords: true,
rowNum: 10,
rowList: [10, 15, 20],
pager: '#employeeSalarysPager',
caption: "Employee Salary list",
rowattr: function (rd) {
return { "class": "rowClass" };
//alert("hi");
}
});
CSS style :
<style type="text/css">
.rowClass { color: blue; background-image: none;}
</style>
Note: If I uncomment //alert statement, it shows alert message 5 times. It means rowattr is getting invoked for each row, however css class is not getting applied.
Regards,
Abhilash
The rowattr do works correctly, but if you want that the class will be applied on selected rows too then you should change CSS rule to the following
.ui-widget-content .rowClass { color: blue; background-image: none; }
see the demo.

Knockout-Kendo.js editableTemplate

I am using Knockout-Kendo.js in Durundal.js
How do I bind Custom editable.template or call custom HTML when click on Edit and Add buttons.
I have tried the below code but not working
<div data-bind="kendoGrid: { data: items, editableTemplate: 'editTemplate', useKOTemplates: true }"> </div>
<script id="editTemplate" type="text/html">
<h3>Edit User</h3>
<p>
<label>User Name:<input data-bind="text:username" /></label>
</p>
</script>
Viewmodel.js file for knockout binding
define(['services/logger', 'config', 'services/dataservice'], function (logger, config, dataservice) {
var title = 'Users';
var items = ko.observableArray();
var vm = {
items: items,
activate: activate,
title: title
};
return vm;
//#region Internal Methods
function activate() {
dataservice.getUsers(vm.items);
ko.bindingHandlers.kendoGrid.options = {
dataSource: {
schema: {
model: {
fields: {
firstName: { type: "string" },
lastName: { type: "string" },
username: { type: "string" },
company: { type: "string" },
addressLine1: { type: "string" },
addressLine2: { type: "string" },
city: { type: "string" },
state: { type: "string" },
postCode: { type: "string" },
phoneNumber: { type: "string" },
website: { type: "string" },
vatNumber: { type: "string" },
registrationNumber: { type: "string" },
creadtedBy: { type: "string", editable: false, nullable: true, hidden: true },
createdOn: { type: "date", editable: false, nullable: true, hidden: true },
modifiedBy: { type: "string", editable: false, nullable: true, hidden: true },
modifiedOn: { type: "date", editable: false, nullable: true, hidden: true },
}
}
},
pageSize: config.gridPageSize
},
toolbar: config.gridToolbar,
height: config.gridHeight,
columns: [
{ field: "firstName", title: "First Name", width: "90px" },
{ field: "lastName", title: "Last Name", width: "90px" },
{ field: "company", title: "Company", width: "90px" },
{ field: "username", title: "User Name", width: "90px" },
{ field: "addressLine1", title: "Address Line1", width: "90px" },
{ field: "addressLine2", title: "Address Line2", width: "90px" },
{ field: "city", title: "City", width: "90px" },
{ field: "state", title: "State", width: "90px" },
{ field: "postCode", title: "Post Code", width: "90px" },
{ field: "phoneNumber", title: "Phone Number", width: "90px" },
{ field: "website", title: "Website", width: "90px" },
{ field: "vatNumber", title: "Vat Number", width: "90px" },
{ field: "registrationNumber", title: "Registration Number", width: "90px" },
{ field: "creadtedBy", title: "Created By", width: "130px" },
{
field: "createdOn",
title: "Created On",
width: "130px",
format: "{0:MM/dd/yyyy HH:mm tt}",
filterable: {
ui: "datetimepicker"
}
},
{ field: "modifiedBy", title: "Modified By", width: "130px" },
{
field: "modifiedOn",
title: "Modified On",
width: "130px",
format: "{0:MM/dd/yyyy HH:mm tt}",
filterable: {
ui: "datetimepicker"
}
},
{ command: ["edit", "destroy"], title: " ", width: "160px" }
],
editable: config.gridEditableType
};
}
//#endregion
});

Resources