Telerik Forums
KendoReact Forum
1 answer
106 views

Dear  Reciever,

Just curious. Is this link(Globalization Support) up-to-date?
Because some components that are in kendo libraries are not listed in here.

Moreover, is this github repo show the available locale info?

Thanks.
Best Regards.

Yanko
Telerik team
 answered on 03 Sep 2024
1 answer
112 views

Hi,

 

If a Grid column is using number filter, its precision can only be 0.001. Is there a way to increase that?

See this Kendo React official example, the "Unit Price" filter can only take 0.001, not able to take 0.0001.

https://www.telerik.com/kendo-react-ui/components/grid/filtering/

 

I tried changing the column format to "{0:n6}", but it only affect the grid cell, not the filter.

 

Thanks,

Jie

 

Yanko
Telerik team
 answered on 02 Sep 2024
1 answer
133 views

I'm developing a system using React where users can create invoice templates using a drag-and-drop interface. I need help with the following:

  1. Template Storage Format: What is the best format for storing these templates on the backend?

  2. Backend Processing: Once the template is stored, the backend should be able to:

    • Receive the invoice amount and other relevant details.
    • Map these details to the selected template.
    • Generate a PDF based on the populated template.

Could you suggest an approach for handling these tasks effectively?

Konstantin Dikov
Telerik team
 answered on 30 Aug 2024
1 answer
103 views

Hi,

I want to use multiselect filtering for grid, just like in the image. How can I do it ?

Thanks.

 

Konstantin Dikov
Telerik team
 answered on 29 Aug 2024
1 answer
120 views

https://www.telerik.com/kendo-react-ui/components/grid/grouping/locked-group-headers/

Am I misreading it? "To lock the group headers of the Grid, use its lockGroups prop." => but in this demo on the Kendo site, none of the group headers are locked. Is it referring to the table header? I thought group headers were those rendered by the grouping (i.e. Beverages if Category Name is chosen). This is easiest to see on page 3 if you leave the demo as-is on page load -- I'd expect Condiments to be locked to the top of the grid as you scroll the page.

I really like this concept because it allows the user to retain context of what they're looking at --> otherwise, the group headers leave the user's view and can cause confusion/wasted time later when the user tries to regain context.

Thanks in advance for your time and help!

Konstantin Dikov
Telerik team
 answered on 28 Aug 2024
2 answers
98 views
Hi, I checked that there is a cellContextMenu method for the Kendo jQuery Spreadsheet but I could not find a similar method for the react spreadsheet component. I want to create a context menu which opens up on right click done at the cell level. How to do so?
Yanko
Telerik team
 answered on 27 Aug 2024
1 answer
126 views

Hello,

We are using kendo-react-form 8.1.1.  We have implemented a number of custom validation functions which all seem to be working appropriately.  However, if we set the required property of a Field as such, 

<Field
  {...fieldProps}
  required={true}
/>

and attempt to submit the form without populating this field, we receive the following "bubble tooltip":

After searching, I discovered that this "tooltip" message is not controlled by KendoReact, but comes from HTML5.  This can be disabled by adding the "novalidate" attribute to the rendered <form> element, however, I cannot find a way to do this using KendoReact's Form API, after looking through FormProps, FormElementProps, and FormRenderProps.

Is there a way to set the novalidate attribute on the rendered <form> element that I have missed?  If not, is this something that is planned for (or could be implemented) in a future release?

Yanko
Telerik team
 answered on 26 Aug 2024
1 answer
156 views

'use client'

import { ReactElement, useMemo, useRef, useState } from "react"
import dynamic from "next/dynamic"

import { GridColumn as Column, GridCellProps, GridItemChangeEvent, GridRowProps, GridToolbar } from "@progress/kendo-react-grid"

import { CompositeFilterDescriptor } from "@progress/kendo-data-query"
import { filterBy } from "@progress/kendo-react-data-tools"

import { CellRender, RowRender } from "../../Other/renderers"
const Grid: any = dynamic(() => import("@progress/kendo-react-grid").then(module => module.Grid as any), { ssr: false })

import { process } from '@progress/kendo-data-query'
import useCdpGridFunctions from "./localHooks/useCdpGridFunctions"

import addIdProperty from './helpers/addIdProperty' // Helpers
import formatDates from './helpers/formatDates'

import './CDPGrid.css'

import fillComboDynamic from "../../fillComboDynamic"

const EDIT_FIELD = 'inEdit'; const GridColumns = [{ field: '' }]


const CDPExampleComponent = ({ cdpData, data, setData, selectedGrid, selectedFilter, basicGridName, tableHmy, databasePackage, gridProps }) => {

  // console.log('basicGridName', basicGridName)
  
  async function getDbGridConfig() {
    // const controlsUrl = `/api/storedProcedures/${paramSelectedGrid}/controls`
    const controlsUrl = `/api/storedProcedures/rofoGridConfig?grid=${basicGridName}`
    // return await (await fetch(controlsUrl)).json()
    const columns = await fetch(controlsUrl)
    return columns
  }
  const [reactiveGridColumns, setReactiveGridColumns] = useState()
  
  useMemo(() => {
    const gridColumns = getDbGridConfig()
    .then((response) => {return response.json()})
    .then((data) => {
      console.log('columns', data)
      setReactiveGridColumns(data)
    })
  }, [])

  // console.log('data', data)

  // const result = filterBy(data, { filter: selectedFilter })

  const filteredData = process(data, { filter: selectedFilter })
  // console.log('filteredData', filteredData)

  data = addIdProperty(filteredData.data) // Data that's sent to the Grid
  data = formatDates(data)

  const [changes, setChanges] = useState<boolean>(false)
  const [columns, setColumns] = useState(GridColumns)

  useCdpGridFunctions(cdpData, setColumns)

  const itemChange = (event: GridItemChangeEvent) => {
    let field = event.field || ''
    event.dataItem[field] = event.value
    let newData = data.map((item: any) => {
      if (item.Id === event.dataItem.Id) {
        item[field] = event.value
      }
      return item
    })
    setData(newData)
    setChanges(true)
  }
  const editedDataItem = useRef()

  // enterEdit ////////////////////////////////////////////////////////////////////
  const enterEdit: any = (dataItem: any, field: string) => {

    // console.log('dataItem', dataItem)
    // console.log('field', field)

    const newData = data.map((item: any) => ({ ...item, [EDIT_FIELD]: item.Id === dataItem.Id ? field : undefined }))

    // console.log('newData', newData)
    
    setData(newData)
    newData['field'] = field
    editedDataItem.current = newData[dataItem.Id]

    // console.log("enterEdit | newData")
    // console.log('editedDataItem.current', editedDataItem.current)
    // console.log(`Row: ${dataItem.Id}, Field: ${field}`, dataItem)
  }

  // exitEdit /////////////////////////////////////////////////////////////////////
  const exitEdit: any = () => {
    // console.log('exitEdit')
    // const newData = data.map((item: any) => ({ ...item, [EDIT_FIELD]: undefined }))
    const newData = data.map((item: any) => ({ ...item, [EDIT_FIELD]: undefined }))
    // console.log('EDIT_FIELD', newData.EDIT_FIELD)
    setData(newData)
    // console.log("exitEdit | newData", newData)
    // console.log('editedDataItem', editedDataItem.current)
  }

  // TODO: I need the title here
  const saveChanges = () => {

    // console.log('Save Changes')
    const dataSegment = data.splice(0, data.length, ...data) // Giant Array

    setChanges(false)
    
    // console.log('Updating the database'); // TODO: Update the database correctly
    updateDatabase(databasePackage, editedDataItem.current)

  }

  const updateDatabase = async (databasePackage: any, edits: any) => { // TODO: Get the stored procedure to work correctly
    const storedProcedureParameters = {
      tableHmy: edits[databasePackage.current.tableHmy],
      amendmentid: edits.AmendmentID,
      fieldToUpdate: edits.inEdit,
      fieldValue: edits[edits.inEdit],
      domainUser: databasePackage.current.domainUser,
      grid: databasePackage.current.basicGridName
    }

    fetch('/api/storedProcedures/[storedProcedure]', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(storedProcedureParameters),
    })
      .then((response) => {
        // console.log('response', response)
        return response.json()
      })
      .then((data) => {
        // console.log('data', data)
      })
  }

  const cancelChanges = () => {
    setData(data)
    setChanges(false)
  }

  const customCellRender: any = (td: ReactElement<HTMLTableCellElement>, props: GridCellProps) => {
    return <CellRender originalProps={props} td={td} enterEdit={enterEdit} editField={EDIT_FIELD} />
  }  // Error, until it returns the correct type, an empty render function returns no data

  const customRowRender: any = (tr: ReactElement<HTMLTableRowElement>, props: GridRowProps) => {
    return <RowRender originalProps={props} tr={tr} exitEdit={exitEdit} editField={EDIT_FIELD} />
  } // Error, until it returns the correct type, an empty render function returns no data; params display column-names

  function dontDisplay(column, value) {
    let displayStatus = true
    value.map((hiddenElement: any) => {
      if (column === hiddenElement) {
        // console.log(`column: ${column} | hiddenElement: ${hiddenElement}`)
        displayStatus = false
      }
    })
    return displayStatus
  }

  function permitEdits(column:any, fields:any) {
    const permittedFields = fields.filter((field:any, index:number) => {
      if (field.ReadOnly !== true) {
        // console.log('field.ReadOnly', field.Name, field.ReadOnly)
        return fields[index]
      }
    })

    try {
      let permitStatus = true
      permittedFields.map((permittedElement: any) => {
        if (column === permittedElement.Name) {
          permitStatus = false
        }
      })
      return permitStatus
    }
    catch (error) {
      return false
    }
  }

  return (
    <>
      {/* <h1>CDP Grid (E2) {selectedGrid}</h1> */}
      <Grid
        id='mainGrid'
        // ref={gridRef}
        style={{ height: '82vh' }} // Grid Height, up from 70vh
        data={data}
        dataItemKey={'Id'}
        // dataItemKey={`${tableHmy}`}
        rowHeight={50}
        resizable={true}
        reorderable={true}
        onItemChange={itemChange} cellRender={customCellRender} rowRender={customRowRender} editField={EDIT_FIELD}>
        {/* {
          gridProps.columnProps.map((column:any, index:any) => {
            if (!dontDisplay(column.field, ['inEdit', 'Id'])) { }
            else if (column.ReadOnly) { // Enable Editables
              return <Column key={index} {...column} format="{0:d}" editable={false} field={column.FieldName} width={column.Width} title={column.HeaderText} />
              }
              else {
                return <Column key={index} {...column} editable={true} className={'azureColor'} field={column.FieldName} width={column.Width} title={column.HeaderText} />
            }
          })
        } */}
        {
          reactiveGridColumns?.map((column:any, index:any) => {

            // console.log('column', column)

            if (column.IsHidden === 1) {}
            else if (column.DropDownProc !== null) {
              // fillComboDynamic(column)

              // How do I replace the field={column.DBName} text with a DropDownList?
              return <Column key={index} {...column} editable={true} className={'fillableDropdown'} field={column.DBName} width={column.Width} title={column.FriendlyName} />
            }
            else if (column.IsEditable !== 0) {
              return <Column key={index} {...column} editable={true} className={'azureColor'} field={column.DBName} width={column.Width} title={column.FriendlyName} />
            }
            else {
              return <Column key={index} {...column} format="{0:d}" editable={false} field={column.DBName} width={column.Width} title={column.FriendlyName} />
            }

            // return <Column key={index} {...column} editable={true} className={'azureColor'} field={column.DBName} width={column.Width} title={column.FriendlyName} />

          })
        }
        <GridToolbar>
          <button
            title='Save Changes'
            className='k-button k-button-md k-rounded-md k-button-solid k-button-solid-base'
            onClick={saveChanges}
            disabled={!changes}>Save Changes</button>
          <button
            title='Cancel Changes'
            className='k-button k-button-md k-rounded-md k-button-solid k-button-solid-base'
            // onClick={cancelChanges}
            disabled={!changes}>Cancel Changes</button>
        </GridToolbar>
      </Grid>
    </>
  )
}

export default CDPExampleComponent

Yanko
Telerik team
 answered on 21 Aug 2024
1 answer
122 views

Hi I'm constantly getting this error:

Uncaught TypeError: Cannot read properties of undefined (reading 'onConstructor')
    at new z (Grid.mjs:470:1)
    at constructClassInstance (react-dom.development.js:11098:1)
    at updateClassComponent (react-dom.development.js:15141:1)
    at beginWork (react-dom.development.js:16537:1)
    at HTMLUnknownElement.callCallback (react-dom.development.js:3556:1)
    at Object.invokeGuardedCallbackDev (react-dom.development.js:3600:1)
    at invokeGuardedCallback (react-dom.development.js:3655:1)
    at beginWork$1 (react-dom.development.js:20656:1)
    at performUnitOfWork (react-dom.development.js:19667:1)
    at workLoopSync (react-dom.development.js:19612:1)

I'm using react 17.0.2 (react 18 does not work as well)

thanks in advance

Vessy
Telerik team
 answered on 16 Aug 2024
1 answer
119 views

How do I stop this? I would like for my DropdownList options to be a vertical list.

Doug
Top achievements
Rank 2
Iron
Iron
Iron
 updated answer on 14 Aug 2024
Narrow your results
Selected tags
Tags
General Discussions
Grid
Wrappers for React
Charts
Scheduler
Filter 
DropDownList
Form
Styling / Themes
DatePicker
Editor
TreeList
Styling
PDF Processing
ComboBox
Excel Export
Dialog
Input
TreeView
Upload
Drawer
Button
Drag and Drop
MultiSelect
Tooltip
Accessibility
NumericTextBox
Checkbox
Menu
Gantt
DateTimePicker
Popup
Window
AutoComplete
DateInput
PDF Viewer
Sortable
Data Query
Drawing
Licensing
TabStrip
Calendar
Pager 
Labels 
Localization
TimePicker
GridLayout
FontIcon
Animation
PanelBar
PivotGrid
Card
DropDownButton
TaskBoard
Conversational UI 
DateRangePicker
Splitter
Badge 
Security
Slider
Spreadsheet
ContextMenu
MultiViewCalendar
Stepper
MultiColumnComboBox
MultiSelectTree
TextBox
AppBar
File Saver
ListView
MaskedTextBox
RadioButton
Switch
TextArea
Toolbar
DropDownTree
TileLayout
Map
Avatar
Date Math
Gauge
RadioGroup
RangeSlider
Rating
Loader
ExpansionPanel
SvgIcon
Typography
ProgressBar
ScrollView
Popover
StockChart
RadialGauge
Server Components
AIPrompt
Page Templates / Building Blocks
AI Coding Assistant
Chat
ColorGradient
ColorPalette
ColorPicker
Notification
Ripple
Skeleton
ButtonGroup
Chip
ChipList
FloatingActionButton
SplitButton
ActionSheet
Barcode
QR Code
FlatColorPicker
Signature
BottomNavigation
BreadCrumb
StackLayout
Timeline
ListBox
ChunkProgressBar
Sparkline
FileManager
ArcGauge
CircularGauge
LinearGauge
ExternalDropZone
OrgChart
Sankey
VS Code Extension
InlineAIPrompt
SpeechToTextButton
Chart Wizard
Agentic UI Generator
SmartPasteButton
PromptBox
SegmentedControl
+? more
Top users last month
Chester
Top achievements
Rank 1
Iron
Simon
Top achievements
Rank 1
Iron
Douglas
Top achievements
Rank 2
Iron
Iron
SUNIL
Top achievements
Rank 3
Iron
Iron
Iron
Marco
Top achievements
Rank 3
Iron
Iron
Iron
Want to show your ninja superpower to fellow developers?
Top users last month
Chester
Top achievements
Rank 1
Iron
Simon
Top achievements
Rank 1
Iron
Douglas
Top achievements
Rank 2
Iron
Iron
SUNIL
Top achievements
Rank 3
Iron
Iron
Iron
Marco
Top achievements
Rank 3
Iron
Iron
Iron
Want to show your ninja superpower to fellow developers?
Want to show your ninja superpower to fellow developers?