Backend API
        
    import React, { useCallback, useState } from 'react';
import DataGrid, { Column, Paging, SearchPanel, Pager, } from 'devextreme-react/data-grid';
import SelectBox, { type SelectBoxTypes } from 'devextreme-react/select-box';
import { europeanUnion } from './data.ts';
const populationFormat = { type: 'fixedPoint', precision: 0 };
const areaFormat = { type: 'fixedPoint', precision: 0 };
const languageLabel = { 'aria-label': 'Language' };
const languages = ['Arabic (Right-to-Left direction)', 'English (Left-to-Right direction)'];
const App = () => {
  const [placeholder, setPlaceholder] = useState('Search...');
  const [rtlEnabled, setRtlEnabled] = useState(false);
  const [selectedValue, setSelectedValue] = useState(languages[1]);
  const onSelectLanguage = useCallback((e: SelectBoxTypes.ValueChangedEvent) => {
    const newRtlEnabled = e.value === languages[0];
    setRtlEnabled(newRtlEnabled);
    setPlaceholder(newRtlEnabled ? 'بحث' : 'Search...');
    setSelectedValue(e.value);
  }, []);
  const headerCellRender = useCallback(() => (
    <div>
      {rtlEnabled ? (
        <div>المساحة (كم<sup>2</sup>)</div>
      ) : (
        <div>Area (km<sup>2</sup>)</div>
      )}
    </div>
  ), [rtlEnabled]);
  return (
    <React.Fragment>
      <DataGrid id="gridContainer"
        dataSource={europeanUnion}
        keyExpr="nameEn"
        rtlEnabled={rtlEnabled}
        showBorders={true}>
        <Paging defaultPageSize={15} />
        <Pager visible={true} />
        <SearchPanel visible={true} placeholder={placeholder} />
        <Column dataField={rtlEnabled ? 'nameAr' : 'nameEn'}
          caption={rtlEnabled ? 'الدولة' : 'Name'} />
        <Column dataField={rtlEnabled ? 'capitalAr' : 'capitalEn'}
          caption={rtlEnabled ? 'عاصمة' : 'Capital'} />
        <Column dataField="population"
          caption={rtlEnabled ? 'عدد السكان (نسمة) 2013' : 'Population'}
          format={populationFormat} />
        <Column dataField="area"
          headerCellRender={headerCellRender}
          format={areaFormat} />
        <Column dataField="accession" visible={false} />
      </DataGrid>
      <div className="options">
        <div className="caption">Options</div>
        <div className="option">
          <span>Language: </span>
          <SelectBox id="select-language"
            items={languages}
            value={selectedValue}
            inputAttr={languageLabel}
            width={250}
            onValueChanged={onSelectLanguage} />
        </div>
      </div>
    </React.Fragment>
  );
};
export default App;
    
    import React, { useCallback, useState } from 'react';
import DataGrid, {
  Column, Paging, SearchPanel, Pager,
} from 'devextreme-react/data-grid';
import SelectBox from 'devextreme-react/select-box';
import { europeanUnion } from './data.js';
const populationFormat = { type: 'fixedPoint', precision: 0 };
const areaFormat = { type: 'fixedPoint', precision: 0 };
const languageLabel = { 'aria-label': 'Language' };
const languages = ['Arabic (Right-to-Left direction)', 'English (Left-to-Right direction)'];
const App = () => {
  const [placeholder, setPlaceholder] = useState('Search...');
  const [rtlEnabled, setRtlEnabled] = useState(false);
  const [selectedValue, setSelectedValue] = useState(languages[1]);
  const onSelectLanguage = useCallback((e) => {
    const newRtlEnabled = e.value === languages[0];
    setRtlEnabled(newRtlEnabled);
    setPlaceholder(newRtlEnabled ? 'بحث' : 'Search...');
    setSelectedValue(e.value);
  }, []);
  const headerCellRender = useCallback(
    () => (
      <div>
        {rtlEnabled ? (
          <div>
            المساحة (كم<sup>2</sup>)
          </div>
        ) : (
          <div>
            Area (km<sup>2</sup>)
          </div>
        )}
      </div>
    ),
    [rtlEnabled],
  );
  return (
    <React.Fragment>
      <DataGrid
        id="gridContainer"
        dataSource={europeanUnion}
        keyExpr="nameEn"
        rtlEnabled={rtlEnabled}
        showBorders={true}
      >
        <Paging defaultPageSize={15} />
        <Pager visible={true} />
        <SearchPanel
          visible={true}
          placeholder={placeholder}
        />
        <Column
          dataField={rtlEnabled ? 'nameAr' : 'nameEn'}
          caption={rtlEnabled ? 'الدولة' : 'Name'}
        />
        <Column
          dataField={rtlEnabled ? 'capitalAr' : 'capitalEn'}
          caption={rtlEnabled ? 'عاصمة' : 'Capital'}
        />
        <Column
          dataField="population"
          caption={rtlEnabled ? 'عدد السكان (نسمة) 2013' : 'Population'}
          format={populationFormat}
        />
        <Column
          dataField="area"
          headerCellRender={headerCellRender}
          format={areaFormat}
        />
        <Column
          dataField="accession"
          visible={false}
        />
      </DataGrid>
      <div className="options">
        <div className="caption">Options</div>
        <div className="option">
          <span>Language: </span>
          <SelectBox
            id="select-language"
            items={languages}
            value={selectedValue}
            inputAttr={languageLabel}
            width={250}
            onValueChanged={onSelectLanguage}
          />
        </div>
      </div>
    </React.Fragment>
  );
};
export default App;
    
    import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.tsx';
ReactDOM.render(
  <App />,
  document.getElementById('app'),
);
    
    export const europeanUnion = [{
  nameAr: 'النمسا',
  nameEn: 'Austria',
  population: 8451900,
  area: 83855,
  capitalAr: 'فيينا',
  capitalEn: 'Vienna',
  accession: 1995,
}, {
  nameAr: 'بلجيكا',
  nameEn: 'Belgium',
  population: 11161600,
  area: 30528,
  capitalAr: 'بروكسل',
  capitalEn: 'Brussels',
  accession: 1957,
}, {
  nameAr: 'بلغاريا',
  nameEn: 'Bulgaria',
  population: 7284600,
  area: 110994,
  capitalAr: 'صوفيا',
  capitalEn: 'Sofia',
  accession: 2007,
}, {
  nameAr: 'كرواتيا',
  nameEn: 'Croatia',
  population: 4262100,
  area: 56594,
  capitalAr: 'زغرب',
  capitalEn: 'Zagreb',
  accession: 2013,
}, {
  nameAr: 'قبرص',
  nameEn: 'Cyprus',
  population: 865900,
  area: 9251,
  capitalAr: 'نيقوسيا',
  capitalEn: 'Nicosia',
  accession: 2004,
}, {
  nameAr: 'الجمهورية التشيكية',
  nameEn: 'Czech Republic',
  population: 10516100,
  area: 78866,
  capitalAr: 'براغ',
  capitalEn: 'Prague',
  accession: 2004,
}, {
  nameAr: 'الدنمارك',
  nameEn: 'Denmark',
  population: 5602600,
  area: 43075,
  capitalAr: 'كوبنهاغن',
  capitalEn: 'Copenhagen',
  accession: 1973,
}, {
  nameAr: 'استونيا',
  nameEn: 'Estonia',
  population: 1324800,
  area: 45227,
  capitalAr: 'تالين',
  capitalEn: 'Tallinn',
  accession: 2004,
}, {
  nameAr: 'فنلندا',
  nameEn: 'Finland',
  population: 5426700,
  area: 338424,
  capitalAr: 'هلسنكي',
  capitalEn: 'Helsinki',
  accession: 1995,
}, {
  nameAr: 'فرنسا',
  nameEn: 'France',
  population: 65633200,
  area: 674843,
  capitalAr: 'باريس',
  capitalEn: 'Paris',
  accession: 1957,
}, {
  nameAr: 'ألمانيا',
  nameEn: 'Germany',
  population: 80523700,
  area: 357021,
  capitalAr: 'البرلينية',
  capitalEn: 'Berlin',
  accession: 1957,
}, {
  nameAr: 'يونان',
  nameEn: 'Greece',
  population: 11062500,
  area: 131990,
  capitalAr: 'أثينا',
  capitalEn: 'Athens',
  accession: 1981,
}, {
  nameAr: 'هنغاريا',
  nameEn: 'Hungary',
  population: 9908800,
  area: 93030,
  capitalAr: 'بودابست',
  capitalEn: 'Budapest',
  accession: 2004,
}, {
  nameAr: 'أيرلندا',
  nameEn: 'Ireland',
  population: 4591100,
  area: 70273,
  capitalAr: 'دبلن',
  capitalEn: 'Dublin',
  accession: 1973,
}, {
  nameAr: 'إيطاليا',
  nameEn: 'Italy',
  population: 59685200,
  area: 301338,
  capitalAr: 'روما',
  capitalEn: 'Rome',
  accession: 1957,
}, {
  nameAr: 'لاتفيا',
  nameEn: 'Latvia',
  population: 2023800,
  area: 64589,
  capitalAr: 'ريغا',
  capitalEn: 'Riga',
  accession: 2004,
}, {
  nameAr: 'ليتوانيا',
  nameEn: 'Lithuania',
  population: 2971900,
  area: 65200,
  capitalAr: 'فيلنيوس',
  capitalEn: 'Vilnius',
  accession: 2004,
}, {
  nameAr: 'لوكسمبورغ',
  nameEn: 'Luxembourg',
  population: 537000,
  area: 2586.4,
  capitalAr: 'لوكسمبورغ',
  capitalEn: 'Luxembourg',
  accession: 1957,
}, {
  nameAr: 'مالطا',
  nameEn: 'Malta',
  population: 421400,
  area: 316,
  capitalAr: 'فاليتا',
  capitalEn: 'Valletta',
  accession: 2004,
}, {
  nameAr: 'هولندا',
  nameEn: 'Netherlands',
  population: 16779600,
  area: 41543,
  capitalAr: 'أمستردام',
  capitalEn: 'Amsterdam',
  accession: 1957,
}, {
  nameAr: 'بولندا',
  nameEn: 'Poland',
  population: 38533300,
  area: 312685,
  capitalAr: 'وارسو',
  capitalEn: 'Warsaw',
  accession: 2004,
}, {
  nameAr: 'البرتغال',
  nameEn: 'Portugal',
  population: 10487300,
  area: 92390,
  capitalAr: 'لشبونة',
  capitalEn: 'Lisbon',
  accession: 1986,
}, {
  nameAr: 'رومانيا',
  nameEn: 'Romania',
  population: 20057500,
  area: 238391,
  capitalAr: 'بوخارست',
  capitalEn: 'Bucharest',
  accession: 2007,
}, {
  nameAr: 'سلوفاكيا',
  nameEn: 'Slovakia',
  population: 5410800,
  area: 49035,
  capitalAr: 'براتيسلافا',
  capitalEn: 'Bratislava',
  accession: 2004,
}, {
  nameAr: 'سلوفينيا',
  nameEn: 'Slovenia',
  population: 2058800,
  area: 20273,
  capitalAr: 'ليوبليانا',
  capitalEn: 'Ljubljana',
  accession: 2004,
}, {
  nameAr: 'إسبانيا',
  nameEn: 'Spain',
  population: 46704300,
  area: 504030,
  capitalAr: 'مدريد',
  capitalEn: 'Madrid',
  accession: 1986,
}, {
  nameAr: 'السويد',
  nameEn: 'Sweden',
  population: 9555900,
  area: 449964,
  capitalAr: 'ستوكهولم',
  capitalEn: 'Stockholm',
  accession: 1995,
}, {
  nameAr: 'المملكة المتحدة',
  nameEn: 'United Kingdom',
  population: 63730100,
  area: 243610,
  capitalAr: 'لندن',
  capitalEn: 'London',
  accession: 1973,
}];
    
    window.exports = window.exports || {};
window.config = {
  transpiler: 'ts',
  typescriptOptions: {
    module: 'system',
    emitDecoratorMetadata: true,
    experimentalDecorators: true,
    jsx: 'react',
  },
  meta: {
    'react': {
      'esModule': true,
    },
    'typescript': {
      'exports': 'ts',
    },
    'devextreme/time_zone_utils.js': {
      'esModule': true,
    },
    'devextreme/localization.js': {
      'esModule': true,
    },
    'devextreme/viz/palette.js': {
      'esModule': true,
    },
    'openai': {
      'esModule': true,
    },
  },
  paths: {
    'npm:': 'https://cdn.jsdelivr.net/npm/',
    'bundles:': '../../../../bundles/',
    'externals:': '../../../../bundles/externals/',
  },
  defaultExtension: 'js',
  map: {
    'ts': 'npm:plugin-typescript@8.0.0/lib/plugin.js',
    'typescript': 'npm:typescript@4.2.4/lib/typescript.js',
    'jszip': 'npm:jszip@3.10.1/dist/jszip.min.js',
    'react': 'npm:react@17.0.2/umd/react.development.js',
    'react-dom': 'npm:react-dom@17.0.2/umd/react-dom.development.js',
    'prop-types': 'npm:prop-types/prop-types.js',
    'rrule': 'npm:rrule@2.6.4/dist/es5/rrule.js',
    'luxon': 'npm:luxon@3.4.4/build/global/luxon.min.js',
    'es6-object-assign': 'npm:es6-object-assign',
    'devextreme': 'npm:devextreme@link:../../packages/devextreme/artifacts/npm/devextreme/cjs',
    'devextreme-react': 'npm:devextreme-react@link:../../packages/devextreme-react/npm/cjs',
    'devextreme-quill': 'npm:devextreme-quill@1.7.6/dist/dx-quill.min.js',
    'devexpress-diagram': 'npm:devexpress-diagram@2.2.24/dist/dx-diagram.js',
    'devexpress-gantt': 'npm:devexpress-gantt@4.1.64/dist/dx-gantt.js',
    'inferno': 'npm:inferno@8.2.3/dist/inferno.min.js',
    'inferno-compat': 'npm:inferno-compat/dist/inferno-compat.min.js',
    'inferno-create-element': 'npm:inferno-create-element@8.2.3/dist/inferno-create-element.min.js',
    'inferno-dom': 'npm:inferno-dom/dist/inferno-dom.min.js',
    'inferno-hydrate': 'npm:inferno-hydrate/dist/inferno-hydrate.min.js',
    'inferno-clone-vnode': 'npm:inferno-clone-vnode/dist/inferno-clone-vnode.min.js',
    'inferno-create-class': 'npm:inferno-create-class/dist/inferno-create-class.min.js',
    'inferno-extras': 'npm:inferno-extras/dist/inferno-extras.min.js',
    '@preact/signals-core': 'npm:@preact/signals-core@1.8.0/dist/signals-core.min.js',
    'devextreme-cldr-data': 'npm:devextreme-cldr-data@1.0.3',
    // SystemJS plugins
    'plugin-babel': 'npm:systemjs-plugin-babel@0.0.25/plugin-babel.js',
    'systemjs-babel-build': 'npm:systemjs-plugin-babel@0.0.25/systemjs-babel-browser.js',
    // Prettier
    'prettier/standalone': 'npm:prettier@2.8.8/standalone.js',
    'prettier/parser-html': 'npm:prettier@2.8.8/parser-html.js',
  },
  packages: {
    'devextreme': {
      defaultExtension: 'js',
    },
    'devextreme-react': {
      main: 'index.js',
    },
    'devextreme-react/common': {
      main: 'index.js',
    },
    'devextreme/events/utils': {
      main: 'index',
    },
    'devextreme/common/core/events/utils': {
      main: 'index',
    },
    'devextreme/localization/messages': {
      format: 'json',
      defaultExtension: 'json',
    },
    'devextreme/events': {
      main: 'index',
    },
    'es6-object-assign': {
      main: './index.js',
      defaultExtension: 'js',
    },
  },
  packageConfigPaths: [
    'npm:@devextreme/*/package.json',
  ],
  babelOptions: {
    sourceMaps: false,
    stage0: true,
    react: true,
  },
};
System.config(window.config);
// eslint-disable-next-line
const useTgzInCSB = ['openai'];
    
    import React from 'react';
import ReactDOM from 'react-dom';
import App from './App.js';
ReactDOM.render(<App />, document.getElementById('app'));
    
    export const europeanUnion = [
  {
    nameAr: 'النمسا',
    nameEn: 'Austria',
    population: 8451900,
    area: 83855,
    capitalAr: 'فيينا',
    capitalEn: 'Vienna',
    accession: 1995,
  },
  {
    nameAr: 'بلجيكا',
    nameEn: 'Belgium',
    population: 11161600,
    area: 30528,
    capitalAr: 'بروكسل',
    capitalEn: 'Brussels',
    accession: 1957,
  },
  {
    nameAr: 'بلغاريا',
    nameEn: 'Bulgaria',
    population: 7284600,
    area: 110994,
    capitalAr: 'صوفيا',
    capitalEn: 'Sofia',
    accession: 2007,
  },
  {
    nameAr: 'كرواتيا',
    nameEn: 'Croatia',
    population: 4262100,
    area: 56594,
    capitalAr: 'زغرب',
    capitalEn: 'Zagreb',
    accession: 2013,
  },
  {
    nameAr: 'قبرص',
    nameEn: 'Cyprus',
    population: 865900,
    area: 9251,
    capitalAr: 'نيقوسيا',
    capitalEn: 'Nicosia',
    accession: 2004,
  },
  {
    nameAr: 'الجمهورية التشيكية',
    nameEn: 'Czech Republic',
    population: 10516100,
    area: 78866,
    capitalAr: 'براغ',
    capitalEn: 'Prague',
    accession: 2004,
  },
  {
    nameAr: 'الدنمارك',
    nameEn: 'Denmark',
    population: 5602600,
    area: 43075,
    capitalAr: 'كوبنهاغن',
    capitalEn: 'Copenhagen',
    accession: 1973,
  },
  {
    nameAr: 'استونيا',
    nameEn: 'Estonia',
    population: 1324800,
    area: 45227,
    capitalAr: 'تالين',
    capitalEn: 'Tallinn',
    accession: 2004,
  },
  {
    nameAr: 'فنلندا',
    nameEn: 'Finland',
    population: 5426700,
    area: 338424,
    capitalAr: 'هلسنكي',
    capitalEn: 'Helsinki',
    accession: 1995,
  },
  {
    nameAr: 'فرنسا',
    nameEn: 'France',
    population: 65633200,
    area: 674843,
    capitalAr: 'باريس',
    capitalEn: 'Paris',
    accession: 1957,
  },
  {
    nameAr: 'ألمانيا',
    nameEn: 'Germany',
    population: 80523700,
    area: 357021,
    capitalAr: 'البرلينية',
    capitalEn: 'Berlin',
    accession: 1957,
  },
  {
    nameAr: 'يونان',
    nameEn: 'Greece',
    population: 11062500,
    area: 131990,
    capitalAr: 'أثينا',
    capitalEn: 'Athens',
    accession: 1981,
  },
  {
    nameAr: 'هنغاريا',
    nameEn: 'Hungary',
    population: 9908800,
    area: 93030,
    capitalAr: 'بودابست',
    capitalEn: 'Budapest',
    accession: 2004,
  },
  {
    nameAr: 'أيرلندا',
    nameEn: 'Ireland',
    population: 4591100,
    area: 70273,
    capitalAr: 'دبلن',
    capitalEn: 'Dublin',
    accession: 1973,
  },
  {
    nameAr: 'إيطاليا',
    nameEn: 'Italy',
    population: 59685200,
    area: 301338,
    capitalAr: 'روما',
    capitalEn: 'Rome',
    accession: 1957,
  },
  {
    nameAr: 'لاتفيا',
    nameEn: 'Latvia',
    population: 2023800,
    area: 64589,
    capitalAr: 'ريغا',
    capitalEn: 'Riga',
    accession: 2004,
  },
  {
    nameAr: 'ليتوانيا',
    nameEn: 'Lithuania',
    population: 2971900,
    area: 65200,
    capitalAr: 'فيلنيوس',
    capitalEn: 'Vilnius',
    accession: 2004,
  },
  {
    nameAr: 'لوكسمبورغ',
    nameEn: 'Luxembourg',
    population: 537000,
    area: 2586.4,
    capitalAr: 'لوكسمبورغ',
    capitalEn: 'Luxembourg',
    accession: 1957,
  },
  {
    nameAr: 'مالطا',
    nameEn: 'Malta',
    population: 421400,
    area: 316,
    capitalAr: 'فاليتا',
    capitalEn: 'Valletta',
    accession: 2004,
  },
  {
    nameAr: 'هولندا',
    nameEn: 'Netherlands',
    population: 16779600,
    area: 41543,
    capitalAr: 'أمستردام',
    capitalEn: 'Amsterdam',
    accession: 1957,
  },
  {
    nameAr: 'بولندا',
    nameEn: 'Poland',
    population: 38533300,
    area: 312685,
    capitalAr: 'وارسو',
    capitalEn: 'Warsaw',
    accession: 2004,
  },
  {
    nameAr: 'البرتغال',
    nameEn: 'Portugal',
    population: 10487300,
    area: 92390,
    capitalAr: 'لشبونة',
    capitalEn: 'Lisbon',
    accession: 1986,
  },
  {
    nameAr: 'رومانيا',
    nameEn: 'Romania',
    population: 20057500,
    area: 238391,
    capitalAr: 'بوخارست',
    capitalEn: 'Bucharest',
    accession: 2007,
  },
  {
    nameAr: 'سلوفاكيا',
    nameEn: 'Slovakia',
    population: 5410800,
    area: 49035,
    capitalAr: 'براتيسلافا',
    capitalEn: 'Bratislava',
    accession: 2004,
  },
  {
    nameAr: 'سلوفينيا',
    nameEn: 'Slovenia',
    population: 2058800,
    area: 20273,
    capitalAr: 'ليوبليانا',
    capitalEn: 'Ljubljana',
    accession: 2004,
  },
  {
    nameAr: 'إسبانيا',
    nameEn: 'Spain',
    population: 46704300,
    area: 504030,
    capitalAr: 'مدريد',
    capitalEn: 'Madrid',
    accession: 1986,
  },
  {
    nameAr: 'السويد',
    nameEn: 'Sweden',
    population: 9555900,
    area: 449964,
    capitalAr: 'ستوكهولم',
    capitalEn: 'Stockholm',
    accession: 1995,
  },
  {
    nameAr: 'المملكة المتحدة',
    nameEn: 'United Kingdom',
    population: 63730100,
    area: 243610,
    capitalAr: 'لندن',
    capitalEn: 'London',
    accession: 1973,
  },
];
    
    <!DOCTYPE html>
<html lang="en">
  <head>
    <title>DevExtreme Demo</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" />
    <link rel="stylesheet" type="text/css" href="https://cdn3.devexpress.com/jslib/25.1.6/css/dx.light.css" />
    <link rel="stylesheet" type="text/css" href="styles.css" />
    <script src="https://cdn.jsdelivr.net/npm/core-js@2.6.12/client/shim.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/systemjs@0.21.3/dist/system.js"></script>
    <script type="text/javascript" src="config.js"></script>
    <script type="text/javascript">
      System.import("./index.tsx");
    </script>
  </head>
  <body class="dx-viewport">
    <div class="demo-container">
      <div id="app"></div>
    </div>
  </body>
</html>
    
    #gridContainer {
  height: 440px;
}
#gridContainer sup {
  font-size: 0.8em;
  vertical-align: super;
  line-height: 0;
}
.options {
  padding: 20px;
  margin-top: 20px;
  background-color: rgba(191, 191, 191, 0.15);
}
.caption {
  font-size: 18px;
  font-weight: 500;
}
.option {
  margin-top: 10px;
}
.option > span {
  margin-right: 10px;
}
.option > .dx-widget {
  display: inline-block;
  vertical-align: middle;
}