const colors = [
'AliceBlue',
'AntiqueWhite',
'Aqua',
'Aquamarine',
'Azure',
'Beige',
'Bisque',
'Black',
'BlanchedAlmond',
'Blue',
'BlueViolet',
'Brown',
'BurlyWood',
'CadetBlue',
'Chartreuse',
'Chocolate',
'Coral',
'CornflowerBlue',
'Cornsilk',
'Crimson',
'Cyan',
'DarkBlue',
'DarkCyan',
'DarkGoldenrod',
'DarkGray',
'DarkGreen',
'DarkGrey',
'DarkKhaki',
'DarkMagenta',
'DarkOliveGreen',
'DarkOrange',
'DarkOrchid',
'DarkRed',
'DarkSalmon',
'DarkSeaGreen',
'DarkSlateBlue',
'DarkSlateGray',
'DarkSlateGrey',
'DarkTurquoise',
'DarkViolet',
'DeepPink',
'DeepSkyBlue',
'DimGray',
'DodgerBlue',
'FireBrick',
'FloralWhite',
'ForestGreen',
'Fuchsia',
'Gainsboro',
'GhostWhite',
'Gold',
'Goldenrod',
'Gray',
'Green',
'GreenYellow',
'Grey',
'Honeydew',
'HotPink',
'IndianRed',
'Indigo',
'Ivory',
'Khaki',
'Lavender',
'LavenderBlush',
'LawnGreen',
'LemonChiffon',
'LightBlue',
'LightCoral',
'LightCyan',
'LightGoldenrodYellow',
'LightGray',
'LightGreen',
'LightGrey',
'LightPink',
'LightSalmon',
'LightSeaGreen',
'LightSkyBlue',
'LightSlateGray',
'LightSlateGrey',
'LightSteelBlue',
'LightYellow',
'Lime',
'LimeGreen',
'Linen',
'Magenta',
'Maroon',
'MediumAquamarine',
'MediumBlue',
'MediumOrchid',
'MediumPurple',
'MediumSeaGreen',
'MediumSlateBlue',
'MediumSpringGreen',
'MediumTurquoise',
'MediumVioletRed',
'MidnightBlue',
'MintCream',
'MistyRose',
'Moccasin',
'NavajoWhite',
'Navy',
'OldLace',
'Olive',
'OliveDrab',
'Orange',
'OrangeRed',
'Orchid',
'PaleGoldenrod',
'PaleGreen',
'PaleTurquoise',
'PaleVioletRed',
'PapayaWhip',
'PeachPuff',
'Peru',
'Pink',
'Plum',
'PowderBlue',
'Purple',
'Rebeccapurple',
'Red',
'RosyBrown',
'RoyalBlue',
'SaddleBrown',
'Salmon',
'SandyBrown',
'SeaGreen',
'Seashell',
'Sienna',
'Silver',
'SkyBlue',
'SlateBlue',
'SlateGray',
'SlateGrey',
'Snow',
'SpringGreen',
'SteelBlue',
'Tan',
'Teal',
'Thistle',
'Tomato',
'Turquoise',
'Violet',
'Wheat',
'White',
'WhiteSmoke',
'Yellow',
'YellowGreen',
];
class ColourCellRenderer {
eGui;
init(params) {
const eGui = (this.eGui = document.createElement('div'));
eGui.style.overflow = 'hidden';
eGui.style.textOverflow = 'ellipsis';
const { value } = params;
const colorSpan = document.createElement('span');
const text = document.createTextNode(value ?? '');
if (value != null) {
colorSpan.style.borderLeft = '10px solid ' + params.value;
colorSpan.style.paddingRight = '5px';
}
eGui.appendChild(colorSpan);
eGui.append(text);
}
getGui() {
return this.eGui;
}
refresh() {
return false;
}
}
const columnDefs = [
{
headerName: "Select does open (not good)",
field: "color",
cellRenderer: ColourCellRenderer,
cellEditor: "agRichSelectCellEditor",
cellEditorParams: {
//lets me add a custom renderer which i need to translate a technical term
//to something a user is able to read
//unfortunately it opens on full Row edit
values: colors,
cellRenderer: ColourCellRenderer,
valueListMaxHeight: 220,
},
},
{
headerName: "Select does not open (good)",
field: "color",
cellRenderer: ColourCellRenderer,
cellEditor: "agSelectCellEditor",
cellEditorParams: {
//Stays closed on fullRow edit
//unfortunately it does not let me translate the values through a custom rendere
values: colors,
valueListMaxHeight: 220,
},
},
];
function getRandomNumber(min, max) {
// min and max included
return Math.floor(Math.random() * (max - min + 1) + min);
}
const data = Array.from(Array(20).keys()).map(() => {
const color = colors[getRandomNumber(0, colors.length - 1)];
return { color };
});
let gridApi;
const gridOptions = {
defaultColDef: {
width: 200,
editable: true,
},
columnDefs: columnDefs,
rowData: data,
editType: "fullRow",
};
// setup the grid after the page has finished loading
document.addEventListener("DOMContentLoaded", () => {
const gridDiv = document.querySelector("#myGrid");
gridApi = agGrid.createGrid(gridDiv, gridOptions);
});
<!doctype html>
<html lang="en">
<head>
<title>
JavaScript Example - Provided Cell Editors Rich Select - Rich Select
Search Values
</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="robots" content="noindex" />
<link
href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;700&display=swap"
rel="stylesheet"
/>
<style media="only screen">
:root,
body {
height: 100%;
width: 100%;
margin: 0;
box-sizing: border-box;
-webkit-overflow-scrolling: touch;
}
html {
position: absolute;
top: 0;
left: 0;
padding: 0;
overflow: auto;
font-family: -apple-system, "system-ui", "Segoe UI", Roboto,
"Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif,
"Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol",
"Noto Color Emoji";
}
body {
padding: 16px;
overflow: auto;
background-color: transparent;
}
</style>
</head>
<body>
<div id="myGrid" style="height: 100%"></div>
<script>
(function () {
const appLocation = "";
window.__basePath = appLocation;
})();
</script>
<script src="https://cdn.jsdelivr.net/npm/seedrandom@3.0.5/seedrandom.min.js"></script>
<script>
// Seed random number generator for predictable tests and examples
Math.seedrandom("AG Grid Random Seed");
</script>
<script src="https://cdn.jsdelivr.net/npm/ag-grid-enterprise@34.0.1/dist/ag-grid-enterprise.min.js?t=1751977784630"></script>
<script src="colors.js"></script>
<script src="colourCellRenderer.js"></script>
<script src="main.js"></script>
</body>
</html>
{
"name": "ag-grid-example",
"dependencies": {
"ag-grid-community": "34.0.1",
"ag-grid-enterprise": "34.0.1"
},
"devDependencies": {
"@types/node": "^22"
}
}