The Kendo Form component internally uses a FormContext which is ued by FormElement and Field. However this Context is not exported in @progress/kendo-react-form
Please export this context. It would really help with the usability of the Form component for complex forms. There are things in the FormContext that are not available in the formRenderProps.
Alternatively, put everything from the context into the FormRenderProps. These don't seem like they needed to be 2 different objects.
Specifically with the Context you can see what fields have been `touched`, `visited` and `modified`. But with the render props you only get a boolean if any field has been touched, visited or modified; not the names of the fields.
All of the Kendo components that "hide" content (tab views, collapse panels, etc) don't actually hide any content. They require us to not render any children.
<ExpansionPanel
{expanded === item.id && (
<ExpansionPanelContent>
This just strikes me as an odd design decision. I guess I don't understand the point of these components if they don't do the 1 thing they are supposed to do; hide portions of the content.
Un-rendering the content is usually not desirable. The contents are often still important. Possibly for SEO purposes, A11y, or if they are part of a Form:
<Form
render={() => {
<FormElement>
<ExpansionPanel>
{expanded === item.id && (
<ExpansionPanelContent>
<Field
name={"firstName"}
component={Input}
validator={() => 'always invalid'}
/>
</ExpansionPanelContent>
</ExpansionPanel>
</FormElement>
}}
/>
This makes the Form valid as long as the panel is collapsed.
Can check out how Bootstrap collapse panels work to see how most people would expect these components to behave. The contents is rendered into the DOM and JS and CSS are used to hide it. There should be a way to achieve this same behavior with Kendo.
As a workaround I end up having to do my own CSS/SASS to hide the contents
.k-expander {
.k-expander-content-wrapper {
height: 0;
overflow: hidden;
}
&.k-expanded {
.k-expander-content-wrapper {
height: auto;
}
}
}
A few suggestions for the React Grid (as of v5.0.1) to help devs conform to accessibility compliance...
1) Standard HTML tables can contains a <caption> element, which screenreaders will use as the descriptive name of the table. Kendo Grid does not appear to have any way to name the table.
2) Related to number 1, other ways to assign a descriptive name to a table may be to include a `title`, `aria-label` or `aria-describedby` attributes, but none of these work on <Grid>. They are not rendered into the HTML if passed as props.
3) Allow GridCell and other Cell components to take `children` to render. The current documentation generally advises us to override the `cell={}` prop on a GridColumn for custom cell rendering. What is not listed in the docs is that doing what seems like the obvious thing:
<GridColumn cell={() => <td>myContent</td>} />
actually breaks accessibility. At a minimum the cell MUST get the attributes
role={'gridcell'}
aria-colindex={props.ariaColumnIndex}
to have the table actually be represented correctly in most screen readers. The Kendo <GridCell> component would normally add these, but only renders the field from the dataItem. It can only render custom data if the `render` prop is set, in which case it yet again does not render the `<td role= aria-colindex=` portions on it's own.
What I'm getting at is, everyone who ever wanted to render a custom cell in Keno Grid always had to make their own cell component that added at least the `role` and `aria-colindex` attributes, and if they didn't, they probably unknowingly broke accessibility.
Kendo could make this clearer in the docs (including the accessibility page for the Grid), and could easily alter GridCell to render `children` if they are passed. Then we could do:
<GridColumn cell={<GridCell><button>yay</button></GridCell>} />
and have the rendered HTML:
<td colSpan="1" style="" class="" role="gridcell" aria-colindex="1" aria-selected="false"><button>yay</button></td>
I think in GridCell this would be as easy as changing:
defaultRendering = (
<td
colSpan={props.colSpan}
style={props.style}
className={className}
role={'gridcell'}
aria-colindex={props.ariaColumnIndex}
aria-selected={props.isSelected}
{...{[GRID_COL_INDEX_ATTRIBUTE]: props.columnIndex}}
{...navigationAttributes}
>
{dataAsString}
</td>
defaultRendering = (
<td
colSpan={props.colSpan}
style={props.style}
className={className}
role={'gridcell'}
aria-colindex={props.ariaColumnIndex}
aria-selected={props.isSelected}
{...{[GRID_COL_INDEX_ATTRIBUTE]: props.columnIndex}}
{...navigationAttributes}
>
{children || dataAsString}
</td>
Feature request
I am using the `AutoComplete` component to implement a search input and I want to be notified when the user selects an item (via mouse click or keyboard navigation) from the popup list.
I found an undocumented prop `handleItemSelect` on the `AutoCompleteHandle` ref object, and used it to implement my feature successfully.
Please can you expose `handleItemSelect` as an event on the `AutoCompleteProps` API.
Hello,
I'm trying to implement an accessible table using your Grid React component. The idea is for the users to be able to navigate the table using the keyboard if need be. Because we are a government contractor we have to make our product accessible and, testable using the Government issued tool for testing, ANDI.
When I use a normal table, I can implement scopes in the table header, either for the column or the row and thus create relationships between headers and cells as well as, use the keyboard to navigate the entire table.
When the same table is implemented with the Grid component, there are no scopes in the header then again, both header and body are separate even though they reside inside a div with role=grid on it which in turn, contains two divs, one for the header and one for the body each in turn, implementing a table: one for what would be the headers and one for what would be the body. I'm attaching screenshots even though I'm sure you know the product.
The fact that both the <thead> and the <tbody> reside in different places, even though they are within the grid, makes it impossible to add associations furthermore, we're using a data-table and the grid. I tried using different props but, as long as both the header and the body are separate, the ANDI tools can't find the table.
Question is, is there a way to make this table truly accessible just as a one created using the semantic table tags?
Hi,
Unfortunately, the KendoReact PivotGrid sorting is currently supported only for string values. This means that even if you set the field type to "date", the sorting will still be applied as if the field were a string. You can see that in this example: https://dojo.telerik.com/oZoTuMIC/55
Please extend your sorting mechanism so that the sorting covers types such as dates and numbers too. Please also consider the user's language when implementing this sorting. We receive date fields in the format yyyy-mm-dd and they should then be displayed in the user language in the UI. For example in German dd.mm.yyyy (i.e. 21.11.2021) or in English 11/21/2021. And please offer this feature for local data binding too.
Regards,
Oliver
We are currently on implementing a component for data grids using the Kendo React Grid and virtual scrolling.
The problem is that the "page down" and "page up" is not working correctly, because of the virtualization (We already contacted the support for it).
Here is a stackblitz where the problem can be reproduced: https://stackblitz.com/edit/react-rapzu9?file=app/main.tsx
Reproduction steps:
1. Click inside the grid
2. Press "Page down" - Page changes, but focus goes to the header cell
3. Press "Page down" again - Nothing happens
Another problem which maybe has the same source is navigating with the arrow keys.
Reproduction steps:
1. Scroll somewhere deeper down
2. Use arrow up to scroll up again
3. At some point it scrolls not up anymore but the focus also changes into the header cell - Not okay
In my opinion its a bug, at least for the arrow keys. If you disagree please open a feature request for it, this functionality will be needed by out customers.
Best regards
Yui
Looking at the JSDoc for for `toDataSourceRequestString` and `toDataSourceRequest`, they both appear to have JSDoc above them, showing the parameter as:
* @param {DataRequestState} state - The state that will be serialized.
Should this actually have `@param {DataSourceRequestState}`?
Hi,
The KendoReact NumericTextBox responds to mousewheel events when in focus. It is very easy to focus on the textbox, type in a value, scroll up or down and inadvertently change the value just entered. This behaviour can be seen clearly on any of the Telerik example pages e.g. https://www.telerik.com/kendo-react-ui/components/inputs/numerictextbox/predefined-step/
I think this behaviour should be disabled by default if spinners are set to default, but otherwise I would like a property to disable it. The normal event handlers which could be used to disable this behaviour are not available on the NumericTextBoxProps.
Kind regards,
David
Currently, the Scheduler events are always placed between the beginning and the end of a slot, no matter if the event actually starts or ends at the slot times. So if an event for example starts at 10:10, the event is placed at the 10:00 slot line and not a little further down below, or if it ends at 11:50 the event end is placed at the 12:00 slot line. I'm talking here especially about the WeekView and the DayView.
This is not accurate enough for some events. Like for example in MS Outlook, if a event doesn't start at the full hour, the graphical representation shows it according to the start time and not at the full hour (see screenshots). We would like to request to make it possible to place events on the Scheduler so that the graphical representation of the event reflects the actual start and and time.
While I was able to calculate a margin for the event start to move it to a more accurate position, it was not possible to also set the height of the event to a calculated positition because the Scheduler doesn't allow this. According your support (see here), an event always has to end at a full slot time and can't be placed somewhere else. Calculating these things on our own brings a whole lot of other problems though (like placing overlapping events correctly, etc.) so that it would be great if the Scheduler had a setting to allow exact positioning according to times.
Hello Team,
We have got this requirement to open date range picker using a single button input. Is there any way I can achieve this. I can see there is endDateInput and startDateInput available but it still renders 2 different inputs. But we want single button to control whole thing.
Thanks,
Gaurav
I'd like to turn off even/odd row highlighting for the Grid and use cell border instead.
I can do it by learning kendo css classes and override particular properties for certain classes but... I have many different vendors for different components and it's so a pitty to learn all the css classes hell...
It'd be supper cool to have something like turnOffAlternation/alternatingRows and showCellBorder/showBorders attributes on the Grid.
Hello,
Our team is using MobX-State-Tree (MST) and KendoReact TreeList control with virtual scrolling enabled. According to documentation MST model stores data as an observable array (https://mobx-state-tree.js.org/API/#array and https://mobx.js.org/api.html#observablearray).
The MST model’s field ‘tree’ is not a regular array, but a LegacyObservableArray.
From UI standpoint:
initially all tree nodes are collapsed
user clicks on i.e. 3rd tree node
selection is not displayed on any tree node (3rd node expected to be selected)
user expands 1st tree node - selection is set on the 3rd tree node
The following warning appears in the browser console.
Warning: Failed prop type: Invalid prop `data` of type `object` supplied to `TreeList`, expected `array`.
in TreeList (created by wrappedComponent)
in wrappedComponent (created by wrappedComponent)
in div (created by wrappedComponent)
in div (created by wrappedComponent)
in wrappedComponent
Model is defined as:
const TreeViewModel = types
.model('TreeViewModel', {
selectedItemUUID: types.maybe(types.string),
tree: types.optional(types.array(TreeNodeModel), []),
isLoaded: types.maybe(types.optional(types.boolean, false)),
treeTypes: types.optional(types.array(TreeNodeTypeModel), []),
})
.views((self) => ({
get treeCollection(): any {
return self.tree;
},
}))
Component is defined as:
return (<>
{!viewModel.isLoaded && loadingPanel}
<div className='treeListContainer' ref={stageCanvasRef}>
{treeListContainerHeight && <TreeList
style={{ maxHeight: `${treeListContainerHeight}px`, overflow: 'auto', }}
data={viewModel.treeCollection}
expandField={expandField}
subItemsField={subItemsField}
columns={columns}
selectedField={selectedField}
rowHeight={40}
scrollable="virtual"
/>}
</div>
</>);
The following workaround allows converting an observable array to a regular array.
.views((self) => ({
get treeCollection(): any {
return JSON.parse(JSON.stringify(self.tree)); // or self.tree.slice()
},
}))
This solution affects performance due to array copy.
Besides this TreeList uses an array copy. User’s selection and expanding don’t trigger related changes in the initial observable array in the model.
Related event handlers (i.e. onSelectionChange, onExpandChange) should be extended to make appropriate changes in the MST model.
Can you please extend KendoReact controls to support observable arrays?
Is there a better solution?
Hello,
I am using React Multiselect in my project. I need every item in the multiselect component selectable with checkboxes and multiselect itself filterable. It would be very nice if you add this features to Multiselect component as built in. There is a workaround which I share links below for this but we need to do all this stuff manually.
1. Checkboxes:
2. Filterable
Thanks
Controlled TextaArea componenet with autoSize and rows properties.
const App = () => {
const [state, setState] = useState();
return (
<TextArea
value={state}
onChange={(e) => setState(e.value)}
autoSize={true}
rows={2}
/>
);
};
Add couple text lines to extend TextArea size and remove these empty lines in any way.
Content from TextArea field is removed but TextArea height stays the same, doesn't come back to it's initial value. It's different comparing to example from your docs where example contains uncontrolled component.
Controlled TextaArea componenet with autoSize and rows properties.
const App = () => {
const [state, setState] = useState();
return (
<TextArea
value={state}
onChange={(e) => setState(e.value)}
autoSize={true}
rows={4}
/>
);
};
and styles like these
.k-textarea textarea {
border: 1px solid blue;
}
Start typing anything
Height of textarea component is decreasing
Controlled TextaArea componenet with autoSize and rows properties.
const App = () => {
const [state, setState] = useState();
return (
<TextArea
value={state}
onChange={(e) => setState(e.value)}
autoSize={true}
rows={2}
/>
);
};
Add couple text lines to extend TextArea size and remove these empty lines in any way
Content from TextArea field is removed but TextArea height stays the same, doesn't come back to it's initial value. It's different comparing to example from your docs where example contains uncontrolled component.
Controlled TextaArea componenet with autoSize and rows properties.
const App = () => {
const [state, setState] = useState();
return (
<TextArea
value={state}
onChange={(e) => setState(e.value)}
autoSize={true}
rows={4}
/>
);
};
and styles like these
.k-textarea textarea {
border: 1px solid blue;
}
Start typing anything
Height of textarea component is decreasing
We'd like the sorting to be correct and not based on the browser settings.
From support ticket:
We've noticed that our grid is not sorting correctly in our local language (Swedish). I've added LocalizationProvider and IntlProvider around it. The translation works fine.
In Swedish it would be sorted: A, B, Å
It's common in software that A and Å is sorted next to eachother but this is wrong.
I've tried using locale "sv" (language) and "se" (country) but neither sorts it correctly.
Reply on support ticket
We are internally using the built-in JavaScript method localeCompare to compare the values:
if (a.localeCompare) {
return a.localeCompare(b);
}
That means that we will compare the data based on the current browser locale. Still, the result can vary based on the machine. In cases, like this one, we can recommend using server filtering the ensure that the results are specific to the Swedish culture regardless of where this is loaded.
Another option can be to log a feature request that will take the culture parameters from the IntlProvider and pass it as a second parameter to the localeCompare function.
Imaging a GridColumn field that is a simple object {name:"My Item", value: 123}. It would be great to be able to define properties of the object as what to display without having to build a custom renderer.
displayField/displayFunction as a callback function with the fieldName of the columns and the dataItem of the row as parameters
const nameDisplay = (field, dataItem) => {
return "some value"
}
...
<GridColumn field={"name"} displayFunction={nameDisplay}