code: def test_server_sorted_after_patch(
      self, bokeh_server_page: BokehServerPage
  ) -> None:
      button = Button()
  
      data = {"x": [1, 2, 5, 6], "y": [60, 50, 20, 10]}
      source = ColumnDataSource(data)
  
      table = DataTable(
          columns=[
              TableColumn(field="x", title="x", sortable=True),
              TableColumn(field="y", title="y", sortable=True),
          ],
          source=source,
          editable=False,
      )
  
      def modify_doc(doc):
          plot = Plot(
              height=400,
              width=400,
              x_range=Range1d(0, 1),
              y_range=Range1d(0, 1),
              min_border=0,
          )
          plot.tags.append(
              CustomJS(
                  name="custom-action",
                  args=dict(s=source),
                  code=RECORD("data", "s.data"),
              )
          )
  
          def cb():
              source.patch({"y": [[2, 100]]})
  
          button.on_event("button_click", cb)
  
          doc.add_root(column(plot, table, button))
  
      page = bokeh_server_page(modify_doc)
  
      page.eval_custom_action()
  
      results = page.results
      assert results == {
          "data": {"x": [1, 2, 5, 6], "y": [60, 50, 20, 10]}
      }
  
      assert get_table_column_cells(page.driver, table, 1) == [
          "1",
          "2",
          "5",
          "6",
      ]
      assert get_table_column_cells(page.driver, table, 2) == [
          "60",
          "50",
          "20",
          "10",
      ]
  
      sort_table_column(page.driver, table, 1)
  
      assert get_table_column_cells(page.driver, table, 1) == [
          "1",
          "2",
          "5",
          "6",
      ]
      assert get_table_column_cells(page.driver, table, 2) == [
          "60",
          "50",
          "20",
          "10",
      ]
  
      sort_table_column(page.driver, table, 2, True)
  
      assert get_table_column_cells(page.driver, table, 1) == [
          "6",
          "5",
          "2",
          "1",
      ]
      assert get_table_column_cells(page.driver, table, 2) == [
          "10",
          "20",
          "50",
          "60",
      ]
  
      button_el = find_element_for(page.driver, button)
      button_el.click()
  
      page.eval_custom_action()
  
      results = page.results
      assert results == {
          "data": {"x": [1, 2, 5, 6], "y": [60, 50, 100, 10]}
      }
      assert source.data == {"x": [1, 2, 5, 6], "y": [60, 50, 100, 10]}
  
      assert get_table_column_cells(page.driver, table, 1) == [
          "6",
          "2",
          "1",
          "5",
      ]
      assert get_table_column_cells(page.driver, table, 2) == [
          "10",
          "50",
          "60",
          "100",
      ]
  
      assert page.has_no_console_errors()
  
imports: from __future__ import annotations
  import pytest
  from bokeh.layouts import column
  from bokeh.models import Button, ColumnDataSource, CustomJS, DataTable, NumberEditor, Plot, Range1d, Rect, TableColumn, TapTool
  from tests.support.plugins.project import BokehServerPage, SinglePlotPage
  from tests.support.util.selenium import RECORD, alt_click, enter_text_in_cell, find_element_for, get_table_cell, get_table_column_cells, get_table_row, get_table_selected_rows, shift_click, sort_table_column
label_desc: Use image node_id 8 for calling the Test_DataTableSource obj's underlying member method code with example usage: obj.test_server_sorted_after_patch(bokeh_server_page) without return types