تُرجمت هذه الصفحة آليًا وقد تحتوي على أخطاء. اقرأ الأصل الإنجليزي

العناصر

Table

يعرض Table بضعة صفوف يكتبها التطبيق على هيئة عناصر فرعية (فواتير، ملخص، مقارنة)، ويمنح قارئات الشاشة جدولاً كاملاً: الجدول نفسه، ومجموعات الصفوف، والصفوف، ورؤوس الأعمدة، والخلايا، لكل منها دوره. أجزاؤه هي TableHeader وTableBody وTableFooter (مجموعات الصفوف)، وTableRow (خلاياه جنباً إلى جنب)، وTableHead (خلية رأس العمود)، وTableCell وTableCaption. المظهر يحدده التطبيق: لا يملك أي جزء ألواناً أو حدوداً أو هوامش داخلية أو عروضاً خاصة به، ويقبل كل جزء class وstyle الخاصين بالتطبيق. أما للصفوف الكثيرة والفرز والتحديد والأعمدة القابلة لتغيير الحجم، فإن DataTable هو الجدول المناسب.

el-table.tsx
el-table.tsxLive
import { mount, Text, View } from "nsh";
import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from "nsh/base";
import { size, Stage, ui } from "./palette";

// A few rows the app writes out: the parts give screen readers a table, the
// classes and the palette give it its look.
const invoices = [
  { id: "INV001", status: "Paid", method: "Card", amount: 250 },
  { id: "INV002", status: "Pending", method: "Transfer", amount: 150 },
  { id: "INV003", status: "Unpaid", method: "Card", amount: 350 },
  { id: "INV004", status: "Paid", method: "Cash", amount: 450 },
];
const widths = ["w-24", "flex-1", "w-24", "w-24"];

function Cell(props: { i: number; head?: boolean; end?: boolean; children: string }) {
  const style = { fontSize: size.label, color: props.head ? ui().muted : ui().text, fontWeight: props.head ? ("500" as const) : ("400" as const) };
  const Part = props.head ? TableHead : TableCell;
  return (
    <Part class={`${widths[props.i]} px-3 py-2.5`}>
      <Text style={{ ...style, textAlign: props.end ? "right" : "left" }}>{props.children}</Text>
    </Part>
  );
}

function App() {
  const line = { borderBottomWidth: 1, borderColor: ui().line };
  const total = invoices.reduce((sum, i) => sum + i.amount, 0);
  return (
    <Stage width={520}>
      <View style={{ ...ui().card, borderRadius: 12, overflow: "hidden" }}>
        <Table accessibilityLabel="Recent invoices">
          <TableHeader>
            <TableRow style={line}>
              {["Invoice", "Status", "Method", "Amount"].map((title, i) => (
                <Cell i={i} head end={i === 3}>
                  {title}
                </Cell>
              ))}
            </TableRow>
          </TableHeader>
          <TableBody>
            {invoices.map((inv) => (
              <TableRow style={line}>
                <Cell i={0}>{inv.id}</Cell>
                <Cell i={1}>{inv.status}</Cell>
                <Cell i={2}>{inv.method}</Cell>
                <Cell i={3} end>{`$${inv.amount.toFixed(2)}`}</Cell>
              </TableRow>
            ))}
          </TableBody>
          <TableFooter>
            <TableRow>
              <Cell i={0} head>Total</Cell>
              <Cell i={1}>{""}</Cell>
              <Cell i={2}>{""}</Cell>
              <Cell i={3} end>{`$${total.toFixed(2)}`}</Cell>
            </TableRow>
          </TableFooter>
          <TableCaption class="px-3 py-2">
            <Text style={{ fontSize: size.detail, color: ui().muted }}>A list of your recent invoices.</Text>
          </TableCaption>
        </Table>
      </View>
    </Stage>
  );
}

mount(App);
use nsh_base::{table, table_body, table_cell, table_head, table_header, table_row, theme};
use nsh_core::prelude::*;

fn invoices() -> impl IntoElement {
    let cell = |label: &'static str| table_cell().w(px(120.0)).px_3().py_2().child(text(label));
    table()
        .accessibility_label("Recent invoices")
        .child(
            table_header().child(
                table_row()
                    .border_b_1()
                    .border_color(move || theme().border)
                    .child(table_head().w(px(120.0)).px_3().py_2().child(text("Invoice")))
                    .child(table_head().w(px(120.0)).px_3().py_2().child(text("Amount"))),
            ),
        )
        .child(table_body().child(table_row().child(cell("INV001")).child(cell("$250.00"))))
}

يأتي Table وأجزاؤه من nsh/base، وهي حزمة nsh-base في Rust، حيث تنشئها table() و table_header() وtable_body() وtable_footer() وtable_row() وtable_head() وtable_cell() و table_caption()، مع دوال الأنماط المصنّفة بالأنواع و.child(..). يعرض الصف خلاياه جنباً إلى جنب؛ ويحدد التطبيق عروض الخلايا، فتصطف الأعمدة.

#الخصائص

الخاصيةRustالنوعالافتراضيالوصف
accessibilityLabel.accessibility_label(..)stringلا شيءفي Table فقط: الاسم الذي تنطق به قارئات الشاشة للجدول.
children.child(..)JSX.Elementلا شيءما يحتويه الجزء: مجموعات وتعليق توضيحي في Table، وصفوف في المجموعة، وخلايا في الصف، ومحتوى في الخلية.
class، styleدوال الأنماطstring، StyleProp<ViewStyle>لا شيءمظهر الجزء وتخطيطه.

#الأجزاء

الجزءداخلالدور لدى قارئات الشاشة
Tableجدول
TableHeaderTableمجموعة صفوف: صفوف رؤوس الأعمدة
TableBodyTableمجموعة صفوف: صفوف البيانات
TableFooterTableمجموعة صفوف: الإجماليات، صف ملخص
TableRowمجموعة، أو Tableصف؛ خلاياه جنباً إلى جنب
TableHeadTableRow في الرأسرأس عمود
TableCellTableRowخلية
TableCaptionTableمحتوى يعرضه التطبيق حول الجدول

تمنح كل منصة الأدوار لقارئ الشاشة الخاص بها: أدوار الجدول والصف والخلية ورأس العمود على Linux (AT-SPI) والويب (ARIA) وAndroid وواجهة GPUI الخلفية؛ والشبكات والمجموعات على macOS وWindows؛ والرؤوس بوصفها رؤوساً على iOS.

#انظر أيضاً

  • DataTable: جدول بأي عدد من الصفوف والأعمدة، مع التحديد والفرز وأعمدة قابلة لتغيير الحجم والنقل.
  • إمكانية الوصول: قيم accessibilityRole وtable وrow وcell وcolumnheader وrowgroup من بينها.