@kanda-libs/ks-design-library-new 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -11,6 +11,7 @@ export interface TableProps<T extends StringIndexedObject<unknown>> {
11
11
  pageSize?: number;
12
12
  compact?: boolean;
13
13
  isLoading?: boolean;
14
+ query?: string;
14
15
  }
15
16
  export declare function Table<T extends StringIndexedObject<unknown>>({ compact, isLoading, ...props }: PropsWithChildren<TableProps<T>>): JSX.Element;
16
17
 
@@ -1,2 +1,2 @@
1
- import{SkeletonLoader as Z}from"@kanda-libs/ks-design-library";import{Icon as Y}from"@kanda-libs/ks-design-library";var v="flex px-3 py-1.75 h-9 -ml-3 my-auto rounded-lg bg-transparent hover:bg-neutral-100 text-style-g-em text-neutral-500 whitespace-nowrap z-20",R={icon:"chevron-down",stroke:"neutral-500",size:12,className:"ml-2 my-auto"},H={width:"calc(100% + 16px)"},u={container:{base:"w-full h-full overflow-hidden",padding:"pl-4 -ml-4"},flex:{base:"w-full h-full flex",padding:"pl-4"}};import{jsx as q,jsxs as K}from"react/jsx-runtime";var D=function({label:e,...o}){return K("button",{className:v,...o,children:[e,q(Y,{...R})]})},I=D;import L from"clsx";function g(e){let o=e===0?H:{};return{classNames:{container:L(u.container.base,e===0?u.container.padding:""),flex:L(u.flex.base,e===0?"":u.flex.padding)},containerStyle:o}}import{jsx as k}from"react/jsx-runtime";var Q=function({index:e,children:o}){let{classNames:r,containerStyle:t}=g(e);return k("div",{className:r.container,style:t,children:k("div",{className:r.flex,children:o})})},E=Q;var T={Button:I,Wrapper:E};import O from"clsx";var c={main:"flex h-14",loading:{base:"my-auto w-full mr-8",margin:"ml-4"},wrapper:{padding:"px-2 pt-2",popover:"pb-1"}};function S(e,o){return{classNames:{...c,loading:O(c.loading.base,e===0?"":c.loading.margin),wrapper:O(c.wrapper.padding,o?"":c.wrapper.popover)}}}import{jsx as b}from"react/jsx-runtime";var $=function({index:e,isLoading:o=!1,popoverButtons:r=!1,label:t,...a}){let{classNames:n}=S(e,r);return b("div",{...a,className:n.main,children:b(Z,{isLoading:o,wrapperClassName:n.loading,afterLoading:b(T.Wrapper,{index:e,children:b(T.Button,{label:t})})})})},A=$;var M={base:"h-14 border-b border-neutral-200"};function h(e,o){let{headers:r,getHeaderGroupProps:t}=e,a=t({}),n=o.filter(l=>l.isVisible).length;return{headers:r,headerGroupProps:a,totalVisible:n}}import{jsx as _}from"react/jsx-runtime";function ee({headerGroup:e,columns:o,isLoading:r}){let{headerGroupProps:t,headers:a}=h(e,o);return _("div",{...t,className:M.base,children:a.map((n,l)=>_(A,{index:l,label:n.render("Header"),isLoading:r,...n.getHeaderProps(n.getSortByToggleProps())}))})}var F=ee;import{SkeletonLoader as re}from"@kanda-libs/ks-design-library";import oe from"clsx";var i={container:"flex w-full h-full",render:"w-full my-auto text-style-g text-neutral-600 whitespace-nowrap overflow-hidden overflow-ellipsis",renderLoading:"w-full my-auto mr-8 text-style-g",cell:{base:"h-16 flex",compact:"h-8 flex",padding:"pl-4"}};function C(e,o,r){return{cell:oe(o?i.cell.compact:i.cell.base,e===0?"":i.cell.padding),container:i.container,render:r?i.renderLoading:i.render}}import{Fragment as ne,jsx as f}from"react/jsx-runtime";var te=function({render:e,index:o,compact:r=!1,isLoading:t=!1,...a}){let n=C(o,r,t);return f("div",{...a,className:n.cell,children:f("div",{className:n.container,children:f("div",{className:n.render,children:f(re,{isLoading:t,afterLoading:f(ne,{children:e()})})})})})},G=te;import{useClasses as ae}from"@kanda-libs/ks-design-library";var W={base:"relative h-16",compact:"relative h-8",border:"border-b border-neutral-200",hover:"group hover:bg-neutral-50 cursor-pointer",button:"hidden group-hover:block"};function P(e){return ae(W,{base:[".base",e===9?"":".border",".hover"],button:[".button"]})}import{jsx as B}from"react/jsx-runtime";function se({cells:e,index:o,compact:r=!1,isLoading:t=!1,...a}){let n=P(o);return console.log({props:a}),B("div",{...a,className:r?n.compact:n.base,children:e.map((l,p)=>B(G,{...l.getCellProps(),index:p,isLoading:t,render:()=>l.render("Cell")}))})}var j=se;import{useCallback as z,useState as le}from"react";function w(e){let[o,r]=le(""),t=z(n=>{r(n.currentTarget.value)},[r]),a=z(()=>{e(o)},[o,e]);return{search:o,onChange:t,onSubmit:a}}import{jsx as y,jsxs as ie}from"react/jsx-runtime";var pe=function({onSearch:e}){let{search:o,onChange:r,onSubmit:t}=w(e);return ie("div",{className:"flex flex-row gap-x-2",children:[y("span",{children:"Search:"}),y("input",{type:"text",value:o,onChange:r}),y("button",{onClick:t,children:"Search"})]})},V=pe;import{useTable as ue,useGlobalFilter as fe,usePagination as be,useSortBy as xe,useFlexLayout as ge}from"react-table";import ce from"fuse.js";var de=(e,o)=>e.filter(r=>Object.values(r.values).join(", ").toLowerCase().includes(o.toLowerCase())),U=(e,o)=>e.filter(({id:r})=>o.filter(t=>t.id===r).length===0),me=(e,o,r,t,a)=>{let n=e.map(s=>s.values),d=new ce(n,{keys:r.map(s=>({name:s,getFn:m=>m[s]}))}).search(o).map(({item:s})=>s).slice(0,t).map(s=>e.find(m=>m.values.cid===s.cid)).filter(Boolean);return U(d,a)},J=(e,o,r,t=10)=>{if(r.length<1)return e;let a=de(e,r).slice(0,t),n=U(e,a),l=me(n,r,o,t-a.length,a),p=[...a,...l];return e.map(({id:d})=>p.find(s=>s.id===d)).filter(Boolean)};function N({columns:e,data:o,pageSize:r=10}){let t=ue({columns:e,data:o,initialState:{pageSize:10,pageIndex:0},autoResetGlobalFilter:!1,globalFilter:(n,l,p)=>J(n,l,p,r)},fe,xe,be,ge);return{onSearch:n=>{t.setGlobalFilter(n)},...t}}import{Fragment as he,jsx as x,jsxs as X}from"react/jsx-runtime";function Te({compact:e=!1,isLoading:o=!1,...r}){let{onSearch:t,page:a,prepareRow:n,columns:l,getTableProps:p,headerGroups:d}=N(r);return X(he,{children:[x(V,{onSearch:s=>{t(s)}}),X("div",{...p(),className:"w-full",children:[x("div",{children:d.map(s=>x(F,{headerGroup:s,columns:l,isLoading:o}))}),a.map((s,m)=>(n(s),x(j,{...s.getRowProps(),index:m,cells:s.cells,compact:e,isLoading:o})))]})]})}var Se=Te;export{Se as Table};
1
+ import{Pagination as Ce}from"@kanda-libs/ks-design-library";import{SkeletonLoader as Z}from"@kanda-libs/ks-design-library";import{useIsDesktop as X}from"@kanda-libs/ks-design-library";function u(e){if(!e)return{};let o=X();return{...e,width:o?e==null?void 0:e.width:"100%"}}import{Icon as Y}from"@kanda-libs/ks-design-library";var R="flex px-3 py-1.75 h-9 -ml-3 my-auto rounded-lg bg-transparent hover:bg-neutral-100 text-style-g-em text-neutral-500 whitespace-nowrap z-20",N={icon:"chevron-down",stroke:"neutral-500",size:12,className:"ml-2 my-auto"},H={width:"calc(100% + 16px)"},f={container:{base:"w-full h-full overflow-hidden",padding:"pl-4 -ml-4"},flex:{base:"w-full h-full md:flex px-4 md:px-0",padding:"md:pl-4"}};import{jsx as q,jsxs as K}from"react/jsx-runtime";var $=function({label:e,...o}){return K("button",{className:R,...o,children:[e,q(Y,{...N})]})},v=$;import L from"clsx";function T(e){let o=e===0?H:{};return{classNames:{container:L(f.container.base,e===0?f.container.padding:""),flex:L(f.flex.base,e===0?"":f.flex.padding)},containerStyle:o}}import{jsx as k}from"react/jsx-runtime";var Q=function({index:e,children:o}){let{classNames:t,containerStyle:r}=T(e);return k("div",{className:t.container,style:r,children:k("div",{className:t.flex,children:o})})},I=Q;var P={Button:v,Wrapper:I};import O from"clsx";var m={main:"flex md:h-14",loading:{base:"my-auto w-full mr-8",margin:"ml-4"},wrapper:{padding:"md:px-2 md:pt-2",popover:"pb-1"}};function S(e,o){return{classNames:{...m,loading:O(m.loading.base,e===0?"":m.loading.margin),wrapper:O(m.wrapper.padding,o?"":m.wrapper.popover)}}}import{jsx as g}from"react/jsx-runtime";var ee=function({index:e,isLoading:o=!1,popoverButtons:t=!1,label:r,...n}){let{classNames:a}=S(e,t),{style:s,...p}=n,i=u(s);return g("div",{...p,style:i,className:a.main,children:g(Z,{isLoading:o,wrapperClassName:a.loading,afterLoading:g(P.Wrapper,{index:e,children:g(P.Button,{label:r})})})})},M=ee;var E={base:"flex-col md:flex-row md:h-14 hidden lg:block border-b border-neutral-200"};function C(e,o){let{headers:t,getHeaderGroupProps:r}=e,n=r({}),a=o.filter(s=>s.isVisible).length;return{headers:t,headerGroupProps:n,totalVisible:a}}import{jsx as A}from"react/jsx-runtime";function oe({headerGroup:e,columns:o,isLoading:t}){let{headerGroupProps:r,headers:n}=C(e,o);return A("div",{...r,className:E.base,children:n.map((a,s)=>A(M,{index:s,label:a.render("Header"),isLoading:t,...a.getHeaderProps(a.getSortByToggleProps())}))})}var _=oe;import{SkeletonLoader as re,Text as ne}from"@kanda-libs/ks-design-library";import te from"clsx";var d={container:"flex w-full h-full",render:"w-full my-auto text-style-g text-neutral-600 whitespace-nowrap overflow-hidden overflow-ellipsis",renderLoading:"w-full my-auto mr-8 text-style-g",mobileLabel:"block md:hidden text-16-24-em text-neutral-600 mr-2",cell:{base:"px-4 py-1 md:pt-0 md:pr-0 md:pb-0 md:h-16 flex",compact:"h-8 flex",padding:"md:pl-4"}};function y(e,o,t){return{cell:te(o?d.cell.compact:d.cell.base,e===0?"":d.cell.padding),container:d.container,render:t?d.renderLoading:d.render,mobileLabel:d.mobileLabel}}import{Fragment as se,jsx as b,jsxs as le}from"react/jsx-runtime";var ae=function({render:e,index:o,compact:t=!1,isLoading:r=!1,label:n,...a}){let s=y(o,t,r),{style:p,...i}=a,l=u(p);return b("div",{...i,style:l,className:s.cell,children:b("div",{className:s.container,children:b("div",{className:s.render,children:b(re,{isLoading:r,afterLoading:le(se,{children:[b(ne,{text:`${n}:`,className:s.mobileLabel}),e()]})})})})})},W=ae;import{useClasses as pe}from"@kanda-libs/ks-design-library";var F={base:"relative md:h-16 flex-col py-2 md:py-0 md:flex-row",compact:"relative h-8",border:"border-b border-neutral-200",hover:"group hover:bg-neutral-50 cursor-pointer",button:"hidden group-hover:block"};function w(e){return pe(F,{base:[".base",e===9?"":".border",".hover"],button:[".button"]})}import{jsx as G}from"react/jsx-runtime";function ie({cells:e,index:o,compact:t=!1,isLoading:r=!1,...n}){let a=w(o);return G("div",{...n,className:t?a.compact:a.base,children:e.map((s,p)=>G(W,{...s.getCellProps(),index:p,isLoading:r,render:()=>s.render("Cell"),label:s.column.Header}))})}var j=ie;import{Fragment as me,jsx as B}from"react/jsx-runtime";function de({page:e,prepareRow:o,isLoading:t=!1,compact:r=!1}){return B(me,{children:e.map((n,a)=>(o(n),B(j,{...n.getRowProps(),index:a,cells:n.cells,isLoading:t,compact:r})))})}var z=de;import{useTable as be,useGlobalFilter as xe,usePagination as ge,useSortBy as Te,useFlexLayout as Pe}from"react-table";import ce from"fuse.js";var ue=(e,o)=>e.filter(t=>Object.values(t.values).join(", ").toLowerCase().includes(o.toLowerCase())),V=(e,o)=>e.filter(({id:t})=>o.filter(r=>r.id===t).length===0),fe=(e,o,t,r,n)=>{let a=e.map(l=>l.values),i=new ce(a,{keys:t.map(l=>({name:l,getFn:c=>c[l]}))}).search(o).map(({item:l})=>l).slice(0,r).map(l=>e.find(c=>c.values.cid===l.cid)).filter(Boolean);return V(i,n)},D=(e,o,t,r=10)=>{if(t.length<1)return e;let n=ue(e,t).slice(0,r),a=V(e,n),s=fe(a,t,o,r-n.length,n),p=[...n,...s];return e.map(({id:i})=>p.find(l=>l.id===i)).filter(Boolean)};import{useEffect as Se}from"react";function h({columns:e,data:o,pageSize:t=10,query:r=""}){let n=be({columns:e,data:o,initialState:{pageSize:10,pageIndex:0},autoResetGlobalFilter:!1,globalFilter:(l,c,J)=>D(l,c,J,t)},xe,Te,ge,Pe),{gotoPage:a,pageCount:s,state:{pageIndex:p}}=n,i={pageCount:s,pageIndex:p,setPage:l=>{a(l)}};return Se(()=>{n.setGlobalFilter(r)},[r]),{paginationProps:i,...n}}import{Fragment as he,jsx as x,jsxs as U}from"react/jsx-runtime";function ye({compact:e=!1,isLoading:o=!1,...t}){let{page:r,prepareRow:n,columns:a,getTableProps:s,headerGroups:p,paginationProps:i}=h(t);return U(he,{children:[U("div",{...s(),className:"w-full",children:[x("div",{children:p.map(l=>x(_,{headerGroup:l,columns:a,isLoading:o}))}),x(z,{page:r,prepareRow:n,isLoading:o,compact:e})]}),x("div",{className:"px-4 py-2",children:x(Ce,{...i})})]})}var we=ye;export{we as Table};
2
2
  //# sourceMappingURL=index.esm.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/components/Table/components/HeaderColumn/index.tsx", "../src/components/Table/components/HeaderButton/Button.tsx", "../src/components/Table/components/HeaderButton/constants.ts", "../src/components/Table/components/HeaderButton/useWrapperProps.ts", "../src/components/Table/components/HeaderButton/Wrapper.tsx", "../src/components/Table/components/HeaderButton/index.tsx", "../src/components/Table/components/HeaderColumn/useHeaderColumnProps.ts", "../src/components/Table/components/HeaderColumn/constants.ts", "../src/components/Table/components/HeaderGroup/constants.ts", "../src/components/Table/components/HeaderGroup/useHeaderGroupProps.ts", "../src/components/Table/components/HeaderGroup/index.tsx", "../src/components/Table/components/Cell/index.tsx", "../src/components/Table/components/Cell/useCellClassNames.ts", "../src/components/Table/components/Cell/constants.ts", "../src/components/Table/components/Row/useRowClassNames.ts", "../src/components/Table/components/Row/constants.ts", "../src/components/Table/components/Row/index.tsx", "../src/components/Table/components/SearchInput/useSearchInput.ts", "../src/components/Table/components/SearchInput/index.tsx", "../src/components/Table/useTableProps.ts", "../src/components/Table/helpers/search.ts", "../src/components/Table/index.tsx"],
4
- "sourcesContent": ["import { SkeletonLoader } from '@kanda-libs/ks-design-library';\nimport type { FunctionComponent, ReactNode } from 'react';\nimport type { TableHeaderProps } from 'react-table';\nimport HeaderButton from '../HeaderButton';\nimport useHeaderColumnProps from './useHeaderColumnProps';\n\nexport interface HeaderColumnProps extends TableHeaderProps {\n index: number;\n isLoading?: boolean;\n popoverButtons?: boolean;\n label: ReactNode;\n}\n\nconst HeaderColumn: FunctionComponent<HeaderColumnProps> = function ({\n index,\n isLoading = false,\n popoverButtons = false,\n label,\n ...props\n}) {\n const { classNames } = useHeaderColumnProps(index, popoverButtons);\n\n return (\n <div {...props} className={classNames.main}>\n <SkeletonLoader\n isLoading={isLoading}\n wrapperClassName={classNames.loading}\n afterLoading={\n <HeaderButton.Wrapper index={index}>\n <HeaderButton.Button label={label} />\n </HeaderButton.Wrapper>\n }\n />\n </div>\n );\n};\n\nexport default HeaderColumn;\n", "import type { FunctionComponent, HTMLAttributes, ReactNode } from 'react';\nimport { Icon } from '@kanda-libs/ks-design-library';\nimport { BUTTON_CLASS_NAMES, ICON_PROPS } from './constants';\n\nexport interface ButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: ReactNode;\n}\n\nconst Button: FunctionComponent<ButtonProps> = function ({ label, ...props }) {\n return (\n <button className={BUTTON_CLASS_NAMES} {...props}>\n {label}\n <Icon {...ICON_PROPS} />\n </button>\n );\n};\n\nexport default Button;\n", "export const BUTTON_CLASS_NAMES =\n 'flex px-3 py-1.75 h-9 -ml-3 my-auto rounded-lg bg-transparent hover:bg-neutral-100 text-style-g-em text-neutral-500 whitespace-nowrap z-20';\n\nexport const ICON_PROPS = {\n icon: 'chevron-down',\n stroke: 'neutral-500',\n size: 12,\n className: 'ml-2 my-auto',\n};\n\nexport const WRAPPER_STYLE = {\n width: 'calc(100% + 16px)',\n};\n\nexport const WRAPPER_CLASS_NAMES = {\n container: {\n base: 'w-full h-full overflow-hidden',\n padding: 'pl-4 -ml-4',\n },\n flex: {\n base: 'w-full h-full flex',\n padding: 'pl-4',\n },\n};\n", "import type { CSSProperties } from 'react';\nimport clsx from 'clsx';\nimport { WRAPPER_STYLE, WRAPPER_CLASS_NAMES } from './constants';\n\nexport interface WrapperPropsHook {\n classNames: {\n container: string;\n flex: string;\n };\n containerStyle: CSSProperties;\n}\n\nexport default function useWrapperProps(index: number): WrapperPropsHook {\n const containerStyle = index === 0 ? WRAPPER_STYLE : {};\n\n const classNames = {\n container: clsx(\n WRAPPER_CLASS_NAMES.container.base,\n index === 0 ? WRAPPER_CLASS_NAMES.container.padding : '',\n ),\n flex: clsx(\n WRAPPER_CLASS_NAMES.flex.base,\n index === 0 ? '' : WRAPPER_CLASS_NAMES.flex.padding,\n ),\n };\n\n return {\n classNames,\n containerStyle,\n };\n}\n", "import type { FunctionComponent } from 'react';\nimport useWrapperProps from './useWrapperProps';\n\nexport interface WrapperProps {\n index: number;\n children?: JSX.Element | JSX.Element[];\n}\n\nconst Wrapper: FunctionComponent<WrapperProps> = function ({\n index,\n children,\n}) {\n const { classNames, containerStyle } = useWrapperProps(index);\n\n return (\n <div className={classNames.container} style={containerStyle}>\n <div className={classNames.flex}>{children}</div>\n </div>\n );\n};\n\nexport default Wrapper;\n", "import Button from './Button';\nimport Wrapper from './Wrapper';\n\nexport default {\n Button,\n Wrapper,\n};\n", "import clsx from 'clsx';\nimport { CLASS_NAMES } from './constants';\n\nexport interface HeaderColumnPropsHook {\n classNames: {\n main: string;\n loading: string;\n wrapper: string;\n };\n}\n\nexport default function useHeaderColumnProps(\n index: number,\n popoverButtons: boolean,\n): HeaderColumnPropsHook {\n const classNames = {\n ...CLASS_NAMES,\n loading: clsx(\n CLASS_NAMES.loading.base,\n index === 0 ? '' : CLASS_NAMES.loading.margin,\n ),\n wrapper: clsx(\n CLASS_NAMES.wrapper.padding,\n popoverButtons ? '' : CLASS_NAMES.wrapper.popover,\n ),\n };\n\n return {\n classNames,\n };\n}\n", "export const CLASS_NAMES = {\n main: 'flex h-14',\n loading: {\n base: 'my-auto w-full mr-8',\n margin: 'ml-4',\n },\n wrapper: {\n padding: 'px-2 pt-2',\n popover: 'pb-1',\n },\n};\n\nexport const MOVE_LEFT_ITEM_PROPS = {\n name: 'Move column left',\n icon: 'arrow-left',\n};\n\nexport const MOVE_RIGHT_ITEM_PROPS = {\n name: 'Move column right',\n icon: 'arrow-right',\n};\n\nexport const HIDE_COLUMN_PROPS = {\n name: 'Hide column',\n icon: 'eye-off',\n};\n", "export const CLASS_NAMES = {\n base: 'h-14 border-b border-neutral-200',\n};\n", "import type {\n ColumnInstance,\n HeaderGroup,\n TableHeaderProps,\n} from 'react-table';\n\nexport interface HeaderGroupPropsHook<T extends Object> {\n headers: ColumnInstance<T>[];\n headerGroupProps: TableHeaderProps;\n totalVisible: number;\n}\n\nexport default function useHeaderGroupProps<T extends Object>(\n headerGroup: HeaderGroup<T>,\n columns: ColumnInstance<T>[],\n): HeaderGroupPropsHook<T> {\n const { headers, getHeaderGroupProps } = headerGroup;\n const headerGroupProps = getHeaderGroupProps({});\n\n const totalVisible = columns.filter((column) => column.isVisible).length;\n\n return {\n headers,\n headerGroupProps,\n totalVisible,\n };\n}\n", "import type { PropsWithChildren } from 'react';\nimport type {\n ColumnInstance,\n HeaderGroup as HeaderGroupType,\n} from 'react-table';\nimport HeaderColumn from '../HeaderColumn';\nimport { CLASS_NAMES } from './constants';\nimport useHeaderGroupProps from './useHeaderGroupProps';\n\nexport interface HeaderGroupProps<T extends Object> {\n headerGroup: HeaderGroupType<T>;\n columns: ColumnInstance<T>[];\n isLoading?: boolean;\n}\n\nfunction HeaderGroup<T extends Object>({\n headerGroup,\n columns,\n isLoading,\n}: PropsWithChildren<HeaderGroupProps<T>>) {\n const { headerGroupProps, headers } = useHeaderGroupProps(\n headerGroup,\n columns,\n );\n\n return (\n <div {...headerGroupProps} className={CLASS_NAMES.base}>\n {headers.map((column, index) => (\n <HeaderColumn\n index={index}\n label={column.render('Header')}\n isLoading={isLoading}\n {...column.getHeaderProps(column.getSortByToggleProps())}\n />\n ))}\n </div>\n );\n}\n\nexport default HeaderGroup;\n", "import type { FunctionComponent, ReactNode } from 'react';\nimport type { TableCellProps } from 'react-table';\nimport { SkeletonLoader } from '@kanda-libs/ks-design-library';\nimport useCellClassNames from './useCellClassNames';\n\nexport interface CellProps extends TableCellProps {\n index: number;\n render: () => ReactNode;\n compact?: boolean;\n isLoading?: boolean;\n}\n\nconst Cell: FunctionComponent<CellProps> = function ({\n render,\n index,\n compact = false,\n isLoading = false,\n ...props\n}) {\n const classNames = useCellClassNames(index, compact, isLoading);\n\n return (\n <div {...props} className={classNames.cell}>\n <div className={classNames.container}>\n <div className={classNames.render}>\n <SkeletonLoader\n isLoading={isLoading}\n afterLoading={<>{render()}</>}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default Cell;\n", "import clsx from 'clsx';\nimport { CLASS_NAMES } from './constants';\n\nexport type CellClassNamesHook = {\n cell: string;\n container: string;\n render: string;\n};\n\nexport default function useCellClassNames(\n index: number,\n compact: boolean,\n isLoading: boolean,\n): CellClassNamesHook {\n return {\n cell: clsx(\n compact ? CLASS_NAMES.cell.compact : CLASS_NAMES.cell.base,\n index === 0 ? '' : CLASS_NAMES.cell.padding,\n ),\n container: CLASS_NAMES.container,\n render: isLoading ? CLASS_NAMES.renderLoading : CLASS_NAMES.render,\n };\n}\n", "export const CLASS_NAMES = {\n container: 'flex w-full h-full',\n render:\n 'w-full my-auto text-style-g text-neutral-600 whitespace-nowrap overflow-hidden overflow-ellipsis',\n renderLoading: 'w-full my-auto mr-8 text-style-g',\n cell: {\n base: 'h-16 flex',\n compact: 'h-8 flex',\n padding: 'pl-4',\n },\n};\n", "import { useClasses } from '@kanda-libs/ks-design-library';\nimport { CLASS_NAMES } from './constants';\n\nexport interface RowClassNamesHook {\n base: string;\n compact: string;\n border: string;\n hover: string;\n button: string;\n}\n\nexport default function useRowClassNames(index: number): RowClassNamesHook {\n const classNames = useClasses(CLASS_NAMES, {\n base: ['.base', index === 9 ? '' : '.border', '.hover'],\n button: ['.button'],\n });\n\n return classNames as RowClassNamesHook;\n}\n", "export const CLASS_NAMES = {\n base: 'relative h-16',\n compact: 'relative h-8',\n border: 'border-b border-neutral-200',\n hover: 'group hover:bg-neutral-50 cursor-pointer',\n button: 'hidden group-hover:block',\n};\n", "import type { PropsWithChildren } from 'react';\nimport type { Row as RowType, TableRowProps } from 'react-table';\nimport Cell from '../Cell';\nimport useRowClassNames from './useRowClassNames';\n\nexport interface RowProps<T extends Object> extends TableRowProps {\n cells: RowType<T>['cells'];\n index: number;\n compact?: boolean;\n isLoading?: boolean;\n}\n\nfunction Row<T extends Object>({\n cells,\n index,\n compact = false,\n isLoading = false,\n ...props\n}: PropsWithChildren<RowProps<T>>) {\n const classNames = useRowClassNames(index);\n\n console.log({\n props,\n });\n\n return (\n <div {...props} className={compact ? classNames.compact : classNames.base}>\n {cells.map((cell, cellIndex) => (\n <Cell\n {...cell.getCellProps()}\n index={cellIndex}\n isLoading={isLoading}\n render={() => cell.render('Cell')}\n />\n ))}\n </div>\n );\n}\n\nexport default Row;\n", "import { FormEvent, useCallback, useState } from 'react';\n\nexport interface SearchInputHook {\n search: string;\n onChange: (e: FormEvent<HTMLInputElement>) => void;\n onSubmit: () => void;\n}\n\nexport default function useSearchInput(\n onSearch: (search: string) => void,\n): SearchInputHook {\n const [search, setSearch] = useState('');\n\n const onChange = useCallback(\n (e: FormEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n },\n [setSearch],\n );\n\n const onSubmit = useCallback(() => {\n onSearch(search);\n }, [search, onSearch]);\n\n return {\n search,\n onChange,\n onSubmit,\n };\n}\n", "import type { FunctionComponent } from 'react';\nimport useSearchInput from './useSearchInput';\n\nexport interface SearchInputProps {\n onSearch: (search: string) => void;\n}\n\nconst SearchInput: FunctionComponent<SearchInputProps> = function ({\n onSearch,\n}) {\n const { search, onChange, onSubmit } = useSearchInput(onSearch);\n\n return (\n <div className=\"flex flex-row gap-x-2\">\n <span>Search:</span>\n <input type=\"text\" value={search} onChange={onChange} />\n <button onClick={onSubmit}>Search</button>\n </div>\n );\n};\n\nexport default SearchInput;\n", "import type { TableInstance, Row } from '../../@types/index';\nimport {\n useTable,\n useGlobalFilter,\n usePagination,\n useSortBy,\n useFlexLayout,\n type IdType,\n TableOptions,\n} from 'react-table';\nimport type { TableProps } from '.';\nimport { globalFilter } from './helpers/search';\nimport type { StringIndexedObject } from '@kanda-libs/ks-design-library';\n\nexport interface TablePropsHook<T extends StringIndexedObject<unknown>>\n extends TableInstance<T> {\n onSearch: (value: string) => void;\n}\n\nexport default function useTableProps<T extends StringIndexedObject<unknown>>({\n columns,\n data,\n pageSize = 10,\n}: TableProps<T>): TablePropsHook<T> {\n const table = useTable<T>(\n {\n columns,\n data,\n initialState: {\n pageSize: 10,\n pageIndex: 0,\n },\n autoResetGlobalFilter: false,\n globalFilter: (\n rows: Row<T>[],\n searchKeys: IdType<T>[],\n filterValue: string,\n ) => globalFilter(rows, searchKeys, filterValue, pageSize),\n } as unknown as TableOptions<T>,\n useGlobalFilter,\n useSortBy,\n usePagination,\n useFlexLayout,\n );\n\n const onSearch = (search: string) => {\n table.setGlobalFilter(search);\n };\n\n return {\n onSearch,\n ...table,\n };\n}\n", "import type { IdType } from 'react-table';\nimport type { Row } from '../../../@types/index';\nimport Fuse from 'fuse.js';\nimport type { StringIndexedObject } from '~/types';\n\nconst exactMatchSearch = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n filterValue: string,\n) => {\n return rows.filter((row) => {\n // Take all values from the row, and add them together in a string\n // for the purposes of searching\n const rowValues = Object.values(row.values).join(', ');\n\n return rowValues.toLowerCase().includes(filterValue.toLowerCase());\n });\n};\n\nconst excludeExactMatches = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n exactMatchRows: Row<T>[],\n) =>\n rows.filter(\n ({ id }) => exactMatchRows.filter((p) => p.id === id).length === 0,\n );\n\nconst fuzzySearch = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n filterValue: string,\n searchKeys: string[],\n numberOfRows: number,\n exactMatchRows: Row<T>[],\n): Row<T>[] => {\n const currentRows = rows.map((row) => {\n return row.values;\n });\n\n const fuse = new Fuse(currentRows, {\n keys: searchKeys.map((key) => ({\n name: key,\n // Because FuseJS allows for dot notation,\n // we need to use a function to get the value\n // as the object returned from the table is flat,\n // rather than nested\n getFn: (obj: StringIndexedObject) => obj[key],\n })),\n });\n\n const results = fuse\n .search(filterValue)\n .map(({ item }) => item)\n .slice(0, numberOfRows);\n\n const filteredResults = results\n .map((result) => rows.find((row) => row.values.cid === result.cid))\n .filter(Boolean) as Row<T>[];\n\n return excludeExactMatches(filteredResults, exactMatchRows);\n};\n\nexport const globalFilter = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n searchKeys: IdType<T>[],\n filterValue: string,\n pageSize = 10,\n): Row<T>[] => {\n if (filterValue.length < 1) {\n return rows;\n }\n\n // Get the first 10 exact matches. The reason for this is that exact matching\n // should take presedence over fuzzy matching. An exact match is more useful\n // but also less expensive to compute. So there's no need to do a fuzzy search\n // if there are >= 10 exact matches.\n const exactMatches = exactMatchSearch(rows, filterValue).slice(0, pageSize);\n const currentRowsExcludingExactMatches = excludeExactMatches(\n rows,\n exactMatches,\n );\n\n const fuzzyMatches = fuzzySearch(\n currentRowsExcludingExactMatches,\n filterValue,\n searchKeys,\n pageSize - exactMatches.length,\n exactMatches,\n );\n\n const results = [...exactMatches, ...fuzzyMatches];\n\n // Return the rows in the same order as the original rows\n // to preserve sorting, which happens before fuzzy matching\n return rows\n .map(({ id }) => results.find((row) => row.id === id))\n .filter(Boolean) as Row<T>[];\n};\n", "import type { StringIndexedObject } from '@kanda-libs/ks-design-library';\nimport type { FunctionComponent, PropsWithChildren } from 'react';\nimport type { Column } from 'react-table';\nimport HeaderGroup from './components/HeaderGroup';\nimport Row from './components/Row';\nimport SearchInput from './components/SearchInput';\nimport useTableProps from './useTableProps';\n\nexport interface TableProps<T extends StringIndexedObject<unknown>> {\n columns: Readonly<Column<T>[]>;\n data: T[];\n filter?: string;\n pageSize?: number;\n compact?: boolean;\n isLoading?: boolean;\n}\n\nexport type TableFunctionComponent<\n T extends StringIndexedObject<unknown> = any,\n> = FunctionComponent<TableProps<T>>;\n\nfunction Table<T extends StringIndexedObject<unknown>>({\n compact = false,\n isLoading = false,\n ...props\n}: PropsWithChildren<TableProps<T>>) {\n const { onSearch, page, prepareRow, columns, getTableProps, headerGroups } =\n useTableProps(props);\n\n return (\n <>\n <SearchInput\n onSearch={(currentSearch) => {\n onSearch(currentSearch);\n }}\n />\n <div {...getTableProps()} className=\"w-full\">\n <div>\n {headerGroups.map((headerGroup) => (\n <HeaderGroup\n headerGroup={headerGroup}\n columns={columns}\n isLoading={isLoading}\n />\n ))}\n </div>\n {page.map((row, index) => {\n prepareRow(row);\n return (\n <Row\n {...row.getRowProps()}\n index={index}\n cells={row.cells}\n compact={compact}\n isLoading={isLoading}\n />\n );\n })}\n </div>\n </>\n );\n}\n\nexport default Table;\n"],
5
- "mappings": "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",
6
- "names": ["SkeletonLoader", "Icon", "BUTTON_CLASS_NAMES", "ICON_PROPS", "WRAPPER_STYLE", "WRAPPER_CLASS_NAMES", "jsx", "jsxs", "Button", "label", "props", "BUTTON_CLASS_NAMES", "Icon", "ICON_PROPS", "Button_default", "clsx", "useWrapperProps", "index", "containerStyle", "WRAPPER_STYLE", "clsx", "WRAPPER_CLASS_NAMES", "jsx", "Wrapper", "index", "children", "classNames", "containerStyle", "useWrapperProps", "Wrapper_default", "HeaderButton_default", "Button_default", "Wrapper_default", "clsx", "CLASS_NAMES", "useHeaderColumnProps", "index", "popoverButtons", "CLASS_NAMES", "clsx", "jsx", "HeaderColumn", "index", "isLoading", "popoverButtons", "label", "props", "classNames", "useHeaderColumnProps", "SkeletonLoader", "HeaderButton_default", "HeaderColumn_default", "CLASS_NAMES", "useHeaderGroupProps", "headerGroup", "columns", "headers", "getHeaderGroupProps", "headerGroupProps", "totalVisible", "column", "jsx", "HeaderGroup", "headerGroup", "columns", "isLoading", "headerGroupProps", "headers", "useHeaderGroupProps", "CLASS_NAMES", "column", "index", "HeaderColumn_default", "HeaderGroup_default", "SkeletonLoader", "clsx", "CLASS_NAMES", "useCellClassNames", "index", "compact", "isLoading", "clsx", "CLASS_NAMES", "Fragment", "jsx", "Cell", "render", "index", "compact", "isLoading", "props", "classNames", "useCellClassNames", "SkeletonLoader", "Cell_default", "useClasses", "CLASS_NAMES", "useRowClassNames", "index", "useClasses", "CLASS_NAMES", "jsx", "Row", "cells", "index", "compact", "isLoading", "props", "classNames", "useRowClassNames", "cell", "cellIndex", "Cell_default", "Row_default", "useCallback", "useState", "useSearchInput", "onSearch", "search", "setSearch", "onChange", "e", "onSubmit", "jsx", "jsxs", "SearchInput", "onSearch", "search", "onChange", "onSubmit", "useSearchInput", "SearchInput_default", "useTable", "useGlobalFilter", "usePagination", "useSortBy", "useFlexLayout", "Fuse", "exactMatchSearch", "rows", "filterValue", "row", "excludeExactMatches", "exactMatchRows", "id", "p", "fuzzySearch", "searchKeys", "numberOfRows", "currentRows", "filteredResults", "key", "obj", "item", "result", "globalFilter", "pageSize", "exactMatches", "currentRowsExcludingExactMatches", "fuzzyMatches", "results", "useTableProps", "columns", "data", "pageSize", "table", "useTable", "rows", "searchKeys", "filterValue", "globalFilter", "useGlobalFilter", "useSortBy", "usePagination", "useFlexLayout", "search", "Fragment", "jsx", "jsxs", "Table", "compact", "isLoading", "props", "onSearch", "page", "prepareRow", "columns", "getTableProps", "headerGroups", "useTableProps", "SearchInput_default", "currentSearch", "headerGroup", "HeaderGroup_default", "row", "index", "Row_default", "Table_default"]
3
+ "sources": ["../src/components/Table/index.tsx", "../src/components/Table/components/HeaderColumn/index.tsx", "../src/hooks/useMobileFullWidthCellStyle.ts", "../src/components/Table/components/HeaderButton/Button.tsx", "../src/components/Table/components/HeaderButton/constants.ts", "../src/components/Table/components/HeaderButton/useWrapperProps.ts", "../src/components/Table/components/HeaderButton/Wrapper.tsx", "../src/components/Table/components/HeaderButton/index.tsx", "../src/components/Table/components/HeaderColumn/useHeaderColumnProps.ts", "../src/components/Table/components/HeaderColumn/constants.ts", "../src/components/Table/components/HeaderGroup/constants.ts", "../src/components/Table/components/HeaderGroup/useHeaderGroupProps.ts", "../src/components/Table/components/HeaderGroup/index.tsx", "../src/components/Table/components/Cell/index.tsx", "../src/components/Table/components/Cell/useCellClassNames.ts", "../src/components/Table/components/Cell/constants.ts", "../src/components/Table/components/Row/useRowClassNames.ts", "../src/components/Table/components/Row/constants.ts", "../src/components/Table/components/Row/index.tsx", "../src/components/Table/components/Pages/index.tsx", "../src/components/Table/useTableProps.ts", "../src/components/Table/helpers/search.ts"],
4
+ "sourcesContent": ["import {\n Pagination,\n type StringIndexedObject,\n} from '@kanda-libs/ks-design-library';\nimport type { FunctionComponent, PropsWithChildren } from 'react';\nimport type { Column } from 'react-table';\nimport HeaderGroup from './components/HeaderGroup';\nimport Pages from './components/Pages';\nimport useTableProps from './useTableProps';\n\nexport interface TableProps<T extends StringIndexedObject<unknown>> {\n columns: Readonly<Column<T>[]>;\n data: T[];\n filter?: string;\n pageSize?: number;\n compact?: boolean;\n isLoading?: boolean;\n query?: string;\n}\n\nexport type TableFunctionComponent<\n T extends StringIndexedObject<unknown> = any,\n> = FunctionComponent<TableProps<T>>;\n\nfunction Table<T extends StringIndexedObject<unknown>>({\n compact = false,\n isLoading = false,\n ...props\n}: PropsWithChildren<TableProps<T>>) {\n const {\n page,\n prepareRow,\n columns,\n getTableProps,\n headerGroups,\n paginationProps,\n } = useTableProps(props);\n\n return (\n <>\n <div {...getTableProps()} className=\"w-full\">\n <div>\n {headerGroups.map((headerGroup) => (\n <HeaderGroup\n headerGroup={headerGroup}\n columns={columns}\n isLoading={isLoading}\n />\n ))}\n </div>\n <Pages\n page={page}\n prepareRow={prepareRow}\n isLoading={isLoading}\n compact={compact}\n />\n </div>\n <div className=\"px-4 py-2\">\n <Pagination {...paginationProps} />\n </div>\n </>\n );\n}\n\nexport default Table;\n", "import { SkeletonLoader } from '@kanda-libs/ks-design-library';\nimport type { FunctionComponent, ReactNode } from 'react';\nimport type { TableHeaderProps } from 'react-table';\nimport useMobileFullWidthCellStyle from '~/hooks/useMobileFullWidthCellStyle';\nimport HeaderButton from '../HeaderButton';\nimport useHeaderColumnProps from './useHeaderColumnProps';\n\nexport interface HeaderColumnProps extends TableHeaderProps {\n index: number;\n isLoading?: boolean;\n popoverButtons?: boolean;\n label: ReactNode;\n}\n\nconst HeaderColumn: FunctionComponent<HeaderColumnProps> = function ({\n index,\n isLoading = false,\n popoverButtons = false,\n label,\n ...props\n}) {\n const { classNames } = useHeaderColumnProps(index, popoverButtons);\n\n const { style: unformattedStyle, ...formattedProps } = props;\n const style = useMobileFullWidthCellStyle(unformattedStyle);\n\n return (\n <div {...formattedProps} style={style} className={classNames.main}>\n <SkeletonLoader\n isLoading={isLoading}\n wrapperClassName={classNames.loading}\n afterLoading={\n <HeaderButton.Wrapper index={index}>\n <HeaderButton.Button label={label} />\n </HeaderButton.Wrapper>\n }\n />\n </div>\n );\n};\n\nexport default HeaderColumn;\n", "import { useIsDesktop } from '@kanda-libs/ks-design-library';\nimport type { CSSProperties } from 'react';\n\nexport type MobileFullWidthCellStyleHook = CSSProperties;\n\nexport default function useMobileFullWidthCellStyle(\n style?: CSSProperties,\n): MobileFullWidthCellStyleHook {\n if (!style) return {};\n\n const isDesktop = useIsDesktop();\n\n // For mobile, we want to make sure that the cell is always 100% width\n const formattedStyle = {\n ...style,\n width: isDesktop ? style?.width : '100%',\n };\n\n return formattedStyle;\n}\n", "import type { FunctionComponent, HTMLAttributes, ReactNode } from 'react';\nimport { Icon } from '@kanda-libs/ks-design-library';\nimport { BUTTON_CLASS_NAMES, ICON_PROPS } from './constants';\n\nexport interface ButtonProps extends HTMLAttributes<HTMLButtonElement> {\n label: ReactNode;\n}\n\nconst Button: FunctionComponent<ButtonProps> = function ({ label, ...props }) {\n return (\n <button className={BUTTON_CLASS_NAMES} {...props}>\n {label}\n <Icon {...ICON_PROPS} />\n </button>\n );\n};\n\nexport default Button;\n", "export const BUTTON_CLASS_NAMES =\n 'flex px-3 py-1.75 h-9 -ml-3 my-auto rounded-lg bg-transparent hover:bg-neutral-100 text-style-g-em text-neutral-500 whitespace-nowrap z-20';\n\nexport const ICON_PROPS = {\n icon: 'chevron-down',\n stroke: 'neutral-500',\n size: 12,\n className: 'ml-2 my-auto',\n};\n\nexport const WRAPPER_STYLE = {\n width: 'calc(100% + 16px)',\n};\n\nexport const WRAPPER_CLASS_NAMES = {\n container: {\n base: 'w-full h-full overflow-hidden',\n padding: 'pl-4 -ml-4',\n },\n flex: {\n base: 'w-full h-full md:flex px-4 md:px-0',\n padding: 'md:pl-4',\n },\n};\n", "import type { CSSProperties } from 'react';\nimport clsx from 'clsx';\nimport { WRAPPER_STYLE, WRAPPER_CLASS_NAMES } from './constants';\n\nexport interface WrapperPropsHook {\n classNames: {\n container: string;\n flex: string;\n };\n containerStyle: CSSProperties;\n}\n\nexport default function useWrapperProps(index: number): WrapperPropsHook {\n const containerStyle = index === 0 ? WRAPPER_STYLE : {};\n\n const classNames = {\n container: clsx(\n WRAPPER_CLASS_NAMES.container.base,\n index === 0 ? WRAPPER_CLASS_NAMES.container.padding : '',\n ),\n flex: clsx(\n WRAPPER_CLASS_NAMES.flex.base,\n index === 0 ? '' : WRAPPER_CLASS_NAMES.flex.padding,\n ),\n };\n\n return {\n classNames,\n containerStyle,\n };\n}\n", "import type { FunctionComponent } from 'react';\nimport useWrapperProps from './useWrapperProps';\n\nexport interface WrapperProps {\n index: number;\n children?: JSX.Element | JSX.Element[];\n}\n\nconst Wrapper: FunctionComponent<WrapperProps> = function ({\n index,\n children,\n}) {\n const { classNames, containerStyle } = useWrapperProps(index);\n\n return (\n <div className={classNames.container} style={containerStyle}>\n <div className={classNames.flex}>{children}</div>\n </div>\n );\n};\n\nexport default Wrapper;\n", "import Button from './Button';\nimport Wrapper from './Wrapper';\n\nexport default {\n Button,\n Wrapper,\n};\n", "import clsx from 'clsx';\nimport { CLASS_NAMES } from './constants';\n\nexport interface HeaderColumnPropsHook {\n classNames: {\n main: string;\n loading: string;\n wrapper: string;\n };\n}\n\nexport default function useHeaderColumnProps(\n index: number,\n popoverButtons: boolean,\n): HeaderColumnPropsHook {\n const classNames = {\n ...CLASS_NAMES,\n loading: clsx(\n CLASS_NAMES.loading.base,\n index === 0 ? '' : CLASS_NAMES.loading.margin,\n ),\n wrapper: clsx(\n CLASS_NAMES.wrapper.padding,\n popoverButtons ? '' : CLASS_NAMES.wrapper.popover,\n ),\n };\n\n return {\n classNames,\n };\n}\n", "export const CLASS_NAMES = {\n main: 'flex md:h-14',\n loading: {\n base: 'my-auto w-full mr-8',\n margin: 'ml-4',\n },\n wrapper: {\n padding: 'md:px-2 md:pt-2',\n popover: 'pb-1',\n },\n};\n\nexport const MOVE_LEFT_ITEM_PROPS = {\n name: 'Move column left',\n icon: 'arrow-left',\n};\n\nexport const MOVE_RIGHT_ITEM_PROPS = {\n name: 'Move column right',\n icon: 'arrow-right',\n};\n\nexport const HIDE_COLUMN_PROPS = {\n name: 'Hide column',\n icon: 'eye-off',\n};\n", "export const CLASS_NAMES = {\n base: 'flex-col md:flex-row md:h-14 hidden lg:block border-b border-neutral-200',\n};\n", "import type {\n ColumnInstance,\n HeaderGroup,\n TableHeaderProps,\n} from 'react-table';\n\nexport interface HeaderGroupPropsHook<T extends Object> {\n headers: ColumnInstance<T>[];\n headerGroupProps: TableHeaderProps;\n totalVisible: number;\n}\n\nexport default function useHeaderGroupProps<T extends Object>(\n headerGroup: HeaderGroup<T>,\n columns: ColumnInstance<T>[],\n): HeaderGroupPropsHook<T> {\n const { headers, getHeaderGroupProps } = headerGroup;\n const headerGroupProps = getHeaderGroupProps({});\n\n const totalVisible = columns.filter((column) => column.isVisible).length;\n\n return {\n headers,\n headerGroupProps,\n totalVisible,\n };\n}\n", "import type { PropsWithChildren } from 'react';\nimport type {\n ColumnInstance,\n HeaderGroup as HeaderGroupType,\n} from 'react-table';\nimport HeaderColumn from '../HeaderColumn';\nimport { CLASS_NAMES } from './constants';\nimport useHeaderGroupProps from './useHeaderGroupProps';\n\nexport interface HeaderGroupProps<T extends Object> {\n headerGroup: HeaderGroupType<T>;\n columns: ColumnInstance<T>[];\n isLoading?: boolean;\n}\n\nfunction HeaderGroup<T extends Object>({\n headerGroup,\n columns,\n isLoading,\n}: PropsWithChildren<HeaderGroupProps<T>>) {\n const { headerGroupProps, headers } = useHeaderGroupProps(\n headerGroup,\n columns,\n );\n\n return (\n <div {...headerGroupProps} className={CLASS_NAMES.base}>\n {headers.map((column, index) => (\n <HeaderColumn\n index={index}\n label={column.render('Header')}\n isLoading={isLoading}\n {...column.getHeaderProps(column.getSortByToggleProps())}\n />\n ))}\n </div>\n );\n}\n\nexport default HeaderGroup;\n", "import type { FunctionComponent, ReactNode } from 'react';\nimport type { TableCellProps } from 'react-table';\nimport { SkeletonLoader, Text } from '@kanda-libs/ks-design-library';\nimport useCellClassNames from './useCellClassNames';\nimport useMobileFullWidthCellStyle from '~/hooks/useMobileFullWidthCellStyle';\n\nexport interface CellProps extends TableCellProps {\n index: number;\n render: () => ReactNode;\n compact?: boolean;\n isLoading?: boolean;\n label?: string;\n}\n\nconst Cell: FunctionComponent<CellProps> = function ({\n render,\n index,\n compact = false,\n isLoading = false,\n label,\n ...props\n}) {\n const classNames = useCellClassNames(index, compact, isLoading);\n\n const { style: unformattedStyle, ...formattedProps } = props;\n const style = useMobileFullWidthCellStyle(unformattedStyle);\n\n return (\n <div {...formattedProps} style={style} className={classNames.cell}>\n <div className={classNames.container}>\n <div className={classNames.render}>\n <SkeletonLoader\n isLoading={isLoading}\n afterLoading={\n <>\n <Text text={`${label}:`} className={classNames.mobileLabel} />\n {render()}\n </>\n }\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport default Cell;\n", "import clsx from 'clsx';\nimport { CLASS_NAMES } from './constants';\n\nexport type CellClassNamesHook = {\n cell: string;\n container: string;\n render: string;\n mobileLabel: string;\n};\n\nexport default function useCellClassNames(\n index: number,\n compact: boolean,\n isLoading: boolean,\n): CellClassNamesHook {\n return {\n cell: clsx(\n compact ? CLASS_NAMES.cell.compact : CLASS_NAMES.cell.base,\n index === 0 ? '' : CLASS_NAMES.cell.padding,\n ),\n container: CLASS_NAMES.container,\n render: isLoading ? CLASS_NAMES.renderLoading : CLASS_NAMES.render,\n mobileLabel: CLASS_NAMES.mobileLabel,\n };\n}\n", "export const CLASS_NAMES = {\n container: 'flex w-full h-full',\n render:\n 'w-full my-auto text-style-g text-neutral-600 whitespace-nowrap overflow-hidden overflow-ellipsis',\n renderLoading: 'w-full my-auto mr-8 text-style-g',\n mobileLabel: 'block md:hidden text-16-24-em text-neutral-600 mr-2',\n cell: {\n base: 'px-4 py-1 md:pt-0 md:pr-0 md:pb-0 md:h-16 flex',\n compact: 'h-8 flex',\n padding: 'md:pl-4',\n },\n};\n", "import { useClasses } from '@kanda-libs/ks-design-library';\nimport { CLASS_NAMES } from './constants';\n\nexport interface RowClassNamesHook {\n base: string;\n compact: string;\n border: string;\n hover: string;\n button: string;\n}\n\nexport default function useRowClassNames(index: number): RowClassNamesHook {\n const classNames = useClasses(CLASS_NAMES, {\n base: ['.base', index === 9 ? '' : '.border', '.hover'],\n button: ['.button'],\n });\n\n return classNames as RowClassNamesHook;\n}\n", "export const CLASS_NAMES = {\n base: 'relative md:h-16 flex-col py-2 md:py-0 md:flex-row',\n compact: 'relative h-8',\n border: 'border-b border-neutral-200',\n hover: 'group hover:bg-neutral-50 cursor-pointer',\n button: 'hidden group-hover:block',\n};\n", "import type { PropsWithChildren } from 'react';\nimport type { Row as RowType, TableRowProps } from 'react-table';\nimport Cell from '../Cell';\nimport useRowClassNames from './useRowClassNames';\n\nexport interface RowProps<T extends Object> extends TableRowProps {\n cells: RowType<T>['cells'];\n index: number;\n compact?: boolean;\n isLoading?: boolean;\n}\n\nfunction Row<T extends Object>({\n cells,\n index,\n compact = false,\n isLoading = false,\n ...props\n}: PropsWithChildren<RowProps<T>>) {\n const classNames = useRowClassNames(index);\n\n return (\n <div {...props} className={compact ? classNames.compact : classNames.base}>\n {cells.map((cell, cellIndex) => (\n <Cell\n {...cell.getCellProps()}\n index={cellIndex}\n isLoading={isLoading}\n render={() => cell.render('Cell')}\n label={cell.column.Header as string}\n />\n ))}\n </div>\n );\n}\n\nexport default Row;\n", "import type { StringIndexedObject } from '@kanda-libs/ks-design-library';\nimport type { PropsWithChildren } from 'react';\nimport type { Row as RowType } from 'react-table';\nimport Row from '../Row';\n\nexport interface PagesProps<T extends StringIndexedObject> {\n page: RowType<T>[];\n prepareRow: (row: RowType<T>) => void;\n isLoading?: boolean;\n compact?: boolean;\n}\n\nfunction Pages<T extends StringIndexedObject>({\n page,\n prepareRow,\n isLoading = false,\n compact = false,\n}: PropsWithChildren<PagesProps<T>>) {\n return (\n <>\n {page.map((row, index) => {\n prepareRow(row);\n return (\n <Row\n {...row.getRowProps()}\n index={index}\n cells={row.cells}\n isLoading={isLoading}\n compact={compact}\n />\n );\n })}\n </>\n );\n}\nexport default Pages;\n", "import type { TableInstance, Row } from '../../@types/index';\nimport {\n useTable,\n useGlobalFilter,\n usePagination,\n useSortBy,\n useFlexLayout,\n type IdType,\n TableOptions,\n} from 'react-table';\nimport type { TableProps } from '.';\nimport { globalFilter } from './helpers/search';\nimport type {\n PaginationProps,\n StringIndexedObject,\n} from '@kanda-libs/ks-design-library';\nimport { useEffect } from 'react';\n\nexport interface TablePropsHook<T extends StringIndexedObject<unknown>>\n extends TableInstance<T> {\n paginationProps: PaginationProps;\n}\n\nexport default function useTableProps<T extends StringIndexedObject<unknown>>({\n columns,\n data,\n pageSize = 10,\n query = '',\n}: TableProps<T>): TablePropsHook<T> {\n const table = useTable<T>(\n {\n columns,\n data,\n initialState: {\n pageSize: 10,\n pageIndex: 0,\n },\n autoResetGlobalFilter: false,\n globalFilter: (\n rows: Row<T>[],\n searchKeys: IdType<T>[],\n filterValue: string,\n ) => globalFilter(rows, searchKeys, filterValue, pageSize),\n } as unknown as TableOptions<T>,\n useGlobalFilter,\n useSortBy,\n usePagination,\n useFlexLayout,\n );\n\n const {\n gotoPage,\n pageCount,\n state: { pageIndex },\n } = table;\n\n const paginationProps: PaginationProps = {\n pageCount,\n pageIndex,\n setPage: (nextPage: number) => {\n gotoPage(nextPage);\n },\n };\n\n useEffect(() => {\n table.setGlobalFilter(query);\n }, [query]);\n\n return {\n paginationProps,\n ...table,\n };\n}\n", "import type { IdType } from 'react-table';\nimport type { Row } from '../../../@types/index';\nimport Fuse from 'fuse.js';\nimport type { StringIndexedObject } from '~/types';\n\nconst exactMatchSearch = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n filterValue: string,\n) => {\n return rows.filter((row) => {\n // Take all values from the row, and add them together in a string\n // for the purposes of searching\n const rowValues = Object.values(row.values).join(', ');\n\n return rowValues.toLowerCase().includes(filterValue.toLowerCase());\n });\n};\n\nconst excludeExactMatches = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n exactMatchRows: Row<T>[],\n) =>\n rows.filter(\n ({ id }) => exactMatchRows.filter((p) => p.id === id).length === 0,\n );\n\nconst fuzzySearch = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n filterValue: string,\n searchKeys: string[],\n numberOfRows: number,\n exactMatchRows: Row<T>[],\n): Row<T>[] => {\n const currentRows = rows.map((row) => {\n return row.values;\n });\n\n const fuse = new Fuse(currentRows, {\n keys: searchKeys.map((key) => ({\n name: key,\n // Because FuseJS allows for dot notation,\n // we need to use a function to get the value\n // as the object returned from the table is flat,\n // rather than nested\n getFn: (obj: StringIndexedObject) => obj[key],\n })),\n });\n\n const results = fuse\n .search(filterValue)\n .map(({ item }) => item)\n .slice(0, numberOfRows);\n\n const filteredResults = results\n .map((result) => rows.find((row) => row.values.cid === result.cid))\n .filter(Boolean) as Row<T>[];\n\n return excludeExactMatches(filteredResults, exactMatchRows);\n};\n\nexport const globalFilter = <T extends StringIndexedObject<unknown>>(\n rows: Row<T>[],\n searchKeys: IdType<T>[],\n filterValue: string,\n pageSize = 10,\n): Row<T>[] => {\n if (filterValue.length < 1) {\n return rows;\n }\n\n // Get the first 10 exact matches. The reason for this is that exact matching\n // should take presedence over fuzzy matching. An exact match is more useful\n // but also less expensive to compute. So there's no need to do a fuzzy search\n // if there are >= 10 exact matches.\n const exactMatches = exactMatchSearch(rows, filterValue).slice(0, pageSize);\n const currentRowsExcludingExactMatches = excludeExactMatches(\n rows,\n exactMatches,\n );\n\n const fuzzyMatches = fuzzySearch(\n currentRowsExcludingExactMatches,\n filterValue,\n searchKeys,\n pageSize - exactMatches.length,\n exactMatches,\n );\n\n const results = [...exactMatches, ...fuzzyMatches];\n\n // Return the rows in the same order as the original rows\n // to preserve sorting, which happens before fuzzy matching\n return rows\n .map(({ id }) => results.find((row) => row.id === id))\n .filter(Boolean) as Row<T>[];\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["Pagination", "SkeletonLoader", "useIsDesktop", "useMobileFullWidthCellStyle", "style", "isDesktop", "Icon", "BUTTON_CLASS_NAMES", "ICON_PROPS", "WRAPPER_STYLE", "WRAPPER_CLASS_NAMES", "jsx", "jsxs", "Button", "label", "props", "BUTTON_CLASS_NAMES", "Icon", "ICON_PROPS", "Button_default", "clsx", "useWrapperProps", "index", "containerStyle", "WRAPPER_STYLE", "clsx", "WRAPPER_CLASS_NAMES", "jsx", "Wrapper", "index", "children", "classNames", "containerStyle", "useWrapperProps", "Wrapper_default", "HeaderButton_default", "Button_default", "Wrapper_default", "clsx", "CLASS_NAMES", "useHeaderColumnProps", "index", "popoverButtons", "CLASS_NAMES", "clsx", "jsx", "HeaderColumn", "index", "isLoading", "popoverButtons", "label", "props", "classNames", "useHeaderColumnProps", "unformattedStyle", "formattedProps", "style", "useMobileFullWidthCellStyle", "SkeletonLoader", "HeaderButton_default", "HeaderColumn_default", "CLASS_NAMES", "useHeaderGroupProps", "headerGroup", "columns", "headers", "getHeaderGroupProps", "headerGroupProps", "totalVisible", "column", "jsx", "HeaderGroup", "headerGroup", "columns", "isLoading", "headerGroupProps", "headers", "useHeaderGroupProps", "CLASS_NAMES", "column", "index", "HeaderColumn_default", "HeaderGroup_default", "SkeletonLoader", "Text", "clsx", "CLASS_NAMES", "useCellClassNames", "index", "compact", "isLoading", "clsx", "CLASS_NAMES", "Fragment", "jsx", "jsxs", "Cell", "render", "index", "compact", "isLoading", "label", "props", "classNames", "useCellClassNames", "unformattedStyle", "formattedProps", "style", "useMobileFullWidthCellStyle", "SkeletonLoader", "Text", "Cell_default", "useClasses", "CLASS_NAMES", "useRowClassNames", "index", "useClasses", "CLASS_NAMES", "jsx", "Row", "cells", "index", "compact", "isLoading", "props", "classNames", "useRowClassNames", "cell", "cellIndex", "Cell_default", "Row_default", "Fragment", "jsx", "Pages", "page", "prepareRow", "isLoading", "compact", "row", "index", "Row_default", "Pages_default", "useTable", "useGlobalFilter", "usePagination", "useSortBy", "useFlexLayout", "Fuse", "exactMatchSearch", "rows", "filterValue", "row", "excludeExactMatches", "exactMatchRows", "id", "p", "fuzzySearch", "searchKeys", "numberOfRows", "currentRows", "filteredResults", "key", "obj", "item", "result", "globalFilter", "pageSize", "exactMatches", "currentRowsExcludingExactMatches", "fuzzyMatches", "results", "useEffect", "useTableProps", "columns", "data", "pageSize", "query", "table", "useTable", "rows", "searchKeys", "filterValue", "globalFilter", "useGlobalFilter", "useSortBy", "usePagination", "useFlexLayout", "gotoPage", "pageCount", "pageIndex", "paginationProps", "nextPage", "Fragment", "jsx", "jsxs", "Table", "compact", "isLoading", "props", "page", "prepareRow", "columns", "getTableProps", "headerGroups", "paginationProps", "useTableProps", "headerGroup", "HeaderGroup_default", "Pages_default", "Pagination", "Table_default"]
7
7
  }
package/dist/library.css CHANGED
@@ -776,6 +776,12 @@ video {
776
776
  line-height: 24px;
777
777
  }
778
778
 
779
+ .text-16-24-em {
780
+ font-weight: 600;
781
+ font-size: 16px;
782
+ line-height: 24px;
783
+ }
784
+
779
785
  .text-16-20-em {
780
786
  font-weight: 600;
781
787
  font-size: 16px;
@@ -997,6 +1003,10 @@ video {
997
1003
  margin-right: 32px;
998
1004
  }
999
1005
 
1006
+ .mr-2 {
1007
+ margin-right: 8px;
1008
+ }
1009
+
1000
1010
  .-ml-3 {
1001
1011
  margin-left: -12px;
1002
1012
  }
@@ -1013,6 +1023,10 @@ video {
1013
1023
  margin-left: 16px;
1014
1024
  }
1015
1025
 
1026
+ .block {
1027
+ display: block;
1028
+ }
1029
+
1016
1030
  .flex {
1017
1031
  display: flex;
1018
1032
  }
@@ -1029,10 +1043,6 @@ video {
1029
1043
  height: 100%;
1030
1044
  }
1031
1045
 
1032
- .h-16 {
1033
- height: 64px;
1034
- }
1035
-
1036
1046
  .h-8 {
1037
1047
  height: 32px;
1038
1048
  }
@@ -1041,10 +1051,6 @@ video {
1041
1051
  height: 36px;
1042
1052
  }
1043
1053
 
1044
- .h-14 {
1045
- height: 56px;
1046
- }
1047
-
1048
1054
  .w-full {
1049
1055
  width: 100%;
1050
1056
  }
@@ -1057,13 +1063,8 @@ video {
1057
1063
  cursor: pointer;
1058
1064
  }
1059
1065
 
1060
- .flex-row {
1061
- flex-direction: row;
1062
- }
1063
-
1064
- .gap-x-2 {
1065
- -moz-column-gap: 8px;
1066
- column-gap: 8px;
1066
+ .flex-col {
1067
+ flex-direction: column;
1067
1068
  }
1068
1069
 
1069
1070
  .overflow-hidden {
@@ -1099,14 +1100,14 @@ video {
1099
1100
  background-color: transparent;
1100
1101
  }
1101
1102
 
1102
- .px-3 {
1103
- padding-left: 12px;
1104
- padding-right: 12px;
1103
+ .px-4 {
1104
+ padding-left: 16px;
1105
+ padding-right: 16px;
1105
1106
  }
1106
1107
 
1107
- .py-1\.75 {
1108
- padding-top: 7px;
1109
- padding-bottom: 7px;
1108
+ .py-2 {
1109
+ padding-top: 8px;
1110
+ padding-bottom: 8px;
1110
1111
  }
1111
1112
 
1112
1113
  .py-1 {
@@ -1114,17 +1115,18 @@ video {
1114
1115
  padding-bottom: 4px;
1115
1116
  }
1116
1117
 
1117
- .px-2 {
1118
- padding-left: 8px;
1119
- padding-right: 8px;
1118
+ .px-3 {
1119
+ padding-left: 12px;
1120
+ padding-right: 12px;
1120
1121
  }
1121
1122
 
1122
- .pl-4 {
1123
- padding-left: 16px;
1123
+ .py-1\.75 {
1124
+ padding-top: 7px;
1125
+ padding-bottom: 7px;
1124
1126
  }
1125
1127
 
1126
- .pt-2 {
1127
- padding-top: 8px;
1128
+ .pl-4 {
1129
+ padding-left: 16px;
1128
1130
  }
1129
1131
 
1130
1132
  .pb-1 {
@@ -2051,3 +2053,66 @@ Modified version of toast CSS to match designs
2051
2053
  .group:hover .group-hover\:block {
2052
2054
  display: block;
2053
2055
  }
2056
+
2057
+ @media (min-width: 768px) {
2058
+ .md\:flex {
2059
+ display: flex;
2060
+ }
2061
+
2062
+ .md\:hidden {
2063
+ display: none;
2064
+ }
2065
+
2066
+ .md\:h-16 {
2067
+ height: 64px;
2068
+ }
2069
+
2070
+ .md\:h-14 {
2071
+ height: 56px;
2072
+ }
2073
+
2074
+ .md\:flex-row {
2075
+ flex-direction: row;
2076
+ }
2077
+
2078
+ .md\:px-0 {
2079
+ padding-left: 0;
2080
+ padding-right: 0;
2081
+ }
2082
+
2083
+ .md\:px-2 {
2084
+ padding-left: 8px;
2085
+ padding-right: 8px;
2086
+ }
2087
+
2088
+ .md\:py-0 {
2089
+ padding-top: 0;
2090
+ padding-bottom: 0;
2091
+ }
2092
+
2093
+ .md\:pt-0 {
2094
+ padding-top: 0;
2095
+ }
2096
+
2097
+ .md\:pr-0 {
2098
+ padding-right: 0;
2099
+ }
2100
+
2101
+ .md\:pb-0 {
2102
+ padding-bottom: 0;
2103
+ }
2104
+
2105
+ .md\:pl-4 {
2106
+ padding-left: 16px;
2107
+ }
2108
+
2109
+ .md\:pt-2 {
2110
+ padding-top: 8px;
2111
+ }
2112
+ }
2113
+
2114
+ @media (min-width: 1024px) {
2115
+ .lg\:block {
2116
+ display: block;
2117
+ }
2118
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kanda-libs/ks-design-library-new",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "Kanda design components library",
5
5
  "main": "dist/index.esm.mjs",
6
6
  "module": "dist/index.esm.mjs",
@@ -3,9 +3,10 @@ export const CLASS_NAMES = {
3
3
  render:
4
4
  'w-full my-auto text-style-g text-neutral-600 whitespace-nowrap overflow-hidden overflow-ellipsis',
5
5
  renderLoading: 'w-full my-auto mr-8 text-style-g',
6
+ mobileLabel: 'block md:hidden text-16-24-em text-neutral-600 mr-2',
6
7
  cell: {
7
- base: 'h-16 flex',
8
+ base: 'px-4 py-1 md:pt-0 md:pr-0 md:pb-0 md:h-16 flex',
8
9
  compact: 'h-8 flex',
9
- padding: 'pl-4',
10
+ padding: 'md:pl-4',
10
11
  },
11
12
  };
@@ -1,13 +1,15 @@
1
1
  import type { FunctionComponent, ReactNode } from 'react';
2
2
  import type { TableCellProps } from 'react-table';
3
- import { SkeletonLoader } from '@kanda-libs/ks-design-library';
3
+ import { SkeletonLoader, Text } from '@kanda-libs/ks-design-library';
4
4
  import useCellClassNames from './useCellClassNames';
5
+ import useMobileFullWidthCellStyle from '~/hooks/useMobileFullWidthCellStyle';
5
6
 
6
7
  export interface CellProps extends TableCellProps {
7
8
  index: number;
8
9
  render: () => ReactNode;
9
10
  compact?: boolean;
10
11
  isLoading?: boolean;
12
+ label?: string;
11
13
  }
12
14
 
13
15
  const Cell: FunctionComponent<CellProps> = function ({
@@ -15,17 +17,26 @@ const Cell: FunctionComponent<CellProps> = function ({
15
17
  index,
16
18
  compact = false,
17
19
  isLoading = false,
20
+ label,
18
21
  ...props
19
22
  }) {
20
23
  const classNames = useCellClassNames(index, compact, isLoading);
21
24
 
25
+ const { style: unformattedStyle, ...formattedProps } = props;
26
+ const style = useMobileFullWidthCellStyle(unformattedStyle);
27
+
22
28
  return (
23
- <div {...props} className={classNames.cell}>
29
+ <div {...formattedProps} style={style} className={classNames.cell}>
24
30
  <div className={classNames.container}>
25
31
  <div className={classNames.render}>
26
32
  <SkeletonLoader
27
33
  isLoading={isLoading}
28
- afterLoading={<>{render()}</>}
34
+ afterLoading={
35
+ <>
36
+ <Text text={`${label}:`} className={classNames.mobileLabel} />
37
+ {render()}
38
+ </>
39
+ }
29
40
  />
30
41
  </div>
31
42
  </div>
@@ -5,6 +5,7 @@ export type CellClassNamesHook = {
5
5
  cell: string;
6
6
  container: string;
7
7
  render: string;
8
+ mobileLabel: string;
8
9
  };
9
10
 
10
11
  export default function useCellClassNames(
@@ -19,5 +20,6 @@ export default function useCellClassNames(
19
20
  ),
20
21
  container: CLASS_NAMES.container,
21
22
  render: isLoading ? CLASS_NAMES.renderLoading : CLASS_NAMES.render,
23
+ mobileLabel: CLASS_NAMES.mobileLabel,
22
24
  };
23
25
  }
@@ -18,7 +18,7 @@ export const WRAPPER_CLASS_NAMES = {
18
18
  padding: 'pl-4 -ml-4',
19
19
  },
20
20
  flex: {
21
- base: 'w-full h-full flex',
22
- padding: 'pl-4',
21
+ base: 'w-full h-full md:flex px-4 md:px-0',
22
+ padding: 'md:pl-4',
23
23
  },
24
24
  };
@@ -1,11 +1,11 @@
1
1
  export const CLASS_NAMES = {
2
- main: 'flex h-14',
2
+ main: 'flex md:h-14',
3
3
  loading: {
4
4
  base: 'my-auto w-full mr-8',
5
5
  margin: 'ml-4',
6
6
  },
7
7
  wrapper: {
8
- padding: 'px-2 pt-2',
8
+ padding: 'md:px-2 md:pt-2',
9
9
  popover: 'pb-1',
10
10
  },
11
11
  };
@@ -1,6 +1,7 @@
1
1
  import { SkeletonLoader } from '@kanda-libs/ks-design-library';
2
2
  import type { FunctionComponent, ReactNode } from 'react';
3
3
  import type { TableHeaderProps } from 'react-table';
4
+ import useMobileFullWidthCellStyle from '~/hooks/useMobileFullWidthCellStyle';
4
5
  import HeaderButton from '../HeaderButton';
5
6
  import useHeaderColumnProps from './useHeaderColumnProps';
6
7
 
@@ -20,8 +21,11 @@ const HeaderColumn: FunctionComponent<HeaderColumnProps> = function ({
20
21
  }) {
21
22
  const { classNames } = useHeaderColumnProps(index, popoverButtons);
22
23
 
24
+ const { style: unformattedStyle, ...formattedProps } = props;
25
+ const style = useMobileFullWidthCellStyle(unformattedStyle);
26
+
23
27
  return (
24
- <div {...props} className={classNames.main}>
28
+ <div {...formattedProps} style={style} className={classNames.main}>
25
29
  <SkeletonLoader
26
30
  isLoading={isLoading}
27
31
  wrapperClassName={classNames.loading}
@@ -1,3 +1,3 @@
1
1
  export const CLASS_NAMES = {
2
- base: 'h-14 border-b border-neutral-200',
2
+ base: 'flex-col md:flex-row md:h-14 hidden lg:block border-b border-neutral-200',
3
3
  };
@@ -0,0 +1,36 @@
1
+ import type { StringIndexedObject } from '@kanda-libs/ks-design-library';
2
+ import type { PropsWithChildren } from 'react';
3
+ import type { Row as RowType } from 'react-table';
4
+ import Row from '../Row';
5
+
6
+ export interface PagesProps<T extends StringIndexedObject> {
7
+ page: RowType<T>[];
8
+ prepareRow: (row: RowType<T>) => void;
9
+ isLoading?: boolean;
10
+ compact?: boolean;
11
+ }
12
+
13
+ function Pages<T extends StringIndexedObject>({
14
+ page,
15
+ prepareRow,
16
+ isLoading = false,
17
+ compact = false,
18
+ }: PropsWithChildren<PagesProps<T>>) {
19
+ return (
20
+ <>
21
+ {page.map((row, index) => {
22
+ prepareRow(row);
23
+ return (
24
+ <Row
25
+ {...row.getRowProps()}
26
+ index={index}
27
+ cells={row.cells}
28
+ isLoading={isLoading}
29
+ compact={compact}
30
+ />
31
+ );
32
+ })}
33
+ </>
34
+ );
35
+ }
36
+ export default Pages;
@@ -1,5 +1,5 @@
1
1
  export const CLASS_NAMES = {
2
- base: 'relative h-16',
2
+ base: 'relative md:h-16 flex-col py-2 md:py-0 md:flex-row',
3
3
  compact: 'relative h-8',
4
4
  border: 'border-b border-neutral-200',
5
5
  hover: 'group hover:bg-neutral-50 cursor-pointer',
@@ -19,10 +19,6 @@ function Row<T extends Object>({
19
19
  }: PropsWithChildren<RowProps<T>>) {
20
20
  const classNames = useRowClassNames(index);
21
21
 
22
- console.log({
23
- props,
24
- });
25
-
26
22
  return (
27
23
  <div {...props} className={compact ? classNames.compact : classNames.base}>
28
24
  {cells.map((cell, cellIndex) => (
@@ -31,6 +27,7 @@ function Row<T extends Object>({
31
27
  index={cellIndex}
32
28
  isLoading={isLoading}
33
29
  render={() => cell.render('Cell')}
30
+ label={cell.column.Header as string}
34
31
  />
35
32
  ))}
36
33
  </div>
@@ -1,9 +1,11 @@
1
- import type { StringIndexedObject } from '@kanda-libs/ks-design-library';
1
+ import {
2
+ Pagination,
3
+ type StringIndexedObject,
4
+ } from '@kanda-libs/ks-design-library';
2
5
  import type { FunctionComponent, PropsWithChildren } from 'react';
3
6
  import type { Column } from 'react-table';
4
7
  import HeaderGroup from './components/HeaderGroup';
5
- import Row from './components/Row';
6
- import SearchInput from './components/SearchInput';
8
+ import Pages from './components/Pages';
7
9
  import useTableProps from './useTableProps';
8
10
 
9
11
  export interface TableProps<T extends StringIndexedObject<unknown>> {
@@ -13,6 +15,7 @@ export interface TableProps<T extends StringIndexedObject<unknown>> {
13
15
  pageSize?: number;
14
16
  compact?: boolean;
15
17
  isLoading?: boolean;
18
+ query?: string;
16
19
  }
17
20
 
18
21
  export type TableFunctionComponent<
@@ -24,16 +27,17 @@ function Table<T extends StringIndexedObject<unknown>>({
24
27
  isLoading = false,
25
28
  ...props
26
29
  }: PropsWithChildren<TableProps<T>>) {
27
- const { onSearch, page, prepareRow, columns, getTableProps, headerGroups } =
28
- useTableProps(props);
30
+ const {
31
+ page,
32
+ prepareRow,
33
+ columns,
34
+ getTableProps,
35
+ headerGroups,
36
+ paginationProps,
37
+ } = useTableProps(props);
29
38
 
30
39
  return (
31
40
  <>
32
- <SearchInput
33
- onSearch={(currentSearch) => {
34
- onSearch(currentSearch);
35
- }}
36
- />
37
41
  <div {...getTableProps()} className="w-full">
38
42
  <div>
39
43
  {headerGroups.map((headerGroup) => (
@@ -44,18 +48,15 @@ function Table<T extends StringIndexedObject<unknown>>({
44
48
  />
45
49
  ))}
46
50
  </div>
47
- {page.map((row, index) => {
48
- prepareRow(row);
49
- return (
50
- <Row
51
- {...row.getRowProps()}
52
- index={index}
53
- cells={row.cells}
54
- compact={compact}
55
- isLoading={isLoading}
56
- />
57
- );
58
- })}
51
+ <Pages
52
+ page={page}
53
+ prepareRow={prepareRow}
54
+ isLoading={isLoading}
55
+ compact={compact}
56
+ />
57
+ </div>
58
+ <div className="px-4 py-2">
59
+ <Pagination {...paginationProps} />
59
60
  </div>
60
61
  </>
61
62
  );
@@ -10,17 +10,22 @@ import {
10
10
  } from 'react-table';
11
11
  import type { TableProps } from '.';
12
12
  import { globalFilter } from './helpers/search';
13
- import type { StringIndexedObject } from '@kanda-libs/ks-design-library';
13
+ import type {
14
+ PaginationProps,
15
+ StringIndexedObject,
16
+ } from '@kanda-libs/ks-design-library';
17
+ import { useEffect } from 'react';
14
18
 
15
19
  export interface TablePropsHook<T extends StringIndexedObject<unknown>>
16
20
  extends TableInstance<T> {
17
- onSearch: (value: string) => void;
21
+ paginationProps: PaginationProps;
18
22
  }
19
23
 
20
24
  export default function useTableProps<T extends StringIndexedObject<unknown>>({
21
25
  columns,
22
26
  data,
23
27
  pageSize = 10,
28
+ query = '',
24
29
  }: TableProps<T>): TablePropsHook<T> {
25
30
  const table = useTable<T>(
26
31
  {
@@ -43,12 +48,26 @@ export default function useTableProps<T extends StringIndexedObject<unknown>>({
43
48
  useFlexLayout,
44
49
  );
45
50
 
46
- const onSearch = (search: string) => {
47
- table.setGlobalFilter(search);
51
+ const {
52
+ gotoPage,
53
+ pageCount,
54
+ state: { pageIndex },
55
+ } = table;
56
+
57
+ const paginationProps: PaginationProps = {
58
+ pageCount,
59
+ pageIndex,
60
+ setPage: (nextPage: number) => {
61
+ gotoPage(nextPage);
62
+ },
48
63
  };
49
64
 
65
+ useEffect(() => {
66
+ table.setGlobalFilter(query);
67
+ }, [query]);
68
+
50
69
  return {
51
- onSearch,
70
+ paginationProps,
52
71
  ...table,
53
72
  };
54
73
  }
@@ -0,0 +1,20 @@
1
+ import { useIsDesktop } from '@kanda-libs/ks-design-library';
2
+ import type { CSSProperties } from 'react';
3
+
4
+ export type MobileFullWidthCellStyleHook = CSSProperties;
5
+
6
+ export default function useMobileFullWidthCellStyle(
7
+ style?: CSSProperties,
8
+ ): MobileFullWidthCellStyleHook {
9
+ if (!style) return {};
10
+
11
+ const isDesktop = useIsDesktop();
12
+
13
+ // For mobile, we want to make sure that the cell is always 100% width
14
+ const formattedStyle = {
15
+ ...style,
16
+ width: isDesktop ? style?.width : '100%',
17
+ };
18
+
19
+ return formattedStyle;
20
+ }
@@ -776,6 +776,12 @@ video {
776
776
  line-height: 24px;
777
777
  }
778
778
 
779
+ .text-16-24-em {
780
+ font-weight: 600;
781
+ font-size: 16px;
782
+ line-height: 24px;
783
+ }
784
+
779
785
  .text-16-20-em {
780
786
  font-weight: 600;
781
787
  font-size: 16px;
@@ -997,6 +1003,10 @@ video {
997
1003
  margin-right: 32px;
998
1004
  }
999
1005
 
1006
+ .mr-2 {
1007
+ margin-right: 8px;
1008
+ }
1009
+
1000
1010
  .-ml-3 {
1001
1011
  margin-left: -12px;
1002
1012
  }
@@ -1013,6 +1023,10 @@ video {
1013
1023
  margin-left: 16px;
1014
1024
  }
1015
1025
 
1026
+ .block {
1027
+ display: block;
1028
+ }
1029
+
1016
1030
  .flex {
1017
1031
  display: flex;
1018
1032
  }
@@ -1029,10 +1043,6 @@ video {
1029
1043
  height: 100%;
1030
1044
  }
1031
1045
 
1032
- .h-16 {
1033
- height: 64px;
1034
- }
1035
-
1036
1046
  .h-8 {
1037
1047
  height: 32px;
1038
1048
  }
@@ -1041,10 +1051,6 @@ video {
1041
1051
  height: 36px;
1042
1052
  }
1043
1053
 
1044
- .h-14 {
1045
- height: 56px;
1046
- }
1047
-
1048
1054
  .w-full {
1049
1055
  width: 100%;
1050
1056
  }
@@ -1057,13 +1063,8 @@ video {
1057
1063
  cursor: pointer;
1058
1064
  }
1059
1065
 
1060
- .flex-row {
1061
- flex-direction: row;
1062
- }
1063
-
1064
- .gap-x-2 {
1065
- -moz-column-gap: 8px;
1066
- column-gap: 8px;
1066
+ .flex-col {
1067
+ flex-direction: column;
1067
1068
  }
1068
1069
 
1069
1070
  .overflow-hidden {
@@ -1099,14 +1100,14 @@ video {
1099
1100
  background-color: transparent;
1100
1101
  }
1101
1102
 
1102
- .px-3 {
1103
- padding-left: 12px;
1104
- padding-right: 12px;
1103
+ .px-4 {
1104
+ padding-left: 16px;
1105
+ padding-right: 16px;
1105
1106
  }
1106
1107
 
1107
- .py-1\.75 {
1108
- padding-top: 7px;
1109
- padding-bottom: 7px;
1108
+ .py-2 {
1109
+ padding-top: 8px;
1110
+ padding-bottom: 8px;
1110
1111
  }
1111
1112
 
1112
1113
  .py-1 {
@@ -1114,17 +1115,18 @@ video {
1114
1115
  padding-bottom: 4px;
1115
1116
  }
1116
1117
 
1117
- .px-2 {
1118
- padding-left: 8px;
1119
- padding-right: 8px;
1118
+ .px-3 {
1119
+ padding-left: 12px;
1120
+ padding-right: 12px;
1120
1121
  }
1121
1122
 
1122
- .pl-4 {
1123
- padding-left: 16px;
1123
+ .py-1\.75 {
1124
+ padding-top: 7px;
1125
+ padding-bottom: 7px;
1124
1126
  }
1125
1127
 
1126
- .pt-2 {
1127
- padding-top: 8px;
1128
+ .pl-4 {
1129
+ padding-left: 16px;
1128
1130
  }
1129
1131
 
1130
1132
  .pb-1 {
@@ -2051,3 +2053,66 @@ Modified version of toast CSS to match designs
2051
2053
  .group:hover .group-hover\:block {
2052
2054
  display: block;
2053
2055
  }
2056
+
2057
+ @media (min-width: 768px) {
2058
+ .md\:flex {
2059
+ display: flex;
2060
+ }
2061
+
2062
+ .md\:hidden {
2063
+ display: none;
2064
+ }
2065
+
2066
+ .md\:h-16 {
2067
+ height: 64px;
2068
+ }
2069
+
2070
+ .md\:h-14 {
2071
+ height: 56px;
2072
+ }
2073
+
2074
+ .md\:flex-row {
2075
+ flex-direction: row;
2076
+ }
2077
+
2078
+ .md\:px-0 {
2079
+ padding-left: 0;
2080
+ padding-right: 0;
2081
+ }
2082
+
2083
+ .md\:px-2 {
2084
+ padding-left: 8px;
2085
+ padding-right: 8px;
2086
+ }
2087
+
2088
+ .md\:py-0 {
2089
+ padding-top: 0;
2090
+ padding-bottom: 0;
2091
+ }
2092
+
2093
+ .md\:pt-0 {
2094
+ padding-top: 0;
2095
+ }
2096
+
2097
+ .md\:pr-0 {
2098
+ padding-right: 0;
2099
+ }
2100
+
2101
+ .md\:pb-0 {
2102
+ padding-bottom: 0;
2103
+ }
2104
+
2105
+ .md\:pl-4 {
2106
+ padding-left: 16px;
2107
+ }
2108
+
2109
+ .md\:pt-2 {
2110
+ padding-top: 8px;
2111
+ }
2112
+ }
2113
+
2114
+ @media (min-width: 1024px) {
2115
+ .lg\:block {
2116
+ display: block;
2117
+ }
2118
+ }
@@ -1,22 +0,0 @@
1
- import type { FunctionComponent } from 'react';
2
- import useSearchInput from './useSearchInput';
3
-
4
- export interface SearchInputProps {
5
- onSearch: (search: string) => void;
6
- }
7
-
8
- const SearchInput: FunctionComponent<SearchInputProps> = function ({
9
- onSearch,
10
- }) {
11
- const { search, onChange, onSubmit } = useSearchInput(onSearch);
12
-
13
- return (
14
- <div className="flex flex-row gap-x-2">
15
- <span>Search:</span>
16
- <input type="text" value={search} onChange={onChange} />
17
- <button onClick={onSubmit}>Search</button>
18
- </div>
19
- );
20
- };
21
-
22
- export default SearchInput;
@@ -1,30 +0,0 @@
1
- import { FormEvent, useCallback, useState } from 'react';
2
-
3
- export interface SearchInputHook {
4
- search: string;
5
- onChange: (e: FormEvent<HTMLInputElement>) => void;
6
- onSubmit: () => void;
7
- }
8
-
9
- export default function useSearchInput(
10
- onSearch: (search: string) => void,
11
- ): SearchInputHook {
12
- const [search, setSearch] = useState('');
13
-
14
- const onChange = useCallback(
15
- (e: FormEvent<HTMLInputElement>) => {
16
- setSearch(e.currentTarget.value);
17
- },
18
- [setSearch],
19
- );
20
-
21
- const onSubmit = useCallback(() => {
22
- onSearch(search);
23
- }, [search, onSearch]);
24
-
25
- return {
26
- search,
27
- onChange,
28
- onSubmit,
29
- };
30
- }