@cryptlex/web-components 5.0.0 → 5.1.0
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/components/data-table/data-table-filter.es.js +46 -44
- package/dist/components/data-table/data-table-filter.es.js.map +1 -1
- package/dist/components/data-table/data-table.es.js +160 -159
- package/dist/components/data-table/data-table.es.js.map +1 -1
- package/dist/components/data-table/table-commons.es.js +51 -217
- package/dist/components/data-table/table-commons.es.js.map +1 -1
- package/dist/components/inputs/date-picker.es.js +61 -41
- package/dist/components/inputs/date-picker.es.js.map +1 -1
- package/dist/components/inputs/datefield.es.js +9 -9
- package/dist/components/inputs/datefield.es.js.map +1 -1
- package/dist/components/inputs/field.es.js +36 -35
- package/dist/components/inputs/field.es.js.map +1 -1
- package/dist/components/inputs/id-search.es.js +36 -33
- package/dist/components/inputs/id-search.es.js.map +1 -1
- package/dist/components/inputs/multi-select.es.js +32 -39
- package/dist/components/inputs/multi-select.es.js.map +1 -1
- package/dist/components/inputs/{country-select.es.js → select-options.es.js} +26 -24
- package/dist/components/inputs/select-options.es.js.map +1 -0
- package/dist/components/inputs/select.es.js +46 -45
- package/dist/components/inputs/select.es.js.map +1 -1
- package/dist/components/ui/button.es.js +22 -24
- package/dist/components/ui/button.es.js.map +1 -1
- package/dist/components/ui/menu.es.js +44 -43
- package/dist/components/ui/menu.es.js.map +1 -1
- package/dist/components/ui/popover.es.js +1 -1
- package/dist/components/ui/popover.es.js.map +1 -1
- package/dist/index.es.d.ts +44 -54
- package/dist/index.es.js +206 -207
- package/dist/node_modules/.pnpm/@internationalized_date@3.8.2/node_modules/@internationalized/date/dist/CalendarDate.es.js +13 -13
- package/dist/node_modules/.pnpm/@internationalized_date@3.8.2/node_modules/@internationalized/date/dist/conversion.es.js +5 -5
- package/dist/node_modules/.pnpm/@internationalized_date@3.8.2/node_modules/@internationalized/date/dist/string.es.js +48 -39
- package/dist/node_modules/.pnpm/@internationalized_date@3.8.2/node_modules/@internationalized/date/dist/string.es.js.map +1 -1
- package/dist/utils/form-hook.es.js +10 -14
- package/dist/utils/form-hook.es.js.map +1 -1
- package/dist/utils/primitives.es.js.map +1 -1
- package/dist/utils/resource-names.es.js +182 -0
- package/dist/utils/resource-names.es.js.map +1 -0
- package/package.json +1 -1
- package/dist/components/inputs/country-select.es.js.map +0 -1
- package/dist/components/inputs/license-type-select.es.js +0 -31
- package/dist/components/inputs/license-type-select.es.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/data-table/data-table.tsx"],"sourcesContent":["\"use client\";\nimport {\n\ttype ApiFilters,\n\ttype ApiSchema,\n\tcn,\n\tLoader,\n\tSearchField,\n\tTABLE_CHECK_BOX_COLUMN,\n\tTABLE_DEFAULT_DATE_COLUMNS,\n\tTABLE_ID_COLUMN,\n\ttype TableActions,\n\ttype TableFetchFn\n} from \"@/index\";\nimport type { components, operations } from \"@cryptlex/web-api-types\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport {\n\ttype AccessorFnColumnDef,\n\ttype Column,\n\ttype ColumnDef,\n\ttype ColumnOrderState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype TableState,\n\ttype Updater,\n\tuseReactTable,\n\ttype VisibilityState\n} from \"@tanstack/react-table\";\nimport { ArrowDownNarrowWide, ArrowDownWideNarrow, ArrowUpDown, Columns3, GripVertical, Info } from \"lucide-react\";\nimport React, { createContext, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\n/** Reserved name for actions column */\nexport const ACTIONS_COLUMN_ID = \"tableActions\";\n\nexport type Schemas = ApiSchema<keyof components['schemas']>;\nexport type OperationKeys = keyof operations;\n\ntype DataTableFactory<TData extends Schemas> = {\n\tfetchFn: TableFetchFn<TData, OperationKeys>;\n\tcolumns: ColumnDef<TData, any>[]\n\tallowSelection?: boolean;\n\tcolumnsToHideByDefault?: VisibilityState; // Columns that are hidden by default\n\tfilterConfig: FiltersConfig<OperationKeys>\n}\n\n\ntype DataTableState = Pick<TableState, 'sorting' | 'rowSelection' | 'pagination'> & {};\n/**\n * Hook for handling all data-table state. Used in DataTableContext\n */\nexport function useDataTableState<TData extends Schemas>({ columns, fetchFn, columnsToHideByDefault = {}, allowSelection = false, filterConfig }: DataTableFactory<TData>) {\n\tconst id = useId();\n\n\t// TODO: Would it be better for this state to be more granular?\n\tconst [tableState, _setTableState] = useState<DataTableState>({\n\t\t/** TODO Reflect in URL */\n\t\tpagination: { pageIndex: 0, pageSize: 20 }, // Pagination state\n\t\tsorting: [], // Sorting state\n\n\t\t/** Ephemeral */\n\t\trowSelection: {}, // Row selection state\n\t});\n\n\t/** TODO Reflect in URL */\n\tconst [searchQuery, setSearchQuery] = useState('');\n\n\t/** TODO Store on browser as preference */\n\tconst [columnOrder, setColumnOrder] = useState<ColumnOrderState>([])\n\t// TODO Store on browser\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({\n\t\tid: false,\n\t\tupdatedAt: false,\n\t\t...columnsToHideByDefault,\n\t});\n\n\tconst [filters, setFilters] = useState<ApiFilters<OperationKeys>[]>([]);\n\n\tconst mergedFilters = useMemo(() => {\n\t\treturn filters.reduce((acc, current) => {\n\t\t\treturn merge(acc, current);\n\t\t}, {});\n\t}, [filters])\n\n\t// Update table state with new values\n\tconst updateTableState = (updates: Partial<DataTableState>) => {\n\t\t_setTableState((prev) => ({ ...prev, ...updates }));\n\t};\n\n\tconst {\n\t\tsorting,\n\t\trowSelection,\n\t\tpagination,\n\t} = tableState;\n\n\tconst query = useQuery({\n\t\tqueryKey: [id, pagination, sorting, searchQuery],\n\t\tqueryFn: () => fetchFn(pagination, sorting, searchQuery, mergedFilters),\n\t\tplaceholderData: keepPreviousData, // Keep previous data while loading new data\n\t\tretry: 0,\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\tuseEffect(() => {\n\t\t// TODO, store in localStorage\n\t}, [columnVisibility])\n\n\tconst columnHelper = useMemo(() => createColumnHelper<TData>(), []);\n\n\tconst metadataColumns = useMemo<AccessorFnColumnDef<TData, string>[]>(() => {\n\t\tconst data = query.data?.data;\n\t\tif (!data?.length) return [];\n\n\t\ttype WithMeta = TData & { metadata: ApiSchema<'MetadataDto'>[] };\n\t\tconst rowHasMetadata = (row: TData): row is WithMeta => row != null &&\n\t\t\ttypeof row === 'object' &&\n\t\t\t'metadata' in row &&\n\t\t\tArray.isArray((row).metadata);\n\n\t\tconst rowsWithMeta = data.filter(\n\t\t\trowHasMetadata\n\t\t);\n\t\tif (rowsWithMeta.length === 0) return [];\n\t\tconst keys = Array.from(new Set(rowsWithMeta.flatMap(r => r.metadata?.map(m => m.key) ?? [])));\n\n\t\treturn keys.map(key =>\n\t\t\tcolumnHelper.accessor(\n\t\t\t\t(row) => {\n\t\t\t\t\tif (rowHasMetadata(row)) {\n\t\t\t\t\t\treturn row?.metadata?.find(m => m.key === key)?.value ?? '';\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: key,\n\t\t\t\t\theader: key, // tooltip header\n\t\t\t\t\tenableSorting: false,\n\t\t\t\t\tcell: (info) => {\n\t\t\t\t\t\tconst value = info.getValue();\n\t\t\t\t\t\t// Handle null/undefined values\n\t\t\t\t\t\tif (value === null || value === undefined) return \"\";\n\t\t\t\t\t\t// For primitive types, return the string representation\n\t\t\t\t\t\treturn String(value);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t));\n\t}, [query.data?.data]);\n\n\t/**\n\t * ID,createdAt and updatedAt will be added by default for all tables\n\t * If selection is allowed, checkbox will be added\n\t * If the dto has metadata, dynamics columns for all the metadata key-value will be added(particular for a view)\n\t * If there are actions for the table, they will be placed fixed at the right side of table.\n\t */\n\tconst cols: ColumnDef<any, any>[] = [\n\t\t...(allowSelection ? TABLE_CHECK_BOX_COLUMN : []),\n\t\t...TABLE_ID_COLUMN,\n\t\t...columns.filter((col) => col.id !== ACTIONS_COLUMN_ID),\n\t\t...(metadataColumns.length ? metadataColumns : []),\n\t\t...TABLE_DEFAULT_DATE_COLUMNS,\n\t\t// Actions column\n\t\t...columns.filter((col) => col.id === ACTIONS_COLUMN_ID),\n\t];\n\n\t// Type-guard for updater\n\tfunction isUpdaterFunction<T>(updater: Updater<T>): updater is (old: T) => T {\n\t\treturn typeof updater === \"function\";\n\t}\n\t// Utility function to resolve updater\n\tfunction resolveUpdater<T>(updater: Updater<T>, currentValue: T) {\n\t\tif (isUpdaterFunction(updater)) {\n\t\t\treturn updater(currentValue);\n\t\t}\n\t\treturn updater;\n\t}\n\n\t// Use react-table's hook to create the table instance\n\tconst tanTable = useReactTable({\n\t\tdata: query.data?.data ?? [],\n\t\tcolumns: cols,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\trowCount: query.data?.total,\n\t\tmanualPagination: true, // Handle pagination manually since pagination is done server side for data tables\n\t\tonPaginationChange: (updater) => {\n\t\t\tupdateTableState({ pagination: resolveUpdater(updater, pagination) });\n\t\t},\n\t\tmanualSorting: true, // Handle sorting manually since sorting is done server side for data tables\n\t\tonSortingChange: (updater) => {\n\t\t\tupdateTableState({ sorting: [...resolveUpdater(updater, sorting)], rowSelection: {} }); // Reset selection when sorting.\n\t\t},\n\t\tmanualFiltering: true, // Handle filtering manually since filtering is done server side for data tables\n\t\tonColumnVisibilityChange: (updater) => {\n\t\t\tsetColumnVisibility(resolveUpdater(updater, columnVisibility));\n\t\t},\n\t\tonRowSelectionChange: (updater) => {\n\t\t\tupdateTableState({ rowSelection: resolveUpdater(updater, rowSelection) });\n\t\t},\n\t\tonColumnOrderChange: (updater) => {\n\t\t\tsetColumnOrder(resolveUpdater(updater, columnOrder));\n\t\t},\n\t\tstate: {\n\t\t\tsorting: sorting,\n\t\t\tcolumnVisibility: columnVisibility,\n\t\t\tpagination: pagination,\n\t\t\trowSelection: rowSelection,\n\t\t\tcolumnOrder: columnOrder\n\t\t},\n\t\tmeta: {\n\t\t\trefetch: query.refetch,\n\t\t},\n\t});\n\n\t// By default, ColumnDef does not give guarantees of column.id existing. Once useReactTable is called, all columns are assigned IDs.\n\t// This populates the columnIds in the columnOrder state\n\t// TODO, add localStorage access layer for this. \n\tuseEffect(() => {\n\t\tsetColumnOrder([...tanTable.getAllLeafColumns().map(c => c.id)]);\n\t}, [])\n\n\treturn { tableState, updateTableState, query, setSearchQuery, searchQuery, tanTable, mergedFilters, filters, setFilters, filterConfig }\n}\n\nexport const DataTableContext = createContext<ReturnType<typeof useDataTableState> | null>(null);\n\nexport const useDataTable = () => {\n\tconst ctx = useContext(DataTableContext);\n\tif (!ctx) {\n\t\tthrow Error(\"DataTable should be used within DataTableProvider.\")\n\t}\n\treturn ctx;\n}\n\nexport function DataTableProvider({ children, ...props }: { children: React.ReactNode; } & ReturnType<typeof useDataTableState>) {\n\treturn (\n\t\t<DataTableContext.Provider value={props}>\n\t\t\t{children}\n\t\t</DataTableContext.Provider>\n\t)\n}\n\n\nexport type DataTableProps = React.ComponentProps<'section'> & {\n\ttableActions: TableActions;\n\n\t// filterConfig: {\n\t// \tfilters: Record<keyof ApiFilters<TOperation>, 'date' | 'string' | 'known-string' | 'number'>,\n\t// }\n}\nexport function DataTable({\n\ttableActions,\n\tclassName,\n\t...props\n\t// filterableFields,\n}: DataTableProps) {\n\t// State for managing table data and filters\n\tconst { query, tanTable } = useDataTable();\n\n\treturn (\n\t\t<>\n\t\t\t{/* Table Actions Section */}\n\t\t\t<section {...props} className={cn(\"flex flex-col bg-card\", className)}>\n\t\t\t\t<Actions tableActions={tableActions} />\n\t\t\t\t{/* The div here is necessary because TableContent is internally a <table> tag and does not respect width, height CSS */}\n\t\t\t\t<div className=\"w-full overflow-auto border-x grow min-h-table relative\" tabIndex={0}>\n\t\t\t\t\t{/* Table overlay with loader */}\n\t\t\t\t\t{query.isLoading && (\n\t\t\t\t\t\t<TableOverlay className=\"cursor-wait\">\n\t\t\t\t\t\t\t<Loader />\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Table overlay for empty table */}\n\t\t\t\t\t{!query.isLoading && tanTable.getRowModel().rows.length === 0 && (\n\t\t\t\t\t\t// Empty table\n\t\t\t\t\t\t<TableOverlay className=\"cursor-not-allowed\">\n\t\t\t\t\t\t\t{!query.isFetching &&\n\t\t\t\t\t\t\t\t(query.isError ? (\n\t\t\t\t\t\t\t\t\t<span className=\"flex gap-3 justify-center items-center\">\n\t\t\t\t\t\t\t\t\t\t{/* TODO (mudasir-pandith) Check for 403 explicitly!! */}\n\t\t\t\t\t\t\t\t\t\t{/* <span>{query.error}</span> */}\n\t\t\t\t\t\t\t\t\t\t<Info />\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\tYou don't have the required permissions. Please contact your\n\t\t\t\t\t\t\t\t\t\t\tadmin.\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : !query.data?.data ? (\n\t\t\t\t\t\t\t\t\t<>No results found.</>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>Unknown error. Please contact customer support.</>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{!query.isLoading && tanTable.getRowModel().rows.length !== 0 &&\n\t\t\t\t\t\t<TableContent className=\"size-full\" />}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Table Footer Section with Pagination and Column Picker */}\n\t\t\t\t<div className=\"flex w-full justify-between border gap-icon p-icon overflow-x-auto\">\n\t\t\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t\t\t<ColumnPicker />\n\t\t\t\t\t\t<PageSize />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Paginator />\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</>\n\t);\n}\n/** Table overlay to be shown for loaders or other messages */\nfunction TableOverlay({\n\tchildren,\n\tclassName,\n}: { children: React.ReactNode; className?: string }) {\n\treturn (\n\t\t<>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\tclassName,\n\t\t\t\t\t\"absolute top-0 bg-card z-20 size-full text-sm flex items-center justify-center\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{/* Keep something in document flow with the correct height */}\n\t\t\t<span className=\"relative h-full w-0 block\" />\n\t\t</>\n\t);\n}\n\nimport {\n\tButton,\n\tgetResourceDisplayName,\n} from \"@/index\";\nimport {\n\tarrayMove,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from '@dnd-kit/sortable';\n\nfunction ColumnPicker() {\n\tconst { tanTable, tableState } = useDataTable();\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t})\n\t);\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(event) => {\n\t\t\t\tconst { active } = event;\n\t\t\t\tsetActiveId(active.id.toString());\n\t\t\t}}\n\t\t\tonDragEnd={(event) => {\n\t\t\t\tconst { active, over } = event;\n\n\t\t\t\tif (over && active.id !== over.id) {\n\t\t\t\t\tconst columnOrder = tanTable.getState().columnOrder;\n\t\t\t\t\tconst oldIndex = columnOrder.indexOf(active.id.toString());\n\t\t\t\t\tconst newIndex = columnOrder.indexOf(over.id.toString());\n\t\t\t\t\ttanTable.setColumnOrder([...arrayMove(columnOrder, oldIndex, newIndex)]);\n\t\t\t\t}\n\n\t\t\t\tsetActiveId(null);\n\t\t\t}}\n\t\t>\n\t\t\t<SortableContext\n\t\t\t\titems={tanTable.getState().columnOrder}\n\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t>\n\t\t\t\t<EasyMenu label={<><Columns3 />Columns</>} selectionMode=\"multiple\" items={tanTable.getAllFlatColumns()} selectedKeys={tanTable.getIsAllColumnsVisible() ? 'all' : tanTable.getVisibleFlatColumns().map(c => c.id)}>\n\t\t\t\t\t<MenuItem onAction={() => tanTable.toggleAllColumnsVisible()} className={'italic'}>(select all)</MenuItem>\n\t\t\t\t\t{tanTable.getState().columnOrder.map(colId => {\n\t\t\t\t\t\tconst col = tanTable.getAllFlatColumns().find(c => c.id === colId);\n\t\t\t\t\t\tif (!col) return null;\n\t\t\t\t\t\treturn <SortableItem key={col.id} column={col} />\n\t\t\t\t\t})}\n\t\t\t\t</EasyMenu>\n\t\t\t\t<DragOverlay>\n\t\t\t\t\t{activeId ? <div className=\"dropdown-item opacity-70 border-2 border-primary\">{getResourceDisplayName(activeId, \"admin-portal\")}</div> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</SortableContext>\n\t\t</DndContext>\n\t);\n\n\n\tfunction SortableItem({ column }: { column: Column<any, unknown> }) {\n\t\tconst {\n\t\t\tattributes,\n\t\t\tlisteners,\n\t\t\tsetNodeRef,\n\t\t\ttransform,\n\t\t\ttransition,\n\t\t} = useSortable({ id: column.id });\n\t\tconst style = {\n\t\t\ttransform: CSS.Transform.toString(transform),\n\t\t\ttransition,\n\t\t\tzIndex: '999'\n\t\t};\n\t\treturn <MenuItem\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\tid={column.id}\n\t\t\tonAction={() => column.toggleVisibility()}\n\t\t\tisDisabled={!column.getCanHide()} className=\"flex items-center\">\n\t\t\t<GripVertical {...listeners} className=\"size-icon cursor-grab\" />\n\t\t\t{/* TODO getResourceDisplayName using context provider */}\n\t\t\t{getResourceDisplayName(column.id, \"admin-portal\")}\n\t\t\t{column.getIsSorted() && <SortIcon className=\"size-icon\" direction={column.getIsSorted()} />}\n\t\t</MenuItem>;\n\t}\n}\n\n\n\nimport {\n\tChevronFirst,\n\tChevronLast,\n\tChevronLeft,\n\tChevronRight,\n} from \"lucide-react\";\n\nfunction Paginator() {\n\tconst { tanTable, query } = useDataTable();\n\tconst rowCount = query.data?.total ?? 0\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<span className=\"whitespace-nowrap caption text-muted\">\n\t\t\t\t{`${tanTable.getState().pagination.pageIndex * tanTable.getState().pagination.pageSize + 1} - ${Math.min(\n\t\t\t\t\t(tanTable.getState().pagination.pageIndex + 1) *\n\t\t\t\t\ttanTable.getState().pagination.pageSize,\n\t\t\t\t\trowCount,\n\t\t\t\t)} of ${rowCount?.toLocaleString()}`}\n\t\t\t</span>\n\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.firstPage()}\n\t\t\t\tisDisabled={!tanTable.getCanPreviousPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronFirst /></Button>\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.previousPage()}\n\t\t\t\tisDisabled={!tanTable.getCanPreviousPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronLeft /></Button>\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.nextPage()}\n\t\t\t\tisDisabled={!tanTable.getCanNextPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronRight /></Button>\n\t\t\t<Button\n\t\t\t\tonClick={() => tanTable.lastPage()}\n\t\t\t\tisDisabled={!tanTable.getCanNextPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronLast /></Button>\n\t\t</div>\n\t);\n}\n\n\nfunction PageSize() {\n\tconst { tanTable } = useDataTable();\n\tconst PAGE_SIZES = [10, 20, 30, 40, 50];\n\n\treturn (\n\t\t<EasyMenu label={tanTable.getState().pagination.pageSize.toString()} selectionMode=\"single\" selectedKeys={[tanTable.getState().pagination.pageSize.toString()]} items={PAGE_SIZES.map(s => ({ id: s.toString(), value: s }))}>\n\t\t\t{\n\t\t\t\t(items) => <MenuItem onAction={() => tanTable.setPageSize(items.value)}>{items.value}</MenuItem>\n\t\t\t}\n\t\t</EasyMenu>\n\t);\n}\n\n\nimport { RotateCw } from \"lucide-react\";\n\nfunction Actions({ tableActions }: { tableActions: TableActions }) {\n\tconst { query, tanTable, searchQuery, setSearchQuery } = useDataTable();\n\n\treturn (\n\t\t<section className=\"flex bg-card justify-between my-0 p-icon border gap-icon overflow-auto\">\n\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t<Button\n\t\t\t\t\tisPending={query.isFetching}\n\t\t\t\t\tonClick={() => query.refetch()}\n\t\t\t\t\tvariant={\"neutral\"}\n\t\t\t\t\tsize={\"icon\"}\n\t\t\t\t><RotateCw /></Button>\n\n\t\t\t\t{tableActions\n\t\t\t\t\t.filter(ta => ta.bulk === tanTable.getSelectedRowModel().rows.length > 0)\n\t\t\t\t\t.map((ta, i) => {\n\t\t\t\t\t\tconst Icon = ta.icon;\n\t\t\t\t\t\treturn (<Button key={`${i}-${ta.bulk}`} type=\"button\" isDisabled={query.isFetching} className=\"animate-in fade-in slide-in-from-left-15 duration-300 transition-transform\" onPress={(e) => { ta.onClick(e, tanTable) }} size={'icon'}><Icon /></Button>)\n\t\t\t\t\t}\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t<DataTableFilter />\n\t\t\t\t{(\n\t\t\t\t\t<SearchField value={searchQuery} onChange={setSearchQuery} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\n\nimport { DataTableFilter, type FiltersConfig } from \"@/components/data-table/data-table-filter\";\nimport { EasyMenu, MenuItem } from \"@/components/ui/menu\";\nimport {\n\tTableBody,\n\tTableCell,\n\tTable as TableComponent,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from \"@/components/ui/table\";\nimport { closestCenter, DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors } from \"@dnd-kit/core\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n\tflexRender\n} from \"@tanstack/react-table\";\nimport { merge } from \"lodash-es\";\n\nfunction SortIcon({ direction, ...props }: { direction: 'asc' | 'desc' | false } & Omit<React.ComponentProps<'svg'>, 'direction'>) {\n\tif (direction === 'asc') return <ArrowDownNarrowWide {...props} />\n\telse if (direction === 'desc') return <ArrowDownWideNarrow {...props} />\n\telse return <ArrowUpDown {...props} />\n}\n\n// TODO, automate checking valid HTML\nfunction TableContent({ className }: React.ComponentProps<typeof TableComponent>) {\n\tconst { tanTable } = useDataTable();\n\tconst tableCellStyle = (isSticky: boolean, className?: string) => cn(\"animate-in fade-in slide-in-from-top-10\", \"px-icon py-2 text-left text-sm font-medium whitespace-nowrap\", isSticky && \"bg-card sticky right-0 z-50 text-center\", className)\n\treturn (\n\t\t<TableComponent className={cn(className)}>\n\t\t\t<TableHeader className=\"sticky top-0 z-10\">\n\t\t\t\t{tanTable.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t<TableRow className={cn(\"h-input\")} key={headerGroup.id}>\n\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\tclassName={tableCellStyle(false, \"bg-card\")}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!header.column.getCanSort() && !header.isPlaceholder\n\t\t\t\t\t\t\t\t\t&& <>{flexRender(\n\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t)}</>}\n\t\t\t\t\t\t\t\t{/* TODO Align header text with table text */}\n\t\t\t\t\t\t\t\t{header.column.getCanSort() && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full !justify-start !px-1.5\"\n\t\t\t\t\t\t\t\t\t\tonPress={header.column.getToggleSortingHandler()}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<SortIcon direction={header.column.getIsSorted()} />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t))}\n\t\t\t</TableHeader>\n\t\t\t<TableBody className=\"flex-1 overflow-y-auto relative\">\n\t\t\t\t{tanTable.getRowModel().rows.map((row) => (\n\t\t\t\t\t<TableRow\n\t\t\t\t\t\tclassName={cn(\"h-input transition-colors data-[selected=true]:bg-primary/10 hover:bg-muted-foreground/20\")}\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\tdata-selected={row.getIsSelected()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\tclassName={tableCellStyle(cell.column.id === ACTIONS_COLUMN_ID)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\tcell.column.columnDef.cell,\n\t\t\t\t\t\t\t\t\tcell.getContext(),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t))}\n\t\t\t</TableBody>\n\t\t</TableComponent>\n\t);\n}\n"],"names":["ACTIONS_COLUMN_ID","useDataTableState","columns","fetchFn","columnsToHideByDefault","allowSelection","filterConfig","id","useId","tableState","_setTableState","useState","searchQuery","setSearchQuery","columnOrder","setColumnOrder","columnVisibility","setColumnVisibility","filters","setFilters","mergedFilters","useMemo","acc","current","merge","updateTableState","updates","prev","sorting","rowSelection","pagination","query","useQuery","keepPreviousData","useEffect","columnHelper","createColumnHelper","metadataColumns","data","_a","rowHasMetadata","row","rowsWithMeta","r","m","key","_b","info","value","cols","TABLE_CHECK_BOX_COLUMN","TABLE_ID_COLUMN","col","TABLE_DEFAULT_DATE_COLUMNS","isUpdaterFunction","updater","resolveUpdater","currentValue","tanTable","useReactTable","getCoreRowModel","_c","c","DataTableContext","createContext","useDataTable","ctx","useContext","DataTableProvider","children","props","DataTable","tableActions","className","jsx","Fragment","cn","Actions","jsxs","TableOverlay","Loader","Info","TableContent","ColumnPicker","PageSize","Paginator","activeId","setActiveId","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","DndContext","closestCenter","event","active","over","oldIndex","newIndex","arrayMove","SortableContext","verticalListSortingStrategy","EasyMenu","Columns3","MenuItem","colId","SortableItem","DragOverlay","getResourceDisplayName","column","attributes","listeners","setNodeRef","transform","transition","useSortable","style","CSS","GripVertical","SortIcon","rowCount","Button","ChevronFirst","ChevronLeft","ChevronRight","ChevronLast","PAGE_SIZES","s","items","RotateCw","ta","i","Icon","e","DataTableFilter","SearchField","direction","ArrowDownNarrowWide","ArrowDownWideNarrow","ArrowUpDown","tableCellStyle","isSticky","TableComponent","TableHeader","headerGroup","TableRow","header","TableHead","flexRender","TableBody","cell","TableCell"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"data-table.es.js","sources":["../../../lib/components/data-table/data-table.tsx"],"sourcesContent":["\"use client\";\nimport {\n\ttype ApiFilters,\n\ttype ApiSchema,\n\tcn,\n\tLoader,\n\tSearchField,\n\tTABLE_CHECK_BOX_COLUMN,\n\tTABLE_DEFAULT_DATE_COLUMNS,\n\tTABLE_ID_COLUMN,\n\ttype TableActions,\n\ttype TableFetchFn\n} from \"@/index\";\nimport type { components, operations } from \"@cryptlex/web-api-types\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport {\n\ttype AccessorFnColumnDef,\n\ttype Column,\n\ttype ColumnDef,\n\ttype ColumnOrderState,\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\ttype TableState,\n\ttype Updater,\n\tuseReactTable,\n\ttype VisibilityState\n} from \"@tanstack/react-table\";\nimport { ArrowDownNarrowWide, ArrowDownWideNarrow, ArrowUpDown, Columns3, GripVertical, Info } from \"lucide-react\";\nimport React, { createContext, useContext, useEffect, useId, useMemo, useState } from \"react\";\n\n/** Reserved name for actions column */\nexport const ACTIONS_COLUMN_ID = \"tableActions\";\n\nexport type Schemas = ApiSchema<keyof components['schemas']>;\nexport type OperationKeys = keyof operations;\n\ntype DataTableFactory<TData extends Schemas> = {\n\tfetchFn: TableFetchFn<TData, OperationKeys>;\n\tcolumns: ColumnDef<TData, any>[]\n\tallowSelection?: boolean;\n\tcolumnsToHideByDefault?: VisibilityState; // Columns that are hidden by default\n\tfilterConfig: FiltersConfig<OperationKeys>\n}\n\n\ntype DataTableState = Pick<TableState, 'sorting' | 'rowSelection' | 'pagination'> & {};\n/**\n * Hook for handling all data-table state. Used in DataTableContext\n */\nexport function useDataTableState<TData extends Schemas>({ columns, fetchFn, columnsToHideByDefault = {}, allowSelection = false, filterConfig }: DataTableFactory<TData>) {\n\tconst id = useId();\n\n\t// TODO: Would it be better for this state to be more granular?\n\tconst [tableState, _setTableState] = useState<DataTableState>({\n\t\t/** TODO Reflect in URL */\n\t\tpagination: { pageIndex: 0, pageSize: 20 }, // Pagination state\n\t\tsorting: [], // Sorting state\n\n\t\t/** Ephemeral */\n\t\trowSelection: {}, // Row selection state\n\t});\n\n\t/** TODO Reflect in URL */\n\tconst [searchQuery, setSearchQuery] = useState('');\n\n\t/** TODO Store on browser as preference */\n\tconst [columnOrder, setColumnOrder] = useState<ColumnOrderState>([])\n\t// TODO Store on browser\n\tconst [columnVisibility, setColumnVisibility] = useState<VisibilityState>({\n\t\tid: false,\n\t\tupdatedAt: false,\n\t\t...columnsToHideByDefault,\n\t});\n\n\tconst [filters, setFilters] = useState<ApiFilters<OperationKeys>[]>([]);\n\n\tconst mergedFilters = useMemo(() => {\n\t\treturn filters.reduce((acc, current) => {\n\t\t\treturn merge(acc, current);\n\t\t}, {});\n\t}, [filters])\n\n\t// Update table state with new values\n\tconst updateTableState = (updates: Partial<DataTableState>) => {\n\t\t_setTableState((prev) => ({ ...prev, ...updates }));\n\t};\n\n\tconst {\n\t\tsorting,\n\t\trowSelection,\n\t\tpagination,\n\t} = tableState;\n\n\tconst query = useQuery({\n\t\tqueryKey: [id, pagination, sorting, searchQuery],\n\t\tqueryFn: () => fetchFn(pagination, sorting, searchQuery, mergedFilters),\n\t\tplaceholderData: keepPreviousData, // Keep previous data while loading new data\n\t\tretry: 0,\n\t\trefetchOnWindowFocus: false,\n\t});\n\n\tuseEffect(() => {\n\t\t// TODO, store in localStorage\n\t}, [columnVisibility])\n\n\tconst columnHelper = useMemo(() => createColumnHelper<TData>(), []);\n\n\tconst metadataColumns = useMemo<AccessorFnColumnDef<TData, string>[]>(() => {\n\t\tconst data = query.data?.data;\n\t\tif (!data?.length) return [];\n\n\t\ttype WithMeta = TData & { metadata: ApiSchema<'MetadataDto'>[] };\n\t\tconst rowHasMetadata = (row: TData): row is WithMeta => row != null &&\n\t\t\ttypeof row === 'object' &&\n\t\t\t'metadata' in row &&\n\t\t\tArray.isArray((row).metadata);\n\n\t\tconst rowsWithMeta = data.filter(\n\t\t\trowHasMetadata\n\t\t);\n\t\tif (rowsWithMeta.length === 0) return [];\n\t\tconst keys = Array.from(new Set(rowsWithMeta.flatMap(r => r.metadata?.map(m => m.key) ?? [])));\n\n\t\treturn keys.map(key =>\n\t\t\tcolumnHelper.accessor(\n\t\t\t\t(row) => {\n\t\t\t\t\tif (rowHasMetadata(row)) {\n\t\t\t\t\t\treturn row?.metadata?.find(m => m.key === key)?.value ?? '';\n\t\t\t\t\t}\n\t\t\t\t\treturn '';\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: key,\n\t\t\t\t\theader: key, // tooltip header\n\t\t\t\t\tenableSorting: false,\n\t\t\t\t\tcell: (info) => {\n\t\t\t\t\t\tconst value = info.getValue();\n\t\t\t\t\t\t// Handle null/undefined values\n\t\t\t\t\t\tif (value === null || value === undefined) return \"\";\n\t\t\t\t\t\t// For primitive types, return the string representation\n\t\t\t\t\t\treturn String(value);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t));\n\t}, [query.data?.data]);\n\n\t/**\n\t * ID,createdAt and updatedAt will be added by default for all tables\n\t * If selection is allowed, checkbox will be added\n\t * If the dto has metadata, dynamics columns for all the metadata key-value will be added(particular for a view)\n\t * If there are actions for the table, they will be placed fixed at the right side of table.\n\t */\n\tconst cols: ColumnDef<any, any>[] = [\n\t\t...(allowSelection ? TABLE_CHECK_BOX_COLUMN : []),\n\t\t...TABLE_ID_COLUMN,\n\t\t...columns.filter((col) => col.id !== ACTIONS_COLUMN_ID),\n\t\t...(metadataColumns.length ? metadataColumns : []),\n\t\t...TABLE_DEFAULT_DATE_COLUMNS,\n\t\t// Actions column\n\t\t...columns.filter((col) => col.id === ACTIONS_COLUMN_ID),\n\t];\n\n\t// Type-guard for updater\n\tfunction isUpdaterFunction<T>(updater: Updater<T>): updater is (old: T) => T {\n\t\treturn typeof updater === \"function\";\n\t}\n\t// Utility function to resolve updater\n\tfunction resolveUpdater<T>(updater: Updater<T>, currentValue: T) {\n\t\tif (isUpdaterFunction(updater)) {\n\t\t\treturn updater(currentValue);\n\t\t}\n\t\treturn updater;\n\t}\n\n\t// Use react-table's hook to create the table instance\n\tconst tanTable = useReactTable({\n\t\tdata: query.data?.data ?? [],\n\t\tcolumns: cols,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\trowCount: query.data?.total,\n\t\tmanualPagination: true, // Handle pagination manually since pagination is done server side for data tables\n\t\tonPaginationChange: (updater) => {\n\t\t\tupdateTableState({ pagination: resolveUpdater(updater, pagination) });\n\t\t},\n\t\tmanualSorting: true, // Handle sorting manually since sorting is done server side for data tables\n\t\tonSortingChange: (updater) => {\n\t\t\tupdateTableState({ sorting: [...resolveUpdater(updater, sorting)], rowSelection: {} }); // Reset selection when sorting.\n\t\t},\n\t\tmanualFiltering: true, // Handle filtering manually since filtering is done server side for data tables\n\t\tonColumnVisibilityChange: (updater) => {\n\t\t\tsetColumnVisibility(resolveUpdater(updater, columnVisibility));\n\t\t},\n\t\tonRowSelectionChange: (updater) => {\n\t\t\tupdateTableState({ rowSelection: resolveUpdater(updater, rowSelection) });\n\t\t},\n\t\tonColumnOrderChange: (updater) => {\n\t\t\tsetColumnOrder(resolveUpdater(updater, columnOrder));\n\t\t},\n\t\tstate: {\n\t\t\tsorting: sorting,\n\t\t\tcolumnVisibility: columnVisibility,\n\t\t\tpagination: pagination,\n\t\t\trowSelection: rowSelection,\n\t\t\tcolumnOrder: columnOrder\n\t\t},\n\t\tmeta: {\n\t\t\trefetch: query.refetch,\n\t\t},\n\t});\n\n\t// By default, ColumnDef does not give guarantees of column.id existing. Once useReactTable is called, all columns are assigned IDs.\n\t// This populates the columnIds in the columnOrder state\n\t// TODO, add localStorage access layer for this. \n\tuseEffect(() => {\n\t\tsetColumnOrder([...tanTable.getAllLeafColumns().map(c => c.id)]);\n\t}, [])\n\n\treturn { tableState, updateTableState, query, setSearchQuery, searchQuery, tanTable, mergedFilters, filters, setFilters, filterConfig }\n}\n\nexport const DataTableContext = createContext<ReturnType<typeof useDataTableState> | null>(null);\n\nexport const useDataTable = () => {\n\tconst ctx = useContext(DataTableContext);\n\tif (!ctx) {\n\t\tthrow Error(\"DataTable should be used within DataTableProvider.\")\n\t}\n\treturn ctx;\n}\n\nexport function DataTableProvider({ children, ...props }: { children: React.ReactNode; } & ReturnType<typeof useDataTableState>) {\n\treturn (\n\t\t<DataTableContext.Provider value={props}>\n\t\t\t{children}\n\t\t</DataTableContext.Provider>\n\t)\n}\n\n\nexport type DataTableProps = React.ComponentProps<'section'> & {\n\ttableActions: TableActions;\n\n\t// filterConfig: {\n\t// \tfilters: Record<keyof ApiFilters<TOperation>, 'date' | 'string' | 'known-string' | 'number'>,\n\t// }\n}\nexport function DataTable({\n\ttableActions,\n\tclassName,\n\t...props\n\t// filterableFields,\n}: DataTableProps) {\n\t// State for managing table data and filters\n\tconst { query, tanTable } = useDataTable();\n\n\treturn (\n\t\t<>\n\t\t\t{/* Table Actions Section */}\n\t\t\t<section {...props} className={cn(\"flex flex-col bg-card\", className)}>\n\t\t\t\t<Actions tableActions={tableActions} />\n\t\t\t\t{/* The div here is necessary because TableContent is internally a <table> tag and does not respect width, height CSS */}\n\t\t\t\t<div className=\"w-full overflow-auto border-x grow min-h-table relative\" tabIndex={0}>\n\t\t\t\t\t{/* Table overlay with loader */}\n\t\t\t\t\t{query.isLoading && (\n\t\t\t\t\t\t<TableOverlay className=\"cursor-wait\">\n\t\t\t\t\t\t\t<Loader />\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{/* Table overlay for empty table */}\n\t\t\t\t\t{!query.isLoading && tanTable.getRowModel().rows.length === 0 && (\n\t\t\t\t\t\t// Empty table\n\t\t\t\t\t\t<TableOverlay className=\"cursor-not-allowed\">\n\t\t\t\t\t\t\t{!query.isFetching &&\n\t\t\t\t\t\t\t\t(query.isError ? (\n\t\t\t\t\t\t\t\t\t<span className=\"flex gap-3 justify-center items-center\">\n\t\t\t\t\t\t\t\t\t\t{/* TODO (mudasir-pandith) Check for 403 explicitly!! */}\n\t\t\t\t\t\t\t\t\t\t{/* <span>{query.error}</span> */}\n\t\t\t\t\t\t\t\t\t\t<Info />\n\t\t\t\t\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t\t\t\t\tYou don't have the required permissions. Please contact your\n\t\t\t\t\t\t\t\t\t\t\tadmin.\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t) : !query.data?.data ? (\n\t\t\t\t\t\t\t\t\t<>No results found.</>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<>Unknown error. Please contact customer support.</>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableOverlay>\n\t\t\t\t\t)}\n\t\t\t\t\t{!query.isLoading && tanTable.getRowModel().rows.length !== 0 &&\n\t\t\t\t\t\t<TableContent className=\"size-full\" />}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Table Footer Section with Pagination and Column Picker */}\n\t\t\t\t<div className=\"flex w-full justify-between border gap-icon p-icon overflow-x-auto\">\n\t\t\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t\t\t<ColumnPicker />\n\t\t\t\t\t\t<PageSize />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Paginator />\n\t\t\t\t</div>\n\t\t\t</section>\n\t\t</>\n\t);\n}\n/** Table overlay to be shown for loaders or other messages */\nfunction TableOverlay({\n\tchildren,\n\tclassName,\n}: { children: React.ReactNode; className?: string }) {\n\treturn (\n\t\t<>\n\t\t\t<span\n\t\t\t\tclassName={cn(\n\t\t\t\t\tclassName,\n\t\t\t\t\t\"absolute top-0 bg-card z-20 size-full text-sm flex items-center justify-center\",\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t\t{/* Keep something in document flow with the correct height */}\n\t\t\t<span className=\"relative h-full w-0 block\" />\n\t\t</>\n\t);\n}\n\nimport {\n\tButton,\n} from \"@/index\";\nimport {\n\tarrayMove,\n\tSortableContext,\n\tsortableKeyboardCoordinates,\n\tuseSortable,\n\tverticalListSortingStrategy\n} from '@dnd-kit/sortable';\n\nfunction ColumnPicker() {\n\tconst { tanTable, tableState } = useDataTable();\n\tconst [activeId, setActiveId] = useState<string | null>(null);\n\n\tconst resourceFormatter = useResourceFormatter();\n\n\tconst sensors = useSensors(\n\t\tuseSensor(PointerSensor),\n\t\tuseSensor(KeyboardSensor, {\n\t\t\tcoordinateGetter: sortableKeyboardCoordinates,\n\t\t})\n\t);\n\treturn (\n\t\t<DndContext\n\t\t\tsensors={sensors}\n\t\t\tcollisionDetection={closestCenter}\n\t\t\tonDragStart={(event) => {\n\t\t\t\tconst { active } = event;\n\t\t\t\tsetActiveId(active.id.toString());\n\t\t\t}}\n\t\t\tonDragEnd={(event) => {\n\t\t\t\tconst { active, over } = event;\n\n\t\t\t\tif (over && active.id !== over.id) {\n\t\t\t\t\tconst columnOrder = tanTable.getState().columnOrder;\n\t\t\t\t\tconst oldIndex = columnOrder.indexOf(active.id.toString());\n\t\t\t\t\tconst newIndex = columnOrder.indexOf(over.id.toString());\n\t\t\t\t\ttanTable.setColumnOrder([...arrayMove(columnOrder, oldIndex, newIndex)]);\n\t\t\t\t}\n\n\t\t\t\tsetActiveId(null);\n\t\t\t}}\n\t\t>\n\t\t\t<SortableContext\n\t\t\t\titems={tanTable.getState().columnOrder}\n\t\t\t\tstrategy={verticalListSortingStrategy}\n\t\t\t>\n\t\t\t\t<EasyMenu label={<><Columns3 />Columns</>} selectionMode=\"multiple\" items={tanTable.getAllFlatColumns()} selectedKeys={tanTable.getIsAllColumnsVisible() ? 'all' : tanTable.getVisibleFlatColumns().map(c => c.id)}>\n\t\t\t\t\t<MenuItem onAction={() => tanTable.toggleAllColumnsVisible()} className={'italic'}>(select all)</MenuItem>\n\t\t\t\t\t{tanTable.getState().columnOrder.map(colId => {\n\t\t\t\t\t\tconst col = tanTable.getAllFlatColumns().find(c => c.id === colId);\n\t\t\t\t\t\tif (!col) return null;\n\t\t\t\t\t\treturn <SortableItem key={col.id} column={col} />\n\t\t\t\t\t})}\n\t\t\t\t</EasyMenu>\n\t\t\t\t<DragOverlay>\n\t\t\t\t\t{activeId ? <div className=\"dropdown-item opacity-70 border-2 border-primary\">{resourceFormatter(activeId)}</div> : null}\n\t\t\t\t</DragOverlay>\n\t\t\t</SortableContext>\n\t\t</DndContext>\n\t);\n\n\n\tfunction SortableItem({ column }: { column: Column<any, unknown> }) {\n\t\tconst {\n\t\t\tattributes,\n\t\t\tlisteners,\n\t\t\tsetNodeRef,\n\t\t\ttransform,\n\t\t\ttransition,\n\t\t} = useSortable({ id: column.id });\n\t\tconst style = {\n\t\t\ttransform: CSS.Transform.toString(transform),\n\t\t\ttransition,\n\t\t\tzIndex: '999'\n\t\t};\n\t\treturn <MenuItem\n\t\t\tref={setNodeRef}\n\t\t\tstyle={style}\n\t\t\t{...attributes}\n\t\t\tid={column.id}\n\t\t\tonAction={() => column.toggleVisibility()}\n\t\t\tisDisabled={!column.getCanHide()} className=\"flex items-center\">\n\t\t\t<GripVertical {...listeners} className=\"size-icon cursor-grab\" />\n\t\t\t{resourceFormatter(column.id)}\n\t\t\t{column.getIsSorted() && <SortIcon className=\"size-icon\" direction={column.getIsSorted()} />}\n\t\t</MenuItem>;\n\t}\n}\n\n\n\nimport {\n\tChevronFirst,\n\tChevronLast,\n\tChevronLeft,\n\tChevronRight,\n} from \"lucide-react\";\n\nfunction Paginator() {\n\tconst { tanTable, query } = useDataTable();\n\tconst rowCount = query.data?.total ?? 0\n\treturn (\n\t\t<div className=\"flex items-center gap-2\">\n\t\t\t<span className=\"whitespace-nowrap caption text-muted\">\n\t\t\t\t{`${tanTable.getState().pagination.pageIndex * tanTable.getState().pagination.pageSize + 1} - ${Math.min(\n\t\t\t\t\t(tanTable.getState().pagination.pageIndex + 1) *\n\t\t\t\t\ttanTable.getState().pagination.pageSize,\n\t\t\t\t\trowCount,\n\t\t\t\t)} of ${rowCount?.toLocaleString()}`}\n\t\t\t</span>\n\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.firstPage()}\n\t\t\t\tisDisabled={!tanTable.getCanPreviousPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronFirst /></Button>\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.previousPage()}\n\t\t\t\tisDisabled={!tanTable.getCanPreviousPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronLeft /></Button>\n\t\t\t<Button\n\t\t\t\tonPress={() => tanTable.nextPage()}\n\t\t\t\tisDisabled={!tanTable.getCanNextPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronRight /></Button>\n\t\t\t<Button\n\t\t\t\tonClick={() => tanTable.lastPage()}\n\t\t\t\tisDisabled={!tanTable.getCanNextPage()}\n\t\t\t\tvariant=\"neutral\"\n\t\t\t\tsize={\"icon\"}\n\t\t\t><ChevronLast /></Button>\n\t\t</div>\n\t);\n}\n\n\nfunction PageSize() {\n\tconst { tanTable } = useDataTable();\n\tconst PAGE_SIZES = [10, 20, 30, 40, 50];\n\n\treturn (\n\t\t<EasyMenu label={tanTable.getState().pagination.pageSize.toString()} selectionMode=\"single\" selectedKeys={[tanTable.getState().pagination.pageSize.toString()]} items={PAGE_SIZES.map(s => ({ id: s.toString(), value: s }))}>\n\t\t\t{\n\t\t\t\t(items) => <MenuItem onAction={() => tanTable.setPageSize(items.value)}>{items.value}</MenuItem>\n\t\t\t}\n\t\t</EasyMenu>\n\t);\n}\n\n\nimport { RotateCw } from \"lucide-react\";\n\nfunction Actions({ tableActions }: { tableActions: TableActions }) {\n\tconst { query, tanTable, searchQuery, setSearchQuery } = useDataTable();\n\n\treturn (\n\t\t<section className=\"flex bg-card justify-between my-0 p-icon border gap-icon overflow-auto\">\n\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t<Button\n\t\t\t\t\tisPending={query.isFetching}\n\t\t\t\t\tonClick={() => query.refetch()}\n\t\t\t\t\tvariant={\"neutral\"}\n\t\t\t\t\tsize={\"icon\"}\n\t\t\t\t><RotateCw /></Button>\n\n\t\t\t\t{tableActions\n\t\t\t\t\t.filter(ta => ta.bulk === tanTable.getSelectedRowModel().rows.length > 0)\n\t\t\t\t\t.map((ta, i) => {\n\t\t\t\t\t\tconst Icon = ta.icon;\n\t\t\t\t\t\treturn (<Button key={`${i}-${ta.bulk}`} type=\"button\" isDisabled={query.isFetching} className=\"animate-in fade-in slide-in-from-left-15 duration-300 transition-transform\" onPress={(e) => { ta.onClick(e, tanTable) }} size={'icon'}><Icon /></Button>)\n\t\t\t\t\t}\n\t\t\t\t\t)}\n\t\t\t</div>\n\t\t\t<div className=\"flex gap-icon\">\n\t\t\t\t<DataTableFilter />\n\t\t\t\t{(\n\t\t\t\t\t<SearchField value={searchQuery} onChange={setSearchQuery} />\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n\n\nimport { DataTableFilter, type FiltersConfig } from \"@/components/data-table/data-table-filter\";\nimport { EasyMenu, MenuItem } from \"@/components/ui/menu\";\nimport {\n\tTableBody,\n\tTableCell,\n\tTable as TableComponent,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from \"@/components/ui/table\";\nimport { useResourceFormatter } from \"@/utils/resource-names\";\nimport { closestCenter, DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors } from \"@dnd-kit/core\";\nimport { CSS } from \"@dnd-kit/utilities\";\nimport {\n\tflexRender\n} from \"@tanstack/react-table\";\nimport { merge } from \"lodash-es\";\n\nfunction SortIcon({ direction, ...props }: { direction: 'asc' | 'desc' | false } & Omit<React.ComponentProps<'svg'>, 'direction'>) {\n\tif (direction === 'asc') return <ArrowDownNarrowWide {...props} />\n\telse if (direction === 'desc') return <ArrowDownWideNarrow {...props} />\n\telse return <ArrowUpDown {...props} />\n}\n\n// TODO, automate checking valid HTML\nfunction TableContent({ className }: React.ComponentProps<typeof TableComponent>) {\n\tconst { tanTable } = useDataTable();\n\tconst tableCellStyle = (isSticky: boolean, className?: string) => cn(\"animate-in fade-in slide-in-from-top-10\", \"px-icon py-2 text-left text-sm font-medium whitespace-nowrap\", isSticky && \"bg-card sticky right-0 z-50 text-center\", className)\n\treturn (\n\t\t<TableComponent className={cn(className)}>\n\t\t\t<TableHeader className=\"sticky top-0 z-10\">\n\t\t\t\t{tanTable.getHeaderGroups().map((headerGroup) => (\n\t\t\t\t\t<TableRow className={cn(\"h-input\")} key={headerGroup.id}>\n\t\t\t\t\t\t{headerGroup.headers.map((header) => (\n\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\tclassName={tableCellStyle(false, \"bg-card\")}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{!header.column.getCanSort() && !header.isPlaceholder\n\t\t\t\t\t\t\t\t\t&& <>{flexRender(\n\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t)}</>}\n\t\t\t\t\t\t\t\t{/* TODO Align header text with table text */}\n\t\t\t\t\t\t\t\t{header.column.getCanSort() && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\t\t\t\tclassName=\"w-full !justify-start !px-1.5\"\n\t\t\t\t\t\t\t\t\t\tonPress={header.column.getToggleSortingHandler()}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\t\t\theader.column.columnDef.header,\n\t\t\t\t\t\t\t\t\t\t\theader.getContext(),\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t<SortIcon direction={header.column.getIsSorted()} />\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t))}\n\t\t\t</TableHeader>\n\t\t\t<TableBody className=\"flex-1 overflow-y-auto relative\">\n\t\t\t\t{tanTable.getRowModel().rows.map((row) => (\n\t\t\t\t\t<TableRow\n\t\t\t\t\t\tclassName={cn(\"h-input transition-colors data-[selected=true]:bg-primary/10 hover:bg-muted-foreground/20\")}\n\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\tdata-selected={row.getIsSelected()}\n\t\t\t\t\t>\n\t\t\t\t\t\t{row.getVisibleCells().map((cell) => (\n\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\tclassName={tableCellStyle(cell.column.id === ACTIONS_COLUMN_ID)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flexRender(\n\t\t\t\t\t\t\t\t\tcell.column.columnDef.cell,\n\t\t\t\t\t\t\t\t\tcell.getContext(),\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</TableRow>\n\t\t\t\t))}\n\t\t\t</TableBody>\n\t\t</TableComponent>\n\t);\n}\n"],"names":["ACTIONS_COLUMN_ID","useDataTableState","columns","fetchFn","columnsToHideByDefault","allowSelection","filterConfig","id","useId","tableState","_setTableState","useState","searchQuery","setSearchQuery","columnOrder","setColumnOrder","columnVisibility","setColumnVisibility","filters","setFilters","mergedFilters","useMemo","acc","current","merge","updateTableState","updates","prev","sorting","rowSelection","pagination","query","useQuery","keepPreviousData","useEffect","columnHelper","createColumnHelper","metadataColumns","data","_a","rowHasMetadata","row","rowsWithMeta","r","m","key","_b","info","value","cols","TABLE_CHECK_BOX_COLUMN","TABLE_ID_COLUMN","col","TABLE_DEFAULT_DATE_COLUMNS","isUpdaterFunction","updater","resolveUpdater","currentValue","tanTable","useReactTable","getCoreRowModel","_c","c","DataTableContext","createContext","useDataTable","ctx","useContext","DataTableProvider","children","props","DataTable","tableActions","className","jsx","Fragment","cn","Actions","jsxs","TableOverlay","Loader","Info","TableContent","ColumnPicker","PageSize","Paginator","activeId","setActiveId","resourceFormatter","useResourceFormatter","sensors","useSensors","useSensor","PointerSensor","KeyboardSensor","sortableKeyboardCoordinates","DndContext","closestCenter","event","active","over","oldIndex","newIndex","arrayMove","SortableContext","verticalListSortingStrategy","EasyMenu","Columns3","MenuItem","colId","SortableItem","DragOverlay","column","attributes","listeners","setNodeRef","transform","transition","useSortable","style","CSS","GripVertical","SortIcon","rowCount","Button","ChevronFirst","ChevronLeft","ChevronRight","ChevronLast","PAGE_SIZES","s","items","RotateCw","ta","i","Icon","e","DataTableFilter","SearchField","direction","ArrowDownNarrowWide","ArrowDownWideNarrow","ArrowUpDown","tableCellStyle","isSticky","TableComponent","TableHeader","headerGroup","TableRow","header","TableHead","flexRender","TableBody","cell","TableCell"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { Checkbox as
|
|
3
|
-
import { createColumnHelper as
|
|
4
|
-
import { intervalToDuration as
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
header: ({ table: e }) => /* @__PURE__ */
|
|
8
|
-
|
|
1
|
+
import { jsx as d } from "react/jsx-runtime";
|
|
2
|
+
import { Checkbox as c } from "../inputs/checkbox.es.js";
|
|
3
|
+
import { createColumnHelper as p } from "@tanstack/react-table";
|
|
4
|
+
import { intervalToDuration as g } from "date-fns";
|
|
5
|
+
const o = p(), D = [
|
|
6
|
+
o.accessor("checkbox", {
|
|
7
|
+
header: ({ table: e }) => /* @__PURE__ */ d(
|
|
8
|
+
c,
|
|
9
9
|
{
|
|
10
10
|
isIndeterminate: e.getIsSomeRowsSelected() && !e.getIsAllPageRowsSelected(),
|
|
11
11
|
isSelected: e.getIsAllPageRowsSelected() || e.getIsSomePageRowsSelected(),
|
|
@@ -13,8 +13,8 @@ const r = g(), E = [
|
|
|
13
13
|
"aria-label": "Select all"
|
|
14
14
|
}
|
|
15
15
|
),
|
|
16
|
-
cell: ({ row: e }) => /* @__PURE__ */
|
|
17
|
-
|
|
16
|
+
cell: ({ row: e }) => /* @__PURE__ */ d(
|
|
17
|
+
c,
|
|
18
18
|
{
|
|
19
19
|
isSelected: e.getIsSelected(),
|
|
20
20
|
onChange: () => e.toggleSelected(),
|
|
@@ -24,29 +24,29 @@ const r = g(), E = [
|
|
|
24
24
|
enableSorting: !1,
|
|
25
25
|
enableHiding: !1
|
|
26
26
|
})
|
|
27
|
-
],
|
|
28
|
-
|
|
27
|
+
], C = [
|
|
28
|
+
o.accessor("id", {
|
|
29
29
|
header: () => "ID"
|
|
30
30
|
})
|
|
31
|
-
],
|
|
32
|
-
|
|
31
|
+
], L = [
|
|
32
|
+
o.accessor("createdAt", {
|
|
33
33
|
header: () => "Creation Date",
|
|
34
34
|
cell: ({ row: e }) => {
|
|
35
35
|
const t = e.getValue("createdAt");
|
|
36
|
-
return
|
|
36
|
+
return i(t);
|
|
37
37
|
},
|
|
38
38
|
enableHiding: !1
|
|
39
39
|
}),
|
|
40
|
-
|
|
40
|
+
o.accessor("updatedAt", {
|
|
41
41
|
header: () => "Last Updated",
|
|
42
42
|
cell: ({ row: e }) => {
|
|
43
43
|
const t = e.getValue("updatedAt");
|
|
44
|
-
return
|
|
44
|
+
return i(t);
|
|
45
45
|
},
|
|
46
46
|
enableHiding: !1
|
|
47
47
|
})
|
|
48
48
|
];
|
|
49
|
-
function
|
|
49
|
+
function i(e) {
|
|
50
50
|
if (!e) return null;
|
|
51
51
|
const t = new Date(e);
|
|
52
52
|
return new Intl.DateTimeFormat(void 0, {
|
|
@@ -54,152 +54,7 @@ function c(e) {
|
|
|
54
54
|
timeStyle: "short"
|
|
55
55
|
}).format(t);
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
"product.displayName": "Product"
|
|
59
|
-
}, C = [
|
|
60
|
-
"access-token",
|
|
61
|
-
"account",
|
|
62
|
-
"activation",
|
|
63
|
-
"activation-log",
|
|
64
|
-
"admin-role",
|
|
65
|
-
"audit-log",
|
|
66
|
-
"automated-email",
|
|
67
|
-
"automated-email-event-log",
|
|
68
|
-
"card",
|
|
69
|
-
"feature-flag",
|
|
70
|
-
"invoice",
|
|
71
|
-
"license",
|
|
72
|
-
"license-template",
|
|
73
|
-
"maintenance-policy",
|
|
74
|
-
"organization",
|
|
75
|
-
"plan",
|
|
76
|
-
"product",
|
|
77
|
-
"product-version",
|
|
78
|
-
"profile",
|
|
79
|
-
"release",
|
|
80
|
-
"release-channel",
|
|
81
|
-
"release-file",
|
|
82
|
-
"release-platform",
|
|
83
|
-
"report",
|
|
84
|
-
"role",
|
|
85
|
-
"role-claim",
|
|
86
|
-
"saml-configuration",
|
|
87
|
-
"segment",
|
|
88
|
-
"sending-domain",
|
|
89
|
-
"setting",
|
|
90
|
-
"tag",
|
|
91
|
-
"team-member",
|
|
92
|
-
"trial",
|
|
93
|
-
"trial-policy",
|
|
94
|
-
"user",
|
|
95
|
-
"user-group",
|
|
96
|
-
"webhook",
|
|
97
|
-
"webhook-event-log",
|
|
98
|
-
"webhook-trigger",
|
|
99
|
-
"reseller",
|
|
100
|
-
"oidc-configuration",
|
|
101
|
-
"organization-claim",
|
|
102
|
-
"reseller-claim"
|
|
103
|
-
], P = {
|
|
104
|
-
account: "Your organization account.",
|
|
105
|
-
product: "Products are the software products you want to license",
|
|
106
|
-
license: "Licenses represent a purchase of your software. These can be linked to customers, and the license key is required to use the product.",
|
|
107
|
-
"access-token": "Access Tokens are used to authenticate your API requests.",
|
|
108
|
-
activation: "Activations, also known as devices/machines/seats are the devices consuming licenses.",
|
|
109
|
-
"activation-log": "Activation Log is a log entry of activation/deactivation of a particular license.",
|
|
110
|
-
trial: "Trial/Trial Activation is a device that has activated a trial of your product.",
|
|
111
|
-
"audit-log": "Audit logs contain all the changes made to your account.",
|
|
112
|
-
"automated-email": "Automated Email allow you to send marketing emails based on events on the linked product.",
|
|
113
|
-
"automated-email-event-log": "Automated email event log is the log of all the automated email events for your product.",
|
|
114
|
-
card: "The payment card for your account.",
|
|
115
|
-
"feature-flag": "Feature flags define features that make up tiers for your products.",
|
|
116
|
-
invoice: "",
|
|
117
|
-
"license-template": "License templates are a blueprint for the licenses you create for your customers and prevent repetition when creating licenses.",
|
|
118
|
-
"maintenance-policy": "Maintenance policies represent support contracts and can be linked to licenses.",
|
|
119
|
-
plan: "",
|
|
120
|
-
"product-version": "Product Versions are sets of Feature Flags that define the tiers of your products.",
|
|
121
|
-
"release-channel": "Release channel is the release channel for your product.",
|
|
122
|
-
"release-file": "Release files are files within your created releases.",
|
|
123
|
-
"release-platform": 'Release Platforms differentiate the target platform for your release. Common platforms include "Windows", "macOS", and "Linux".',
|
|
124
|
-
release: "Releases help you to manage different versions of your app, and secure distribute it to licensed users.",
|
|
125
|
-
report: "Analytics data for your account",
|
|
126
|
-
"role-claim": "",
|
|
127
|
-
role: "Roles define permissions for your team.",
|
|
128
|
-
"saml-configuration": "",
|
|
129
|
-
segment: "Sets of filters that can be saved to filter resources.",
|
|
130
|
-
"trial-policy": "Trial policies are templates for creating trials for your products.",
|
|
131
|
-
"webhook-event-log": "Webhook Event Logs are logs of events that have occured on webhooks.",
|
|
132
|
-
"webhook-trigger": "",
|
|
133
|
-
webhook: "Webhooks are HTTP callbacks which are triggered by specific events.",
|
|
134
|
-
organization: "",
|
|
135
|
-
profile: "",
|
|
136
|
-
setting: "",
|
|
137
|
-
tag: "Tags allow you to manage your licenses and customers on the dashboard.",
|
|
138
|
-
"team-member": "Team members can access the account based on their roles.",
|
|
139
|
-
user: "A user refers to your customer whom you want to license your product.",
|
|
140
|
-
"sending-domain": "Allows Cryptlex to send emails on your behalf using your From Email address",
|
|
141
|
-
"admin-role": "Roles that have type admin",
|
|
142
|
-
"user-group": "Groups of users that you can assign licenses to.",
|
|
143
|
-
reseller: "Resellers allow you to delegate user management to third parties or partners",
|
|
144
|
-
"oidc-configuration": "",
|
|
145
|
-
"organization-claim": "",
|
|
146
|
-
"reseller-claim": ""
|
|
147
|
-
}, u = {
|
|
148
|
-
id: "ID",
|
|
149
|
-
createdAt: "Creation Date",
|
|
150
|
-
scopes: "Permissions",
|
|
151
|
-
updatedAt: "Last Updated",
|
|
152
|
-
expiresAt: "Expiration Date",
|
|
153
|
-
lastSeenAt: "Last Seen",
|
|
154
|
-
os: "OS",
|
|
155
|
-
osVersion: "OS Version",
|
|
156
|
-
key: "License Key",
|
|
157
|
-
vmName: "VM Name",
|
|
158
|
-
container: "Container",
|
|
159
|
-
allowedIpRange: "Allowed IP Range",
|
|
160
|
-
allowedIpRanges: "Allowed IP Ranges",
|
|
161
|
-
allowedIpAddresses: "Allowed IP Addresses",
|
|
162
|
-
disallowedIpAddresses: "Disallowed IP Addresses",
|
|
163
|
-
allowVmActivation: "Allow VM Activation",
|
|
164
|
-
disableGeoLocation: "Disable Geolocation",
|
|
165
|
-
"user.id": "User ID",
|
|
166
|
-
userId: "User",
|
|
167
|
-
productId: "Product",
|
|
168
|
-
downloads: "Total Downloads",
|
|
169
|
-
claims: "Permissions",
|
|
170
|
-
googleSsoEnabled: "Google Login Enabled",
|
|
171
|
-
lastAttemptedAt: "Last Attempt Date",
|
|
172
|
-
url: "URL",
|
|
173
|
-
"trialPolicy.name": "Trial Policy Name",
|
|
174
|
-
"licensePolicy.name": "License Template Name",
|
|
175
|
-
licensePolicy: "License Template",
|
|
176
|
-
eventLog: "Audit Log",
|
|
177
|
-
cc: "CC Recepients",
|
|
178
|
-
bcc: "BCC Recepients",
|
|
179
|
-
ipAddress: "IP Address",
|
|
180
|
-
resellerId: "Reseller",
|
|
181
|
-
productVersionId: "Product Version",
|
|
182
|
-
releaseId: "Release",
|
|
183
|
-
maintenancePolicyId: "Maintenance Policy",
|
|
184
|
-
webhookId: "Webhook",
|
|
185
|
-
automatedEmailId: "Automated Email",
|
|
186
|
-
"location.countryName": "Country",
|
|
187
|
-
"location.ipAddress": "IP Address",
|
|
188
|
-
"location.countryCode": "Country",
|
|
189
|
-
organizationId: "Organization",
|
|
190
|
-
"address.country": "Country",
|
|
191
|
-
"address.addressLine1": "Address Line 1",
|
|
192
|
-
"address.addressLine2": "Address Line 2",
|
|
193
|
-
responseStatusCode: "HTTP Status Code",
|
|
194
|
-
resourceId: "Resource ID",
|
|
195
|
-
Sso: "SAML SSO 2.0",
|
|
196
|
-
"reseller.name": "Reseller",
|
|
197
|
-
sendingDomain: "Email Sending Domain"
|
|
198
|
-
};
|
|
199
|
-
function D(e, t) {
|
|
200
|
-
return t !== "admin-portal" && e in d ? d[e] : e in u ? u[e] : y(e);
|
|
201
|
-
}
|
|
202
|
-
function O(e) {
|
|
57
|
+
function E(e) {
|
|
203
58
|
const t = e.expiresAt && new Date(e.expiresAt) < /* @__PURE__ */ new Date();
|
|
204
59
|
switch (!0) {
|
|
205
60
|
case (e.revoked && e.suspended && t):
|
|
@@ -220,11 +75,11 @@ function O(e) {
|
|
|
220
75
|
return "Active";
|
|
221
76
|
}
|
|
222
77
|
}
|
|
223
|
-
function
|
|
224
|
-
return e === 0 || !e ? "Lifetime" :
|
|
78
|
+
function I(e) {
|
|
79
|
+
return e === 0 || !e ? "Lifetime" : m(e);
|
|
225
80
|
}
|
|
226
|
-
function
|
|
227
|
-
const t =
|
|
81
|
+
function m(e) {
|
|
82
|
+
const t = g({
|
|
228
83
|
start: 0,
|
|
229
84
|
end: e * 1e3
|
|
230
85
|
});
|
|
@@ -235,68 +90,47 @@ function h(e) {
|
|
|
235
90
|
t.hours && `${t.hours}h`
|
|
236
91
|
].filter(Boolean).join(" ").trim();
|
|
237
92
|
}
|
|
238
|
-
function
|
|
239
|
-
const
|
|
240
|
-
let
|
|
241
|
-
for (const
|
|
242
|
-
|
|
243
|
-
return
|
|
93
|
+
function k(e, t) {
|
|
94
|
+
const n = t.toString().split(".");
|
|
95
|
+
let r = e;
|
|
96
|
+
for (const a of n)
|
|
97
|
+
r = r == null ? void 0 : r[a];
|
|
98
|
+
return r;
|
|
244
99
|
}
|
|
245
|
-
const
|
|
100
|
+
const T = {
|
|
246
101
|
windows: "Windows",
|
|
247
102
|
macos: "macOS",
|
|
248
103
|
linux: "Linux",
|
|
249
104
|
ios: "iOS",
|
|
250
105
|
android: "Android"
|
|
251
106
|
};
|
|
252
|
-
function
|
|
253
|
-
return
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
const t = e.replace(/([A-Z])/g, " $1");
|
|
261
|
-
return t.charAt(0).toUpperCase().concat(t.slice(1)).replace(/\.[a-z]/, (a) => a.replace(".", " ").toUpperCase());
|
|
262
|
-
}
|
|
263
|
-
return e;
|
|
264
|
-
}
|
|
265
|
-
var A = /* @__PURE__ */ ((e) => (e[e.USER = 0] = "USER", e[e.ORGANIZATION = 1] = "ORGANIZATION", e[e.RESELLER = 2] = "RESELLER", e))(A || {});
|
|
266
|
-
function F(e, t) {
|
|
267
|
-
return async (a, o, s, p) => {
|
|
268
|
-
const m = {
|
|
269
|
-
...p,
|
|
270
|
-
page: a.pageIndex + 1,
|
|
271
|
-
limit: a.pageSize,
|
|
272
|
-
sort: S(o[0]),
|
|
273
|
-
search: s
|
|
107
|
+
function _(e, t) {
|
|
108
|
+
return async (n, r, a, u) => {
|
|
109
|
+
const l = {
|
|
110
|
+
...u,
|
|
111
|
+
page: n.pageIndex + 1,
|
|
112
|
+
limit: n.pageSize,
|
|
113
|
+
sort: S(r[0]),
|
|
114
|
+
search: a
|
|
274
115
|
};
|
|
275
|
-
return e.GET(t, { query:
|
|
276
|
-
|
|
277
|
-
), data:
|
|
116
|
+
return e.GET(t, { query: l }).then((s) => ({ total: Number.parseInt(
|
|
117
|
+
s.response.headers.get("Pagination-Count") || "0"
|
|
118
|
+
), data: s.data }));
|
|
278
119
|
};
|
|
279
120
|
}
|
|
280
121
|
function S(e) {
|
|
281
122
|
return e ? e.desc ? `-${e.id}` : `+${e.id}` : "-createdAt";
|
|
282
123
|
}
|
|
283
124
|
export {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
C as
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
c as formatDate,
|
|
295
|
-
O as getLicenseStatus,
|
|
296
|
-
D as getResourceDisplayName,
|
|
297
|
-
T as getValidityDisplay,
|
|
298
|
-
x as getValueFromData,
|
|
299
|
-
z as pluralizeTimes,
|
|
300
|
-
h as secondsToDuration
|
|
125
|
+
T as ALL_OS,
|
|
126
|
+
D as TABLE_CHECK_BOX_COLUMN,
|
|
127
|
+
L as TABLE_DEFAULT_DATE_COLUMNS,
|
|
128
|
+
C as TABLE_ID_COLUMN,
|
|
129
|
+
_ as createTableFetchFn,
|
|
130
|
+
i as formatDate,
|
|
131
|
+
E as getLicenseStatus,
|
|
132
|
+
I as getValidityDisplay,
|
|
133
|
+
k as getValueFromData,
|
|
134
|
+
m as secondsToDuration
|
|
301
135
|
};
|
|
302
136
|
//# sourceMappingURL=table-commons.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-commons.es.js","sources":["../../../lib/components/data-table/table-commons.tsx"],"sourcesContent":["\nimport { Checkbox } from \"@/components/inputs/checkbox\";\nimport type { components, operations, paths } from \"@cryptlex/web-api-types\";\nimport type { PaginationState, SortingState, Table } from \"@tanstack/react-table\";\nimport { createColumnHelper } from \"@tanstack/react-table\";\nimport { intervalToDuration } from \"date-fns\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type createClient from \"openapi-fetch\";\nimport type { PressEvent } from \"react-aria-components\";\n\nconst cH = createColumnHelper<any>();\nexport const TABLE_CHECK_BOX_COLUMN = [\n\tcH.accessor(\"checkbox\", {\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tisIndeterminate={table.getIsSomeRowsSelected() && !table.getIsAllPageRowsSelected()}\n\t\t\t\tisSelected={\n\t\t\t\t\ttable.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()\n\t\t\t\t}\n\t\t\t\tonChange={() => table.toggleAllPageRowsSelected()}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tisSelected={row.getIsSelected()}\n\t\t\t\tonChange={() => row.toggleSelected()}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n];\n\nexport const TABLE_ID_COLUMN = [\n\tcH.accessor(\"id\", {\n\t\theader: () => \"ID\",\n\t}),\n];\nexport const TABLE_DEFAULT_DATE_COLUMNS = [\n\tcH.accessor(\"createdAt\", {\n\t\theader: () => \"Creation Date\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"createdAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn formatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n\tcH.accessor(\"updatedAt\", {\n\t\theader: () => \"Last Updated\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"updatedAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn formatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n];\n\n// TODO, i18n\nexport function formatDate(date: string | null | undefined) {\n\tif (!date) return null;\n\tconst _date = new Date(date);\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\tdateStyle: \"medium\",\n\t\ttimeStyle: \"short\",\n\t}).format(_date);\n}\n\n/** Application Names */\nexport type CtxProjectName =\n\t| \"admin-portal\"\n\t| \"customer-portal\"\n\t| \"internal-portal\"\n\t| \"reseller-portal\";\n// Display names specific to customer and reseller portal\nconst OTHER_PORTALS_DISPLAY_NAME: Record<string, string> = {\n\t\"product.displayName\": \"Product\",\n};\n\n/** Resource Name should ALWAYS be in singular form */\nexport const RESOURCE_NAMES = [\n\t\"access-token\",\n\t\"account\",\n\t\"activation\",\n\t\"activation-log\",\n\t\"admin-role\",\n\t\"audit-log\",\n\t\"automated-email\",\n\t\"automated-email-event-log\",\n\t\"card\",\n\t\"feature-flag\",\n\t\"invoice\",\n\t\"license\",\n\t\"license-template\",\n\t\"maintenance-policy\",\n\t\"organization\",\n\t\"plan\",\n\t\"product\",\n\t\"product-version\",\n\t\"profile\",\n\t\"release\",\n\t\"release-channel\",\n\t\"release-file\",\n\t\"release-platform\",\n\t\"report\",\n\t\"role\",\n\t\"role-claim\",\n\t\"saml-configuration\",\n\t\"segment\",\n\t\"sending-domain\",\n\t\"setting\",\n\t\"tag\",\n\t\"team-member\",\n\t\"trial\",\n\t\"trial-policy\",\n\t\"user\",\n\t\"user-group\",\n\t\"webhook\",\n\t\"webhook-event-log\",\n\t\"webhook-trigger\",\n\t\"reseller\",\n\t\"oidc-configuration\",\n\t\"organization-claim\",\n\t\"reseller-claim\",\n] as const;\nexport type ResourceName = (typeof RESOURCE_NAMES)[number];\nexport const RESOURCE_DEFINITIONS: Record<ResourceName, string> = {\n\taccount: \"Your organization account.\",\n\tproduct: \"Products are the software products you want to license\",\n\tlicense:\n\t\t\"Licenses represent a purchase of your software. These can be linked to customers, and the license key is required to use the product.\",\n\t\"access-token\": \"Access Tokens are used to authenticate your API requests.\",\n\tactivation:\n\t\t\"Activations, also known as devices/machines/seats are the devices consuming licenses.\",\n\t\"activation-log\":\n\t\t\"Activation Log is a log entry of activation/deactivation of a particular license.\",\n\ttrial:\n\t\t\"Trial/Trial Activation is a device that has activated a trial of your product.\",\n\t\"audit-log\": \"Audit logs contain all the changes made to your account.\",\n\t\"automated-email\":\n\t\t\"Automated Email allow you to send marketing emails based on events on the linked product.\",\n\t\"automated-email-event-log\":\n\t\t\"Automated email event log is the log of all the automated email events for your product.\",\n\tcard: \"The payment card for your account.\",\n\t\"feature-flag\":\n\t\t\"Feature flags define features that make up tiers for your products.\",\n\tinvoice: \"\",\n\t\"license-template\":\n\t\t\"License templates are a blueprint for the licenses you create for your customers and prevent repetition when creating licenses.\",\n\t\"maintenance-policy\":\n\t\t\"Maintenance policies represent support contracts and can be linked to licenses.\",\n\tplan: \"\",\n\t\"product-version\":\n\t\t\"Product Versions are sets of Feature Flags that define the tiers of your products.\",\n\t\"release-channel\": \"Release channel is the release channel for your product.\",\n\t\"release-file\": \"Release files are files within your created releases.\",\n\t\"release-platform\":\n\t\t'Release Platforms differentiate the target platform for your release. Common platforms include \"Windows\", \"macOS\", and \"Linux\".',\n\trelease:\n\t\t\"Releases help you to manage different versions of your app, and secure distribute it to licensed users.\",\n\treport: \"Analytics data for your account\",\n\t\"role-claim\": \"\",\n\trole: \"Roles define permissions for your team.\",\n\t\"saml-configuration\": \"\",\n\tsegment: \"Sets of filters that can be saved to filter resources.\",\n\t\"trial-policy\":\n\t\t\"Trial policies are templates for creating trials for your products.\",\n\t\"webhook-event-log\":\n\t\t\"Webhook Event Logs are logs of events that have occured on webhooks.\",\n\t\"webhook-trigger\": \"\",\n\twebhook:\n\t\t\"Webhooks are HTTP callbacks which are triggered by specific events.\",\n\torganization: \"\",\n\tprofile: \"\",\n\tsetting: \"\",\n\ttag: \"Tags allow you to manage your licenses and customers on the dashboard.\",\n\t\"team-member\": \"Team members can access the account based on their roles.\",\n\tuser: \"A user refers to your customer whom you want to license your product.\",\n\t\"sending-domain\":\n\t\t\"Allows Cryptlex to send emails on your behalf using your From Email address\",\n\t\"admin-role\": \"Roles that have type admin\",\n\t\"user-group\": \"Groups of users that you can assign licenses to.\",\n\treseller:\n\t\t\"Resellers allow you to delegate user management to third parties or partners\",\n\t\"oidc-configuration\": \"\",\n\t\"organization-claim\": \"\",\n\t\"reseller-claim\": \"\",\n};\n\nconst RESOURCE_DISPLAY_NAMES: Record<string, string> = {\n\tid: \"ID\",\n\tcreatedAt: \"Creation Date\",\n\tscopes: \"Permissions\",\n\tupdatedAt: \"Last Updated\",\n\texpiresAt: \"Expiration Date\",\n\tlastSeenAt: \"Last Seen\",\n\tos: \"OS\",\n\tosVersion: \"OS Version\",\n\tkey: \"License Key\",\n\tvmName: \"VM Name\",\n\tcontainer: \"Container\",\n\tallowedIpRange: \"Allowed IP Range\",\n\tallowedIpRanges: \"Allowed IP Ranges\",\n\tallowedIpAddresses: \"Allowed IP Addresses\",\n\tdisallowedIpAddresses: \"Disallowed IP Addresses\",\n\tallowVmActivation: \"Allow VM Activation\",\n\tdisableGeoLocation: \"Disable Geolocation\",\n\t\"user.id\": \"User ID\",\n\tuserId: \"User\",\n\tproductId: \"Product\",\n\tdownloads: \"Total Downloads\",\n\tclaims: \"Permissions\",\n\tgoogleSsoEnabled: \"Google Login Enabled\",\n\tlastAttemptedAt: \"Last Attempt Date\",\n\turl: \"URL\",\n\t\"trialPolicy.name\": \"Trial Policy Name\",\n\t\"licensePolicy.name\": \"License Template Name\",\n\tlicensePolicy: \"License Template\",\n\teventLog: \"Audit Log\",\n\tcc: \"CC Recepients\",\n\tbcc: \"BCC Recepients\",\n\tipAddress: \"IP Address\",\n\tresellerId: \"Reseller\",\n\tproductVersionId: \"Product Version\",\n\treleaseId: \"Release\",\n\tmaintenancePolicyId: \"Maintenance Policy\",\n\twebhookId: \"Webhook\",\n\tautomatedEmailId: \"Automated Email\",\n\t\"location.countryName\": \"Country\",\n\t\"location.ipAddress\": \"IP Address\",\n\t\"location.countryCode\": \"Country\",\n\torganizationId: \"Organization\",\n\t\"address.country\": \"Country\",\n\t\"address.addressLine1\": \"Address Line 1\",\n\t\"address.addressLine2\": \"Address Line 2\",\n\tresponseStatusCode: \"HTTP Status Code\",\n\tresourceId: \"Resource ID\",\n\tSso: \"SAML SSO 2.0\",\n\t\"reseller.name\": \"Reseller\",\n\tsendingDomain: \"Email Sending Domain\",\n};\nexport function getResourceDisplayName(\n\tresourceName: string,\n\tportal: CtxProjectName,\n) {\n\tif (portal !== \"admin-portal\" && resourceName in OTHER_PORTALS_DISPLAY_NAME) {\n\t\treturn OTHER_PORTALS_DISPLAY_NAME[resourceName];\n\t} else if (resourceName in RESOURCE_DISPLAY_NAMES) {\n\t\treturn RESOURCE_DISPLAY_NAMES[resourceName];\n\t} else {\n\t\treturn convertCamelCaseToTitleCase(resourceName);\n\t}\n}\n\n/**\n * Format multiple license parameters (expired, suspended, revoked) into a single status\n */\nexport function getLicenseStatus(license: any): string {\n\tconst licenseExpired =\n\t\tlicense.expiresAt && new Date(license.expiresAt) < new Date();\n\t// Status Column\n\tswitch (true) {\n\t\tcase license.revoked && license.suspended && licenseExpired:\n\t\t\treturn \"Revoked, Suspended, Expired\";\n\t\tcase license.revoked && license.suspended:\n\t\t\treturn \"Revoked, Suspended\";\n\t\tcase license.revoked && licenseExpired:\n\t\t\treturn \"Revoked, Expired\";\n\t\tcase license.suspended && licenseExpired:\n\t\t\treturn \"Suspended, Expired\";\n\t\tcase license.suspended:\n\t\t\treturn \"Suspended\";\n\t\tcase license.revoked:\n\t\t\treturn \"Revoked\";\n\t\tcase licenseExpired:\n\t\t\treturn \"Expired\";\n\t\tdefault:\n\t\t\treturn \"Active\";\n\t}\n}\n\nexport function getValidityDisplay(validity: number | undefined) {\n\tif (validity === 0 || !validity) {\n\t\treturn \"Lifetime\";\n\t} else {\n\t\treturn secondsToDuration(validity);\n\t}\n}\nexport function secondsToDuration(seconds: number): string {\n\tconst duration = intervalToDuration({\n\t\tstart: 0,\n\t\tend: seconds * 1000,\n\t});\n\n\tconst parts = [\n\t\tduration.years && `${duration.years}y`,\n\t\tduration.months && `${duration.months}m`,\n\t\tduration.days && `${duration.days}d`,\n\t\tduration.hours && `${duration.hours}h`,\n\t];\n\n\t// Filter out undefined values and join\n\treturn parts.filter(Boolean).join(\" \").trim();\n}\n\nexport function getValueFromData(\n\tdata: any,\n\taccessor: string | number | symbol,\n) {\n\tconst accessors = accessor.toString().split(\".\");\n\tlet value = data;\n\tfor (const acc of accessors) {\n\t\tvalue = value?.[acc];\n\t}\n\treturn value;\n}\nexport const ALL_OS: { [key: string]: string } = {\n\twindows: \"Windows\",\n\tmacos: \"macOS\",\n\tlinux: \"Linux\",\n\tios: \"iOS\",\n\tandroid: \"Android\",\n};\n\n/**\n *\n * @param input camelCase\n * @returns title case for the camelCase string\n */\nexport function convertToTitleCase(input: string): string {\n\treturn input\n\t\t.replace(/([A-Z])/g, \" $1\") // Insert space before capital letters\n\t\t.trim() // Remove any leading/trailing spaces\n\t\t.split(\" \") // Split into words\n\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) // Capitalize each word\n\t\t.join(\" \"); // Join back into a single string\n}\nexport function pluralizeTimes(resourceName: string, count: number) {\n\tif (count > 1) {\n\t\tif (/y$/.test(resourceName)) {\n\t\t\tif (resourceName === \"Day\") return \"Days\";\n\t\t\treturn resourceName.replace(/y$/, \"ies\");\n\t\t}\n\t\treturn resourceName.concat(\"s\");\n\t}\n\treturn resourceName;\n}\n\n/**\n * Converts a string from 'camelCase' to 'Title Case'\n * @param string String to convert to `Title Case`\n */\nexport function convertCamelCaseToTitleCase(string: string) {\n\tif (string) {\n\t\tconst spacedString = string.replace(/([A-Z])/g, \" $1\");\n\t\treturn spacedString\n\t\t\t.charAt(0)\n\t\t\t.toUpperCase()\n\t\t\t.concat(spacedString.slice(1))\n\t\t\t.replace(/\\.[a-z]/, (substr: string) => {\n\t\t\t\treturn substr.replace(\".\", \" \").toUpperCase();\n\t\t\t});\n\t}\n\treturn string;\n}\n\nexport enum DYNAMIC_INPUT_TARGET {\n\tUSER = 0,\n\tORGANIZATION = 1,\n\tRESELLER = 2,\n}\nexport type VisibilityState<T> = {\n\t[K in keyof T]?: boolean;\n};\n\nexport type TableActions = ({\n\tonClick: (e: PressEvent, t: Table<any>) => void\n\tbulk: boolean;\n\ticon: LucideIcon\n\ttooltip?: string;\n})[]\n\nexport type TableFetchFn<TData, TOperation extends keyof operations> = (\n\tp: PaginationState,\n\ts: SortingState,\n\tq: string,\n\tf: ApiFilters<TOperation>\n) => Promise<{\n\ttotal: number;\n\tdata: TData[] | undefined;\n}>;\n/*** Type for hide some of the columns based on the dto of the particular page\n ** `id`, `updatedAt` are by default hidden\n */\nexport type DefaultVisibilityState<T> = {\n\t[K in keyof T]?: boolean;\n};\n\n\ntype Client = ReturnType<typeof createClient<paths>>;\n\n// Helper type to extract valid GET paths\ntype GetPaths = {\n\t[P in keyof paths]: paths[P] extends { get: any } ? P : never;\n}[keyof paths];\n\nexport type ApiSchema<T extends keyof components['schemas']> = components['schemas'][T];\nexport type ApiQuery<T extends keyof operations> = NonNullable<operations[T]['parameters']['query']>;\nexport type ApiGetAllParameters = {\n\tpage: number;\n\tlimit: number;\n\tsearch?: string;\n\tsort?: string;\n}\n\n\nexport type ApiFilter<T extends keyof operations> = Omit<ApiQuery<T>, 'page' | 'limit' | 'sort' | 'search'>\nexport type ApiFilters<T extends keyof operations> = NonNullable<Omit<ApiQuery<T>, 'page' | 'limit' | 'sort' | 'search'>>\n\nexport function createTableFetchFn<Return, Operation extends keyof operations>(\n\tctxclient: Client,\n\tpath: GetPaths,\n): TableFetchFn<Return, Operation> {\n\treturn async (pagination, sorting, searching, filters) => {\n\t\tconst query: ApiQuery<Operation> = {\n\t\t\t...filters,\n\t\t\tpage: pagination.pageIndex + 1,\n\t\t\tlimit: pagination.pageSize,\n\t\t\tsort: generateSortParam(sorting[0]),\n\t\t\tsearch: searching,\n\t\t};\n\n\t\t// const pathParams = merge(_baseQueryObject, params);\n\n\t\treturn ctxclient.GET(path, { query }).then((value) => {\n\t\t\tconst rowCount = Number.parseInt(\n\t\t\t\tvalue.response.headers.get(\"Pagination-Count\") || \"0\",\n\t\t\t);\n\t\t\treturn { total: rowCount, data: value.data };\n\t\t});\n\t};\n}\n\nfunction generateSortParam(\n\tsort: { id: string; desc: boolean } | undefined,\n): string {\n\tif (sort) {\n\t\tif (sort.desc) {\n\t\t\treturn `-${sort.id}`;\n\t\t} else {\n\t\t\treturn `+${sort.id}`;\n\t\t}\n\t} else {\n\t\treturn \"-createdAt\";\n\t}\n}\n\n\n"],"names":["cH","createColumnHelper","TABLE_CHECK_BOX_COLUMN","table","jsx","Checkbox","row","TABLE_ID_COLUMN","TABLE_DEFAULT_DATE_COLUMNS","date","formatDate","_date","OTHER_PORTALS_DISPLAY_NAME","RESOURCE_NAMES","RESOURCE_DEFINITIONS","RESOURCE_DISPLAY_NAMES","getResourceDisplayName","resourceName","portal","convertCamelCaseToTitleCase","getLicenseStatus","license","licenseExpired","getValidityDisplay","validity","secondsToDuration","seconds","duration","intervalToDuration","getValueFromData","data","accessor","accessors","value","acc","ALL_OS","convertToTitleCase","input","word","pluralizeTimes","count","string","spacedString","substr","DYNAMIC_INPUT_TARGET","createTableFetchFn","ctxclient","path","pagination","sorting","searching","filters","query","generateSortParam","sort"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table-commons.es.js","sources":["../../../lib/components/data-table/table-commons.tsx"],"sourcesContent":["\nimport { Checkbox } from \"@/components/inputs/checkbox\";\nimport type { components, operations, paths } from \"@cryptlex/web-api-types\";\nimport type { PaginationState, SortingState, Table } from \"@tanstack/react-table\";\nimport { createColumnHelper } from \"@tanstack/react-table\";\nimport { intervalToDuration } from \"date-fns\";\nimport type { LucideIcon } from \"lucide-react\";\nimport type createClient from \"openapi-fetch\";\nimport type { PressEvent } from \"react-aria-components\";\n\nconst cH = createColumnHelper<any>();\nexport const TABLE_CHECK_BOX_COLUMN = [\n\tcH.accessor(\"checkbox\", {\n\t\theader: ({ table }) => (\n\t\t\t<Checkbox\n\t\t\t\tisIndeterminate={table.getIsSomeRowsSelected() && !table.getIsAllPageRowsSelected()}\n\t\t\t\tisSelected={\n\t\t\t\t\ttable.getIsAllPageRowsSelected() || table.getIsSomePageRowsSelected()\n\t\t\t\t}\n\t\t\t\tonChange={() => table.toggleAllPageRowsSelected()}\n\t\t\t\taria-label=\"Select all\"\n\t\t\t/>\n\t\t),\n\n\t\tcell: ({ row }) => (\n\t\t\t<Checkbox\n\t\t\t\tisSelected={row.getIsSelected()}\n\t\t\t\tonChange={() => row.toggleSelected()}\n\t\t\t\taria-label=\"Select row\"\n\t\t\t/>\n\t\t),\n\t\tenableSorting: false,\n\t\tenableHiding: false,\n\t}),\n];\n\nexport const TABLE_ID_COLUMN = [\n\tcH.accessor(\"id\", {\n\t\theader: () => \"ID\",\n\t}),\n];\nexport const TABLE_DEFAULT_DATE_COLUMNS = [\n\tcH.accessor(\"createdAt\", {\n\t\theader: () => \"Creation Date\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"createdAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn formatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n\tcH.accessor(\"updatedAt\", {\n\t\theader: () => \"Last Updated\",\n\t\tcell: ({ row }) => {\n\t\t\tconst date = row.getValue(\"updatedAt\") satisfies\n\t\t\t\t| string\n\t\t\t\t| null\n\t\t\t\t| undefined;\n\t\t\treturn formatDate(date);\n\t\t},\n\t\tenableHiding: false,\n\t}),\n];\n\n// TODO, i18n\nexport function formatDate(date: string | null | undefined) {\n\tif (!date) return null;\n\tconst _date = new Date(date);\n\treturn new Intl.DateTimeFormat(undefined, {\n\t\tdateStyle: \"medium\",\n\t\ttimeStyle: \"short\",\n\t}).format(_date);\n}\n/**\n * Format multiple license parameters (expired, suspended, revoked) into a single status\n */\nexport function getLicenseStatus(license: any): string {\n\tconst licenseExpired =\n\t\tlicense.expiresAt && new Date(license.expiresAt) < new Date();\n\t// Status Column\n\tswitch (true) {\n\t\tcase license.revoked && license.suspended && licenseExpired:\n\t\t\treturn \"Revoked, Suspended, Expired\";\n\t\tcase license.revoked && license.suspended:\n\t\t\treturn \"Revoked, Suspended\";\n\t\tcase license.revoked && licenseExpired:\n\t\t\treturn \"Revoked, Expired\";\n\t\tcase license.suspended && licenseExpired:\n\t\t\treturn \"Suspended, Expired\";\n\t\tcase license.suspended:\n\t\t\treturn \"Suspended\";\n\t\tcase license.revoked:\n\t\t\treturn \"Revoked\";\n\t\tcase licenseExpired:\n\t\t\treturn \"Expired\";\n\t\tdefault:\n\t\t\treturn \"Active\";\n\t}\n}\n\nexport function getValidityDisplay(validity: number | undefined) {\n\tif (validity === 0 || !validity) {\n\t\treturn \"Lifetime\";\n\t} else {\n\t\treturn secondsToDuration(validity);\n\t}\n}\nexport function secondsToDuration(seconds: number): string {\n\tconst duration = intervalToDuration({\n\t\tstart: 0,\n\t\tend: seconds * 1000,\n\t});\n\n\tconst parts = [\n\t\tduration.years && `${duration.years}y`,\n\t\tduration.months && `${duration.months}m`,\n\t\tduration.days && `${duration.days}d`,\n\t\tduration.hours && `${duration.hours}h`,\n\t];\n\n\t// Filter out undefined values and join\n\treturn parts.filter(Boolean).join(\" \").trim();\n}\n\nexport function getValueFromData(\n\tdata: any,\n\taccessor: string | number | symbol,\n) {\n\tconst accessors = accessor.toString().split(\".\");\n\tlet value = data;\n\tfor (const acc of accessors) {\n\t\tvalue = value?.[acc];\n\t}\n\treturn value;\n}\nexport const ALL_OS: { [key: string]: string } = {\n\twindows: \"Windows\",\n\tmacos: \"macOS\",\n\tlinux: \"Linux\",\n\tios: \"iOS\",\n\tandroid: \"Android\",\n};\n\nexport type VisibilityState<T> = {\n\t[K in keyof T]?: boolean;\n};\n\nexport type TableActions = ({\n\tonClick: (e: PressEvent, t: Table<any>) => void\n\tbulk: boolean;\n\ticon: LucideIcon\n\ttooltip?: string;\n})[]\n\nexport type TableFetchFn<TData, TOperation extends keyof operations> = (\n\tp: PaginationState,\n\ts: SortingState,\n\tq: string,\n\tf: ApiFilters<TOperation>\n) => Promise<{\n\ttotal: number;\n\tdata: TData[] | undefined;\n}>;\n/*** Type for hide some of the columns based on the dto of the particular page\n ** `id`, `updatedAt` are by default hidden\n */\nexport type DefaultVisibilityState<T> = {\n\t[K in keyof T]?: boolean;\n};\n\n\ntype Client = ReturnType<typeof createClient<paths>>;\n\n// Helper type to extract valid GET paths\ntype GetPaths = {\n\t[P in keyof paths]: paths[P] extends { get: any } ? P : never;\n}[keyof paths];\n\nexport type ApiSchema<T extends keyof components['schemas']> = components['schemas'][T];\nexport type ApiQuery<T extends keyof operations> = NonNullable<operations[T]['parameters']['query']>;\nexport type ApiGetAllParameters = {\n\tpage: number;\n\tlimit: number;\n\tsearch?: string;\n\tsort?: string;\n}\n\n\nexport type ApiFilter<T extends keyof operations> = Omit<ApiQuery<T>, 'page' | 'limit' | 'sort' | 'search'>\nexport type ApiFilters<T extends keyof operations> = NonNullable<Omit<ApiQuery<T>, 'page' | 'limit' | 'sort' | 'search'>>\n\nexport function createTableFetchFn<Return, Operation extends keyof operations>(\n\tctxclient: Client,\n\tpath: GetPaths,\n): TableFetchFn<Return, Operation> {\n\treturn async (pagination, sorting, searching, filters) => {\n\t\tconst query: ApiQuery<Operation> = {\n\t\t\t...filters,\n\t\t\tpage: pagination.pageIndex + 1,\n\t\t\tlimit: pagination.pageSize,\n\t\t\tsort: generateSortParam(sorting[0]),\n\t\t\tsearch: searching,\n\t\t};\n\n\t\t// const pathParams = merge(_baseQueryObject, params);\n\n\t\treturn ctxclient.GET(path, { query }).then((value) => {\n\t\t\tconst rowCount = Number.parseInt(\n\t\t\t\tvalue.response.headers.get(\"Pagination-Count\") || \"0\",\n\t\t\t);\n\t\t\treturn { total: rowCount, data: value.data };\n\t\t});\n\t};\n}\n\nfunction generateSortParam(\n\tsort: { id: string; desc: boolean } | undefined,\n): string {\n\tif (sort) {\n\t\tif (sort.desc) {\n\t\t\treturn `-${sort.id}`;\n\t\t} else {\n\t\t\treturn `+${sort.id}`;\n\t\t}\n\t} else {\n\t\treturn \"-createdAt\";\n\t}\n}\n\n\n"],"names":["cH","createColumnHelper","TABLE_CHECK_BOX_COLUMN","table","jsx","Checkbox","row","TABLE_ID_COLUMN","TABLE_DEFAULT_DATE_COLUMNS","date","formatDate","_date","getLicenseStatus","license","licenseExpired","getValidityDisplay","validity","secondsToDuration","seconds","duration","intervalToDuration","getValueFromData","data","accessor","accessors","value","acc","ALL_OS","createTableFetchFn","ctxclient","path","pagination","sorting","searching","filters","query","generateSortParam","sort"],"mappings":"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"}
|