Editable and non-editable some ag-grid cells dynamically - ag-grid

I have to implement editable/non-editable of the corresponding cells in a particular row depending on datatype selection. When we select datatype="NUMERIC" then it should be editable particular that cell in a row only under Min and Max column instead of full column.
Example
```
$scope.gridOptions.onCellValueChanged = function(event) {
if (event.colDef.field === 'validation_type') {
if (event.newValue.name === 'NUMERIC') {
event.columnApi.getColumn('min_value').editable = true;
}
}
}
```
Then it allow all cells of that column editable. But as per my requirement it should be editable only one particular cell. Please suggest.
Screenshots:

The easiest place to do this is in your column definitions:
const columnDefs = [
// ...
{
headerName: 'Data Type',
field: 'validation_type',
},
{
headerName: 'min',
field: 'min_value',
editable: function(params) {
// allow `min_value` cell to be edited for rows with correct `validation_type`
return params.node.data.validation_type === 'NUMERIC';
},
},
{
headerName: 'max',
field: 'max_value',
editable: function(params) {
return params.node.data.validation_type === 'NUMERIC';
},
},
// ...
];

Related

Column filter for "empty" value

Is there a way to add a column filter for empty values?
I see we can filter for equal, not equal, ... but I'd like to have an option to filter a column so it returns rows where the column is empty or null.
I had the same issue with empty cells
You should use 'Blank option'
const filterOptions = [
'empty',
{
displayKey: 'blanks',
displayName: 'Blanks',
test: function (filterValue, cellValue) {
return cellValue == undefined;
},
hideFilterInput: true,
},
'equals',
'notEqual',
'lessThan',
'lessThanOrEqual',
'greaterThan',
'greaterThanOrEqual',
'inRange'
];
columnDef = [
{
headerName: 'someValue', field: 'someValue',
filter: 'agNumberColumnFilter',
filterParams: {
filterOptions: filterOptions
}
},]
'empty' - is equal to 'Please choose option'
more inforamtion you can find here: https://www.ag-grid.com/javascript-grid-filter-provided-simple/#blank-cells-date-and-number-filters

Ag-grid Master/Detail grid Independent pagination at Master and Detail

if number of rows of detail grid are more, it is tedious to scroll through all rows,
Is it possible to add pagination at Master and Detail independently?
I have gone through the below link of ag-grid documentation but did not find a way or mention of pagination.
https://www.ag-grid.com/javascript-grid-master-detail/
You just need to add pagination related properties pagination : true to the detail grid options. Here is what your detailGridOptions would look like -
this.detailCellRendererParams = {
detailGridOptions: {
columnDefs: [
{ field: 'callId' },
{ field: 'direction' },
{
field: 'number',
minWidth: 150,
},
{
field: 'duration',
valueFormatter: "x.toLocaleString() + 's'",
},
{
field: 'switchCode',
minWidth: 150,
},
],
defaultColDef: { flex: 1 },
pagination : true, //set pagination to true
paginationPageSize: 5 // define page size, default is 100
},
getDetailRowData: function(params) {
params.successCallback(params.data.callRecords);
},
};
}
Attaching the example screenshot -
Used this example

Ag-grid: Is there a way to add a custom filter to default filters

I'm trying to add a custom filter of using string similarity algorithm to the default text filters. Is there any way to do it?
class App extends Component {
constructor(props) {
super(props);
this.state = {
columnDefs: [
{
headerName: "Make",
field: "make",
sortable: true,
filter: true,
checkboxSelection: true,
},
...
],
...
}
}
}
In the code above, if I give true for the filter of Make column, the full list of default text filters are presented. But if I add filterParams.filterOptions as below
...
this.state = {
columnDefs: [
{
headerName: "Make",
field: "make",
sortable: true,
filter: "agTextColumnFilter",
filterParams: {
filterOptions: [
"similarTo",
{
displayKey: "similarTo",
displayName: "similar to",
test: function (filterValue, cellValue) {
...
return stringSimilarity > 0.8;
}
}
...]
}
}
... ]
}
Only "similarTo" filter is on the list of filters.
Is there any way to add this custom filter to the default text filters, including contains, not contains, equals, not equals, starts with, and ends with.
Ag grid comes up with a solution to add custom filters.
These documents are enough to understand how we can implement them.
DocumentLink : https://ag-grid.com/react-data-grid/filter-provided-simple/#custom-filter-options

How can I add particular component(like Input component) in Ag-grid by Row wise or how can i remove component by Row in Ag-grid?

How can I add a particular component (like Checkbox, Input , select, dropdown component) in a particular row? Whenever I add a component into columns, it comes in every row. How can I remove the component from a particular row?
this.columnDefs1 = [
{
headerName: "M1",
field: "m1",
width: 90,
cellRendererFramework: InputComponent,
controlData: {
type: 'text'
},
},
]
this.rowData1 = [
{
m1: "50",
},
{
m1: "30",
},
{
m1: "",
//If I don't want input component in this row, how can I remove?
//I have tried by not giving m1
//also but its coming in whole column or every row.
},
{
m1: "20",
},
]
You can see in the linked image for reference, I don't want the last 4 select components, but I need those rows blank:
You can use colDef.cellRendererSelector which is a function that selects the renderer based on the row data
headerName: "M1",
field: "m1",
width: 90,
cellRendererSelector: function (params) {
if (params.data.m1) {
return InputComponent;
} else {
return null;
}
},
controlData: {
type: 'text'
}
You can read more about it here - https://www.ag-grid.com/javascript-grid-cell-rendering/#many-renderers-one-column

How to hide column in AG-Grid?

How to hide the column in AG-Grid and also it should not be displayed in Tool Panel...
var columnDefs = [{ headerName: "Stone_ID", field: "Stone_ID", width: 100, hide: "true" }]
You can set the column property of suppressToolPanel to true to achieve that.
var columnDefs = [
{
headerName: "Stone_ID",
field: "Stone_ID",
width: 100,
hide: true,
suppressToolPanel: true
}
]
If you are looking for dynamically show/hide columns follow below:
You can use either setColumnVisible or setColumnsVisible.
NOTE: those functions expect a colKey(s) which is related to the field you set in columnDefs.
columnDefs = [
{
headerName: "Name",
field: "name", // => that!
width: 150
},
{
headerName: "Last Name",
field: "last_name", // => that!
width: 150
},
// ...
];
When using setColumnVisible you can show/hide a single column
gridOptions.columnApi.setColumnVisible('name', false) //In that case we hide it
When using setColumnsVisible you can show/hide multiple columns
gridOptions.columnApi.setColumnsVisible(['name', 'last_name'], true) //In that case we show them
To do this programatically you can use:
Hide columns:
this.agGrid.columnApi.setColumnsVisible(["COL_ID_1", "COL_ID_2"], false);
Show columns:
this.agGrid.columnApi.setColumnsVisible(["COL_ID_1", "COL_ID_2"], true);
To do this for a whole column group you can use:
const group = this.columnApi.getColumnGroup("MY_GROUP");
group.children.forEach(child => this.columnApi.setColumnsVisible(child, false));
Posting late but It may helpful for others with some extra details:
If you want to hide your column on the grid you can use hide property to hide that column from the grid.
Only hide from grid colDef example:
colMainDef = [
{
headerName: 'Approved',
field: 'status',
hide: true
}]
But the same column will still be accessible on the side menu panel if you want to hide it from the side menu you can use one more property suppressColumnsToolPanel by making this true it will hide the column from the side menu.
Hide column from the grid as well as from side panel colDef example:
colMainDef = [
{
headerName: 'Approved',
field: 'status',
suppressColumnsToolPanel: true,
hide: true,
}]
Hope this will helps to hide/show columns as per your requirements.
var columnDefs = [{ headerName: "Stone_ID", field: "Stone_ID", width: 100, hide: true }]
{
...,
hide: true,
suppressColumnsToolPanel: true
}
In the package.json:
"dependencies": {
"#ag-grid-community/angular": "^24.1.0",
"#ag-grid-enterprise/all-modules": "^24.1.0",
...
}
hide: should get the value true, not the string "true" (like width: gets 100, not "100")
Just add "hide: true" in your column definition.
Ex:
var columnDefs = [{ headerName: "ABC", field: "XYZ", hide: true }]
hide column on load
{
headerName: 'ROE',
field: 'roe',
width: 100,
hide: true
},
based on selection you can show/hide it using
example
this.gridColumnApi.setColumnVisible('roe',true);
We can hide column dynamically in the following way using onColumnVisible listen event
const onColumnVisible = useCallback(params => {
if (params.source === 'toolPanelUi') {
const colId = params.column ? [ params.column.colId ] : params.columns.map(col => col.colId)
const value = columns.map(v => {
if (v.colId === colId.find(c => c === v.colId)) {
params.visible ? v.hide = false : v.hide = true
}
return v
})
if (value) {
setColumns(value)
}
}
}, [ gridParams, setColumns ])
<Grid onColumnVisible={onColumnVisible } />