Compare commits
5 commits
Author | SHA1 | Date | |
---|---|---|---|
353881dead | |||
6238d1e8b7 | |||
47a9829d9b | |||
04d28f880f | |||
6b96a85554 |
7 changed files with 864 additions and 729 deletions
|
@ -90,6 +90,6 @@ export function RemoveDemoTable()
|
|||
)
|
||||
},
|
||||
},
|
||||
}))} />
|
||||
}))} disableFilter={true} disableSort={true} />
|
||||
);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
import "@kernelui/core/lib/style.css";
|
||||
import "@kernelui/core/lib/index.css";
|
||||
import "../src/styles/smartable.less";
|
||||
|
||||
import React from "react";
|
||||
|
|
18
package.json
18
package.json
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"version": "1.0.6",
|
||||
"version": "1.1.2",
|
||||
"name": "@kernelui/smartable",
|
||||
"description": "Kernel UI Smartable.",
|
||||
"scripts": {
|
||||
|
@ -17,22 +17,22 @@
|
|||
"@kernelui:registry": "https://code.zeptotech.net/api/packages/UIKernel/npm/"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@kernelui/core": "^1.5.0",
|
||||
"@kernelui/core": "^1.8.2",
|
||||
"@phosphor-icons/react": "^2.1.7",
|
||||
"@types/node": "^22.0.0",
|
||||
"@types/react": "^18.3.3",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@vitejs/plugin-react": "^4.3.0",
|
||||
"@types/react": "^18.3.12",
|
||||
"@types/react-dom": "^18.3.1",
|
||||
"@vitejs/plugin-react": "^4.3.4",
|
||||
"less": "^4.2.0",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-router-dom": "^6.26.2",
|
||||
"react-router-dom": "^7.0.1",
|
||||
"typescript": "^5.4.5",
|
||||
"vite": "^5.2.11",
|
||||
"vite-plugin-dts": "^3.9.1"
|
||||
"vite": "^6.0.1",
|
||||
"vite-plugin-dts": "^4.3.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@kernelui/core": "^1.1.2"
|
||||
"@kernelui/core": "^1.8.2"
|
||||
},
|
||||
"packageManager": "yarn@4.5.0"
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ import {RowInstance, RowLoader} from "./Row";
|
|||
import {useAsyncManager} from "./AsyncManager";
|
||||
import {ColumnHeading} from "./Columns/ColumnHeading";
|
||||
import {sortRows} from "./Sort";
|
||||
import {AutoPaginate} from "@kernelui/core";
|
||||
import {AutoPaginate, classes} from "@kernelui/core";
|
||||
|
||||
/**
|
||||
* Smartable instance component properties.
|
||||
|
@ -66,10 +66,10 @@ export function PaginatedInstance<CK extends ColumnKey>(props: InstancePropertie
|
|||
/**
|
||||
* Base component for a Smartable table.
|
||||
*/
|
||||
export function Table<CK extends ColumnKey>({columns, children}: React.PropsWithChildren<InstanceProperties<CK>>)
|
||||
export function Table<CK extends ColumnKey>({className, columns, children}: React.PropsWithChildren<InstanceProperties<CK>>)
|
||||
{
|
||||
return (
|
||||
<table className={"smartable"}>
|
||||
<table className={classes("smartable", className)}>
|
||||
<thead>
|
||||
<ColumnsHeadings columns={columns} />
|
||||
</thead>
|
||||
|
@ -85,9 +85,12 @@ export function Table<CK extends ColumnKey>({columns, children}: React.PropsWith
|
|||
*/
|
||||
export function ColumnsHeadings<CK extends ColumnKey>({columns}: {columns: Columns<CK>})
|
||||
{
|
||||
// Get feature disable options.
|
||||
const {disableSort, disableFilter} = useTable<CK>();
|
||||
|
||||
return (
|
||||
<>
|
||||
<tr className={"headings"}>
|
||||
<tr className={classes("headings", disableSort === true ? "disable-sort" : undefined)}>
|
||||
{ // Showing title of each column.
|
||||
Object.keys(columns).map((key) => (
|
||||
<AutoColumnContextProvider key={key} columnKey={key}>
|
||||
|
@ -96,17 +99,21 @@ export function ColumnsHeadings<CK extends ColumnKey>({columns}: {columns: Colum
|
|||
))
|
||||
}
|
||||
</tr>
|
||||
<tr className={"filters"}>
|
||||
{ // Add columns filters, if there are some.
|
||||
(Object.entries(columns) as [CK, Column][]).map(([columnKey, column]) => (
|
||||
column.filter && (
|
||||
<AutoColumnContextProvider key={columnKey as string} columnKey={columnKey}>
|
||||
<td>{column.filter.element}</td>
|
||||
</AutoColumnContextProvider>
|
||||
)
|
||||
))
|
||||
}
|
||||
</tr>
|
||||
{ // Add filters if filter feature is not disabled.
|
||||
disableFilter !== true && (
|
||||
<tr className={"filters"}>
|
||||
{ // Add columns filters, if there are some.
|
||||
(Object.entries(columns) as [CK, Column][]).map(([columnKey, column]) => (
|
||||
column.filter && (
|
||||
<AutoColumnContextProvider key={columnKey as string} columnKey={columnKey}>
|
||||
<td>{column.filter.element}</td>
|
||||
</AutoColumnContextProvider>
|
||||
)
|
||||
))
|
||||
}
|
||||
</tr>
|
||||
)
|
||||
}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
|
|
@ -15,6 +15,11 @@ export type SmartableData<CK extends ColumnKey> = Promisable<(Promisable<RowDefi
|
|||
*/
|
||||
export interface SmartableProperties<CK extends ColumnKey>
|
||||
{
|
||||
/**
|
||||
* Table custom class name.
|
||||
*/
|
||||
className?: string;
|
||||
|
||||
/**
|
||||
* Table data.
|
||||
*/
|
||||
|
@ -44,6 +49,16 @@ export interface SmartableProperties<CK extends ColumnKey>
|
|||
*/
|
||||
pageSize: number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Disable sort feature.
|
||||
*/
|
||||
disableSort?: boolean;
|
||||
|
||||
/**
|
||||
* Disable filter feature.
|
||||
*/
|
||||
disableFilter?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,81 +1,89 @@
|
|||
tr.headings
|
||||
{
|
||||
th
|
||||
&.disable-sort
|
||||
{
|
||||
position: relative;
|
||||
th { pointer-events: none; }
|
||||
}
|
||||
|
||||
cursor: pointer;
|
||||
|
||||
&::before, &::after
|
||||
{ // Sorting order indicator.
|
||||
transition: height 0.2s ease, background 0.2s ease, top 0.2s ease, bottom 0.2s ease;
|
||||
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
|
||||
display: block;
|
||||
margin: auto;
|
||||
box-sizing: border-box;
|
||||
|
||||
background: var(--background-darkest);
|
||||
}
|
||||
|
||||
&::before
|
||||
&:not(.disable-sort)
|
||||
{
|
||||
th
|
||||
{
|
||||
right: calc(0.33em - 1px);
|
||||
position: relative;
|
||||
|
||||
width: 2px;
|
||||
height: 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
&::after
|
||||
{
|
||||
right: calc(0.33em - 3px);
|
||||
cursor: pointer;
|
||||
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
&::before, &::after
|
||||
{ // Sorting order indicator.
|
||||
transition: height 0.2s ease, background 0.2s ease, top 0.2s ease, bottom 0.2s ease;
|
||||
|
||||
&.asc, &.desc
|
||||
{
|
||||
&::after, &::before
|
||||
{
|
||||
background: var(--primary);
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
|
||||
display: block;
|
||||
margin: auto;
|
||||
box-sizing: border-box;
|
||||
|
||||
background: var(--background-darkest);
|
||||
}
|
||||
|
||||
&::before
|
||||
{
|
||||
height: 0.8em;
|
||||
right: calc(0.33em - 1px);
|
||||
|
||||
width: 2px;
|
||||
height: 0;
|
||||
border-radius: 2px;
|
||||
}
|
||||
}
|
||||
&::after
|
||||
{
|
||||
right: calc(0.33em - 3px);
|
||||
|
||||
&.asc::after
|
||||
{
|
||||
top: 0.5em;
|
||||
}
|
||||
&.desc::after
|
||||
{
|
||||
bottom: 0.5em;
|
||||
}
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.order
|
||||
{ // Sort order indicator.
|
||||
position: relative;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
&.asc, &.desc
|
||||
{
|
||||
&::after, &::before
|
||||
{
|
||||
background: var(--primary);
|
||||
}
|
||||
|
||||
display: block;
|
||||
margin: auto 0;
|
||||
padding: 0.3em 0.3em 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--foreground-lightest);
|
||||
font-size: 0.7em;
|
||||
&::before
|
||||
{
|
||||
height: 0.8em;
|
||||
}
|
||||
}
|
||||
|
||||
float: right;
|
||||
&.asc::after
|
||||
{
|
||||
top: 0.5em;
|
||||
}
|
||||
&.desc::after
|
||||
{
|
||||
bottom: 0.5em;
|
||||
}
|
||||
|
||||
.order
|
||||
{ // Sort order indicator.
|
||||
position: relative;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
|
||||
display: block;
|
||||
margin: auto 0;
|
||||
padding: 0.3em 0.3em 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: var(--foreground-lightest);
|
||||
font-size: 0.7em;
|
||||
|
||||
float: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue