If this is not the first time that you read my posts, you probably know that I actively participate in StackOverflow and you probably have already gone through some post where I write about some question that I think that deserves a little more information.
Few days back someone asked how (if possible at all) to get both popup and inline editing in the same grid. Basically what he was trying to do is using popup when creating a new record and use inline (or incell) for existing records. We might argue if from a standard UX point of view if this is good but I can see some cases where this might make sense so I’ve decided to investigate a little on it and I’ve tried to answer the question.
Mixing popup and inline editing in a grid
Research
The very first thing that I thought about was trying to invoke directly the functions that creates the popup window form for editing a record and the function that switches into inline (or incell) mode. The idea was if I can invoke the internal methods directly, I would be able to trigger the mode that I want defining custom buttons.
But when examining KendoUI code (yes, it’s is not Open Source but as Telerik Most Valuable Professional I have access to it) I see that I need to send extra arguments to the methods for popup and incell and it was not easy (clean) for me getting these arguments.
Second approach was invoking KendoUI Grid addRow method that enters in edit mode and depending on the initialization value, it is going to be “popup” or “inline”. The question was … if I change the edition mode dynamically and not at initialization time, will it be used?
The answer is yes, you can change the option dynamically and next time edit event is triggered the edition mode will change. This is not the case with some options for this and other Kendo UI Widget that once the widget is created, they will not read back the options.
How to implement it
What I had to do is:
- Initialize the Grid for using, by default, inline mode.
- Define a Custom button in the toolbar that looks like the standard “Add new row” but executes our own code.
- Define the button handler that forces the edition mode to “popup”, invokes editRow and restores previous edition mode (“inline”)
This would be something like
var grid = $("#grid").kendoGrid({ dataSource: ds, toolbar: [ { // My own version of "Add new record" button, with name **popup** text : "Add new record", name: "popup", iconClass: "k-icon k-add" } ], // By default is **inline** editable: "inline", ... }).data("kendoGrid");
Here we can see that I’ve created in the toolbar a button with name “popup” and showing the text “Add new record”, the same being displayed by the default “create” button. Finally, I’ve define the icon that should be displayed in the button having the button look exactly the same than the standard “create” button.
The second important question is that I’ve defined “editable” as “inline” so it is expected that I define an “edit” button for each row and when clicked, it enters in “inline” edition.
Now, the missing part: attach a click event handler attached to my “popup” button. This is:
// Event handler for my **popup** button defined in the grid toolbar $(".k-grid-popup", grid.element).on("click", function () { // Temporarily set editable to "popup" grid.options.editable = "popup"; // Insert row grid.addRow(); // Revert editable to inline grid.options.editable = "inline"; });
Binding a function to the click event for buttons defined in the toolbar is defining using “on” jQuery method for the CSS class “.k-grid-” in our case since “name” is equal to toolbar, we use the CSS “.k-grid-popup”.
As you can see is a pretty simple process, pretty clean and you don’t have to do a lot of code edition or source code change.
You can play with it in this JSFiddle.