Material-ui: рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХреНрд░рдордмрджреНрдз рдХреЙрд▓рдо

рдХреЛ рдирд┐рд░реНрдорд┐рдд 6 рдЕрдЧре░ 2015  ┬╖  71рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: mui-org/material-ui

рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдЯрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЙрд▓рдо рд╣реЛрдВ рдЬреЛ Google рд╕рд╛рдордЧреНрд░реА рдбрд┐рдЬрд╝рд╛рдЗрди рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВ: http://www.google.com/design/spec/components/data-tables.html#data -tables-interaction

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдРрд╕рд╛ рдХреБрдЫ

import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn, TableFooter } from 'material-ui/Table';
import { SmartTableRow } from 'components';
import React, { PropTypes, Component } from 'react';
import styles from './SmartTable.scss';
import SortIcon from 'material-ui/svg-icons/action/swap-vert';
import IconButton from 'material-ui/IconButton';
import ChevronLeft from 'material-ui/svg-icons/navigation/chevron-left';
import ChevronRight from 'material-ui/svg-icons/navigation/chevron-right';
import getMuiTheme from 'material-ui/styles/getMuiTheme';

function sortFunc(a, b, key) {
  if (typeof(a[key]) === 'number') {
    return a[key] - b[key];
  }

  const ax = [];
  const bx = [];

  a[key].replace(/(\d+)|(\D+)/g, (_, $1, $2) => { ax.push([$1 || Infinity, $2 || '']); });
  b[key].replace(/(\d+)|(\D+)/g, (_, $1, $2) => { bx.push([$1 || Infinity, $2 || '']); });

  while (ax.length && bx.length) {
    const an = ax.shift();
    const bn = bx.shift();
    const nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
    if (nn) return nn;
  }

  return ax.length - bx.length;
}

class SmartTable extends Component {

  static childContextTypes = {
    muiTheme: React.PropTypes.object.isRequired
  }

  constructor(props, context) {
    super(props, context);
    this.state = { isAsc: false, sortHeader: null };
  }

  getChildContext() {
    return { muiTheme: getMuiTheme() };
  }

  sortByColumn(column, data) {
    const isAsc = this.state.sortHeader === column ? !this.state.isAsc : true;
    const sortedData = data.sort((a, b) => sortFunc(a, b, column));

    if (!isAsc) {
      sortedData.reverse();
    }

    this.setState({
      data: sortedData,
      sortHeader: column,
      isAsc
    });
  }

  render() {

    const { offset, limit, total, tableHeaders, data, onPageClick } = this.props;

    return (
      <Table className={ styles.table } selectable={false}>
        <TableHeader displaySelectAll ={false} adjustForCheckbox={false}>
          <TableRow>
            {!!tableHeaders && tableHeaders.map((header, index) => (
              <TableHeaderColumn key={index}>
                <div className={styles.rowAlign}>
                  {header.alias}
                  <SortIcon
                    id={header.dataAlias}
                    className={styles.sortIcon}
                    onMouseUp={(e) => this.sortByColumn(e.target.id, data) }
                  />
                </div>
              </TableHeaderColumn>
            ))}
          </TableRow>
        </TableHeader>
        <TableBody showRowHover stripedRows displayRowCheckbox={false}>
          {!!data && data.map((row, index) => (
            <SmartTableRow key={index} {...{ row, index, tableHeaders }} />
          ))}
        </TableBody>
        <TableFooter>
          <TableRow>
            <TableRowColumn>
                <div className={styles.footerControls}>
                  { `${Math.min((offset + 1), total)} - ${Math.min((offset + limit), total)} of ${total}` }
                  <IconButton disabled={offset === 0} onClick={onPageClick.bind(null, offset - limit)}>
                    <ChevronLeft/>
                  </IconButton>
                  <IconButton disabled={offset + limit >= total} onClick={onPageClick.bind(null, offset + limit)}>
                    <ChevronRight/>
                  </IconButton>
                </div>
              </TableRowColumn>
          </TableRow>
        </TableFooter>
      </Table>
    );
  }
}

SmartTable.propTypes = {
  tableHeaders: PropTypes.array,
  data: PropTypes.array,
  offset: PropTypes.number, // current offset
  total: PropTypes.number, // total number of rows
  limit: PropTypes.number, // num of rows in each page
  onPageClick: PropTypes.func // what to do after clicking page number
};

export default SmartTable;

.table {
  width: auto;
  padding-top: 30px;
}

.rowAlign {
  display: flex;
  align-items: center;
}

.footerControls {
  display: flex;
  align-items: center;
  justify-content: flex-end;
}

.sortIcon {
  cursor: pointer;
  path {
    fill: rgb(158, 158, 158) !important;
    pointer-events: none;
  }
}

рд╕рднреА 71 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрджрд┐ рдЖрдкрдХреЛ рддрддреНрдХрд╛рд▓ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рд╢рд╛рдЦрд╛ v0.11 рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреЙрд▓рдо рд╣реЗрдбрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ (рдЖрд░реЛрд╣реА/рдЕрд╡рд░реЛрд╣реА) рдХреЛ рдХреИрд╕реЗ рдХреНрд░рдордмрджреНрдз рдХрд░рдирд╛ рд╣реИ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд┐рдХ/рдЯреИрдк рдИрд╡реЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдереЛрдбрд╝рд╛ рдлреНрд▓рдХреНрд╕/рд░рд┐рдлреНрд▓рдХреНрд╕/рд░реЗрдбрдХреНрд╕ рдХрд┐рдХ рдкрд░ рд╣реВрдВ рдФрд░ рдПрдордпреВрдЖрдИ рдХреЗ рдмрд╛рд╣рд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреЙрд▓рдо рд╣реЗрдбрд░ рд╕реЙрд░реНрдЯ рд╕рдВрдХреЗрддрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдФрд░ рдЙрди рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдХрд╛ рдЦреБрд▓рд╛рд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреБрдЫ рд╕рдордп рд╣реЛ рддреЛ рд╣рдореЗрдВ рдПрдХ рдкреАрдЖрд░ (рд╢рд╛рдЦрд╛ v0.11 рдХреЗ рд╡рд┐рд░реБрджреНрдз) рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

рдХреЛрдИ рдЗрд╕ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ? рд╣рдорд╛рд░реА рдЯреАрдо (@VladimirPal) @jkruder рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдПрдХ рд╢реЙрдЯ рджреЗрдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдЧреАред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ sortIndicator рдФрд░ onClick рдХреЗ рд▓рд┐рдП TableHeaderColumn рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, sortIndicator рдЬреЛ рднреА рдШрдЯрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЖрдорддреМрд░ рдкрд░ FontIcon ) рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЫрдБрдЯрд╛рдИ рддрд░реНрдХ Table рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ред

рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд▓реЙрдЬрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЧрд▓ рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ, рдорд▓реНрдЯреА-рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ, рдФрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдЪрдХреНрд░ рдХрд╛ рдХреНрд░рдо ( Asc->Desc->None рдпрд╛ Desc->Asc ), рдФрд░ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдореЗрдВ рдХреЙрд▓рдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдордпреВрдЖрдИ рдХреЗ Table рджреБрдмрд▓рд╛ рд░рдЦрдирд╛ рдФрд░ рддрд░реНрдХ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛред рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░? @jkruder @sjstebbins

@zachguo рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдмрд╛рд╣рд░ рдЫрдБрдЯрд╛рдИ рддрд░реНрдХ рд░рдЦрдиреЗ рдХреЗ рд╕рд╛рде рд╕рд╣рдордд рд╣реИрдВред рдореИрдВ ['asc', 'desc', 'none'] рдХреА рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЙрд░реНрдЯ рд╕рд░рдгреА рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдХреЙрд▓рдо рд╣реЗрдбрд░ рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд▓рд┐рдХ рдЗрдВрдбреЗрдХреНрд╕ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рдПрдЧрд╛ рдЬреЛ 0 рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕реАрдмреА рдХреЛ рд╕реЙрд░реНрдЯ рд╡реИрд▓реНрдпреВ рдФрд░ рдХреЙрд▓рдо рдирд╛рдо/рд╕рдВрдЦреНрдпрд╛/рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЗрд╕ рд╕рд░рдгреА рдХреЛ рдХрд╕реНрдЯрдо рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЛрдк рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдкреВрд░реНрддрд┐ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдорд▓реНрдЯреА рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдЯреЗрдмрд▓ рдХреЗ рдЙрдкрднреЛрдХреНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдХреЙрд▓рдо рдХреНрд▓рд┐рдХ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдХреНрд░рдо рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рд╣реИред рдЙрдкрднреЛрдХреНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: [{columnId: 'asc'}, {otherColumnId: 'desc'}] ред рдореИрдВ рдПрдХрд╛рдзрд┐рдХ рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБ рдХреЙрд▓рдо рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдпреЛрдЧреНрдп (рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕) рдлрд╝реАрд▓реНрдб рдЬреЛрдбрд╝реВрдВрдЧрд╛ред

@jkruder TBH рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реЙрд░реНрдЯ рд╕рд░рдгреА рдХреЛ Table рдореЗрдВ рд╕рд╣реЗрдЬрдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореИрдВ indicator рдФрд░ onClick рджреЛрдиреЛрдВ рдХреЛ рдЫрдБрдЯрд╛рдИ рддрд░реНрдХ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдХреЗ, рдПрдХ рдирд┐рдЪрд▓реЗ рд╕реНрддрд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдБ, рддрд╛рдХрд┐

  • Table рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЗрд╕рд▓рд┐рдП рддрд░реНрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ),
  • рджреЛрдиреЛрдВ рдкреНрд░реЙрдкреНрд╕ рдЕрдиреНрдп рдЬрд░реВрд░рддреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХреЙрд▓рдо рд╣реЗрдбрд░ рдХреЛ рдмреИрдЬ рджреЗрдирд╛, рдпрд╛ рдХрд┐рд╕реА рдХреЙрд▓рдо рдХреЛ рдЙрд╕рдХреЗ рд╣реЗрдбрд░ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд░рдирд╛ред

рд▓реЗрдХрд┐рди рд╡рд┐рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдЖрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

@zachguo рд╕рдВрдХреЗрддрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ; UI рдХреЛ decoupling рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реИрдВ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ indicator рдФрд░ onClick рдХреЗ рд╕рд╛рде рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдПрдХ рдЧреИрд░-рд╡рд┐рдЪрд╛рд░рдгреАрдп рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдПрдкреАрдЖрдИ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдореЗрдВ рдПрдХ рдХреНрд░рдордмрджреНрдз рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдПрдХ SortableTable рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╣рдо рдкрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреАрдЖрдИ рдХреЛ рд╕рд╣рдЬ рдирд╣реАрдВ рдкрд╛ рд░рд╣реЗ рд╣реИрдВред

рд╣рд╛рдБ, SortableTable рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред

рд╣рдо рдПрдордбреА рдХреЗ рдбреЗрдЯрд╛рдЯреЗрдмрд▓ рд╕реНрдкреЗрдХреНрд╕ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ indicator $ рдХреЗ рдмрдЬрд╛рдп icon рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
screen shot 2015-08-25 at 6 37 45 pm
screen shot 2015-08-25 at 6 38 48 pm

@zachguo рдЗрд╕рдХреА рдХреНрдпрд╛ рд╕реНрдерд┐рддрд┐ рд╣реИ?

@VladimirPal рдиреЗ рдПрдХ рдРрд╕рд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдПрдордпреВрдЖрдИ рдХреЛрдб рдХреА рд╕рд┐рдВрдЧрд▓ рд▓рд╛рдЗрди рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рддреИрдпрд╛рд░ рд╣реИ рддреЛ рд╣рдо рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЛрд░реНрдЯ рдХрд░реЗрдВрдЧреЗред

рдореБрдЭреЗ рдпрд╣ рджреЗрдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ 0.11 рдореЗрдВ рдЕрдкрдЧреНрд░реЗрдб рдХрд┐рдпрд╛ рдЧрдпрд╛

рдЕрдЪреНрдЫрд╛ рдХрд╛рдо

@zachguo рдЦреБрдж рдПрдХ рдХреНрд░рдордмрджреНрдз, рдкреЗрдЬреЗрдмрд▓ рдЯреЗрдмрд▓ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛, рд▓реЗрдХрд┐рди рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдХрд╛рдо рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рдЖрдкрдХреЛ рдХрдм рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрд╛рдирд╛ рдЕрдЪреНрдЫрд╛ рд░рд╣реЗрдЧрд╛? рдЗрд╕ рдмреАрдЪ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдЯреНрд░рдВрдХ рдХреЗ рдмрд╛рд╣рд░ рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реБрдИред

@zachguo @VladimirPal рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ?

@shaurya947 @daniel-sim @sjstebbins

рд╣рдордиреЗ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рджреЛрдиреЛрдВ рдкрд░ рд╕реЙрд░реНрдЯрд┐рдВрдЧ (рд╕рд┐рдВрдЧрд▓-рдХреЙрд▓рдо рдФрд░ рдорд▓реНрдЯреА-рдХреЙрд▓рдо рд╕реЙрд░реНрдЯрд┐рдВрдЧ рджреЛрдиреЛрдВ) рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдордпреВрдЖрдИ рдореЗрдВ рдЗрди рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдкреАрдЖрдИ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдордпреВрдЖрдИ рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ рдкреБрди: рд╕рдХреНрд░рд┐рдп рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рдЧрдпрд╛ред рд╣реИред

рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рдПрдордпреВрдЖрдИ рдХреЗ рдЯреЗрдмрд▓ рдШрдЯрдХреЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рдХреЗ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛/рд╕реЙрд░реНрдЯ/рдкреЗрдЬ рдХрд╛ рд╕реНрд╡рдпрдВ рдЯреНрд░реИрдХ рд░рдЦреЗрдВ, рдФрд░ рдПрдордпреВрдЖрдИ рдХреЗ рдЯреЗрдмрд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рджреЗрдВред

рдЖрдИрдПрдордПрдЪрдУ, рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдЬреИрд╕реЗ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╡рд░реНрддрдорд╛рди рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рд░рдЦрдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИред рдХрдо рдУрд╡рд░рд╣реЗрдб, рд▓рд┐рдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо icon / indicator рдкреНрд░реЛрдк рдФрд░ onClick рдИрд╡реЗрдВрдЯ рдХреЛ TableHeaderColumn рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рдирдпрд╛ рдкреНрд░реА -рд╕реНрдЯрд╛рдЗрд▓ TableFooter рдШрдЯрдХред

рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░?

cc: @oliviertassinari

@zachguo :

рдХреЛрдИ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рд▓рд┐рдЦреЗ рдмрд┐рдирд╛ рдПрдордпреВрдЖрдИ рдХреЗ рдЯреЗрдмрд▓ рдШрдЯрдХреЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рдХреЗ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдФрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛/рд╕реЙрд░реНрдЯ/рдкреЗрдЬ рдХрд╛ рд╕реНрд╡рдпрдВ рдЯреНрд░реИрдХ рд░рдЦреЗрдВ, рдФрд░ рдПрдордпреВрдЖрдИ рдХреЗ рдЯреЗрдмрд▓ рдШрдЯрдХреЛрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рджреЗрдВред

рд╣рд╛рдБ, рдпрд╣ рдХрд╛рдлреА рд╕рд╛рдзреНрдп рд╣реИред

рдЖрдкрдиреЗ рдЬрд┐рди рдкреНрд░реЙрдкреНрд╕ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ рдФрд░ рдЫрдБрдЯрд╛рдИ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЕрдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рднреА рдХрд╛рдо рдЖ рд╕рдХрддреЗ рд╣реИрдВред рддреЛ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВ ..

рдпрд╣ рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЯреЗрдмрд▓рд╣реЗрдбрд░ рдХреЙрд▓рдо рдХреЗ рдЕрдВрджрд░ рдПрдХ рдСрдирдХреНрд▓рд┐рдХ рдХреЗ рд╕рд╛рде рдПрдХ div рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред TableHeaderColumn рдХреЗ рд▓рд┐рдП рдСрдирдХреНрд▓рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдареАрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛ рд╣реЛрдЧрд╛, рдФрд░ IMO 99% рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

@roieki рд╣рдордиреЗ рднреА рдпрд╣реА рдХрд┐рдпрд╛ рд╣реИ

@ shaurya947 @jkruder рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ $#$ TableHeaderColumn $#$ рдХреЗ рд▓рд┐рдП рдПрдХ onClick рдкреНрд░реЛрдк рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рд╕рдВрдмрдВрдзрд┐рдд #2011

рдХреНрдпрд╛ рдХреЛрдИ рдЗрд╕реЗ рдЙрдард╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ?

рдРрд╕рд╛ рдХреБрдЫ

import { Table, TableBody, TableHeader, TableHeaderColumn, TableRow, TableRowColumn, TableFooter } from 'material-ui/Table';
import { SmartTableRow } from 'components';
import React, { PropTypes, Component } from 'react';
import styles from './SmartTable.scss';
import SortIcon from 'material-ui/svg-icons/action/swap-vert';
import IconButton from 'material-ui/IconButton';
import ChevronLeft from 'material-ui/svg-icons/navigation/chevron-left';
import ChevronRight from 'material-ui/svg-icons/navigation/chevron-right';
import getMuiTheme from 'material-ui/styles/getMuiTheme';

function sortFunc(a, b, key) {
  if (typeof(a[key]) === 'number') {
    return a[key] - b[key];
  }

  const ax = [];
  const bx = [];

  a[key].replace(/(\d+)|(\D+)/g, (_, $1, $2) => { ax.push([$1 || Infinity, $2 || '']); });
  b[key].replace(/(\d+)|(\D+)/g, (_, $1, $2) => { bx.push([$1 || Infinity, $2 || '']); });

  while (ax.length && bx.length) {
    const an = ax.shift();
    const bn = bx.shift();
    const nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]);
    if (nn) return nn;
  }

  return ax.length - bx.length;
}

class SmartTable extends Component {

  static childContextTypes = {
    muiTheme: React.PropTypes.object.isRequired
  }

  constructor(props, context) {
    super(props, context);
    this.state = { isAsc: false, sortHeader: null };
  }

  getChildContext() {
    return { muiTheme: getMuiTheme() };
  }

  sortByColumn(column, data) {
    const isAsc = this.state.sortHeader === column ? !this.state.isAsc : true;
    const sortedData = data.sort((a, b) => sortFunc(a, b, column));

    if (!isAsc) {
      sortedData.reverse();
    }

    this.setState({
      data: sortedData,
      sortHeader: column,
      isAsc
    });
  }

  render() {

    const { offset, limit, total, tableHeaders, data, onPageClick } = this.props;

    return (
      <Table className={ styles.table } selectable={false}>
        <TableHeader displaySelectAll ={false} adjustForCheckbox={false}>
          <TableRow>
            {!!tableHeaders && tableHeaders.map((header, index) => (
              <TableHeaderColumn key={index}>
                <div className={styles.rowAlign}>
                  {header.alias}
                  <SortIcon
                    id={header.dataAlias}
                    className={styles.sortIcon}
                    onMouseUp={(e) => this.sortByColumn(e.target.id, data) }
                  />
                </div>
              </TableHeaderColumn>
            ))}
          </TableRow>
        </TableHeader>
        <TableBody showRowHover stripedRows displayRowCheckbox={false}>
          {!!data && data.map((row, index) => (
            <SmartTableRow key={index} {...{ row, index, tableHeaders }} />
          ))}
        </TableBody>
        <TableFooter>
          <TableRow>
            <TableRowColumn>
                <div className={styles.footerControls}>
                  { `${Math.min((offset + 1), total)} - ${Math.min((offset + limit), total)} of ${total}` }
                  <IconButton disabled={offset === 0} onClick={onPageClick.bind(null, offset - limit)}>
                    <ChevronLeft/>
                  </IconButton>
                  <IconButton disabled={offset + limit >= total} onClick={onPageClick.bind(null, offset + limit)}>
                    <ChevronRight/>
                  </IconButton>
                </div>
              </TableRowColumn>
          </TableRow>
        </TableFooter>
      </Table>
    );
  }
}

SmartTable.propTypes = {
  tableHeaders: PropTypes.array,
  data: PropTypes.array,
  offset: PropTypes.number, // current offset
  total: PropTypes.number, // total number of rows
  limit: PropTypes.number, // num of rows in each page
  onPageClick: PropTypes.func // what to do after clicking page number
};

export default SmartTable;

.table {
  width: auto;
  padding-top: 30px;
}

.rowAlign {
  display: flex;
  align-items: center;
}

.footerControls {
  display: flex;
  align-items: center;
  justify-content: flex-end;
}

.sortIcon {
  cursor: pointer;
  path {
    fill: rgb(158, 158, 158) !important;
    pointer-events: none;
  }
}

@vorlov рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг, рдзрдиреНрдпрд╡рд╛рджред рдХреНрдпрд╛ рдЖрдк рдЕрдкрдирд╛ SmartTableRow рдШрдЯрдХ рднреА рдкреЛрд╕реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

@chrisrittelmeyer рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЙрдкрд░реЛрдХреНрдд рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрдб рднреА рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

import { TableRow, TableRowColumn } from 'material-ui/Table';
import React, { PropTypes } from 'react';
import formatTableCell from './formatTableCell';

const SmartTableRow = ({ index, row, tableHeaders }) => (
  <TableRow key={index}>
    {tableHeaders.map((header, propIndex) => (
      <TableRowColumn key={propIndex}>{formatTableCell(row[header.dataAlias], header.format)}</TableRowColumn>
    ))}
  </TableRow>
);

SmartTableRow.propTypes = {
  index: PropTypes.number,
  row: PropTypes.object
};

export default SmartTableRow;

@vorlov рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдпрд╣ рдХреЛрдб рд╣реИ рдФрд░ рдХрд╣реАрдВ рднреА рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╢рд╛рдпрдж?

@chrisrittelmeyer stange рд╕рд╡рд╛рд▓) рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ)

рдУрд╣! рдореБрдЭреЗ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ - рдХреНрдпрд╛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдРрд╕рд╛ рд╡рд╛рддрд╛рд╡рд░рдг рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЖрдк рд╣рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ? рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ рдЕрднреА рднреА рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдБ рд╕рднреА рднрд╛рдЧреЛрдВ рдХреЛ рдЪрд┐рдкрдХрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдореБрдЭреЗ рдХреЗрд╡рд▓ рд░реЗрдкреЛ рдХреА рдУрд░ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@vorlov рдпрд╣ рд╕реНрдорд╛рд░реНрдЯ рдЯреЗрдмрд▓ рдХрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдХрд╛рдлреА рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣рд╛ рд╣реВрдВред рдореБрдЭреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдСрдлрд╝рд╕реЗрдЯ, рд╕реАрдорд╛ рдФрд░ рдХреБрд▓ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рджрд┐рдЦ рд░рд╣рд╛ рд╣реИ?

@ рдЬреЗрдХреЗ 82 рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ, рдореИрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕реЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓ рд░рд┐рд╕реАрд╡рдкреНрд░реЙрдкреНрд╕ рдпрд╛ рдХрдВрдкреЛрдиреЗрдВрдЯрд╡рд┐рд▓рдорд╛рдЙрдВрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

@vorlov рд╕реНрд╡реАрдЯ, рдлрд┐рд░ рд╕реЗ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рд╣реИ

@vorlov рд╣рдореНрдо рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рд╕реАрдзреЗ рдкреНрд░реЛрдк (рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░) рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИ: \

@NeXTs рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?

@vorlov
const sortedData = data.sort((a, b) => sortFunc(a, b, column));
data.sort - рд╕реЙрд░реНрдЯ рдореНрдпреВрдЯреЗрдЯрд░ рд╣реИ рдЗрд╕рд▓рд┐рдП рдпрд╣ data рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ this.props.data рдХрд╛ рд╕реАрдзрд╛ рд╕рдВрджрд░реНрдн рд╣реИ, рд╣реИ рдирд╛?

рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдХреНрдпрд╛ рдерд╛?

this.setState({
   data: sortedData
})

рдпрджрд┐ render рд░рд╛рдЬреНрдп рдХреЗ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рддреЛ рдпрд╣ рдХреЗрд╡рд▓ const { data } = this.props; рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ
рд╢рд╛рдпрдж рд╡рд┐рдЪрд╛рд░ рдерд╛ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рд╕реЗ data рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕реЗ рдХреНрд▓реЛрди рдХрд░реЗрдВ, рдЗрд╕реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВ рдФрд░ рдлрд┐рд░ рд░рд╛рдЬреНрдп рдореЗрдВ data рдХреЛ рд╕реЙрд░реНрдЯ/рд╡рд╛рдкрд╕ рдХрд░реЗрдВ?

рдЗрд╕рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ TableSortLabel рдХреЛ next рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред next рд╢рд╛рдЦрд╛ рдкрд░ рдПрдХ рдбреЗрдореЛ рднреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЙрд▓рдо рд╕реЙрд░реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред

@NeXTs рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЖрдкрдиреЗ рд╡рд╣рд╛рдВ рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рдХрд╣рд╛рдВ рджреЗрдЦрд╛ред рдореИрдВ рдирдИ рд╡рд╕реНрддреБ рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рдпрд╣ рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рди рдХрд░реЗред

рдкреНрд░реЙрдкреНрд╕ рдЖрдорддреМрд░ рдкрд░ рд░реЗрдбрдХреНрд╕ рд╕реНрдЯреЛрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдпрд╣реА рдореЗрд░реА рдмрд╛рдд рдереА
рдареАрдХ рд╣реИ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдЕрдм рдпрд╣ рдЗрддрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рднреА рдзрдиреНрдпрд╡рд╛рдж! :+1:

@NeXTs рдореИрдВ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реНрдкреНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯреЗрдмрд▓ рдкрд░ рдкреНрд░реЙрдкреНрд╕ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рд░рд╛рдЬреНрдп рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
<SmartTable { ...{ tableHeaders, data, limit: 20, total: !!data && data.length, offset: 0, onPageClick: this.handleLoad } } />

@vorlov рд╕рдордЭ рдЧрдпрд╛
@nathanmarks рдУрд╣ рдХреВрд▓! рдпрд╣ рдорд╛рд╕реНрдЯрд░ рдмреНрд░рд╛рдВрдЪ рдореЗрдВ рдХрдм рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧрд╛?

рдЙрдкрд░реЛрдХреНрдд рдореЗрдВ рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдЧрд╛рдпрдм рд╣реИ
'./formatTableCell' рд╕реЗ рдлреЙрд░реНрдореЗрдЯрдЯреЗрдмрд▓рд╕реЗрд▓ рдЖрдпрд╛рдд рдХрд░реЗрдВ;

@jimgong92 @chrisrittelmeyer formatTableCell file

import numeral from 'numeral';
import React from 'react';
import { Link } from 'react-router';
import FlatButton from 'material-ui/FlatButton';

export default (cell, format, row) => {
  switch (format && format.type) {
    case 'link':
      return <Link to={ `${format.url}${row.id}` }>{ cell }</Link>;    
    case 'percentage':
      return `${cell}%`;    
    case 'money':
      return numeral(cell).format('0,0');
    default:
      return cell;
  }
};

рдЕрджреНрдпрддрди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

@vorlov рдЖрдкрдХрд╛ рдШрдЯрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдПрдХ рдЬрд┐рд╕реНрдЯ рдпрд╛ рд░реЗрдкреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдВрджрд░ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП

@nathanmarks TableSortLabel рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ рдХрд╣рд╛рдВ рд╣реИ рдФрд░ next рд╢рд╛рдЦрд╛ рдкрд░ рдЗрд╕рдХрд╛ рдбреЗрдореЛ рдХрд╣рд╛рдВ рд╣реИ?

рд╣рд╛рдБ, рд░реЗрдкреЛ рдореЗрдВ TableSortLabel рдпрд╛ рдХрд┐рд╕реА рдХреНрд░рдордмрджреНрдзрддрд╛ рдХрд╛ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рд╣реИред рдЖрд╢реНрдЪрд░реНрдп рд╣реИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдХреНрдпреЛрдВ рдмрдВрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЗ рдорд╣рд╛рди рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @vorlov ред

рд╣рд╛рдБ, рд░реЗрдкреЛ рдореЗрдВ TableSortLabel рдпрд╛ рдХрд┐рд╕реА рдХреНрд░рдордмрджреНрдзрддрд╛ рдХрд╛ рдХреЛрдИ рдирд┐рд╢рд╛рди рдирд╣реАрдВ рд╣реИред

рдпрд╣ next рд╢рд╛рдЦрд╛ рдкрд░ рд╣реИ: рдбреЗрдореЛ/рдЯреЗрдмрд▓/рдПрдиреНрд╣рд╛рдВрд╕реНрдбрдЯреЗрдмрд▓ ред

@oliviertassinari рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдпрд╣ рддреНрд░реБрдЯрд┐ рдорд┐рд▓реА:

TypeError: Cannot read property 'render' of undefined
EnhancedTable.render
http://localhost:8004/app.a3611250a45594961d8c.js:122073:47
http://localhost:8004/app.a3611250a45594961d8c.js:11761:22
measureLifeCyclePerf
http://localhost:8004/app.a3611250a45594961d8c.js:11040:13
ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext
http://localhost:8004/app.a3611250a45594961d8c.js:11760:26
ReactCompositeComponentWrapper._renderValidatedComponent
http://localhost:8004/app.a3611250a45594961d8c.js:11787:33
ReactCompositeComponentWrapper.performInitialMount
http://localhost:8004/app.a3611250a45594961d8c.js:11327:31
ReactCompositeComponentWrapper.mountComponent
http://localhost:8004/app.a3611250a45594961d8c.js:11223:22
Object.mountComponent
http://localhost:8004/app.a3611250a45594961d8c.js:3816:36
ReactDOMComponent.mountChildren
http://localhost:8004/app.a3611250a45594961d8c.js:10366:45
ReactDOMComponent._createInitialChildren
http://localhost:8004/app.a3611250a45594961d8c.js:7453:33

рдпрд╣ рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдкрд░ рд╣реИ: рдбреЗрдореЛ/рдЯреЗрдмрд▓/рдПрдиреНрд╣рд╛рдВрд╕реНрдбрдЯреЗрдмрд▓ред

@oliviertassinari рдкрд░реЗрд╢рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖рдорд╛ рдХрд░реЗрдВред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдореИрдВ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП npm install material-ui@next рдЪрд▓рд╛рддрд╛ рд╣реВрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдПрдиреНрд╣рд╛рдВрд╕реНрдбрдЯреЗрдмрд▓ рдореМрдЬреВрдж рд╣реИ, рддреЛ рдЯреЗрдмрд▓рд╕реЙрд░реНрдЯ рд▓реЗрдмрд▓ рдШрдЯрдХ рдкрд░рд┐рдгрд╛рдореА рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ-рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдЧрд╛рдпрдм рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдпрд╣рд╛рдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрджрдо рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ? рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдзрдиреНрдпрд╡рд╛рджред

@GarrettVD ~ next рд╢рд╛рдЦрд╛ рдЕрднреА рддрдХ рдЬрд╛рд░реА рдирд╣реАрдВ рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЬреАрдердм рд╕реЗ рдПрдирдкреАрдПрдо рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред ~

рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ: рд╣рдордиреЗ рддрдм рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд▓реНрдлрд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИред

@mbrookes рдЖрд╣, рдЧреЛрдЪрд╛ред рдзрдиреНрдпрд╡рд╛рджред

рдмрдврд╝рд┐рдпрд╛ рдХрд╛рдо, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдореЗрдВ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдзрдиреНрдпрд╡рд╛рдж

@oliviertassinari рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдкрд░ рднреА рдХреНрд░рдордмрджреНрдз рдФрд░ рдЕрдВрдХрди рд╣реИ? рд╡рд╣ рд╢рд╛рдЦрд╛ рдХрдм рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реЛрдЧреА рдпрд╛ рд╡рд░реНрддрдорд╛рди рд╢рд╛рдЦрд╛ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрдЧреА? рд╡рд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд░реЛрдЪрдХ рдЪреАрдЬреЗрдВ рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВ :)

@damianobarbati рд╣рдордиреЗ рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд▓реНрдлрд╛ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ: npm install material-ui@next

рдЗрд╕ рдкрд░ рдЕрд▓реНрдлрд╛ рдбреЙрдХреНрд╕ рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП: https://material-ui-1dab0.firebaseapp.com/#/component -demos/tables

рдирдорд╕реНрддреЗ, рдиреМрд╕рд┐рдЦрд┐рдпрд╛ рдЬрд╛рдБрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдЫрд╛рдБрдЯрдирд╛ рдкреНрдпрд╛рд░рд╛ рд╣реЛрдЧрд╛! рдЗрд╕реЗ рдПрдордпреВрдЖрдИ рдХреЗ рд╕реНрдерд┐рд░ рдЙрддреНрдкрд╛рджрди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдХрдм рдорд░реНрдЬ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

рдореЗрд░реА рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдбреЗрдЯрд╛ рд╕реЙрд░реНрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИред рдорд╣рд╛рди рдХрд╛рдо!

рдирдорд╕реНрддреЗ,

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдИ рд░рд┐рд▓реАрдЬ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИред рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?

@nshung рдЖрдкрдХреЛ material-ui@next . рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

https://material-ui-1dab0.firebaseapp.com/component-demos/tables

рдпрд╣ рднреА рдЦреВрдм рд░рд╣реАред рдореИрдВ рдЕрдЧрд▓реЗ рдбреЗрдореЛ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдЫрдБрдЯрд╛рдИ рджреЗрдЦрддрд╛ рд╣реВрдБред рдХреНрдпрд╛ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рдпрд╣ рдЗрд╕ рдШрдЯрдХ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИ? рдХреНрдпрд╛ рдЗрд╕реЗ рдПрдордпреВрдЖрдИ рдХреЗ рдмрд╛рд╣рд░ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛?

@lrettig рдбрд╛рдпрдирд╛рдорд┐рдХ рд╕реЙрд░реНрдЯрд┐рдВрдЧ рдХреЛ рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдбрд╛рдпрдиреЗрдорд┐рдХ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рд╕реЗ 20% рдкреНрд░рдпрд╛рд╕ рдХреЗ рд╕рд╛рде 80% рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╣рдордиреЗ рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛ рдХреЗ рд╕рд╛рде рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рд▓реЛрдЧреЛрдВ рдХреЗ рдкрд╛рд╕ рдЯреЗрдмрд▓ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд┐рдзрддрд╛ рд╣реИред

рд╣рд╛рдп @oliviertassinari рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдереЛрдбрд╝рд╛ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐ - рдпрд╣рд╛рдБ рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдореЗрдВ рдЫрдБрдЯрд╛рдИ рдирд╣реАрдВ рдЬреЛрдбрд╝реА рдЧрдИ рдереА? рддреЛ рдХреНрдпрд╛ рдпрд╣ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдирд╣реАрдВ рдмрди рдЬрд╛рдПрдЧрд╛? рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдЕрдЧрд░ рдореБрдЭреЗ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИред

@lrettig рд░рд╛рдЗрдЯ, рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдЕрдВрддрддрдГ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рд╡рд┐рд▓рдп рд╣реЛрдиреЗ рдЬрд╛ рд░рд╣реА рд╣реИред

рдЗрд╕рдХреЗ рд▓рд╛рдЗрд╡ рд╣реЛрдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@oliviertassinari - рдзрдиреНрдпрд╡рд╛рдж! рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдЖрдкрдХреА рдкрд┐рдЫрд▓реА рдЯрд┐рдкреНрдкрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрд▓рдЭрди рдореЗрдВ рд╣реВрдВред рдЖрдкрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рдХрд┐:

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдЫрдБрдЯрд╛рдИ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЫрдБрдЯрд╛рдИ рдпрд╣рд╛рдБ рд╣реИ, рдЕрдЧрд▓реА рд╢рд╛рдЦрд╛ рдореЗрдВ, рдФрд░ рдорд╛рд╕реНрдЯрд░ рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдЧреА, рддреЛ рдХреНрдпрд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ _not_ рд╣реИ? рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдирд╣реАрдВ рдЖ рд░рд╣рд╛ рд╣реИ?

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдзрдиреНрдпрд╡рд╛рджред

@lrettig рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ, рдореЗрд░рд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХреЗ рдмрд╛рд╣рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд┐ рдЕрдЧрд▓реЗ/v1-рдЕрд▓реНрдлрд╛ рд╢рд╛рдЦрд╛ рдбреЗрдореЛ рдкрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдмрдВрдж рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдРрд╕реА рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬреЛ material-ui@next рдирд╣реАрдВ рд╣реИ? рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдореИрдВ рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реЙрдХ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

@jspengeman @next рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдмреЛрд▓ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдпрд╣ v1.0.0-alpha.21 рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

@oliviertassinari рдзрдиреНрдпрд╡рд╛рдж! рдореИрдВ рдЙрддрдирд╛ рд╣реА рд╕рдордЭ рдЧрдпрд╛, рдмрд╕ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ 2015 рдореЗрдВ рдЦреЛрд▓рд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреЗ рдЗрд╕реЗ 0.X рд░рд┐рд▓реАрдЬ рдореЗрдВ рдмрдирд╛ рджрд┐рдпрд╛ рд╣реИред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ?

рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдиреЗ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдХреЗ рд░рд┐рд▓реАрдЬ рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛?

@oliviertassinari рдХреИрд╕рд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ?

рд╕реБрд╡рд┐рдзрд╛ рдиреЗ рдЗрд╕реЗ рд╕рд╛рдордЧреНрд░реА-рдпреВрдЖрдИ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ v1 рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЖрдкрдХреЗ рддреНрд╡рд░рд┐рдд рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП @oliviertassinari thnx!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕