Datatables. js - Лучшая организация столбцов, но по-прежнему нужно сортировать по заголовку - PullRequest
0 голосов
/ 08 мая 2020

Для этого проекта я использую последнюю версию DatatTables. js

Таблица, которую я хочу включить как МНОГО столбцов, и я хочу объединить некоторые из них в один ячейка, НО я все еще хочу иметь возможность каким-то образом отсортировать всю таблицу по столбцам, которые я только что объединил.

Вот текущая таблица:

<table id="table-data" width="100%">
    <thead>
        <tr>
            <th>Order Date</th>
            <th>Order ID</th>
            <th>Promo ID</th>
            <th>Order Details</th>
            <th>Shipping Name</th>
            <th>Shipping Address</th>
            <th>Shipping City</th>
            <th>Shipping State</th>
            <th>Shipping Zip Code</th>
            <th>Email Address</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Order Date</td>
            <td>Order ID</td>
            <td>Promo ID</td>
            <td>Order Details</td>
            <td>Shipping Name</td>
            <td>Shipping Address</td>
            <td>Shipping City</td>
            <td>Shipping State</td>
            <td>Shipping Zip Code</td>
            <td>Email Address</td>
        </tr>
        <tr>
            <td>Order Date</td>
            <td>Order ID</td>
            <td>Promo ID</td>
            <td>Order Details</td>
            <td>Shipping Name</td>
            <td>Shipping Address</td>
            <td>Shipping City</td>
            <td>Shipping State</td>
            <td>Shipping Zip Code</td>
            <td>Email Address</td>
        </tr>
    </tbody>
</table>

И вот что Я бы хотел сделать:

<table id="table-data" width="100%">
    <thead>
        <tr>
            <th>Order Date</th>
            <th>Order ID</th>
            <th>Promo ID</th>
            <th>Order Details</th>
            <th>Shipping Info</th>
            <th>Email Address</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Order Date</td>
            <td>Order ID</td>
            <td>Promo ID</td>
            <td>Order Details</td>
            <td>
                Shipping Name<br/>
                Shipping Address<br/>
                Shipping City<br/>
                Shipping State<br/>
                Shipping Zip Code
            </td>
            <td>Email Address</td>
        </tr>
        <tr>
            <td>Order Date</td>
            <td>Order ID</td>
            <td>Promo ID</td>
            <td>Order Details</td>
            <td>
                Shipping Name<br/>
                Shipping Address<br/>
                Shipping City<br/>
                Shipping State<br/>
                Shipping Zip Code
            </td>
            <td>Email Address</td>
        </tr>
    </tbody>
</table>

Мне сложно найти какое-либо расширение, плагин или функцию, которые позволили бы мне по-прежнему сортировать по отгрузочному наименованию, адресу, городу, штату и почтовому индексу, когда они все в той же камере.

1 Ответ

1 голос
/ 08 мая 2020

Частичное решение: создайте 4 скрытых столбца - по одному для каждого адреса, города, штата и почтового индекса. Используйте внешние элементы управления (например, 4 кнопки) для сортировки по этим столбцам. Это частичное решение, поскольку оно нарушает подход «сортировка только по заголовкам». Теперь у вас есть микс. Не идеально. Но относительно просто.

Я думаю, что объединение этих внешних элементов управления в заголовок столбца, вероятно, было бы более неудобным. (В аналогичной ситуации я полагался только на поле глобального фильтра: «Искать, не сортировать».)

Ниже представлен аналогичный подход, но поведение щелчка указано в заголовке столбца.

Поведение: если щелкнуть заголовок первого столбца, выполняется итерация по четырем состояниям сортировки:

1) Имя как c

2) Имя des c

3) Фамилия c

4) Фамилия des c

Вот мои тестовые данные:

<table id="example" class="display" style="width:100%">
    <thead>
        <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
            <th>First</th>
            <th>Last</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Tiger Nixon</td>
            <td>System Architect</td>
            <td>Edinburgh</td>
            <td>61</td>
            <td>2011/04/25</td>
            <td>$320,800</td>
            <td>Tiger</td>
            <td>Nixon</td>
        </tr>
        <tr>
            <td>Garrett Winters</td>
            <td>Accountant</td>
            <td>Tokyo</td>
            <td>63</td>
            <td>2011/07/25</td>
            <td>$170,750</td>
            <td>Garrett</td>
            <td>Winters</td>
        </tr>
        <tr>
            <td>Ashton Cox</td>
            <td>Junior Technical Author</td>
            <td>San Francisco</td>
            <td>66</td>
            <td>2009/01/12</td>
            <td>$86,000</td>
            <td>Ashton</td>
            <td>Cox</td>
        </tr>
        <tr>
            <td>Cedric Kelly</td>
            <td>Senior Javascript Developer</td>
            <td>Edinburgh</td>
            <td>22</td>
            <td>2012/03/29</td>
            <td>$433,060</td>
            <td>Cedric</td>
            <td>Kelly</td>
        </tr>
    </tbody>
    <tfoot>
        <tr>
            <th>Name</th>
            <th>Position</th>
            <th>Office</th>
            <th>Age</th>
            <th>Start date</th>
            <th>Salary</th>
            <th>First</th>
            <th>Last</th>
        </tr>
    </tfoot>
</table>

Вы можно видеть, что данные в заголовке Name также были разделены на 2 отдельных столбца в конце (First и Last).

Затем я использую следующее определение DataTables с соответствующим настраиваемым сортировщик. Сортировщик применяется только к заголовку Name. Все остальные заголовки работают по умолчанию:

<script type="text/javascript">

  $(document).ready(function() {
    var table = $('#example').DataTable( {
      "order": [[ 6, 'asc' ], [ 7, 'asc' ]],
      "columnDefs": [ 
        { "visible": false,  "targets": [ 6, 7 ] }
      ]
    } );

    // Override the DataTables event:
    $( 'thead tr th:nth-child(1)' ).off('click');

    $( 'thead tr th:nth-child(1)' ).click(function() {
      var order = table.order();
      var col = order[0][0]; // zero-indexed
      var ord = order[0][1]; // 'asc' or 'desc'
      ord = (ord === 'asc' ? 'desc' : 'asc'); // toggle asc/desc
      if (col < 6) {
        col = 6;
        ord = 'asc';
      } else {
        ord = (ord === 'asc' ? 'desc' : 'asc'); // toggle asc/desc
        if (ord === 'asc') { // move sort to next column
          col = (col === 7) ? 6 : col +1;
        }
      }
      table.order( [ col, ord ] ).draw();
    });

  } );

</script>

Щелкните заголовок Name, чтобы увидеть поведение.

Это только частичное решение, потому что нет никаких указаний, говорящих вам каков порядок сортировки для столбца 1, но можно добавить поле отображения.

По крайней мере, это может дать вам дополнительные идеи.

...