ExtJS 4 set background color to a cell - extjs4

Is there a way in ExtJS 4 to add a background colour to the cells in the whole table, depending only on the value in the cell and not on the columns?

Add renderer to your column:
renderer: function (val, metadata, record) {
var backgroundColor = null;
if (val) {
if (val == 1) backgroundColor = "green";
if (val == 2) backgroundColor = "red";
}
metadata.style = 'background-color: ' + backgroundColor + ';';
return '';
}
Here is a working example: https://fiddle.sencha.com/fiddle/b73

This works for me...
renderer : function(value, meta) {
if(parseInt(value) > 0) {
meta.style = "background-color:green;";
} else {
meta.style = "background-color:red;";
}
}

Basicly what you want to do is:
Create 1 renderer for all columns:
columns:{
defaults: {
renderer: myrenderer
},
items:[
//your column definitions here...
]
}
The renderer is smth like this:
var myrenderer = function(value, metaData, record, rowIndex, colIndex, store, view) {
if (value >= 0 && value < 25) {
metaData.tdCls += 'x-change-cell-red';
} else if (value >= 25 && value < 50) {
metaData.tdCls += 'x-change-cell-orange';
} else if (value >= 50 && value < 75) {
metaData.tdCls += 'x-change-cell-yellow';
} else if (value >= 75 && value < 100) {
metaData.tdCls += 'x-change-cell-green';
} else if (value === 100){
metaData.tdCls +='x-change-cell-awesome-green';
}else {
metaData.tdCls += 'x-change-cell-violet';
}
return value + '%';
}

Related

SwiftUI: How to force user to only input one single digit?

I have a bunch of textfield that only accept numbers. But how can I force the user to only input one single digit and not multiple. I want the input to be a number between 0 and 9.
Any ideas?
This is the setup for one of the textfields:
CocoaTextField(pin1default, text: $pin1)
.isFirstResponder(currentFocus == 0)
.font(.system(size: 18, weight: .bold))
.lineLimit(1)
.frame(maxWidth: 50, maxHeight: 50, alignment: .center)
.multilineTextAlignment(.center)
.overlay(
RoundedRectangle(cornerRadius: 6)
.strokeBorder(Color.gray.opacity(0.1), lineWidth: 2, antialiased: true)
)
.keyboardType(.numberPad)
.onChange(of: pin1, perform: { value in
if value.count > 0 {
currentFocus += 1
}
})
.onTapGesture {
currentFocus = 0
pin1default = ""
}
You could do something like this:
func validateTextField(_ number: String) -> Bool {
let numberPredicate = NSPredicate(format: "SELF MATCHES %#", "^[0-9]*$")
return numberPredicate.evaluate(with: number) ? true : false
}
struct ContentView: View {
#State var number = ""
var body: some View {
TextField("Number", text: $number)
.onChange(of: number) { newNumber in
if !validateTextField(newNumber) && newNumber.count <= 1 {
number = ""
} else {
let value = String(newNumber.prefix(1))
if newNumber != value {
number = value
}
}
}
}
}

dgrid custom sort with secondary sort column

I'm currently using a custom sort function on a dgrid (pasted below). It doesn't change sorting drastically, just sorts one particular column uniquely and sorts the others case-insensitive. I'd like to add a secondary sort by a column named "scheduled" to be added to the sort when any other column is sorted. I'm just not sure how to go about it. I've seen how to override the sort to sort by two columns, but not when a custom sort is in play. The secondary sort would always be there, not matter what other column is clicked.
For reference I'm running dojo 1.10 and dgrid 1.0. Data is coming from a RequestMemory DStore and I'd really rather this sort happen on the grid rather than back at the store level. Any help would be appreciated.
currGrid.on('dgrid-sort', function (event) {
event.preventDefault();
var sort = event.sort[0];
currGrid.set('sort', function (a, b) {
if (sort.property == "thisField") {
//special sort for thisField
if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
var colorA = a[sort.property].split("|");
var aValue = colorA[0].toLowerCase();
}
if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
var colorB = b[sort.property].split("|");
var bValue = colorB[0].toLowerCase();
}
if (String(aValue) == String(bValue)) {
var result = 0;
} else if (dojo.string.trim(aValue) == "") {
var result = true ? 1 : -1;
} else if (dojo.string.trim(bValue) == "") {
var result = true ? -1 : 1;
} else {
var result = aValue > bValue ? 1 : -1;
}
return result * (sort.descending ? -1 : 1);
} else {
//Sort for all other fields same as always (except toLowerCase)
if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
var aValue = a[sort.property].toLowerCase();
} else {
var aValue = "";
}
if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
var bValue = b[sort.property].toLowerCase();
} else {
var bValue = "";
}
var result = aValue > bValue ? 1 : -1;
return result * (sort.descending ? -1 : 1);
}
});
currGrid.updateSortArrow(event.sort, true);
});
currGrid.startup();
You could do something like below.
currGrid.on('dgrid-sort', function (event) {
event.preventDefault();
var sortSet = [];
sortSet.push(event.sort[0]);
sortSet.push({property: "scheduled"});
currGrid.set('sort', function (a, b) {
var aValue, bValue, result = 0;
for(var i = 0; i < sortSet.length; i++){
var sort = sortSet[i];
if (sort.property == "thisField") {
//special sort for thisField
if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
var colorA = a[sort.property].split("|");
aValue = colorA[0].toLowerCase();
}
if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
var colorB = b[sort.property].split("|");
bValue = colorB[0].toLowerCase();
}
if (String(aValue) == String(bValue)) {
result = 0;
} else if (dojo.string.trim(aValue) == "") {
result = true ? 1 : -1;
} else if (dojo.string.trim(bValue) == "") {
result = true ? -1 : 1;
} else {
result = aValue > bValue ? 1 : -1;
}
return result * (sort.descending ? -1 : 1);
} else {
//Sort for all other fields same as always (except toLowerCase)
if (a[sort.property] !== 'undefined' && typeof a[sort.property] == "string") {
aValue = a[sort.property].toLowerCase();
} else {
aValue = "";
}
if (b[sort.property] !== 'undefined' && typeof b[sort.property] == "string") {
bValue = b[sort.property].toLowerCase();
} else {
bValue = "";
}
//You need this check here
if(aValue != bValue){
result = aValue > bValue ? 1 : -1;
return result * (sort.descending ? -1 : 1);
}
}
}
return 0;
});
currGrid.updateSortArrow(event.sort, true);
});
currGrid.startup();
I have some concerns about your code, the variables result, aValue and bValue are all local within the if statement and yet they are being used outside the statement. It could result in wrong results if some other variables are defined with the same name in global space. So I have modified them.
So the second section you needed to check if aValue == bValue to return 0.

Dojo dgrid: Filter data from store with diffrent fields when I click on filter button

I am using 'dgrid/Grid' and dstore/RequestMemory for creating grid and storing data. Now I want to filter data according to values in the fields(see img). I am not sure how to filter data when using simple Dgrid and dstore.
var structure = [{
label : "Value Date",
field : "valueDate"
}, {
id: "currencyCol",
label : "Currency",
field : "currency"
}, {
label : "Nostro",
field : "nostroAgent"
}];
var store= new RequestMemory({
target: 'getReportData',
idProperty: "cashflowId",
headers: structure
});
// Create an instance of OnDemandGrid referencing the store
var grid = new(declare([Grid, Pagination, Selection]))({
collection: store,
columns: structure,
loadingMessage: 'Loading data...',
noDataMessage: 'No results found.',
minRowsPerPage: 50,
}, 'grid');
grid.startup();
on(document.getElementById("filter"), "click", function(event) {
event.preventDefault();
grid.set('collection', store.filter({
**currencyCol: "AED"**
.
.
.
}));
Any help would be appreciated or suggest if I use some diffrent store or grid.
I got the solution for my question. On filter button click I have written all my filtering logic and the final store will set to dgrid:
on(document.getElementById("filter"), "click", function(event) {
var store= new RequestMemory({
target: 'getReportData',
idProperty: "cashflowId",
headers: structure
});
var from=dijit.byId('from').value;
var to=dijit.byId('to').value;
var curr=dijit.byId('currency').value;
var nos=dijit.byId('nostro').value;
var authStatus=dijit.byId('authStatus').value;
var filterStore;
var finalStore=store;
var filter= new store.Filter();
var dateToFindFrom;
var dateToFindTo;
if (from != "" && from !== null) {
var yyyy = from.getFullYear().toString();
var mm = ((from.getMonth()) + 1).toString(); // getMonth() is zero-based
var dd = from.getDate().toString();
if(mm <= 9){
mm= "0" + mm;
}
if(dd <= 9){
dd= "0" + dd;
}
dateToFindFrom =yyyy + mm + dd;
filterStore= filter.gte('valueDate', dateToFindFrom);
finalStore=finalStore.filter(filterStore);
}
if (to != "" && to !== null) {
var yyyy = to.getFullYear().toString();
var mm = ((to.getMonth()) + 1).toString(); // getMonth() is zero-based
var dd = to.getDate().toString();
if(mm <= 9){
mm= "0" + mm;
}
if(dd <= 9){
dd= "0" + dd;
}
dateToFindTo =yyyy + mm + dd;
filterStore= filter.lte('valueDate', dateToFindTo); //.lte('valueDate', dateToFindTo);
finalStore=finalStore.filter(filterStore);
}
if(curr != "" && curr !== null) {
filterStore= filter.eq('currency', curr);
finalStore=finalStore.filter(filterStore);
}
if(nos != "" && nos !== null) {
filterStore= filter.eq('nostroAgent',nos);
finalStore=finalStore.filter(filterStore);
}
if(authStatus != "" && authStatus !== null) {
if (authStatus=='ALL') {
var both= [true, false];
filterStore= filter.in('approved', both);
finalStore=finalStore.filter(filterStore);
} else if (authStatus=='Authorised Only') {
filterStore= filter.eq('approved', true);
finalStore=finalStore.filter(filterStore);
} else if (authStatus=='Unauthorised Only') {
filterStore= filter.eq('approved', false);
finalStore=finalStore.filter(filterStore);
};
};
grid.set('collection', finalStore);
});

Yadcf - Server side multi select

I used the function yadcf multi_select
When I make my search for two words, the function puts me a pipe between. I do not know how to remove it for that he understands the two words separately.
http://www.hostingpics.net/viewer.php?id=710742Capture.jpg
I found that the pipe would begin with this function :
function doFilterMultiSelect(arg, table_selector_jq_friendly, column_number, filter_match_mode) {
$.fn.dataTableExt.iApiIndex = oTablesIndex[table_selector_jq_friendly];
var oTable = oTables[table_selector_jq_friendly],
selected_values = $(arg).val(),
selected_values_trimmed = [],
i,
stringForSearch,
column_number_filter,
settingsDt = getSettingsObjFromTable(oTable);
column_number_filter = calcColumnNumberFilter(settingsDt, column_number, table_selector_jq_friendly);
$(document).data("#yadcf-filter-" + table_selector_jq_friendly + "-" + column_number + "_val", selected_values);
if (selected_values !== null) {
for (i = selected_values.length - 1; i >= 0; i--) {
if (selected_values[i] === "-1") {
selected_values.splice(i, 1);
break;
}
}
for (i = 0; i < selected_values.length; i++) {
selected_values_trimmed.push($.trim(selected_values[i]));
}
if (selected_values_trimmed.length !== 0) {
stringForSearch = selected_values_trimmed.join('narutouzomaki');
stringForSearch = stringForSearch.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
stringForSearch = stringForSearch.split('narutouzomaki').join('|');
if (filter_match_mode === "contains") {
oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
} else if (filter_match_mode === "exact") {
oTable.fnFilter("^(" + stringForSearch + ")$", column_number_filter, true, false, true);
} else if (filter_match_mode === "startsWith") {
oTable.fnFilter("^(" + stringForSearch + ")", column_number_filter, true, false, true);
} else if (filter_match_mode === "regex") {
oTable.fnFilter(stringForSearch, column_number_filter, true, false, true);
}
} else {
oTable.fnFilter("", column_number_filter);
}
} else {
oTable.fnFilter("", column_number_filter);
}
resetIApiIndex();
}
I can not seem to solve the problem to operate the multi_select.
Thank you for the help
Since you are using a multi select filter on some column yadcf sends strings with | (OR) to your server.
On your server side you have to do the split of the string into array/list of string and construct a proper sql query.
Split in Java
Split in PHP(see code sample in bottom
p.s I'm the author of yadcf

increment/decrements events for dijit.form.NumberSpinner

Is there any way to catch the event if the value inside dijit.form.NumberSpinner widget gets incremented or decremented?
What I intent to do is whenever value goes below 0 set text inside NumberSpinner widget as "Never" and when user increments it from "Never" it should be again set to 0.
dojo.declare("MySpinner", [Spinner], {
zeroValue: 'Never',
adjust: function(/*Object*/ val, /*Number*/ delta){
arguments[0] = val && val > 0 ? val : 0;
return this.inherited(arguments);
},
_getValueAttr: function() {
var v = this.inherited(arguments);
return (!v || v <= 0) ? 0 : v;
},
format: function(/*Number*/ value, /*dojo.number.__FormatOptions*/ constraints){
var v = this.inherited(arguments);
if (v <= 0 || !v)
return this.zeroValue;
return v;
},
isValid: function(/*Boolean*/ isFocused){
var v = this.get('value');
if (!v) {
return true;
}
return this.inherited(arguments);
}
});
Here's the working example
http://jsfiddle.net/cswing/zDVep/