diff --git a/assets/icons/kanbanicon.svg b/assets/icons/kanbanicon.svg new file mode 100644 index 00000000..1900d1e4 --- /dev/null +++ b/assets/icons/kanbanicon.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/icons/timelineicon.svg b/assets/icons/timelineicon.svg new file mode 100644 index 00000000..8c3a5505 --- /dev/null +++ b/assets/icons/timelineicon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/assets/stylesheets/App.css b/assets/stylesheets/App.css index 1168769a..24d3aabb 100644 --- a/assets/stylesheets/App.css +++ b/assets/stylesheets/App.css @@ -1384,6 +1384,161 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton { height: 100%; } +.objectKanbanContainerWrapper { + position: relative; + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + display: flex; + flex-direction: column; +} + +.objectKanbanContainerSkeletons { + display: flex; + flex-direction: column; + flex: 1; + min-width: 0; + min-height: 0; +} + +.objectKanbanKanbanBody { + position: relative; + flex: 1; + min-width: 0; + min-height: 0; +} + +.objectKanbanContainer { + position: absolute; + inset: 0; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; + z-index: 1; + pointer-events: auto; +} + +.objectKanbanWrap { + width: 100%; + height: 100%; + min-width: 0; + min-height: 0; +} + +.objectKanbanWrap > .ant-spin-nested-loading, +.objectKanbanWrap > .ant-spin-nested-loading > .ant-spin-container { + height: 100%; + min-height: 0; +} + +.objectKanbanScroll { + flex: 1; + width: 100%; + min-width: 0; + min-height: 0; +} + +.objectKanbanScroll .simplebar-content-wrapper { + height: 100%; +} + +.objectKanbanScroll .simplebar-content { + min-height: 100%; +} + +.objectKanbanHeader { + flex-shrink: 0; + width: 100%; + min-width: 0; + overflow: hidden; +} + +.objectKanbanHeaderTrack { + width: max-content; + min-width: 100%; + will-change: transform; +} + +.objectKanbanHeaderRow { + width: max-content; + min-width: 100%; + align-items: flex-start; +} + +.objectKanbanHeaderCell { + flex: 0 0 360px; + min-width: 360px; + flex-shrink: 0; + padding: 8px 8px; + border: 1px solid var(--ant-color-border-secondary); + border-bottom: 1px solid var(--color-descriptions-border); + border-radius: 12px 12px 0 0; + background-color: var(--layout-header-bg); +} + +.objectKanban { + width: max-content; + min-width: 100%; + height: 100%; + min-height: 100%; + align-items: stretch; + padding-bottom: 4px; +} + +.objectKanbanSkeletonColumns { + position: absolute; + inset: 0; + z-index: 0; + overflow: hidden; + pointer-events: none; +} + +.objectKanbanSkeletonTrack { + width: max-content; + min-width: 100%; + height: 100%; + will-change: transform; +} + +.objectKanbanSkeletonRow { + width: max-content; + min-width: 100%; + height: 100%; + align-items: stretch; +} + +.objectKanbanColumn, +.objectKanbanColumnSkeleton { + flex: 0 0 360px; + min-width: 360px; + min-height: 0; + border-top: none; + border-radius: 0 0 12px 12px; +} + +.objectKanbanColumnSkeleton { + border-radius: 0 0 12px 12px; + overflow: hidden; +} + +.objectKanbanColumnCards { + flex: 1; + border-radius: 0 0 12px 12px; + height: 100%; +} + +.objectKanbanColumnSkeleton .objectKanbanColumnCards { + background-color: var(--layout-header-bg); +} + +.objectKanbanColumnCardsInner { + padding: 16px; +} + .electron-body .ant-modal-wrap, .electron-body .ant-modal-mask, .electron-body .ant-drawer { diff --git a/src/components/Dashboard/Finance/Invoices.jsx b/src/components/Dashboard/Finance/Invoices.jsx index 326aa342..7bb8bcfe 100644 --- a/src/components/Dashboard/Finance/Invoices.jsx +++ b/src/components/Dashboard/Finance/Invoices.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Invoices = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('invoices') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('invoices') @@ -35,7 +32,7 @@ const Invoices = () => { objectType='invoice' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Invoices = () => { ref={tableRef} visibleColumns={columnVisibility} type='invoice' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const Invoices = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Finance/PaymentPolicies.jsx b/src/components/Dashboard/Finance/PaymentPolicies.jsx index 171c7ca7..f6645c05 100644 --- a/src/components/Dashboard/Finance/PaymentPolicies.jsx +++ b/src/components/Dashboard/Finance/PaymentPolicies.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -17,8 +16,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const PaymentPolicies = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('paymentPolicy') const [columnVisibility, setColumnVisibility] = useColumnVisibility('paymentPolicy') const [showFilterSidebar, setShowFilterSidebar] = @@ -31,7 +28,7 @@ const PaymentPolicies = () => { objectType='paymentPolicy' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -69,7 +65,6 @@ const PaymentPolicies = () => { ref={tableRef} visibleColumns={columnVisibility} type='paymentPolicy' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -83,7 +78,7 @@ const PaymentPolicies = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Finance/Payments.jsx b/src/components/Dashboard/Finance/Payments.jsx index e5bd0f50..088ec963 100644 --- a/src/components/Dashboard/Finance/Payments.jsx +++ b/src/components/Dashboard/Finance/Payments.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Payments = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('payments') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('payments') @@ -35,7 +32,7 @@ const Payments = () => { objectType='payment' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Payments = () => { ref={tableRef} visibleColumns={columnVisibility} type='payment' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const Payments = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Finance/TaxRecords.jsx b/src/components/Dashboard/Finance/TaxRecords.jsx index d1348eb5..91df9460 100644 --- a/src/components/Dashboard/Finance/TaxRecords.jsx +++ b/src/components/Dashboard/Finance/TaxRecords.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const TaxRecords = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('taxRecord') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('taxRecord') @@ -35,7 +32,7 @@ const TaxRecords = () => { objectType='taxRecord' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const TaxRecords = () => { ref={tableRef} visibleColumns={columnVisibility} type='taxRecord' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const TaxRecords = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Inventory/FilamentStocks.jsx b/src/components/Dashboard/Inventory/FilamentStocks.jsx index e629b9f6..9077da88 100644 --- a/src/components/Dashboard/Inventory/FilamentStocks.jsx +++ b/src/components/Dashboard/Inventory/FilamentStocks.jsx @@ -10,7 +10,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -22,8 +21,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const FilamentStocks = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('filamentStocks') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('filamentStocks') @@ -39,7 +36,7 @@ const FilamentStocks = () => { objectType='filamentStock' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -76,7 +72,6 @@ const FilamentStocks = () => { ref={tableRef} visibleColumns={columnVisibility} type='filamentStock' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -91,7 +86,7 @@ const FilamentStocks = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/OrderItems.jsx b/src/components/Dashboard/Inventory/OrderItems.jsx index 575cbb7a..06d297db 100644 --- a/src/components/Dashboard/Inventory/OrderItems.jsx +++ b/src/components/Dashboard/Inventory/OrderItems.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const OrderItems = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('orderItems') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('orderItems') @@ -35,7 +32,7 @@ const OrderItems = () => { objectType='orderItem' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const OrderItems = () => { ref={tableRef} visibleColumns={columnVisibility} type='orderItem' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const OrderItems = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Inventory/PartStocks.jsx b/src/components/Dashboard/Inventory/PartStocks.jsx index 28241eb5..28a424d6 100644 --- a/src/components/Dashboard/Inventory/PartStocks.jsx +++ b/src/components/Dashboard/Inventory/PartStocks.jsx @@ -10,7 +10,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -22,8 +21,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const PartStocks = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('partStocks') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('partStocks') @@ -39,7 +36,7 @@ const PartStocks = () => { objectType='partStock' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -76,7 +72,6 @@ const PartStocks = () => { ref={tableRef} visibleColumns={columnVisibility} type='partStock' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -91,7 +86,7 @@ const PartStocks = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/ProductStocks.jsx b/src/components/Dashboard/Inventory/ProductStocks.jsx index ccea5ceb..520022c1 100644 --- a/src/components/Dashboard/Inventory/ProductStocks.jsx +++ b/src/components/Dashboard/Inventory/ProductStocks.jsx @@ -11,7 +11,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -23,8 +22,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const ProductStocks = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('productStocks') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('productStock') @@ -40,7 +37,7 @@ const ProductStocks = () => { objectType='productStock' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -77,7 +73,6 @@ const ProductStocks = () => { ref={tableRef} visibleColumns={columnVisibility} type='productStock' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -92,7 +87,7 @@ const ProductStocks = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/PurchaseOrders.jsx b/src/components/Dashboard/Inventory/PurchaseOrders.jsx index 912abd7e..295da5ed 100644 --- a/src/components/Dashboard/Inventory/PurchaseOrders.jsx +++ b/src/components/Dashboard/Inventory/PurchaseOrders.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const PurchaseOrders = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('purchaseOrders') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('purchaseOrders') @@ -35,7 +32,7 @@ const PurchaseOrders = () => { objectType='purchaseOrder' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const PurchaseOrders = () => { ref={tableRef} visibleColumns={columnVisibility} type='purchaseOrder' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const PurchaseOrders = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Inventory/Shipments.jsx b/src/components/Dashboard/Inventory/Shipments.jsx index 40943538..e168faec 100644 --- a/src/components/Dashboard/Inventory/Shipments.jsx +++ b/src/components/Dashboard/Inventory/Shipments.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Shipments = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('shipments') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('shipments') @@ -35,7 +32,7 @@ const Shipments = () => { objectType='shipment' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Shipments = () => { ref={tableRef} visibleColumns={columnVisibility} type='shipment' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const Shipments = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Inventory/StockAudits.jsx b/src/components/Dashboard/Inventory/StockAudits.jsx index 1931b35d..a20a7005 100644 --- a/src/components/Dashboard/Inventory/StockAudits.jsx +++ b/src/components/Dashboard/Inventory/StockAudits.jsx @@ -10,7 +10,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -22,8 +21,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const StockAudits = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('stockAudits') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('stockAudits') @@ -39,7 +36,7 @@ const StockAudits = () => { objectType='stockAudit' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -76,7 +72,6 @@ const StockAudits = () => { ref={tableRef} visibleColumns={columnVisibility} type='stockAudit' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -91,7 +86,7 @@ const StockAudits = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/StockEvents.jsx b/src/components/Dashboard/Inventory/StockEvents.jsx index 06481075..6856cd2c 100644 --- a/src/components/Dashboard/Inventory/StockEvents.jsx +++ b/src/components/Dashboard/Inventory/StockEvents.jsx @@ -6,7 +6,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const StockEvents = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('stockEvents') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('stockEvent') @@ -35,7 +32,7 @@ const StockEvents = () => { objectType='stockEvent' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const StockEvents = () => { ref={tableRef} visibleColumns={columnVisibility} type='stockEvent' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const StockEvents = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/StockLocations.jsx b/src/components/Dashboard/Inventory/StockLocations.jsx index eb7a1da6..1fb0410d 100644 --- a/src/components/Dashboard/Inventory/StockLocations.jsx +++ b/src/components/Dashboard/Inventory/StockLocations.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const StockLocations = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('stockLocations') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('stockLocation') @@ -37,7 +34,7 @@ const StockLocations = () => { objectType='stockLocation' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -74,7 +70,6 @@ const StockLocations = () => { ref={tableRef} visibleColumns={columnVisibility} type='stockLocation' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -89,7 +84,7 @@ const StockLocations = () => { /> - + ) } diff --git a/src/components/Dashboard/Inventory/StockTransfers.jsx b/src/components/Dashboard/Inventory/StockTransfers.jsx index 8ff4da50..b35a6139 100644 --- a/src/components/Dashboard/Inventory/StockTransfers.jsx +++ b/src/components/Dashboard/Inventory/StockTransfers.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const StockTransfers = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('stockTransfers') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('stockTransfer') @@ -37,7 +34,7 @@ const StockTransfers = () => { objectType='stockTransfer' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -74,7 +70,6 @@ const StockTransfers = () => { ref={tableRef} visibleColumns={columnVisibility} type='stockTransfer' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -89,7 +84,7 @@ const StockTransfers = () => { /> - + ) } diff --git a/src/components/Dashboard/Management/AppPasswords.jsx b/src/components/Dashboard/Management/AppPasswords.jsx index 32ba5542..94421463 100644 --- a/src/components/Dashboard/Management/AppPasswords.jsx +++ b/src/components/Dashboard/Management/AppPasswords.jsx @@ -7,7 +7,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ExportListButton from '../common/ExportListButton' @@ -17,8 +16,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const AppPasswords = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('appPassword') const [columnVisibility, setColumnVisibility] = useColumnVisibility('appPassword') @@ -34,7 +31,7 @@ const AppPasswords = () => { objectType='appPassword' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -70,7 +66,6 @@ const AppPasswords = () => { { /> - + ) } diff --git a/src/components/Dashboard/Management/CourierServices.jsx b/src/components/Dashboard/Management/CourierServices.jsx index cf030d22..9d1ea391 100644 --- a/src/components/Dashboard/Management/CourierServices.jsx +++ b/src/components/Dashboard/Management/CourierServices.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const CourierServices = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('courierService') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('courierService') @@ -35,7 +32,7 @@ const CourierServices = () => { objectType='courierService' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const CourierServices = () => { ref={tableRef} visibleColumns={columnVisibility} type='courierService' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const CourierServices = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/Couriers.jsx b/src/components/Dashboard/Management/Couriers.jsx index b47716fe..fad240b2 100644 --- a/src/components/Dashboard/Management/Couriers.jsx +++ b/src/components/Dashboard/Management/Couriers.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Couriers = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('courier') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('courier') const [showFilterSidebar, setShowFilterSidebar] = @@ -34,7 +31,7 @@ const Couriers = () => { objectType='courier' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const Couriers = () => { ref={tableRef} visibleColumns={columnVisibility} type='courier' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const Couriers = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/DocumentJobs.jsx b/src/components/Dashboard/Management/DocumentJobs.jsx index 8a6161a9..b3a2cae2 100644 --- a/src/components/Dashboard/Management/DocumentJobs.jsx +++ b/src/components/Dashboard/Management/DocumentJobs.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const DocumentJobs = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('documentJob') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('documentJob') @@ -35,7 +32,7 @@ const DocumentJobs = () => { objectType='documentJob' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const DocumentJobs = () => { ref={tableRef} visibleColumns={columnVisibility} type='documentJob' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const DocumentJobs = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/DocumentPrinters.jsx b/src/components/Dashboard/Management/DocumentPrinters.jsx index 06807cf3..97d2eca7 100644 --- a/src/components/Dashboard/Management/DocumentPrinters.jsx +++ b/src/components/Dashboard/Management/DocumentPrinters.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const DocumentPrinters = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('documentPrinter') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('documentPrinter') @@ -35,7 +32,7 @@ const DocumentPrinters = () => { objectType='documentPrinter' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const DocumentPrinters = () => { ref={tableRef} visibleColumns={columnVisibility} type='documentPrinter' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const DocumentPrinters = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/DocumentSizes.jsx b/src/components/Dashboard/Management/DocumentSizes.jsx index 0142e9a7..a7de38e4 100644 --- a/src/components/Dashboard/Management/DocumentSizes.jsx +++ b/src/components/Dashboard/Management/DocumentSizes.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -17,8 +16,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const DocumentSizes = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('documentSize') const [columnVisibility, setColumnVisibility] = useColumnVisibility('documentSize') @@ -34,7 +31,7 @@ const DocumentSizes = () => { objectType='documentSize' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const DocumentSizes = () => { ref={tableRef} visibleColumns={columnVisibility} type='documentSize' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const DocumentSizes = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/DocumentTemplates.jsx b/src/components/Dashboard/Management/DocumentTemplates.jsx index e6b92169..f65fe66f 100644 --- a/src/components/Dashboard/Management/DocumentTemplates.jsx +++ b/src/components/Dashboard/Management/DocumentTemplates.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const DocumentTemplates = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('documentTemplate') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('documentTemplate') @@ -35,7 +32,7 @@ const DocumentTemplates = () => { objectType='documentTemplate' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const DocumentTemplates = () => { ref={tableRef} visibleColumns={columnVisibility} type='documentTemplate' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const DocumentTemplates = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/FilamentSkus.jsx b/src/components/Dashboard/Management/FilamentSkus.jsx index 45dcc8d2..0fe89390 100644 --- a/src/components/Dashboard/Management/FilamentSkus.jsx +++ b/src/components/Dashboard/Management/FilamentSkus.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const FilamentSkus = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('filamentSkus') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('filamentSku') @@ -37,7 +34,7 @@ const FilamentSkus = () => { objectType='filamentSku' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -74,7 +70,6 @@ const FilamentSkus = () => { ref={tableRef} visibleColumns={columnVisibility} type='filamentSku' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -89,7 +84,7 @@ const FilamentSkus = () => { /> - + ) } diff --git a/src/components/Dashboard/Management/Filaments.jsx b/src/components/Dashboard/Management/Filaments.jsx index 46a72ddb..22b088d2 100644 --- a/src/components/Dashboard/Management/Filaments.jsx +++ b/src/components/Dashboard/Management/Filaments.jsx @@ -8,7 +8,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ColumnViewButton from '../common/ColumnViewButton' import ObjectTable from '../common/ObjectTable' import ObjectActions from '../common/ObjectActions' -import useViewMode from '../hooks/useViewMode' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' @@ -23,7 +22,6 @@ const Filaments = () => { const tableRef = useRef() // View mode state (cards/list), persisted in sessionStorage via custom hook - const [viewMode, setViewMode] = useViewMode('filament') const [columnVisibility, setColumnVisibility] = useColumnVisibility('filament') @@ -40,7 +38,7 @@ const Filaments = () => { objectType='filament' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -76,7 +73,6 @@ const Filaments = () => { { /> - + ) } diff --git a/src/components/Dashboard/Management/Files.jsx b/src/components/Dashboard/Management/Files.jsx index 37fddd28..6776b96d 100644 --- a/src/components/Dashboard/Management/Files.jsx +++ b/src/components/Dashboard/Management/Files.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Files = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('file') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('file') const [showFilterSidebar, setShowFilterSidebar] = @@ -29,8 +26,11 @@ const Files = () => { useSortSidebarVisibility('Files') return ( - - + + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -67,7 +66,6 @@ const Files = () => { ref={tableRef} visibleColumns={columnVisibility} type='file' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -81,7 +79,7 @@ const Files = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/Hosts.jsx b/src/components/Dashboard/Management/Hosts.jsx index b50bac4c..8cd7ecbe 100644 --- a/src/components/Dashboard/Management/Hosts.jsx +++ b/src/components/Dashboard/Management/Hosts.jsx @@ -12,7 +12,6 @@ import ListViewEditButtons from '../common/ListViewEditButtons' import { ObjectListViewProvider } from '../context/ObjectListViewContext' import ObjectTable from '../common/ObjectTable' import ObjectActions from '../common/ObjectActions' -import useViewMode from '../hooks/useViewMode' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' @@ -23,7 +22,6 @@ const Hosts = () => { const tableRef = useRef() // View mode state (cards/list), persisted in sessionStorage via custom hook - const [viewMode, setViewMode] = useViewMode('host') const [columnVisibility, setColumnVisibility] = useColumnVisibility('host') @@ -39,7 +37,7 @@ const Hosts = () => { objectType='host' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -75,7 +72,6 @@ const Hosts = () => { { /> - + ) } diff --git a/src/components/Dashboard/Management/Materials.jsx b/src/components/Dashboard/Management/Materials.jsx index d44e66bb..4bb05594 100644 --- a/src/components/Dashboard/Management/Materials.jsx +++ b/src/components/Dashboard/Management/Materials.jsx @@ -9,7 +9,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ExportListButton from '../common/ExportListButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Materials = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('material') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('material') @@ -37,7 +34,7 @@ const Materials = () => { objectType='material' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Materials = () => { { /> - + ) } diff --git a/src/components/Dashboard/Management/NoteTypes.jsx b/src/components/Dashboard/Management/NoteTypes.jsx index 5f6bf049..6641e5d7 100644 --- a/src/components/Dashboard/Management/NoteTypes.jsx +++ b/src/components/Dashboard/Management/NoteTypes.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const NoteTypes = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('noteType') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('noteType') @@ -35,7 +32,7 @@ const NoteTypes = () => { objectType='noteType' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const NoteTypes = () => { ref={tableRef} visibleColumns={columnVisibility} type='noteType' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const NoteTypes = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/PartSkus.jsx b/src/components/Dashboard/Management/PartSkus.jsx index bd09d897..577e5dfd 100644 --- a/src/components/Dashboard/Management/PartSkus.jsx +++ b/src/components/Dashboard/Management/PartSkus.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const PartSkus = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('partSkus') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('partSku') const [showFilterSidebar, setShowFilterSidebar] = @@ -36,7 +33,7 @@ const PartSkus = () => { objectType='partSku' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const PartSkus = () => { ref={tableRef} visibleColumns={columnVisibility} type='partSku' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -88,7 +83,7 @@ const PartSkus = () => { /> - + ) } diff --git a/src/components/Dashboard/Management/Parts.jsx b/src/components/Dashboard/Management/Parts.jsx index b579cd4b..84e168ad 100644 --- a/src/components/Dashboard/Management/Parts.jsx +++ b/src/components/Dashboard/Management/Parts.jsx @@ -9,7 +9,6 @@ import ObjectActions from '../common/ObjectActions' import useColumnVisibility from '../hooks/useColumnVisibility' -import useViewMode from '../hooks/useViewMode' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' @@ -24,8 +23,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Parts = (filter) => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('part') const [columnVisibility, setColumnVisibility] = useColumnVisibility('part') const [showFilterSidebar, setShowFilterSidebar] = @@ -40,7 +37,7 @@ const Parts = (filter) => { objectType='part' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -78,7 +74,6 @@ const Parts = (filter) => { ref={tableRef} visibleColumns={columnVisibility} type='part' - cards={viewMode === 'cards'} filter={filter} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} @@ -93,7 +88,7 @@ const Parts = (filter) => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/PermissionSettings.jsx b/src/components/Dashboard/Management/PermissionSettings.jsx index 45804f2d..f1306a60 100644 --- a/src/components/Dashboard/Management/PermissionSettings.jsx +++ b/src/components/Dashboard/Management/PermissionSettings.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const PermissionSettingsList = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('permissionSetting') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('permissionSetting') @@ -35,7 +32,7 @@ const PermissionSettingsList = () => { objectType='permissionSetting' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const PermissionSettingsList = () => { ref={tableRef} visibleColumns={columnVisibility} type='permissionSetting' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const PermissionSettingsList = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/ProductCategories.jsx b/src/components/Dashboard/Management/ProductCategories.jsx index 4786992c..24b88706 100644 --- a/src/components/Dashboard/Management/ProductCategories.jsx +++ b/src/components/Dashboard/Management/ProductCategories.jsx @@ -9,7 +9,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ExportListButton from '../common/ExportListButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const ProductCategories = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('productCategory') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('productCategory') @@ -37,7 +34,7 @@ const ProductCategories = () => { objectType='productCategory' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const ProductCategories = () => { { /> - + ) } diff --git a/src/components/Dashboard/Management/ProductSkus.jsx b/src/components/Dashboard/Management/ProductSkus.jsx index 83696d1a..100442d7 100644 --- a/src/components/Dashboard/Management/ProductSkus.jsx +++ b/src/components/Dashboard/Management/ProductSkus.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const ProductSkus = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('productSkus') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('productSku') @@ -37,7 +34,7 @@ const ProductSkus = () => { objectType='productSku' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -74,7 +70,6 @@ const ProductSkus = () => { ref={tableRef} visibleColumns={columnVisibility} type='productSku' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -89,7 +84,7 @@ const ProductSkus = () => { /> - + ) } diff --git a/src/components/Dashboard/Management/Products.jsx b/src/components/Dashboard/Management/Products.jsx index 7b69f519..a07ad20a 100644 --- a/src/components/Dashboard/Management/Products.jsx +++ b/src/components/Dashboard/Management/Products.jsx @@ -25,7 +25,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ExportListButton from '../common/ExportListButton' @@ -37,8 +36,6 @@ const Products = () => { const navigate = useNavigate() const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('Products') - const getProductActionItems = (id) => { return { items: [ @@ -309,7 +306,7 @@ const Products = () => { objectType='product' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -347,7 +343,6 @@ const Products = () => { { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/StockAuditLevels.jsx b/src/components/Dashboard/Management/StockAuditLevels.jsx index 4b2b8ab8..54968db5 100644 --- a/src/components/Dashboard/Management/StockAuditLevels.jsx +++ b/src/components/Dashboard/Management/StockAuditLevels.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const StockAuditLevels = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('stockAuditLevel') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('stockAuditLevel') @@ -34,7 +31,7 @@ const StockAuditLevels = () => { objectType='stockAuditLevel' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const StockAuditLevels = () => { ref={tableRef} visibleColumns={columnVisibility} type='stockAuditLevel' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const StockAuditLevels = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/TaxRates.jsx b/src/components/Dashboard/Management/TaxRates.jsx index 491a7faa..e3a2e324 100644 --- a/src/components/Dashboard/Management/TaxRates.jsx +++ b/src/components/Dashboard/Management/TaxRates.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const TaxRates = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('taxRate') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('taxRate') const [showFilterSidebar, setShowFilterSidebar] = @@ -34,7 +31,7 @@ const TaxRates = () => { objectType='taxRate' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const TaxRates = () => { ref={tableRef} visibleColumns={columnVisibility} type='taxRate' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const TaxRates = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/UserGroups.jsx b/src/components/Dashboard/Management/UserGroups.jsx index a5d1190d..a46cc249 100644 --- a/src/components/Dashboard/Management/UserGroups.jsx +++ b/src/components/Dashboard/Management/UserGroups.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const UserGroups = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('userGroup') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('userGroup') const [showFilterSidebar, setShowFilterSidebar] = @@ -34,7 +31,7 @@ const UserGroups = () => { objectType='userGroup' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const UserGroups = () => { ref={tableRef} visibleColumns={columnVisibility} type='userGroup' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const UserGroups = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/Users.jsx b/src/components/Dashboard/Management/Users.jsx index d651397b..bdeb80ac 100644 --- a/src/components/Dashboard/Management/Users.jsx +++ b/src/components/Dashboard/Management/Users.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Users = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('user') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('user') const [showFilterSidebar, setShowFilterSidebar] = @@ -34,7 +31,7 @@ const Users = () => { objectType='user' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const Users = () => { ref={tableRef} type={'user'} visibleColumns={columnVisibility} - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const Users = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Management/Vendors.jsx b/src/components/Dashboard/Management/Vendors.jsx index a33210d3..9f810ee0 100644 --- a/src/components/Dashboard/Management/Vendors.jsx +++ b/src/components/Dashboard/Management/Vendors.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Vendors = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('vendor') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('vendor') const [showFilterSidebar, setShowFilterSidebar] = @@ -29,8 +26,11 @@ const Vendors = () => { useSortSidebarVisibility('Vendors') return ( - - + + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -67,7 +66,6 @@ const Vendors = () => { ref={tableRef} visibleColumns={columnVisibility} type='vendor' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -81,7 +79,7 @@ const Vendors = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Production/FilamentProfiles.jsx b/src/components/Dashboard/Production/FilamentProfiles.jsx index 343238aa..70b361a5 100644 --- a/src/components/Dashboard/Production/FilamentProfiles.jsx +++ b/src/components/Dashboard/Production/FilamentProfiles.jsx @@ -13,12 +13,9 @@ import ObjectTableViewButton from '../common/ObjectTableViewButton' import useColumnVisibility from '../hooks/useColumnVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' -import useViewMode from '../hooks/useViewMode' const FilamentProfiles = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('FilamentProfiles') const [columnVisibility, setColumnVisibility] = useColumnVisibility('filamentProfile') const [showFilterSidebar, setShowFilterSidebar] = @@ -33,7 +30,7 @@ const FilamentProfiles = () => { objectType='filamentProfile' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -68,7 +64,6 @@ const FilamentProfiles = () => { { /> - + ) } diff --git a/src/components/Dashboard/Production/GCodeFiles.jsx b/src/components/Dashboard/Production/GCodeFiles.jsx index 353fa35b..8a9d5fe4 100644 --- a/src/components/Dashboard/Production/GCodeFiles.jsx +++ b/src/components/Dashboard/Production/GCodeFiles.jsx @@ -8,7 +8,6 @@ import ObjectActions from '../common/ObjectActions' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' @@ -21,8 +20,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const GCodeFiles = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('gcodeFile') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('gcodeFile') @@ -38,7 +35,7 @@ const GCodeFiles = () => { objectType='gcodeFile' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -75,7 +71,6 @@ const GCodeFiles = () => { { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Production/Jobs.jsx b/src/components/Dashboard/Production/Jobs.jsx index a515c6ef..35d75338 100644 --- a/src/components/Dashboard/Production/Jobs.jsx +++ b/src/components/Dashboard/Production/Jobs.jsx @@ -5,7 +5,6 @@ import { Flex, Space } from 'antd' import useColumnVisibility from '../hooks/useColumnVisibility.jsx' import ObjectTable from '../common/ObjectTable.jsx' import ObjectActions from '../common/ObjectActions' -import useViewMode from '../hooks/useViewMode.jsx' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Jobs = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('job') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('job') const [showFilterSidebar, setShowFilterSidebar] = @@ -36,7 +33,7 @@ const Jobs = () => { objectType='job' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Jobs = () => { ref={tableRef} type={'job'} visibleColumns={columnVisibility} - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -88,7 +83,7 @@ const Jobs = () => { /> - + ) } diff --git a/src/components/Dashboard/Production/PrinterProfiles.jsx b/src/components/Dashboard/Production/PrinterProfiles.jsx index 524fa514..e75f7667 100644 --- a/src/components/Dashboard/Production/PrinterProfiles.jsx +++ b/src/components/Dashboard/Production/PrinterProfiles.jsx @@ -13,11 +13,8 @@ import ObjectTableViewButton from '../common/ObjectTableViewButton' import useColumnVisibility from '../hooks/useColumnVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' -import useViewMode from '../hooks/useViewMode' const PrinterProfiles = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('PrinterProfiles') const [columnVisibility, setColumnVisibility] = useColumnVisibility('printerProfile') const [showFilterSidebar, setShowFilterSidebar] = @@ -32,7 +29,7 @@ const PrinterProfiles = () => { objectType='printerProfile' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -67,7 +63,6 @@ const PrinterProfiles = () => { { /> - + ) } diff --git a/src/components/Dashboard/Production/Printers.jsx b/src/components/Dashboard/Production/Printers.jsx index 2cd0e4ef..43036fe2 100644 --- a/src/components/Dashboard/Production/Printers.jsx +++ b/src/components/Dashboard/Production/Printers.jsx @@ -13,7 +13,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useColumnVisibility from '../hooks/useColumnVisibility' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' @@ -22,7 +21,6 @@ const Printers = () => { const tableRef = useRef() // View mode state (cards/list), persisted in sessionStorage via custom hook - const [viewMode, setViewMode] = useViewMode('Printers') // Column visibility state, persisted in sessionStorage via custom hook const [columnVisibility, setColumnVisibility] = useColumnVisibility('printer') @@ -40,7 +38,7 @@ const Printers = () => { objectType='printer' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -78,7 +75,6 @@ const Printers = () => { type='printer' showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} - cards={viewMode === 'cards'} visibleColumns={columnVisibility} expandHeight={true} saveFilterInSession={true} @@ -92,7 +88,7 @@ const Printers = () => { /> - + ) } diff --git a/src/components/Dashboard/Production/SubJobs.jsx b/src/components/Dashboard/Production/SubJobs.jsx index baf010cc..0eb50581 100644 --- a/src/components/Dashboard/Production/SubJobs.jsx +++ b/src/components/Dashboard/Production/SubJobs.jsx @@ -5,7 +5,6 @@ import { Flex, Space } from 'antd' import useColumnVisibility from '../hooks/useColumnVisibility.jsx' import ObjectTable from '../common/ObjectTable.jsx' import ObjectActions from '../common/ObjectActions' -import useViewMode from '../hooks/useViewMode.jsx' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' @@ -20,8 +19,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const SubJobs = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('subJob') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('subJob') const [showFilterSidebar, setShowFilterSidebar] = @@ -36,7 +33,7 @@ const SubJobs = () => { objectType='subJob' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const SubJobs = () => { ref={tableRef} type={'subJob'} visibleColumns={columnVisibility} - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -88,7 +83,7 @@ const SubJobs = () => { /> - + ) } diff --git a/src/components/Dashboard/Sales/Clients.jsx b/src/components/Dashboard/Sales/Clients.jsx index 347329bd..a19e7d27 100644 --- a/src/components/Dashboard/Sales/Clients.jsx +++ b/src/components/Dashboard/Sales/Clients.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Clients = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('client') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('client') const [showFilterSidebar, setShowFilterSidebar] = @@ -34,7 +31,7 @@ const Clients = () => { objectType='client' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -72,7 +68,6 @@ const Clients = () => { ref={tableRef} visibleColumns={columnVisibility} type='client' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -86,7 +81,7 @@ const Clients = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/FulfillmentPolicies.jsx b/src/components/Dashboard/Sales/FulfillmentPolicies.jsx index 71c9ac07..057ce734 100644 --- a/src/components/Dashboard/Sales/FulfillmentPolicies.jsx +++ b/src/components/Dashboard/Sales/FulfillmentPolicies.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -17,8 +16,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const FulfillmentPolicies = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('fulfillmentPolicy') const [columnVisibility, setColumnVisibility] = useColumnVisibility('fulfillmentPolicy') const [showFilterSidebar, setShowFilterSidebar] = @@ -31,7 +28,7 @@ const FulfillmentPolicies = () => { objectType='fulfillmentPolicy' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -69,7 +65,6 @@ const FulfillmentPolicies = () => { ref={tableRef} visibleColumns={columnVisibility} type='fulfillmentPolicy' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -83,7 +78,7 @@ const FulfillmentPolicies = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/ListingVarients.jsx b/src/components/Dashboard/Sales/ListingVarients.jsx index 1c6d5691..86ec4649 100644 --- a/src/components/Dashboard/Sales/ListingVarients.jsx +++ b/src/components/Dashboard/Sales/ListingVarients.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const ListingVarients = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('listingVarients') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('listingVarients') @@ -35,7 +32,7 @@ const ListingVarients = () => { objectType='listingVarient' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const ListingVarients = () => { ref={tableRef} visibleColumns={columnVisibility} type='listingVarient' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const ListingVarients = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/Listings.jsx b/src/components/Dashboard/Sales/Listings.jsx index 78b95878..a889a1b0 100644 --- a/src/components/Dashboard/Sales/Listings.jsx +++ b/src/components/Dashboard/Sales/Listings.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Listings = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('listings') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('listings') @@ -35,7 +32,7 @@ const Listings = () => { objectType='listing' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Listings = () => { ref={tableRef} visibleColumns={columnVisibility} type='listing' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const Listings = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/Marketplaces.jsx b/src/components/Dashboard/Sales/Marketplaces.jsx index 5a5b73da..e5402d70 100644 --- a/src/components/Dashboard/Sales/Marketplaces.jsx +++ b/src/components/Dashboard/Sales/Marketplaces.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const Marketplaces = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('marketplaces') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('marketplaces') @@ -35,7 +32,7 @@ const Marketplaces = () => { objectType='marketplace' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const Marketplaces = () => { ref={tableRef} visibleColumns={columnVisibility} type='marketplace' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const Marketplaces = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/ReturnPolicies.jsx b/src/components/Dashboard/Sales/ReturnPolicies.jsx index eae11c21..a9b9f44b 100644 --- a/src/components/Dashboard/Sales/ReturnPolicies.jsx +++ b/src/components/Dashboard/Sales/ReturnPolicies.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -17,8 +16,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const ReturnPolicies = () => { const tableRef = useRef() - - const [viewMode, setViewMode] = useViewMode('returnPolicy') const [columnVisibility, setColumnVisibility] = useColumnVisibility('returnPolicy') const [showFilterSidebar, setShowFilterSidebar] = useFilterSidebarVisibility('ReturnPolicies') @@ -30,7 +27,7 @@ const ReturnPolicies = () => { objectType='returnPolicy' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -68,7 +64,6 @@ const ReturnPolicies = () => { ref={tableRef} visibleColumns={columnVisibility} type='returnPolicy' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -82,7 +77,7 @@ const ReturnPolicies = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/Sales/SalesOrders.jsx b/src/components/Dashboard/Sales/SalesOrders.jsx index 0e1a9add..b011696d 100644 --- a/src/components/Dashboard/Sales/SalesOrders.jsx +++ b/src/components/Dashboard/Sales/SalesOrders.jsx @@ -6,7 +6,6 @@ import useColumnVisibility from '../hooks/useColumnVisibility' import ObjectTableViewButton from '../common/ObjectTableViewButton' import FilterSidebarButton from '../common/FilterSidebarButton' import SortSidebarButton from '../common/SortSidebarButton' -import useViewMode from '../hooks/useViewMode' import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility' import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility' import ColumnViewButton from '../common/ColumnViewButton' @@ -18,8 +17,6 @@ import { ObjectListViewProvider } from '../context/ObjectListViewContext' const SalesOrders = () => { const tableRef = useRef() - const [viewMode, setViewMode] = useViewMode('salesOrders') - const [columnVisibility, setColumnVisibility] = useColumnVisibility('salesOrders') @@ -35,7 +32,7 @@ const SalesOrders = () => { objectType='salesOrder' tableRef={tableRef} > - + { onClick={() => setShowFilterSidebar(!showFilterSidebar)} /> @@ -73,7 +69,6 @@ const SalesOrders = () => { ref={tableRef} visibleColumns={columnVisibility} type='salesOrder' - cards={viewMode === 'cards'} showFilterSidebar={showFilterSidebar} showSortSidebar={showSortSidebar} expandHeight={true} @@ -87,7 +82,7 @@ const SalesOrders = () => { useSortInUrl={true} /> - + ) } diff --git a/src/components/Dashboard/common/ObjectKanban.jsx b/src/components/Dashboard/common/ObjectKanban.jsx new file mode 100644 index 00000000..851a87f0 --- /dev/null +++ b/src/components/Dashboard/common/ObjectKanban.jsx @@ -0,0 +1,283 @@ +import { + forwardRef, + useCallback, + useContext, + useImperativeHandle, + useLayoutEffect, + useMemo, + useRef, + useState +} from 'react' +import { Empty, Flex } from 'antd' +import PropTypes from 'prop-types' +import { ApiServerContext } from '../context/ApiServerContext' +import ObjectKanbanColumn from './ObjectKanbanColumn' +import ObjectKanbanHeader from './ObjectKanbanHeader' +import ScrollBox from './ScrollBox' +import { getCategoryValueKey } from './viewModeUtils' + +const ObjectKanban = forwardRef( + ( + { + type, + categoryProperty, + baseFilter = {}, + masterFilter = {}, + sorter = {}, + pageSize = 25, + model, + modelProperties, + visibleColumns = {}, + isEditing = false, + rowActions = [], + renderActions + }, + ref + ) => { + const { getModelPropertyValues } = useContext(ApiServerContext) + const columnRefs = useRef({}) + const headerTrackRef = useRef(null) + const skeletonTrackRef = useRef(null) + const [scrollElement, setScrollElement] = useState(null) + const [categoryValues, setCategoryValues] = useState([]) + const [hasLoaded, setHasLoaded] = useState(false) + + const baseFilterRef = useRef(baseFilter) + const masterFilterRef = useRef(masterFilter) + const sorterRef = useRef(sorter) + const getModelPropertyValuesRef = useRef(getModelPropertyValues) + const lastCategoryQueryKeyRef = useRef(null) + + baseFilterRef.current = baseFilter + masterFilterRef.current = masterFilter + sorterRef.current = sorter + getModelPropertyValuesRef.current = getModelPropertyValues + + const setScrollContainerRef = useCallback((node) => { + setScrollElement(node) + }, []) + + useLayoutEffect(() => { + const mainScroll = scrollElement + const headerTrack = headerTrackRef.current + const skeletonTrack = skeletonTrackRef.current + if (!mainScroll || !headerTrack) return undefined + + const handleMainScroll = () => { + const offset = `translate3d(-${mainScroll.scrollLeft}px, 0, 0)` + headerTrack.style.transform = offset + if (skeletonTrack) { + skeletonTrack.style.transform = offset + } + } + + handleMainScroll() + mainScroll.addEventListener('scroll', handleMainScroll, { passive: true }) + + return () => { + mainScroll.removeEventListener('scroll', handleMainScroll) + } + }, [scrollElement, categoryValues]) + + const categoryPropertyDef = useMemo( + () => + model?.properties?.find( + (property) => property.name === categoryProperty + ), + [categoryProperty, model] + ) + + const buildCategoryQueryKey = useCallback( + (filter, activeSorter) => + JSON.stringify({ + type, + categoryProperty, + filter, + masterFilter: masterFilterRef.current, + sorter: activeSorter + }), + [categoryProperty, type] + ) + + const reloadColumns = useCallback(async () => { + await Promise.all( + Object.values(columnRefs.current) + .filter(Boolean) + .map((columnRef) => columnRef.reload?.()) + ) + }, []) + + const load = useCallback( + async (filter = null, sorterArg = null) => { + if (!categoryProperty) { + lastCategoryQueryKeyRef.current = null + setCategoryValues([]) + setHasLoaded(true) + return + } + + const activeFilter = filter ?? baseFilterRef.current + const activeSorter = sorterArg ?? sorterRef.current + const queryKey = buildCategoryQueryKey(activeFilter, activeSorter) + + if (lastCategoryQueryKeyRef.current === queryKey) { + await reloadColumns() + setHasLoaded(true) + return + } + + setHasLoaded(false) + + try { + const values = await getModelPropertyValuesRef.current( + type, + categoryProperty, + { + filter: activeFilter, + masterFilter: masterFilterRef.current + } + ) + const nextValues = Array.isArray(values) ? values : [] + setCategoryValues(nextValues) + lastCategoryQueryKeyRef.current = queryKey + } catch (error) { + console.error('Error fetching kanban category values:', error) + setCategoryValues([]) + lastCategoryQueryKeyRef.current = null + throw error + } finally { + setHasLoaded(true) + } + }, + [buildCategoryQueryKey, categoryProperty, reloadColumns, type] + ) + + const reload = useCallback(async () => { + lastCategoryQueryKeyRef.current = null + await load(baseFilterRef.current, sorterRef.current) + }, [load]) + + useImperativeHandle( + ref, + () => ({ + load, + reload + }), + [load, reload] + ) + + if (!categoryProperty) { + return ( + + + + ) + } + + if (hasLoaded && categoryValues.length === 0) { + return ( + + + + ) + } + + if (!hasLoaded || categoryValues.length === 0) { + return ( +
+ ) + } + + return ( +
+
+ +
+
+ + + {categoryValues.map((categoryValue) => { + const columnKey = getCategoryValueKey(categoryValue) + return ( + { + if (node) { + columnRefs.current[columnKey] = node + } else { + delete columnRefs.current[columnKey] + } + }} + scrollElement={scrollElement} + type={type} + categoryProperty={categoryProperty} + categoryValue={categoryValue} + baseFilter={baseFilter} + masterFilter={masterFilter} + sorter={sorter} + pageSize={pageSize} + model={model} + modelProperties={modelProperties} + visibleColumns={visibleColumns} + isEditing={isEditing} + rowActions={rowActions} + renderActions={renderActions} + /> + ) + })} + + +
+
+
+ + {categoryValues.map((categoryValue) => { + const columnKey = getCategoryValueKey(categoryValue) + return ( +
+
+
+ ) + })} + +
+
+
+
+
+ ) + } +) + +ObjectKanban.displayName = 'ObjectKanban' + +ObjectKanban.propTypes = { + type: PropTypes.string.isRequired, + categoryProperty: PropTypes.string, + baseFilter: PropTypes.object, + masterFilter: PropTypes.object, + sorter: PropTypes.object, + pageSize: PropTypes.number, + model: PropTypes.object.isRequired, + modelProperties: PropTypes.array.isRequired, + visibleColumns: PropTypes.object, + isEditing: PropTypes.bool, + rowActions: PropTypes.array, + renderActions: PropTypes.func +} + +export default ObjectKanban diff --git a/src/components/Dashboard/common/ObjectKanbanColumn.jsx b/src/components/Dashboard/common/ObjectKanbanColumn.jsx new file mode 100644 index 00000000..6e842c84 --- /dev/null +++ b/src/components/Dashboard/common/ObjectKanbanColumn.jsx @@ -0,0 +1,552 @@ +import { + forwardRef, + useCallback, + useContext, + useEffect, + useImperativeHandle, + useLayoutEffect, + useMemo, + useRef, + useState +} from 'react' +import { Flex, Spin } from 'antd' +import { LoadingOutlined } from '@ant-design/icons' +import PropTypes from 'prop-types' +import { ApiServerContext } from '../context/ApiServerContext' +import ObjectCard from './ObjectCard' +import { toCategoryFilterValue } from './viewModeUtils' + +const SCROLL_THRESHOLD = 50 + +const ObjectKanbanColumn = forwardRef( + ( + { + type, + categoryProperty, + categoryValue, + baseFilter = {}, + masterFilter = {}, + sorter = {}, + pageSize = 25, + model, + modelProperties, + visibleColumns = {}, + isEditing = false, + rowActions = [], + renderActions, + scrollElement = null + }, + ref + ) => { + const { fetchObjects } = useContext(ApiServerContext) + const containerRef = useRef(null) + const pagesRef = useRef([]) + const loadingPagesRef = useRef(new Set()) + const dataLoadGenerationRef = useRef(0) + const pendingScrollAnchorRef = useRef(null) + const lastColumnQueryKeyRef = useRef(null) + + const baseFilterRef = useRef(baseFilter) + const masterFilterRef = useRef(masterFilter) + const sorterRef = useRef(sorter) + const fetchObjectsRef = useRef(fetchObjects) + + baseFilterRef.current = baseFilter + masterFilterRef.current = masterFilter + sorterRef.current = sorter + fetchObjectsRef.current = fetchObjects + + const [pages, setPages] = useState([]) + const [loading, setLoading] = useState(true) + + const columnFilter = useMemo( + () => ({ + ...baseFilter, + [categoryProperty]: toCategoryFilterValue(categoryValue) + }), + [baseFilter, categoryProperty, categoryValue] + ) + + const columnQueryKey = useMemo( + () => + JSON.stringify({ + type, + categoryProperty, + categoryValue: toCategoryFilterValue(categoryValue), + filter: columnFilter, + sorter + }), + [columnFilter, categoryProperty, categoryValue, sorter, type] + ) + + const tableData = useMemo(() => { + const items = pages.flatMap((page) => page.items) + const seen = new Set() + return items.filter((item) => { + const id = item?._id + if (id == null) return true + if (seen.has(id)) return false + seen.add(id) + return true + }) + }, [pages]) + + const createSkeletonData = useCallback( + (pageNum) => + Array(pageSize) + .fill(null) + .map((_, index) => ({ + _id: `skeleton-${categoryProperty}-${pageNum}-${index}`, + isSkeleton: true + })), + [categoryProperty, pageSize] + ) + + const createSkeletonPage = useCallback( + (pageNum) => ({ + pageNum, + items: createSkeletonData(pageNum), + isSkeletonPage: true + }), + [createSkeletonData] + ) + + const createPageWindow = useCallback( + (loadedPages, direction) => { + const dedupedByPageNum = new Map() + loadedPages.forEach((page) => { + dedupedByPageNum.set(page.pageNum, page) + }) + const sortedPages = [...dedupedByPageNum.values()].sort( + (a, b) => a.pageNum - b.pageNum + ) + const visiblePages = + direction === 'previous' + ? sortedPages.slice(0, 2) + : sortedPages.slice(-2) + const firstPage = visiblePages[0] + const lastPage = visiblePages[visiblePages.length - 1] + const nextPages = [] + + if (firstPage?.pageNum > 1) { + nextPages.push(createSkeletonPage(firstPage.pageNum - 1)) + } + nextPages.push(...visiblePages) + if (lastPage?.hasMore) { + nextPages.push(createSkeletonPage(lastPage.pageNum + 1)) + } + + return nextPages + }, + [createSkeletonPage] + ) + + const mergeLoadedPage = useCallback((currentPages, loadedPage) => { + const withoutSkeletons = currentPages.filter( + (page) => !page.isSkeletonPage + ) + const withoutDuplicate = withoutSkeletons.filter( + (page) => page.pageNum !== loadedPage.pageNum + ) + return [...withoutDuplicate, loadedPage].sort( + (a, b) => a.pageNum - b.pageNum + ) + }, []) + + const setTablePages = useCallback((nextPages) => { + pagesRef.current = nextPages + setPages(nextPages) + }, []) + + const isStaleDataLoad = useCallback( + (generation) => generation !== dataLoadGenerationRef.current, + [] + ) + + const fetchPage = useCallback( + async (pageNum) => { + const filter = { + ...masterFilterRef.current, + ...baseFilterRef.current, + [categoryProperty]: toCategoryFilterValue(categoryValue) + } + return fetchObjectsRef.current(type, { + page: pageNum, + limit: pageSize, + filter, + sorter: sorterRef.current + }) + }, + [categoryProperty, categoryValue, pageSize, type] + ) + + const fetchData = useCallback( + async (pageNum) => { + const generation = dataLoadGenerationRef.current + try { + const result = await fetchPage(pageNum) + if (isStaleDataLoad(generation)) return [] + const loadedPage = { + pageNum, + items: result.data || [], + hasMore: result.hasMore + } + setPages((prev) => + prev.map((page) => (page.pageNum === pageNum ? loadedPage : page)) + ) + return result.data || [] + } catch (error) { + console.error(`Error loading kanban page ${pageNum}:`, error) + return [] + } + }, + [fetchPage, isStaleDataLoad] + ) + + const findRenderedCard = useCallback((scrollTarget, id) => { + if (!scrollTarget || id == null) return null + return scrollTarget.querySelector(`[data-kanban-card-id="${String(id)}"]`) + }, []) + + const captureScrollAnchor = useCallback( + (scrollTarget, placeholderPage, direction, currentPages) => { + if (!scrollTarget) return null + + const targetTop = scrollTarget.getBoundingClientRect().top + const closestCard = (items) => + items + .map((item, index) => { + const element = findRenderedCard(scrollTarget, item._id) + return element + ? { + index, + id: item._id, + top: element.getBoundingClientRect().top + } + : null + }) + .filter(Boolean) + .sort( + (a, b) => + Math.abs(a.top - targetTop) - Math.abs(b.top - targetTop) + )[0] + + const placeholderAnchor = closestCard(placeholderPage.items) + const loadedPages = currentPages.filter((page) => !page.isSkeletonPage) + const retainedPage = + direction === 'previous' + ? loadedPages[0] + : loadedPages[loadedPages.length - 1] + const fallbackAnchor = retainedPage + ? closestCard(retainedPage.items) + : null + + return { placeholderAnchor, fallbackAnchor } + }, + [findRenderedCard] + ) + + const restoreScrollAnchor = useCallback( + (scrollTarget, anchor, loadedPage) => { + if (!scrollTarget || !anchor) return + + const loadedItem = loadedPage.items[anchor.placeholderAnchor?.index] + const anchorId = loadedItem?._id ?? anchor.fallbackAnchor?.id + const previousTop = loadedItem + ? anchor.placeholderAnchor?.top + : anchor.fallbackAnchor?.top + if (anchorId == null || previousTop == null) return + + const element = findRenderedCard(scrollTarget, anchorId) + if (!element) return + const renderedTop = element.getBoundingClientRect().top + scrollTarget.scrollTop += renderedTop - previousTop + }, + [findRenderedCard] + ) + + useLayoutEffect(() => { + const pendingAnchor = pendingScrollAnchorRef.current + if (!pendingAnchor) return + pendingScrollAnchorRef.current = null + restoreScrollAnchor( + pendingAnchor.scrollTarget, + pendingAnchor.anchor, + pendingAnchor.loadedPage + ) + }, [pages, restoreScrollAnchor]) + + const loadBoundaryPage = useCallback( + async (pageNum, direction, scrollTarget) => { + if (loadingPagesRef.current.size > 0) return + + const currentPages = pagesRef.current + const placeholderPage = currentPages.find( + (page) => page.pageNum === pageNum && page.isSkeletonPage + ) + if (!placeholderPage) return + + const scrollAnchor = captureScrollAnchor( + scrollTarget, + placeholderPage, + direction, + currentPages + ) + + const generation = dataLoadGenerationRef.current + loadingPagesRef.current.add(pageNum) + + try { + const result = await fetchPage(pageNum) + if (isStaleDataLoad(generation)) return + const loadedPage = { + pageNum, + items: result.data || [], + hasMore: result.hasMore + } + + pendingScrollAnchorRef.current = { + scrollTarget, + anchor: scrollAnchor, + loadedPage + } + setPages((prev) => { + if ( + !prev.some( + (page) => page.pageNum === pageNum && page.isSkeletonPage + ) + ) { + return prev + } + + const loadedPages = mergeLoadedPage(prev, loadedPage) + return createPageWindow(loadedPages, direction) + }) + } catch (error) { + console.error(`Error loading kanban page ${pageNum}:`, error) + } finally { + loadingPagesRef.current.delete(pageNum) + } + }, + [ + captureScrollAnchor, + createPageWindow, + fetchPage, + isStaleDataLoad, + mergeLoadedPage + ] + ) + + const loadNextPage = useCallback( + (scrollTarget) => { + const nextPage = pagesRef.current[pagesRef.current.length - 1] + if (nextPage?.isSkeletonPage) { + loadBoundaryPage(nextPage.pageNum, 'next', scrollTarget) + } + }, + [loadBoundaryPage] + ) + + const loadPreviousPage = useCallback( + (scrollTarget) => { + const previousPage = pagesRef.current[0] + if (previousPage?.isSkeletonPage) { + loadBoundaryPage(previousPage.pageNum, 'previous', scrollTarget) + } + }, + [loadBoundaryPage] + ) + + const loadInitialPage = useCallback(async () => { + dataLoadGenerationRef.current += 1 + loadingPagesRef.current.clear() + pendingScrollAnchorRef.current = null + const generation = dataLoadGenerationRef.current + + pagesRef.current = [] + setPages([]) + setLoading(true) + + const skeletonPage = createSkeletonPage(1) + setTablePages([skeletonPage]) + + try { + const firstResult = await fetchPage(1) + if (isStaleDataLoad(generation)) return + const loadedPages = [ + { + pageNum: 1, + items: firstResult.data || [], + hasMore: firstResult.hasMore + } + ] + if (!isStaleDataLoad(generation)) { + setTablePages(createPageWindow(loadedPages, 'next')) + } + } catch { + if (!isStaleDataLoad(generation)) { + setTablePages([]) + } + } finally { + if (!isStaleDataLoad(generation)) { + setLoading(false) + } + } + }, [ + createPageWindow, + createSkeletonPage, + fetchPage, + isStaleDataLoad, + setTablePages + ]) + + const reloadLoadedPages = useCallback(async () => { + const loadedPages = pagesRef.current.filter( + (page) => !page.isSkeletonPage + ) + for (let i = 0; i < loadedPages.length; i++) { + await fetchData(loadedPages[i].pageNum) + } + }, [fetchData]) + + useImperativeHandle(ref, () => ({ + reload: reloadLoadedPages + })) + + useEffect(() => { + if (lastColumnQueryKeyRef.current === columnQueryKey) return + + let cancelled = false + + const runLoad = async () => { + await loadInitialPage() + if (!cancelled) { + lastColumnQueryKeyRef.current = columnQueryKey + } + } + + runLoad() + + return () => { + cancelled = true + } + }, [columnQueryKey, loadInitialPage]) + + const skeletonBoundaryIds = useMemo(() => { + const firstPage = pages[0] + const lastPage = pages[pages.length - 1] + return { + previous: + firstPage?.isSkeletonPage && firstPage.items.length > 0 + ? firstPage.items[firstPage.items.length - 1]._id + : null, + next: + lastPage?.isSkeletonPage && lastPage.items[0] + ? lastPage.items[0]._id + : null + } + }, [pages]) + + useLayoutEffect(() => { + const container = containerRef.current + if (!container || !scrollElement) return + + const observer = new IntersectionObserver( + (entries) => { + for (const entry of entries) { + if (!entry.isIntersecting) continue + const boundary = entry.target.dataset.skeletonBoundary + if (boundary === 'next') { + loadNextPage(scrollElement) + } else if (boundary === 'previous') { + loadPreviousPage(scrollElement) + } + } + }, + { + root: scrollElement, + rootMargin: `${SCROLL_THRESHOLD}px`, + threshold: 0 + } + ) + + container + .querySelectorAll('[data-skeleton-boundary]') + .forEach((el) => observer.observe(el)) + + return () => observer.disconnect() + }, [ + scrollElement, + skeletonBoundaryIds, + loadNextPage, + loadPreviousPage, + tableData + ]) + + return ( + +
+ } spinning={loading}> + + {tableData.map((record) => { + if (record?._id == undefined) return null + + const skeletonBoundary = + record._id === skeletonBoundaryIds.next + ? 'next' + : record._id === skeletonBoundaryIds.previous + ? 'previous' + : undefined + + return ( +
+ +
+ ) + })} +
+
+
+
+ ) + } +) + +ObjectKanbanColumn.displayName = 'ObjectKanbanColumn' + +ObjectKanbanColumn.propTypes = { + type: PropTypes.string.isRequired, + categoryProperty: PropTypes.string.isRequired, + categoryValue: PropTypes.any, + baseFilter: PropTypes.object, + masterFilter: PropTypes.object, + sorter: PropTypes.object, + pageSize: PropTypes.number, + model: PropTypes.object.isRequired, + modelProperties: PropTypes.array.isRequired, + visibleColumns: PropTypes.object, + isEditing: PropTypes.bool, + rowActions: PropTypes.array, + renderActions: PropTypes.func, + scrollElement: PropTypes.object +} + +export default ObjectKanbanColumn diff --git a/src/components/Dashboard/common/ObjectKanbanHeader.jsx b/src/components/Dashboard/common/ObjectKanbanHeader.jsx new file mode 100644 index 00000000..fd4836b0 --- /dev/null +++ b/src/components/Dashboard/common/ObjectKanbanHeader.jsx @@ -0,0 +1,46 @@ +import { Flex } from 'antd' +import PropTypes from 'prop-types' +import ObjectProperty from './ObjectProperty' +import { getCategoryValueKey } from './viewModeUtils' + +const ObjectKanbanHeader = ({ + categoryValues, + categoryProperty, + categoryPropertyDef, + trackRef +}) => { + return ( +
+
+ + {categoryValues.map((categoryValue) => { + const columnKey = getCategoryValueKey(categoryValue) + return ( +
+ {categoryPropertyDef ? ( + + ) : null} +
+ ) + })} +
+
+
+ ) +} + +ObjectKanbanHeader.displayName = 'ObjectKanbanHeader' + +ObjectKanbanHeader.propTypes = { + categoryValues: PropTypes.array.isRequired, + categoryProperty: PropTypes.string.isRequired, + categoryPropertyDef: PropTypes.object, + trackRef: PropTypes.object +} + +export default ObjectKanbanHeader diff --git a/src/components/Dashboard/common/ObjectTable.jsx b/src/components/Dashboard/common/ObjectTable.jsx index 31beab17..56116f8a 100644 --- a/src/components/Dashboard/common/ObjectTable.jsx +++ b/src/components/Dashboard/common/ObjectTable.jsx @@ -9,7 +9,6 @@ import { useMemo, createElement } from 'react' -import { flushSync } from 'react-dom' import { Table, Skeleton, @@ -36,6 +35,7 @@ import { } from '../../../database/ObjectModels' import ObjectProperty from './ObjectProperty' import ObjectCard from './ObjectCard' +import ObjectKanban from './ObjectKanban' import FilterSidebar from './FilterSidebar' import SortSidebar from './SortSidebar' import CheckIcon from '../../Icons/CheckIcon' @@ -59,6 +59,7 @@ import { hasActionPermission } from '../../../database/permissions' import Tooltip from './Tooltip' import { ObjectTableFilterContext } from './ObjectTableFilterContext' import ObjectListViewContext from '../context/ObjectListViewContext' +import { isCardsView, isKanbanView, normalizeViewMode } from './viewModeUtils' const logger = loglevel.getLogger('DasboardTable') logger.setLevel(config.logLevel) @@ -271,6 +272,7 @@ const ObjectTable = forwardRef( scrollHeight = 'calc(var(--unit-100vh) - 258px)', onDataChange, initialPage = 1, + viewMode: viewModeProp, cards = false, visibleColumns = {}, masterFilter = {}, @@ -292,10 +294,19 @@ const ObjectTable = forwardRef( }, ref ) => { + const objectListView = useContext(ObjectListViewContext) + const viewMode = normalizeViewMode( + viewModeProp ?? + objectListView?.viewMode ?? + (cards ? { type: 'cards' } : { type: 'list' }) + ) + const isCards = isCardsView(viewMode) + const isKanban = isKanbanView(viewMode) + const kanbanRef = useRef(null) + const wasKanbanRef = useRef(false) const { token, userProfile } = useContext(AuthContext) const { isElectron } = useContext(ElectronContext) const { callAction } = useActions() - const objectListView = useContext(ObjectListViewContext) const listViewId = objectListView?.listViewId ?? null const listViewFilter = objectListView?.listViewFilter ?? null const listViewSort = objectListView?.listViewSort ?? null @@ -349,7 +360,7 @@ const ObjectTable = forwardRef( if (isMobile) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 298px)' } - if (cards) { + if (isCards || isKanban) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 210px)' } if (isElectron) { @@ -358,7 +369,7 @@ const ObjectTable = forwardRef( if (isMobile && isElectron) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 282px)' } - if (cards && isElectron) { + if ((isCards || isKanban) && isElectron) { adjustedScrollHeight = 'calc(var(--unit-100vh) - 258px)' } const tableRef = useRef(null) @@ -384,15 +395,18 @@ const ObjectTable = forwardRef( const lastAppliedViewKeyRef = useRef(null) - const buildEffectiveFilter = useCallback((userFilter, viewFilter = listViewFilterRef.current) => { - const active = getActiveFilterValues(userFilter) - const viewId = listViewIdRef.current - if (!viewId) return active - return { - ...getActiveFilterValues(viewFilter || {}), - ...active - } - }, []) + const buildEffectiveFilter = useCallback( + (userFilter, viewFilter = listViewFilterRef.current) => { + const active = getActiveFilterValues(userFilter) + const viewId = listViewIdRef.current + if (!viewId) return active + return { + ...getActiveFilterValues(viewFilter || {}), + ...active + } + }, + [] + ) // Table state const [pages, setPages] = useState([]) @@ -443,7 +457,10 @@ const ObjectTable = forwardRef( ) const prevValuesRef = useRef({ type, masterFilter }) - const getMasterFilter = useCallback(() => masterFilter || {}, [masterFilter]) + const getMasterFilter = useCallback( + () => masterFilter || {}, + [masterFilter] + ) const resolveSorter = useCallback((userSorter) => { if (userSorter?.field && userSorter?.order) { @@ -517,9 +534,7 @@ const ObjectTable = forwardRef( const clearTablePages = useCallback(() => { pagesRef.current = [] - flushSync(() => { - setPages([]) - }) + setPages([]) }, []) const setTablePages = useCallback((nextPages) => { @@ -889,6 +904,10 @@ const ObjectTable = forwardRef( const reloadLoadedPages = useCallback( async ({ silent = false } = {}) => { + if (isKanban) { + await kanbanRef.current?.reload?.() + return + } if (!silent) { setLazyLoading(true) } @@ -905,7 +924,7 @@ const ObjectTable = forwardRef( } } }, - [fetchData] + [fetchData, isKanban] ) const reload = useCallback(() => reloadLoadedPages(), [reloadLoadedPages]) @@ -1076,9 +1095,12 @@ const ObjectTable = forwardRef( useEffect(() => { if (connected !== true || !type) return - const unsubscribe = subscribeToAllObjectUpdates(type, (id, updateData) => { - updateEventHandlerRef.current(id, updateData) - }) + const unsubscribe = subscribeToAllObjectUpdates( + type, + (id, updateData) => { + updateEventHandlerRef.current(id, updateData) + } + ) subscribeToAllObjectUpdatesRef.current = unsubscribe return () => { if (unsubscribe) unsubscribe() @@ -1119,15 +1141,38 @@ const ObjectTable = forwardRef( const loadPage = useCallback( async (pageNum, filter = null, sorter = null) => { + if (isKanban) { + setLoading(true) + try { + const activeFilter = + filter != null ? filter : activeFilterRef.current + const resolvedSorter = + sorter != null + ? resolveSorter(sorter) + : resolveSorter(tableSorterRef.current) + + if (!kanbanRef.current?.load) { + await new Promise((resolve) => requestAnimationFrame(resolve)) + } + + await kanbanRef.current?.load?.( + activeFilter, + resolvedSorter?.field ? resolvedSorter : {} + ) + } catch (error) { + logger.error('Error loading kanban view:', error) + } finally { + setLoading(false) + } + return + } const generation = beginDataReload() clearTablePages() if (isStaleDataLoad(generation)) return const skeletonPage = createSkeletonPage(pageNum) - flushSync(() => { - setTablePages([skeletonPage]) - setLoading(true) - }) + setTablePages([skeletonPage]) + setLoading(true) if (isStaleDataLoad(generation)) return try { @@ -1165,7 +1210,9 @@ const ObjectTable = forwardRef( fetchPage, isStaleDataLoad, setTablePages, - suppressTableChange + suppressTableChange, + isKanban, + resolveSorter ] ) @@ -1232,11 +1279,7 @@ const ObjectTable = forwardRef( setTableSorter(viewSort) tableSorterRef.current = viewSort activeFilterRef.current = viewFilter - loadPage( - initialPage, - viewFilter, - viewSort.field ? viewSort : null - ) + loadPage(initialPage, viewFilter, viewSort.field ? viewSort : null) }, [ activeObjectView, initialPage, @@ -1261,11 +1304,11 @@ const ObjectTable = forwardRef( return } - listViewIdRef.current = null - listViewFilterRef.current = {} - lastAppliedViewKeyRef.current = null - filter = getAllTabPersistedFilter() - sorter = getAllTabPersistedSorter() + listViewIdRef.current = null + listViewFilterRef.current = {} + lastAppliedViewKeyRef.current = null + filter = getAllTabPersistedFilter() + sorter = getAllTabPersistedSorter() const resolvedSorter = resolveSorter(sorter) const nextSorter = sorter?.field ? sorter : {} @@ -1287,9 +1330,7 @@ const ObjectTable = forwardRef( // View tab: apply the view definition. Sidebar starts as the view // filter so the UI matches; All-tab user settings must not leak in. const viewId = - options.viewId !== undefined - ? options.viewId - : listViewIdRef.current + options.viewId !== undefined ? options.viewId : listViewIdRef.current const viewFilter = options.viewFilter !== undefined ? options.viewFilter || {} @@ -1299,12 +1340,11 @@ const ObjectTable = forwardRef( listViewFilterRef.current = viewFilter filter = viewFilter - sorter = - options.viewSort?.field - ? options.viewSort - : sorterState?.field - ? sorterState - : {} + sorter = options.viewSort?.field + ? options.viewSort + : sorterState?.field + ? sorterState + : {} const resolvedSorter = resolveSorter(sorter) const nextSorter = sorter?.field ? sorter : {} @@ -1349,16 +1389,55 @@ const ObjectTable = forwardRef( })) useEffect(() => { - if ( - connected == true && - token != null && - !pages.includes(initialPage) && - !initialized - ) { - loadInitialPage() - setInitialized(true) + if (connected !== true || token == null || initialized) { + return } - }, [token, loadInitialPage, initialPage, pages, initialized, connected]) + + let cancelled = false + + const run = async () => { + await loadInitialPage() + if (!cancelled) { + setInitialized(true) + } + } + + run() + + return () => { + cancelled = true + } + }, [token, loadInitialPage, initialized, connected]) + + useEffect(() => { + if (!isKanban || connected !== true || token == null) { + wasKanbanRef.current = isKanban + return + } + + const categoryProperty = viewMode?.settings?.categoryProperty + if (!categoryProperty) { + wasKanbanRef.current = isKanban + return + } + + if (!wasKanbanRef.current) { + loadPage( + initialPage, + activeFilterRef.current, + tableSorterRef.current?.field ? tableSorterRef.current : null + ) + } + + wasKanbanRef.current = isKanban + }, [ + isKanban, + connected, + token, + loadPage, + initialPage, + viewMode?.settings?.categoryProperty + ]) // Watch for changes in type and masterFilter, reset component state when they change useEffect(() => { @@ -1457,15 +1536,14 @@ const ObjectTable = forwardRef( const effective = buildEffectiveFilter(newSidebarFilter) activeFilterRef.current = effective if (activeObjectViewRef.current) { - onObjectViewFilterSortChangeRef.current?.(newSidebarFilter, tableSorter) + onObjectViewFilterSortChangeRef.current?.( + newSidebarFilter, + tableSorter + ) } else if (!listViewIdRef.current) { persistFilter(newSidebarFilter) } - loadPage( - initialPage, - effective, - resolveSorter(tableSorter) - ) + loadPage(initialPage, effective, resolveSorter(tableSorter)) }, [ buildEffectiveFilter, @@ -1511,7 +1589,7 @@ const ObjectTable = forwardRef( // Table columns from model properties const columnsWithSkeleton = [ { - title: lazyLoading ? : cards ? model.icon : null, + title: lazyLoading ? : isCards ? model.icon : null, key: 'icon', width: 45, fixed: 'left', @@ -1526,7 +1604,7 @@ const ObjectTable = forwardRef( }, [pages]) useEffect(() => { - if (!expandHeight || cards) return + if (!expandHeight || isCards || isKanban) return const findAntTableBody = (element) => { if (!element) return null @@ -1547,7 +1625,14 @@ const ObjectTable = forwardRef( return () => { tableBody.style.minHeight = '' } - }, [expandHeight, adjustedScrollHeight, cards, loading, tableData]) + }, [ + expandHeight, + adjustedScrollHeight, + isCards, + isKanban, + loading, + tableData + ]) // Add columns in the order specified by model.columns model.columns.forEach((colName) => { @@ -1720,9 +1805,9 @@ const ObjectTable = forwardRef( ) useLayoutEffect(() => { - if (!cards) return + if (!isCards) return measureCardColSpan() - }, [cards, showFilterSidebar, showSortSidebar, measureCardColSpan]) + }, [isCards, showFilterSidebar, showSortSidebar, measureCardColSpan]) useEffect(() => { return () => cardsResizeObserverRef.current?.disconnect() @@ -1730,7 +1815,7 @@ const ObjectTable = forwardRef( // Card view: load when the leading skeleton card in a boundary page enters view useLayoutEffect(() => { - if (!cards) return + if (!isCards) return const container = cardsContainerNodeRef.current if (!container) return const scrollEl = container.querySelector('.simplebar-content-wrapper') @@ -1760,7 +1845,7 @@ const ObjectTable = forwardRef( .forEach((el) => observer.observe(el)) return () => observer.disconnect() - }, [cards, skeletonBoundaryIds, loadNextPage, loadPreviousPage]) + }, [isCards, skeletonBoundaryIds, loadNextPage, loadPreviousPage]) const renderCards = () => { return ( @@ -1847,7 +1932,31 @@ const ObjectTable = forwardRef( onResizeEnd={measureCardColSpan} > - {cards ? ( + {isKanban ? ( +
+ } + spinning={loading} + style={{ height: '100%' }} + > + + +
+ ) : isCards ? (
}, + { type: 'cards', label: 'Cards', icon: }, + { type: 'kanban', label: 'Kanban', icon: } +] const ObjectTableViewButton = ({ - viewMode, - setViewMode, + objectType, + viewMode: viewModeProp, + setViewMode: setViewModeProp, showEndingDivider = false, ...buttonProps }) => { - const content = ( -