Compare commits

...

21 Commits

Author SHA1 Message Date
61041e8391 Refactor SimpleDateTimePropertyFilter styles for improved layout and alignment
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Adjusted margins and alignment properties for the SimpleDateTimePropertyFilter component to enhance visual consistency.
- Updated styles for tree nodes and switchers to ensure better alignment and spacing within the component.
2026-08-10 02:23:52 +01:00
30e7aa2cf9 Enhance Job and SubJob models with additional properties and filters
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Updated Job model to include 'startedAt' and 'finishedAt' in columns and filters, improving data tracking.
- Modified SubJob model to replace specific job and printer IDs with their respective objects in filters, and added 'startedAt' and 'finishedAt' to filters and sorters for better data management.
2026-08-10 01:53:43 +01:00
0e238f9455 Enhance SimpleDateTimePropertyFilter with improved styling and functionality
- Added CSS styles for the SimpleDateTimePropertyFilter component to improve layout and spacing.
- Updated the component to include a more flexible checkbox rendering with indeterminate states.
- Refactored the handleNodeCheck function for better management of checked states and visibility during filtering.
2026-08-10 01:47:43 +01:00
33e7cf43dc Update FileInfo component to include trailing comma for improved code consistency
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
2026-08-10 01:17:05 +01:00
9f4e6869a5 Add SimpleDateTimePropertyFilter component for enhanced date and time filtering
- Introduced SimpleDateTimePropertyFilter component to handle filtering of date and time properties in the dashboard.
- Updated SimplePropertyFilter to integrate the new component, allowing for specialized handling of dateTime and date types.
- Enhanced filtering logic to improve user experience when dealing with date and time selections.
2026-08-10 01:17:01 +01:00
38e89e45c7 Refactor SimplePropertyFilter for improved key handling and filtering logic
Some checks failed
farmcontrol/farmcontrol-ui/pipeline/head There was a failure building this commit
- Enhanced the getOptionKey function to support object types and improve key generation for options.
- Updated local state management to utilize keys for checked values, ensuring consistent behavior during filtering.
- Refactored handleChange and emitChange functions to work with keys, improving clarity and maintainability.
- Adjusted Checkbox component to use generated keys for value handling, enhancing the filtering experience.
2026-08-10 00:56:55 +01:00
0b110cdfff Enhance ObjectTable and ScrollBox components with new filtering capabilities
- Introduced a new SimplePropertyFilter component for advanced filtering options in the ObjectTable.
- Updated ObjectTable to utilize ColumnFilterDropdown for improved filter management and user experience.
- Enhanced ScrollBox to support additional padding options for better layout control.
- Refactored related components to integrate new filtering logic and maintain consistent styling across the dashboard.
2026-08-10 00:42:09 +01:00
ed4f1c7505 Implement editDisabled state across various components for improved editing control
Some checks failed
farmcontrol/farmcontrol-ui/pipeline/head There was a failure building this commit
- Added editDisabled state to multiple components, enhancing control over editing actions based on the current state.
- Updated the disabled property in relevant components to utilize the new editDisabled state, ensuring consistent behavior across the dashboard.
- Refactored imports to remove unused getModelByName function calls, streamlining the codebase.
2026-08-09 23:33:34 +01:00
7065cd312b Refactor isSameActionUrl function in ObjectActions component for clarity
- Updated the isSameActionUrl function to improve readability and maintainability.
- Enhanced comments to clarify the logic behind action URL comparison and visibility control for actions based on the current page state.
2026-08-09 23:20:35 +01:00
469907ef59 Add edit and cancelEdit functionality to various document models
- Introduced 'edit', 'cancelEdit', and 'finishEdit' actions across multiple document models, enhancing user interaction during editing processes.
- Updated visibility logic for these actions to ensure they only appear when relevant, improving the user experience.
- Refactored existing visibility functions for consistency across models.
2026-08-09 23:15:36 +01:00
1192d56027 Add showEndingDivider prop to ObjectTableViewButton for enhanced layout control
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Updated ObjectTableViewButton component to accept a showEndingDivider prop, allowing for conditional rendering of a divider in the layout.
- Modified multiple dashboard components (Invoices, Payments, TaxRecords, etc.) to utilize the new prop, improving visual separation in the UI.
- Ensured consistent application of the new prop across various components for a cohesive user experience.
2026-08-09 23:08:01 +01:00
0b17a33225 Refactor ObjectTable component for improved readability and layout consistency
- Reformatted the filter logic for clarity in the mergeLoadedPage function.
- Updated the gap property in the Flex component to enhance layout spacing in the sidebar.
2026-08-09 22:53:27 +01:00
e885949639 Enhance ObjectTable component with improved data handling and deduplication
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Introduced logic to filter out duplicate items in the table data, logging warnings for omitted rows.
- Added mechanisms for managing data load generation to prevent stale data issues during asynchronous operations.
- Refactored page loading and merging logic to ensure proper handling of loaded pages and skeleton states.
- Improved state management for loading and clearing table pages, enhancing overall performance and user experience.
2026-08-09 21:07:57 +01:00
78299f688e Add sort functionality to various dashboard components
- Introduced SortSidebarButton to enable sorting in Invoices, Payments, TaxRecords, and Inventory components.
- Integrated useSortSidebarVisibility hook to manage sort sidebar visibility state.
- Updated relevant components to include sorting capabilities, enhancing user experience and data management.
2026-08-09 20:54:53 +01:00
b44eb246eb Update setSearchParams call in ObjectTableNavigationButtons to replace URL parameters without adding to history 2026-08-09 20:48:11 +01:00
40b567b17e Refactor AppPassword component for improved readability and modal width adjustment
- Reformatted import statements for better clarity and consistency.
- Increased modal width for the Regenerate Secret functionality to enhance user experience.
- Improved the structure of the createElement call for RegenerateAppPasswordSecret for better readability.
2026-08-09 20:35:42 +01:00
9ee46d2067 Refactor NotesPanel component to improve state management and loading behavior
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Removed unnecessary initialized state and replaced it with refs for notes ID and type to optimize re-rendering.
- Updated useEffect dependencies to ensure proper data fetching based on changes in notes ID and type.
- Enhanced loading state handling during note fetching for better user experience.
2026-08-09 19:33:59 +01:00
8c073a598a Enhance modal and drawer styling in App.css for improved UI consistency
- Added styling for `.ant-drawer-mask` to match the existing `.ant-modal-mask` backdrop filter.
- Updated the positioning of `.electron-body .ant-drawer` to align with modal adjustments, ensuring a cohesive layout across components.
2026-08-09 19:21:24 +01:00
2bf929bb49 Merge branch 'electrobun'
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
2026-08-09 16:03:05 +01:00
e9f4c1f3d3 Refine CEF installer artifact detection logic in app update process
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Updated isCefInstallerArtifact function to use a regex pattern for identifying CEF installer artifacts, improving accuracy in artifact name matching.
- Enhanced comments for clarity on CEF build naming conventions, aiding future maintenance and understanding of the code.
2026-08-08 21:56:32 +01:00
1d741d8932 Add artifact filtering for CEF installer in app update process
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Introduced isCefInstallerArtifact function to identify CEF installer artifacts based on their file names.
- Updated artifact selection logic to filter out CEF installer artifacts, ensuring only relevant updates are processed.
- Enhanced overall update handling by improving artifact management and reducing unnecessary processing.
2026-08-08 21:10:12 +01:00
134 changed files with 2253 additions and 262 deletions

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.889696,0,0,0.887145,3,3.004404)">
<path d="M65.191,32.59C65.191,50.56 50.592,65.181 32.59,65.181C14.621,65.181 0,50.56 0,32.59C0,14.599 14.621,0 32.59,0C50.592,0 65.191,14.599 65.191,32.59ZM21.127,17.509L13.242,25.633C12.808,26.079 12.495,26.691 12.495,27.302C12.495,28.65 13.45,29.624 14.829,29.624C15.43,29.624 16.052,29.406 16.465,28.928L20.404,24.868L20.501,24.753L20.475,26.04L20.475,46.139C20.475,47.465 21.491,48.481 22.828,48.481C24.175,48.481 25.191,47.465 25.191,46.139L25.191,26.019L25.16,24.683L25.324,24.868L29.274,28.928C29.72,29.406 30.279,29.624 30.921,29.624C32.259,29.624 33.191,28.65 33.191,27.302C33.191,26.713 32.954,26.079 32.528,25.633L24.631,17.509C23.69,16.537 22.049,16.547 21.127,17.509ZM39.936,19.053L39.936,39.173L39.958,40.423L39.866,40.315L35.937,36.243C35.534,35.808 34.912,35.579 34.258,35.579C32.932,35.579 31.967,36.532 31.967,37.89C31.967,38.501 32.268,39.113 32.714,39.571L40.579,47.673C41.511,48.636 43.13,48.646 44.093,47.673L52,39.571C52.414,39.113 52.663,38.48 52.663,37.89C52.663,36.532 51.751,35.579 50.372,35.579C49.751,35.579 49.18,35.808 48.724,36.243L44.786,40.315L44.629,40.493L44.651,39.195L44.651,19.053C44.651,17.727 43.626,16.733 42.299,16.733C40.942,16.733 39.936,17.727 39.936,19.053Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
<g transform="matrix(0.887145,0,0,0.887145,3,3.004404)">
<rect x="0" y="0" width="65.378" height="65.212" style="fill-opacity:0;"/>
<path d="M32.59,65.181C50.592,65.181 65.191,50.582 65.191,32.59C65.191,14.599 50.592,0 32.59,0C14.599,0 0,14.599 0,32.59C0,50.582 14.599,65.181 32.59,65.181ZM32.59,58.02C18.529,58.02 7.161,46.652 7.161,32.59C7.161,18.529 18.529,7.161 32.59,7.161C46.652,7.161 58.03,18.529 58.03,32.59C58.03,46.652 46.652,58.02 32.59,58.02Z" style="fill-rule:nonzero;"/>
<path d="M23.228,47.784C24.494,47.784 25.468,46.819 25.468,45.554L25.468,26.266L25.404,22.761C25.383,21.569 24.42,20.585 23.228,20.585C22.046,20.585 21.083,21.569 21.062,22.761L20.988,26.288L20.988,45.554C20.988,46.819 21.953,47.784 23.228,47.784ZM33.14,27.518C33.14,26.97 32.893,26.346 32.498,25.941L24.94,18.166C24.039,17.234 22.491,17.244 21.61,18.166L14.063,25.941C13.639,26.346 13.357,26.948 13.357,27.518C13.357,28.815 14.271,29.738 15.577,29.738C16.148,29.738 16.739,29.519 17.133,29.073L20.878,25.194L23.207,22.452L25.65,25.194L29.417,29.073C29.822,29.519 30.362,29.738 30.962,29.738C32.249,29.738 33.14,28.815 33.14,27.518ZM41.856,17.43C40.581,17.43 39.616,18.363 39.616,19.629L39.616,38.916L39.69,42.422C39.712,43.623 40.675,44.608 41.856,44.608C43.048,44.608 44.011,43.623 44.032,42.422L44.096,38.938L44.096,19.629C44.096,18.363 43.122,17.43 41.856,17.43ZM51.748,37.674C51.748,36.378 50.878,35.466 49.581,35.466C48.99,35.466 48.45,35.694 48.014,36.109L44.269,39.998L41.835,42.74L39.496,39.998L35.751,36.109C35.367,35.694 34.787,35.466 34.174,35.466C32.899,35.466 31.976,36.378 31.976,37.674C31.976,38.244 32.277,38.836 32.692,39.272L40.229,47.027C41.109,47.938 42.636,47.958 43.558,47.027L51.126,39.272C51.541,38.836 51.748,38.223 51.748,37.674Z" style="fill-rule:nonzero;"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -344,7 +344,8 @@ body {
overflow: hidden;
}
.ant-modal-mask {
.ant-modal-mask,
.ant-drawer-mask {
backdrop-filter: blur(3px);
}
@ -512,6 +513,24 @@ body {
height: 8px !important;
}
.scrollbox-inner .simplebar-track.simplebar-vertical {
right: var(--scrollbox-vertical-right-padding);
}
.scrollbox-inner .simplebar-track.simplebar-horizontal {
bottom: var(--scrollbox-horizontal-bottom-padding);
}
.scrollbox-inner-small-padding .simplebar-track.simplebar-vertical {
right: 8px;
bottom: 8px;
top: 8px;
}
.scrollbox-inner-small-padding .simplebar-track.simplebar-horizontal {
bottom: 8px;
}
.simplebar-scrollbar:before {
background: #78787854 !important;
}
@ -967,7 +986,8 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton {
}
.electron-body .ant-modal-wrap,
.electron-body .ant-modal-mask {
.electron-body .ant-modal-mask,
.electron-body .ant-drawer {
top: 41px;
}
@ -1086,3 +1106,27 @@ span.ant-skeleton-input.ant-skeleton-input-sm.text-skeleton {
margin-inline-start: 0;
margin-top: 4px;
}
.simple-date-time-property-filter {
margin: -6px 0;
}
.simple-date-time-property-filter.ant-tree .ant-tree-treenode {
margin-bottom: 0;
height: 40px;
align-items: center;
}
.simple-date-time-property-filter.ant-tree .ant-tree-switcher {
align-self: center;
}
.simple-date-time-property-filter.ant-tree .ant-tree-switcher-leaf-line:after {
height: 0;
top: -5px;
}
.simple-date-time-property-filter.ant-tree .ant-tree-switcher-leaf-line:before {
top: -16px;
bottom: -24px;
}

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const Invoices = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Invoices')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Invoices')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const Invoices = () => {
<ExportListButton objectType='invoice' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const Invoices = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const Invoices = () => {
type='invoice'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -26,10 +26,7 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import {
getModelByName,
getModelProperty
} from '../../../../database/ObjectModels.js'
import { getModelProperty } from '../../../../database/ObjectModels.js'
import OrderItemIcon from '../../../Icons/OrderItemIcon.jsx'
import ShipmentIcon from '../../../Icons/ShipmentIcon.jsx'
@ -65,6 +62,7 @@ const InvoiceInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -87,11 +85,6 @@ const InvoiceInfo = () => {
},
}
const editDisabled =
getModelByName('invoice')
?.actions?.find((action) => action.name === 'edit')
?.disabled(objectFormState.objectData) ?? false
return (
<Flex
gap='large'
@ -156,7 +149,7 @@ const InvoiceInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const Payments = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Payments')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Payments')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const Payments = () => {
<ExportListButton objectType='payment' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const Payments = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const Payments = () => {
type='payment'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -24,7 +24,6 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import { getModelByName } from '../../../../database/ObjectModels.js'
const log = loglevel.getLogger('PaymentInfo')
log.setLevel(config.logLevel)
@ -55,6 +54,7 @@ const PaymentInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -77,11 +77,6 @@ const PaymentInfo = () => {
},
}
const editDisabled =
getModelByName('payment')
?.actions?.find((action) => action.name === 'edit')
?.disabled(objectFormState.objectData) ?? false
return (
<Flex
gap='large'
@ -143,7 +138,7 @@ const PaymentInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const TaxRecords = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('TaxRecords')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('TaxRecords')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const TaxRecords = () => {
<ExportListButton objectType='taxRecord' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const TaxRecords = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const TaxRecords = () => {
type='taxRecord'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -45,6 +45,7 @@ const TaxRecordInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -124,7 +125,9 @@ const TaxRecordInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -11,8 +11,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -29,6 +31,9 @@ const FilamentStocks = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('FilamentStocks')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('FilamentStocks')
const actionItems = {
items: [
{
@ -69,6 +74,10 @@ const FilamentStocks = () => {
<ExportListButton objectType='filamentStock' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +85,7 @@ const FilamentStocks = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -86,6 +96,7 @@ const FilamentStocks = () => {
type='filamentStock'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -47,6 +47,7 @@ const FilamentStockInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -123,7 +124,11 @@ const FilamentStockInfo = () => {
}}
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={true}
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>
<ObjectTableNavigationButtons

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const OrderItems = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('OrderItems')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('OrderItems')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const OrderItems = () => {
<ExportListButton objectType='orderItem' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const OrderItems = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const OrderItems = () => {
type='orderItem'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -46,6 +46,7 @@ const OrderItemInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -123,7 +124,9 @@ const OrderItemInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -11,8 +11,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -29,6 +31,9 @@ const PartStocks = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('PartStocks')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('PartStocks')
const actionItems = {
items: [
{
@ -69,6 +74,10 @@ const PartStocks = () => {
<ExportListButton objectType='partStock' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +85,7 @@ const PartStocks = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -86,6 +96,7 @@ const PartStocks = () => {
type='partStock'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -52,6 +52,7 @@ const PartStockInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -132,7 +133,9 @@ const PartStockInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -12,8 +12,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -30,6 +32,9 @@ const ProductStocks = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('ProductStocks')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('ProductStocks')
const actionItems = {
items: [
{
@ -70,6 +75,10 @@ const ProductStocks = () => {
<ExportListButton objectType='productStock' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -77,6 +86,7 @@ const ProductStocks = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -87,6 +97,7 @@ const ProductStocks = () => {
type='productStock'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -10,10 +10,7 @@ import InfoCollapse from '../../common/InfoCollapse.jsx'
import ObjectInfo from '../../common/ObjectInfo.jsx'
import ObjectProperty from '../../common/ObjectProperty.jsx'
import ViewButton from '../../common/ViewButton.jsx'
import {
getModelProperty,
getModelByName
} from '../../../../database/ObjectModels.js'
import { getModelProperty } from '../../../../database/ObjectModels.js'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
@ -71,6 +68,7 @@ const ProductStockInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -93,11 +91,6 @@ const ProductStockInfo = () => {
},
}
const editDisabled =
getModelByName('productStock')
?.actions?.find((action) => action.name === 'edit')
?.disabled(objectFormState.objectData) ?? false
return (
<Flex
gap='large'
@ -162,7 +155,7 @@ const ProductStockInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const PurchaseOrders = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('PurchaseOrders')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('PurchaseOrders')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const PurchaseOrders = () => {
<ExportListButton objectType='purchaseOrder' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const PurchaseOrders = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const PurchaseOrders = () => {
type='purchaseOrder'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -28,7 +28,6 @@ import OrderItemsIcon from '../../../Icons/OrderItemIcon.jsx'
import ShipmentIcon from '../../../Icons/ShipmentIcon.jsx'
import InvoiceIcon from '../../../Icons/InvoiceIcon.jsx'
import StockEventIcon from '../../../Icons/StockEventIcon.jsx'
import { getModelByName } from '../../../../database/ObjectModels.js'
const log = loglevel.getLogger('PurchaseOrderInfo')
log.setLevel(config.logLevel)
@ -70,6 +69,7 @@ const PurchaseOrderInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -95,10 +95,6 @@ const PurchaseOrderInfo = () => {
},
}
const editDisabled = getModelByName('purchaseOrder')
.actions.find((action) => action.name === 'edit')
.disabled(objectFormState.objectData)
return (
<Flex
gap='large'
@ -164,7 +160,7 @@ const PurchaseOrderInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const Shipments = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Shipments')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Shipments')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const Shipments = () => {
<ExportListButton objectType='shipment' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const Shipments = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const Shipments = () => {
type='shipment'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -61,6 +61,7 @@ const PurchaseOrderInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -159,7 +160,9 @@ const PurchaseOrderInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -58,6 +58,7 @@ const ShipmentInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
const actions = {
@ -138,7 +139,9 @@ const ShipmentInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -11,8 +11,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -29,6 +31,9 @@ const StockAudits = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('StockAudits')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('StockAudits')
const actionItems = {
items: [
{
@ -69,6 +74,10 @@ const StockAudits = () => {
<ExportListButton objectType='stockAudit' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +85,7 @@ const StockAudits = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -86,6 +96,7 @@ const StockAudits = () => {
type='stockAudit'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -48,6 +48,7 @@ const StockAuditInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -126,7 +127,9 @@ const StockAuditInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -4,8 +4,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
import ReloadIcon from '../../Icons/ReloadIcon'
@ -20,6 +22,9 @@ const StockEvents = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('StockEvents')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('StockEvents')
const actionItems = {
items: [
{
@ -52,6 +57,10 @@ const StockEvents = () => {
<ExportListButton objectType='stockEvent' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -59,6 +68,7 @@ const StockEvents = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -69,6 +79,7 @@ const StockEvents = () => {
type='stockEvent'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -9,8 +9,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -27,6 +29,9 @@ const StockLocations = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('StockLocations')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('StockLocations')
const actionItems = {
items: [
{
@ -67,6 +72,10 @@ const StockLocations = () => {
<ExportListButton objectType='stockLocation' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -74,6 +83,7 @@ const StockLocations = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -84,6 +94,7 @@ const StockLocations = () => {
type='stockLocation'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -49,6 +49,7 @@ const StockLocationInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -127,7 +128,9 @@ const StockLocationInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -9,8 +9,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -27,6 +29,9 @@ const StockTransfers = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('StockTransfers')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('StockTransfers')
const actionItems = {
items: [
{
@ -67,6 +72,10 @@ const StockTransfers = () => {
<ExportListButton objectType='stockTransfer' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -74,6 +83,7 @@ const StockTransfers = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -84,6 +94,7 @@ const StockTransfers = () => {
type='stockTransfer'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -8,10 +8,7 @@ import InfoCollapse from '../../common/InfoCollapse.jsx'
import ObjectInfo from '../../common/ObjectInfo.jsx'
import ObjectProperty from '../../common/ObjectProperty.jsx'
import ViewButton from '../../common/ViewButton.jsx'
import {
getModelProperty,
getModelByName
} from '../../../../database/ObjectModels.js'
import { getModelProperty } from '../../../../database/ObjectModels.js'
import InfoCircleIcon from '../../../Icons/InfoCircleIcon.jsx'
import NoteIcon from '../../../Icons/NoteIcon.jsx'
import AuditLogIcon from '../../../Icons/AuditLogIcon.jsx'
@ -61,6 +58,7 @@ const StockTransferInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -83,11 +81,6 @@ const StockTransferInfo = () => {
},
}
const editDisabled =
getModelByName('stockTransfer')
?.actions?.find((action) => action.name === 'edit')
?.disabled(objectFormState.objectData) ?? false
return (
<Flex
gap='large'
@ -150,7 +143,7 @@ const StockTransferInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -8,8 +8,10 @@ import PlusIcon from '../../Icons/PlusIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
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'
const AppPasswords = () => {
@ -23,6 +25,9 @@ const AppPasswords = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('AppPasswords')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('AppPasswords')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const AppPasswords = () => {
<ExportListButton objectType='appPassword' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const AppPasswords = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const AppPasswords = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -1,4 +1,4 @@
import { useRef, useState, useEffect, useContext } from 'react'
import { useRef, useState, useEffect } from 'react'
import { useLocation } from 'react-router-dom'
import { Flex, Space } from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
@ -20,8 +20,6 @@ import InfoCollapsePlaceholder from '../../common/InfoCollapsePlaceholder.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import { getModelByName } from '../../../../database/ObjectModels.js'
import { AuthContext } from '../../context/AuthContext.jsx'
const AppPasswordInfo = () => {
const location = useLocation()
@ -36,7 +34,6 @@ const AppPasswordInfo = () => {
})
return () => setOnModalOk(null)
}, [setOnModalOk])
const { userProfile } = useContext(AuthContext)
const appPasswordId = new URLSearchParams(location.search).get(
'appPasswordId'
)
@ -53,6 +50,7 @@ const AppPasswordInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -71,10 +69,6 @@ const AppPasswordInfo = () => {
}
}
const editDisabled = getModelByName('appPassword')
.actions.find((action) => action.name === 'edit')
.disabled({ ...objectFormState.objectData, _user: userProfile })
return (
<Flex
gap='large'
@ -132,7 +126,7 @@ const AppPasswordInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -4,8 +4,10 @@ import { Button, Flex, Space, Dropdown } from 'antd'
import ReloadIcon from '../../Icons/ReloadIcon'
import useColumnVisibility from '../hooks/useColumnVisibility'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ObjectTable from '../common/ObjectTable'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton'
@ -18,6 +20,9 @@ const AuditLogs = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('AuditLogs')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('AuditLogs')
const actionItems = {
items: [
{
@ -50,6 +55,10 @@ const AuditLogs = () => {
<ExportListButton objectType='auditLog' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -62,6 +71,7 @@ const AuditLogs = () => {
visibleColumns={columnVisibility}
type='auditLog'
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const CourierServices = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('CourierServices')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('CourierServices')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const CourierServices = () => {
<ExportListButton objectType='courierService' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const CourierServices = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const CourierServices = () => {
type='courierService'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -47,6 +47,7 @@ const CourierServiceInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -126,7 +127,9 @@ const CourierServiceInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -23,6 +25,9 @@ const Couriers = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Couriers')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Couriers')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const Couriers = () => {
<ExportListButton objectType='courier' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const Couriers = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -79,6 +89,7 @@ const Couriers = () => {
type='courier'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -43,6 +43,7 @@ const CourierInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -122,7 +123,9 @@ const CourierInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const DocumentJobs = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('DocumentJobs')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('DocumentJobs')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const DocumentJobs = () => {
<ExportListButton objectType='documentJob' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const DocumentJobs = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const DocumentJobs = () => {
type='documentJob'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -48,6 +48,7 @@ const DocumentJobInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -123,7 +124,9 @@ const DocumentJobInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -6,8 +6,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
import NewDocumentPrinter from './DocumentPrinters/NewDocumentPrinter'
@ -23,6 +25,9 @@ const DocumentPrinters = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('DocumentPrinters')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('DocumentPrinters')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const DocumentPrinters = () => {
<ExportListButton objectType='documentPrinter' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const DocumentPrinters = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -79,6 +89,7 @@ const DocumentPrinters = () => {
type='documentPrinter'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -50,6 +50,7 @@ const DocumentPrinterInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -131,7 +132,9 @@ const DocumentPrinterInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -22,6 +24,9 @@ const DocumentSizes = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('DocumentSizes')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('DocumentSizes')
const actionItems = {
items: [
{
@ -62,6 +67,10 @@ const DocumentSizes = () => {
<ExportListButton objectType='documentSize' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -69,6 +78,7 @@ const DocumentSizes = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -78,6 +88,7 @@ const DocumentSizes = () => {
type='documentSize'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -48,6 +48,7 @@ const DocumentSizeInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -123,7 +124,9 @@ const DocumentSizeInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const DocumentTemplates = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('DocumentTemplates')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('DocumentTemplates')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const DocumentTemplates = () => {
<ExportListButton objectType='documentTemplate' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const DocumentTemplates = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const DocumentTemplates = () => {
type='documentTemplate'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -50,6 +50,7 @@ const DocumentTemplateInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -128,7 +129,9 @@ const DocumentTemplateInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -9,8 +9,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -27,6 +29,9 @@ const FilamentSkus = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('FilamentSkus')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('FilamentSkus')
const actionItems = {
items: [
{
@ -67,6 +72,10 @@ const FilamentSkus = () => {
<ExportListButton objectType='filamentSku' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -74,6 +83,7 @@ const FilamentSkus = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -84,6 +94,7 @@ const FilamentSkus = () => {
type='filamentSku'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -42,6 +42,7 @@ const FilamentSkuInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -121,7 +122,9 @@ const FilamentSkuInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -13,8 +13,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
import useViewMode from '../hooks/useViewMode'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ExportListButton from '../common/ExportListButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
const Filaments = () => {
const [newFilamentOpen, setNewFilamentOpen] = useState(false)
@ -29,6 +31,9 @@ const Filaments = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Filaments')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Filaments')
const actionItems = {
items: [
{
@ -69,6 +74,10 @@ const Filaments = () => {
<ExportListButton objectType='filament' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +85,7 @@ const Filaments = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -86,6 +96,7 @@ const Filaments = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -61,6 +61,7 @@ const FilamentInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -144,7 +145,9 @@ const FilamentInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -5,8 +5,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -20,6 +22,9 @@ const Files = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Files')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Files')
const actionItems = {
items: [
{
@ -52,6 +57,10 @@ const Files = () => {
<ExportListButton objectType='file' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -59,6 +68,7 @@ const Files = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -68,6 +78,7 @@ const Files = () => {
type='file'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -49,6 +49,7 @@ const FileInfo = () => {
formValid: false,
lock: null,
loading: true,
editDisabled: false,
objectData: {
_id: fileId
}
@ -137,7 +138,9 @@ const FileInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -14,7 +14,9 @@ import ReloadIcon from '../../Icons/ReloadIcon'
import useViewMode from '../hooks/useViewMode'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
const Hosts = () => {
const [newHostOpen, setNewHostOpen] = useState(false)
@ -28,6 +30,9 @@ const Hosts = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Hosts')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Hosts')
const actionItems = {
items: [
{
@ -68,6 +73,10 @@ const Hosts = () => {
<ExportListButton objectType='host' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -75,6 +84,7 @@ const Hosts = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -85,6 +95,7 @@ const Hosts = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -57,6 +57,7 @@ const HostInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -140,7 +141,9 @@ const HostInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -10,8 +10,10 @@ import PlusIcon from '../../Icons/PlusIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
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'
const Materials = () => {
@ -26,6 +28,9 @@ const Materials = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Materials')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Materials')
const actionItems = {
items: [
{
@ -66,6 +71,10 @@ const Materials = () => {
<ExportListButton objectType='material' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -73,6 +82,7 @@ const Materials = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -83,6 +93,7 @@ const Materials = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -45,6 +45,7 @@ const MaterialInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -124,7 +125,9 @@ const MaterialInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const NoteTypes = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('NoteTypes')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('NoteTypes')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const NoteTypes = () => {
<ExportListButton objectType='noteType' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const NoteTypes = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const NoteTypes = () => {
type='noteType'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -38,6 +38,7 @@ const NoteTypeInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -112,7 +113,9 @@ const NoteTypeInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -47,6 +47,7 @@ const NoteInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -127,7 +128,9 @@ const NoteInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -9,8 +9,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -26,6 +28,9 @@ const PartSkus = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('PartSkus')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('PartSkus')
const actionItems = {
items: [
{
@ -66,6 +71,10 @@ const PartSkus = () => {
<ExportListButton objectType='partSku' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -73,6 +82,7 @@ const PartSkus = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -83,6 +93,7 @@ const PartSkus = () => {
type='partSku'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -37,6 +37,7 @@ const PartSkuInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -116,7 +117,9 @@ const PartSkuInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -14,7 +14,9 @@ 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'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton'
@ -28,6 +30,9 @@ const Parts = (filter) => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Parts')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Parts')
const actionItems = {
items: [
{
@ -68,6 +73,10 @@ const Parts = (filter) => {
<ExportListButton objectType='part' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -75,6 +84,7 @@ const Parts = (filter) => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -85,6 +95,7 @@ const Parts = (filter) => {
cards={viewMode === 'cards'}
filter={filter}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -50,6 +50,7 @@ const PartInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -125,7 +126,9 @@ const PartInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -10,8 +10,10 @@ import PlusIcon from '../../Icons/PlusIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
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'
const ProductCategories = () => {
@ -26,6 +28,9 @@ const ProductCategories = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('ProductCategories')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('ProductCategories')
const actionItems = {
items: [
{
@ -66,6 +71,10 @@ const ProductCategories = () => {
<ExportListButton objectType='productCategory' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -73,6 +82,7 @@ const ProductCategories = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -83,6 +93,7 @@ const ProductCategories = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -42,6 +42,7 @@ const ProductCategoryInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -121,7 +122,9 @@ const ProductCategoryInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -9,8 +9,10 @@ import useColumnVisibility from '../hooks/useColumnVisibility'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -27,6 +29,9 @@ const ProductSkus = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('ProductSkus')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('ProductSkus')
const actionItems = {
items: [
{
@ -67,6 +72,10 @@ const ProductSkus = () => {
<ExportListButton objectType='productSku' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -74,6 +83,7 @@ const ProductSkus = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -84,6 +94,7 @@ const ProductSkus = () => {
type='productSku'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -44,6 +44,7 @@ const ProductSkuInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -124,7 +125,9 @@ const ProductSkuInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -27,8 +27,10 @@ import CheckIcon from '../../Icons/CheckIcon'
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'
const Products = () => {
@ -239,6 +241,9 @@ const Products = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Products')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Products')
const actionItems = {
items: [
{
@ -340,6 +345,10 @@ const Products = () => {
</Popover>
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -347,6 +356,7 @@ const Products = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -355,6 +365,7 @@ const Products = () => {
type={'product'}
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -50,6 +50,7 @@ const ProductInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -125,7 +126,9 @@ const ProductInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -23,6 +25,9 @@ const TaxRates = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('TaxRates')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('TaxRates')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const TaxRates = () => {
<ExportListButton objectType='taxRate' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const TaxRates = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -79,6 +89,7 @@ const TaxRates = () => {
type='taxRate'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -42,6 +42,7 @@ const TaxRateInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -121,7 +122,9 @@ const TaxRateInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -5,8 +5,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -20,6 +22,9 @@ const Users = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Users')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Users')
const actionItems = {
items: [
{
@ -51,6 +56,10 @@ const Users = () => {
<ExportListButton objectType='user' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -67,6 +76,7 @@ const Users = () => {
visibleColumns={columnVisibility}
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -44,6 +44,7 @@ const UserInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
const isMobile = useMediaQuery({ maxWidth: 768 })
@ -120,7 +121,9 @@ const UserInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -23,6 +25,9 @@ const Vendors = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Vendors')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Vendors')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const Vendors = () => {
<ExportListButton objectType='vendor' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const Vendors = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -79,6 +89,7 @@ const Vendors = () => {
type='vendor'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -42,6 +42,7 @@ const VendorInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -121,7 +122,9 @@ const VendorInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -4,12 +4,14 @@ import NewFilamentProfile from './FilamentProfiles/NewFilamentProfile'
import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ObjectTable from '../common/ObjectTable'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import PlusIcon from '../../Icons/PlusIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
import useColumnVisibility from '../hooks/useColumnVisibility'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import useViewMode from '../hooks/useViewMode'
const FilamentProfiles = () => {
@ -21,6 +23,9 @@ const FilamentProfiles = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('FilamentProfiles')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('FilamentProfiles')
const actionItems = {
items: [
{
@ -60,6 +65,10 @@ const FilamentProfiles = () => {
<ExportListButton objectType='filamentProfile' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -67,6 +76,7 @@ const FilamentProfiles = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -77,6 +87,7 @@ const FilamentProfiles = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -80,6 +80,7 @@ const FilamentProfileInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -166,7 +167,11 @@ const FilamentProfileInfo = () => {
startEditing={() => actionHandlerRef.current.callAction('edit')}
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={objectFormState.beingEditedByOther || objectFormState.loading}
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>
<ObjectTableNavigationButtons

View File

@ -9,8 +9,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
import ObjectTable from '../common/ObjectTable'
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'
import ExportListButton from '../common/ExportListButton'
@ -26,6 +28,9 @@ const GCodeFiles = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('GCodeFiles')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('GCodeFiles')
const actionItems = {
items: [
{
@ -66,6 +71,10 @@ const GCodeFiles = () => {
<ExportListButton objectType='gcodeFile' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -73,6 +82,7 @@ const GCodeFiles = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -82,6 +92,7 @@ const GCodeFiles = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -51,6 +51,7 @@ const GCodeFileInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -130,7 +131,9 @@ const GCodeFileInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -10,8 +10,10 @@ import ObjectTable from '../common/ObjectTable.jsx'
import useViewMode from '../hooks/useViewMode.jsx'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ColumnViewButton from '../common/ColumnViewButton.jsx'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton.jsx'
const Jobs = () => {
@ -24,6 +26,8 @@ const Jobs = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Jobs')
const [showSortSidebar, setShowSortSidebar] = useSortSidebarVisibility('Jobs')
const actionItems = {
items: [
{
@ -69,6 +73,10 @@ const Jobs = () => {
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +84,7 @@ const Jobs = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -86,6 +95,7 @@ const Jobs = () => {
visibleColumns={columnVisibility}
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -25,7 +25,6 @@ import JobIcon from '../../../Icons/JobIcon.jsx'
import DocumentPrintButton from '../../common/DocumentPrintButton.jsx'
import UserNotifierToggle from '../../common/UserNotifierToggle.jsx'
import ScrollBox from '../../common/ScrollBox.jsx'
import { getModelByName } from '../../../../database/ObjectModels.js'
const log = loglevel.getLogger('JobInfo')
log.setLevel(config.logLevel)
@ -57,16 +56,12 @@ const JobInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {
_id: jobId
}
})
const editDisabled =
getModelByName('job')
?.actions?.find((action) => action.name === 'edit')
?.disabled(objectFormState.objectData) ?? false
const actions = {
edit: () => {
objectFormRef?.current.startEditing()
@ -144,7 +139,7 @@ const JobInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -4,12 +4,14 @@ import NewPrinterProfile from './PrinterProfiles/NewPrinterProfile'
import ColumnViewButton from '../common/ColumnViewButton'
import ExportListButton from '../common/ExportListButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ObjectTable from '../common/ObjectTable'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import PlusIcon from '../../Icons/PlusIcon'
import ReloadIcon from '../../Icons/ReloadIcon'
import useColumnVisibility from '../hooks/useColumnVisibility'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import useViewMode from '../hooks/useViewMode'
const PrinterProfiles = () => {
const [newProfileOpen, setNewProfileOpen] = useState(false)
@ -20,6 +22,9 @@ const PrinterProfiles = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('PrinterProfiles')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('PrinterProfiles')
const actionItems = {
items: [
{
@ -59,6 +64,10 @@ const PrinterProfiles = () => {
<ExportListButton objectType='printerProfile' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -66,6 +75,7 @@ const PrinterProfiles = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -76,6 +86,7 @@ const PrinterProfiles = () => {
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -59,6 +59,7 @@ const PrinterProfileInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -139,7 +140,11 @@ const PrinterProfileInfo = () => {
startEditing={() => actionHandlerRef.current.callAction('edit')}
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={objectFormState.beingEditedByOther || objectFormState.loading}
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>
<ObjectTableNavigationButtons

View File

@ -11,9 +11,11 @@ import ExportListButton from '../common/ExportListButton'
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'
const Printers = () => {
const [newPrinterOpen, setNewPrinterOpen] = useState(false)
@ -29,6 +31,9 @@ const Printers = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Printers')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Printers')
const actionItems = {
items: [
{
@ -69,6 +74,10 @@ const Printers = () => {
<ExportListButton objectType='printer' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -76,6 +85,7 @@ const Printers = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -84,6 +94,7 @@ const Printers = () => {
ref={tableRef}
type='printer'
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
cards={viewMode === 'cards'}
visibleColumns={columnVisibility}
expandHeight={true}

View File

@ -51,6 +51,7 @@ const PrinterInfo = () => {
formValid: false,
activities: [],
loading: false,
editDisabled: false,
objectData: {}
})
@ -137,7 +138,9 @@ const PrinterInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -8,8 +8,10 @@ import ObjectTable from '../common/ObjectTable.jsx'
import useViewMode from '../hooks/useViewMode.jsx'
import ObjectTableViewButton from '../common/ObjectTableViewButton'
import FilterSidebarButton from '../common/FilterSidebarButton'
import SortSidebarButton from '../common/SortSidebarButton'
import ColumnViewButton from '../common/ColumnViewButton.jsx'
import useFilterSidebarVisibility from '../hooks/useFilterSidebarVisibility.jsx'
import useSortSidebarVisibility from '../hooks/useSortSidebarVisibility'
import ExportListButton from '../common/ExportListButton.jsx'
const SubJobs = () => {
@ -21,6 +23,9 @@ const SubJobs = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('SubJobs')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('SubJobs')
const actionItems = {
items: [
{
@ -54,6 +59,10 @@ const SubJobs = () => {
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -61,6 +70,7 @@ const SubJobs = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -71,6 +81,7 @@ const SubJobs = () => {
visibleColumns={columnVisibility}
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -23,6 +25,9 @@ const Clients = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Clients')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Clients')
const actionItems = {
items: [
{
@ -63,6 +68,10 @@ const Clients = () => {
<ExportListButton objectType='client' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -70,6 +79,7 @@ const Clients = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -79,6 +89,7 @@ const Clients = () => {
type='client'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -42,6 +42,7 @@ const ClientInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -121,7 +122,9 @@ const ClientInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -57,6 +57,7 @@ const ListingVarientInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -135,7 +136,9 @@ const ListingVarientInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const Listings = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Listings')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Listings')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const Listings = () => {
<ExportListButton objectType='listing' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const Listings = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const Listings = () => {
type='listing'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -55,6 +55,7 @@ const ListingInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -134,7 +135,9 @@ const ListingInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const Marketplaces = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('Marketplaces')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('Marketplaces')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const Marketplaces = () => {
<ExportListButton objectType='marketplace' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const Marketplaces = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const Marketplaces = () => {
type='marketplace'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -66,6 +66,7 @@ const MarketplaceInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -202,7 +203,9 @@ const MarketplaceInfo = () => {
editLoading={objectFormState.editLoading}
formValid={objectFormState.formValid}
disabled={
objectFormState.beingEditedByOther || objectFormState.loading
objectFormState.beingEditedByOther ||
objectFormState.loading ||
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -7,8 +7,10 @@ import ReloadIcon from '../../Icons/ReloadIcon'
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'
import ExportListButton from '../common/ExportListButton'
@ -24,6 +26,9 @@ const SalesOrders = () => {
const [showFilterSidebar, setShowFilterSidebar] =
useFilterSidebarVisibility('SalesOrders')
const [showSortSidebar, setShowSortSidebar] =
useSortSidebarVisibility('SalesOrders')
const actionItems = {
items: [
{
@ -64,6 +69,10 @@ const SalesOrders = () => {
<ExportListButton objectType='salesOrder' />
</Space>
<Space>
<SortSidebarButton
active={showSortSidebar}
onClick={() => setShowSortSidebar(!showSortSidebar)}
/>
<FilterSidebarButton
active={showFilterSidebar}
onClick={() => setShowFilterSidebar(!showFilterSidebar)}
@ -71,6 +80,7 @@ const SalesOrders = () => {
<ObjectTableViewButton
viewMode={viewMode}
setViewMode={setViewMode}
showEndingDivider={true}
/>
</Space>
</Flex>
@ -80,6 +90,7 @@ const SalesOrders = () => {
type='salesOrder'
cards={viewMode === 'cards'}
showFilterSidebar={showFilterSidebar}
showSortSidebar={showSortSidebar}
expandHeight={true}
saveFilterInSession={true}
saveFilterInUrl={true}

View File

@ -28,7 +28,6 @@ import OrderItemsIcon from '../../../Icons/OrderItemIcon.jsx'
import ShipmentIcon from '../../../Icons/ShipmentIcon.jsx'
import InvoiceIcon from '../../../Icons/InvoiceIcon.jsx'
import StockEventIcon from '../../../Icons/StockEventIcon.jsx'
import { getModelByName } from '../../../../database/ObjectModels.js'
const log = loglevel.getLogger('SalesOrderInfo')
log.setLevel(config.logLevel)
@ -68,6 +67,7 @@ const SalesOrderInfo = () => {
formValid: false,
lock: null,
loading: false,
editDisabled: false,
objectData: {}
})
@ -93,10 +93,6 @@ const SalesOrderInfo = () => {
},
}
const editDisabled = getModelByName('salesOrder')
.actions.find((action) => action.name === 'edit')
.disabled(objectFormState.objectData)
return (
<Flex
gap='large'
@ -162,7 +158,7 @@ const SalesOrderInfo = () => {
disabled={
objectFormState.beingEditedByOther ||
objectFormState.loading ||
editDisabled
objectFormState.editDisabled
}
loading={objectFormState.editLoading}
/>

View File

@ -136,7 +136,7 @@ const FilterSidebar = ({
}
return (
<Card style={{ flexShrink: 0, height: '100%' }}>
<Card style={{ flex: 1, minHeight: 0, width: '100%', height: '100%' }}>
<Flex vertical gap='middle'>
<Flex justify='space-between'>
<Dropdown menu={menuItems} trigger={['hover']} placement='bottomLeft'>

View File

@ -25,12 +25,14 @@ const { Text } = Typography
const NotesPanel = ({ _id, type }) => {
const [newNoteOpen, setNewNoteOpen] = useState(false)
const [loading, setLoading] = useState(true)
const [initialized, setInitialized] = useState(false)
const [error, setError] = useState(null)
const [notes, setNotes] = useState(null)
const [expandedNotes, setExpandedNotes] = useState({})
const subscribeToObjectTypeUpdatesRef = useRef(null)
const notesIdRef = useRef(null)
const notesTypeRef = useRef(null)
const { token } = useContext(AuthContext)
const { fetchNotes, connected, subscribeToObjectTypeUpdates } =
useContext(ApiServerContext)
@ -50,6 +52,7 @@ const NotesPanel = ({ _id, type }) => {
const generateNotes = useCallback(
async (id) => {
setLoading(true)
const notesData = await fetchData(id)
setLoading(false)
@ -108,11 +111,16 @@ const NotesPanel = ({ _id, type }) => {
}, [_id, subscribeToObjectTypeUpdates, connected, handleReloadData])
useEffect(() => {
if (connected == true && token != null && !initialized) {
if (
connected == true &&
token != null &&
(_id != notesIdRef.current || type != notesTypeRef.current)
) {
handleReloadData()
setInitialized(true)
notesIdRef.current = _id
notesTypeRef.current = type
}
}, [token, handleReloadData, initialized, connected])
}, [token, handleReloadData, connected, _id, type])
const actionItems = {
items: [

View File

@ -6,7 +6,10 @@ import { useNavigate, useLocation } from 'react-router-dom'
import { useActionsModal } from '../context/ActionsModalContext'
import KeyboardShortcut from './KeyboardShortcut'
import { AuthContext } from '../context/AuthContext'
import { buildActionUrl, stripPageActionParams } from '../../../utils/modelActions'
import {
buildActionUrl,
stripPageActionParams
} from '../../../utils/modelActions'
// Recursively filter actions based on visibleActions
function filterActionsByVisibility(actions, visibleActions) {
@ -74,12 +77,12 @@ function isSameActionUrl(action, actionUrl, currentUrl, pathname, search) {
if (action.type === 'modal') {
return actionUrl === currentUrl
}
return (
stripPageActionParams(
actionUrl.split('?')[0],
actionUrl.includes('?') ? actionUrl.split('?')[1] : ''
) === stripPageActionParams(pathname, search)
)
// Compare the action URL to the current location with its action param
// stripped. Default page actions (e.g. Info) match and stay hidden when
// already on that page. Actions that set their own action param (edit,
// cancelEdit, finishEdit, etc.) do not match and remain available
// visibility is controlled by action.visible (e.g. _isEditing).
return actionUrl === stripPageActionParams(pathname, search)
}
// Recursively map actions to AntD Dropdown items
@ -238,7 +241,7 @@ const ObjectActions = ({
<Dropdown menu={menu} {...dropdownProps}>
<Button
{...buttonProps}
disabled={disabled}
disabled={disabled || filteredActions.length === 0}
onClick={() => showActionsModal(id, type, objectData)}
>
Actions

View File

@ -76,6 +76,23 @@ const buildObjectFromEntries = (entries = []) => {
}, {})
}
const getEditDisabled = (model, objectData, userProfile) => {
if (model?.readOnly === true) {
return true
}
const editAction = model?.actions?.find((action) => action.name === 'edit')
if (!editAction?.disabled) {
return false
}
if (typeof editAction.disabled === 'function') {
return (
editAction.disabled({ ...objectData, _user: userProfile }) ?? false
)
}
return !!editAction.disabled
}
/**
* ObjectForm is a reusable form component for editing any object type.
* It handles fetching, updating, locking, unlocking, and validation logic.
@ -85,9 +102,10 @@ const buildObjectFromEntries = (entries = []) => {
* - type: string (required)
* - formItems: array (for ObjectInfo/ObjectProperty items)
* - children: function({
* loading, isEditing, startEditing, cancelEditing, handleUpdate, form, formValid, objectData, setIsEditing, setObjectData
* loading, isEditing, startEditing, cancelEditing, handleUpdate, form, formValid, objectData, setIsEditing, setObjectData, editDisabled
* }) => ReactNode
* - setCurrentObject: boolean (sync object data to ActionsContext)
* - onStateChange: receives form state including editDisabled (from model edit action)
*/
const ObjectForm = forwardRef(
(
@ -388,20 +406,22 @@ const ObjectForm = forwardRef(
setFormValid(true)
onStateChangeRef.current({
formValid: true,
objectData: mergedObjectData
objectData: mergedObjectData,
editDisabled: getEditDisabled(model, mergedObjectData, userProfile)
})
})
.catch(() => {
setFormValid(false)
onStateChangeRef.current({
formValid: false,
objectData: mergedObjectData
objectData: mergedObjectData,
editDisabled: getEditDisabled(model, mergedObjectData, userProfile)
})
})
}, 150)
return () => clearTimeout(timeoutId)
}, [form, formUpdateValues])
}, [form, formUpdateValues, model, userProfile])
// Cleanup on unmount
useEffect(() => {
@ -592,10 +612,13 @@ const ObjectForm = forwardRef(
// Debounce objectData updates sent to parent to limit re-renders
useEffect(() => {
const timeoutId = setTimeout(() => {
onStateChangeRef.current({ objectData })
onStateChangeRef.current({
objectData,
editDisabled: getEditDisabled(model, objectData, userProfile)
})
}, 150)
return () => clearTimeout(timeoutId)
}, [objectData])
}, [objectData, model, userProfile])
useEffect(() => {
if (!setCurrentObject) {
@ -651,13 +674,15 @@ const ObjectForm = forwardRef(
...computedValuesObject,
_isEditing: true
}))
onStateChangeRef.current({
isEditing: true,
objectData: {
const nextObjectData = {
...objectData,
...computedValuesObject,
_isEditing: true
}
onStateChangeRef.current({
isEditing: true,
objectData: nextObjectData,
editDisabled: getEditDisabled(model, nextObjectData, userProfile)
})
} catch (err) {
console.error(err)
@ -831,6 +856,7 @@ const ObjectForm = forwardRef(
setIsEditing,
setObjectData,
editLoading,
editDisabled: getEditDisabled(model, objectData, userProfile),
activities,
handleFetchObject,
handleDelete

View File

@ -9,6 +9,7 @@ import {
useMemo,
createElement
} from 'react'
import { flushSync } from 'react-dom'
import {
Table,
Skeleton,
@ -21,7 +22,8 @@ import {
Space,
Tooltip,
Form,
Splitter
Splitter,
Card
} from 'antd'
import { LoadingOutlined } from '@ant-design/icons'
import PropTypes from 'prop-types'
@ -37,6 +39,7 @@ import {
import ObjectProperty from './ObjectProperty'
import ObjectCard from './ObjectCard'
import FilterSidebar from './FilterSidebar'
import SortSidebar from './SortSidebar'
import XMarkIcon from '../../Icons/XMarkIcon'
import CheckIcon from '../../Icons/CheckIcon'
import { useLocation } from 'react-router-dom'
@ -47,6 +50,7 @@ import { useActions } from '../context/ActionsContext'
import ActionsIcon from '../../Icons/ActionsIcon'
import FilterIcon from '../../Icons/FilterIcon'
import ScrollBox from './ScrollBox'
import SimplePropertyFilter from './SimplePropertyFilter'
import {
getActiveFilterValues,
useTableStatePersistence
@ -66,6 +70,120 @@ const getCardColSpan = (containerWidth) => {
return 24
}
const toFilterExpression = (values) => {
if (!values?.length) return undefined
const parts = values.map((value) => {
if (value && typeof value === 'object') {
return String(value._id ?? value.type ?? JSON.stringify(value))
}
return String(value)
})
return parts.length === 1 ? parts[0] : parts.join('|')
}
const fromFilterExpression = (expr) => {
if (expr === undefined || expr === null || expr === '') return null
if (typeof expr === 'string' && expr.includes('|')) {
return expr.split('|').filter((part) => part !== '')
}
return [expr]
}
const ColumnFilterDropdown = ({
setSelectedKeys,
selectedKeys,
confirm,
clearFilters,
visible,
propertyName,
propertyLabel,
modelType
}) => {
const [expression, setExpression] = useState('')
const [draft, setDraft] = useState(selectedKeys || [])
const selectedKeysRef = useRef(selectedKeys)
selectedKeysRef.current = selectedKeys
// Re-sync from the applied sidebar/column filter each time the dropdown opens
useEffect(() => {
if (!visible) return
const keys = selectedKeysRef.current || []
setDraft(keys)
setExpression(toFilterExpression(keys) ?? '')
}, [visible])
const handleDraftChange = (next) => {
setDraft(next)
setExpression(toFilterExpression(next) ?? '')
}
const handleExpressionChange = (e) => {
const text = e.target.value
setExpression(text)
setDraft(fromFilterExpression(text) || [])
}
const applyFilter = () => {
const trimmed = expression.trim()
if (!trimmed) {
clearFilters()
} else if (draft?.length) {
setSelectedKeys(draft)
} else {
setSelectedKeys([trimmed])
}
confirm()
}
const resetFilter = () => {
setExpression('')
setDraft([])
clearFilters()
confirm()
}
return (
<div style={{ padding: 8 }}>
<Flex vertical gap='small'>
<Space.Compact>
<Input
placeholder={'Filter ' + propertyLabel}
value={expression}
onChange={handleExpressionChange}
onPressEnter={applyFilter}
style={{ width: 200, display: 'block' }}
/>
<Button onClick={resetFilter} icon={<XMarkIcon />} />
<Button type='primary' onClick={applyFilter} icon={<CheckIcon />} />
</Space.Compact>
<Card size='small' styles={{ body: { padding: 0, height: 200 } }}>
<ScrollBox inner={true} smallPadding={true}>
<div style={{ padding: '18px 20px', minWidth: 0 }}>
<SimplePropertyFilter
modelType={modelType}
propertyName={propertyName}
value={draft}
onChange={handleDraftChange}
/>
</div>
</ScrollBox>
</Card>
</Flex>
</div>
)
}
ColumnFilterDropdown.propTypes = {
setSelectedKeys: PropTypes.func,
selectedKeys: PropTypes.array,
confirm: PropTypes.func,
clearFilters: PropTypes.func,
visible: PropTypes.bool,
propertyName: PropTypes.string,
propertyLabel: PropTypes.string,
modelType: PropTypes.string
}
const RowForm = ({ record, isEditing, onRegister, children }) => {
const [form] = Form.useForm()
useEffect(() => {
@ -120,6 +238,7 @@ const ObjectTable = forwardRef(
size = 'middle',
onStateChange,
showFilterSidebar = false,
showSortSidebar = false,
expandHeight = false,
showActions = true,
saveFilterInSession = false,
@ -156,6 +275,7 @@ const ObjectTable = forwardRef(
getPersistedFilter,
getPersistedSorter,
persistFilter,
persistSort,
persistTableState,
registerPageFilter
} = useTableStatePersistence({
@ -197,10 +317,20 @@ const ObjectTable = forwardRef(
// Table state
const [pages, setPages] = useState([])
const pagesRef = useRef(pages)
const tableData = useMemo(
() => pages.flatMap((page) => page.items),
[pages]
)
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)) {
logger.warn('Duplicate table row omitted:', id)
return false
}
seen.add(id)
return true
})
}, [pages])
const [loading, setLoading] = useState(true)
const [lazyLoading, setLazyLoading] = useState(false)
@ -258,6 +388,46 @@ const ObjectTable = forwardRef(
const loadingPagesRef = useRef(new Set())
const pendingScrollAnchorRef = useRef(null)
const dataLoadGenerationRef = useRef(0)
const [tableListKey, setTableListKey] = useState(0)
const isInternalSortUpdateRef = useRef(false)
const beginDataReload = useCallback(() => {
dataLoadGenerationRef.current += 1
loadingPagesRef.current.clear()
pendingScrollAnchorRef.current = null
pagesRef.current = []
setTableListKey((key) => key + 1)
return dataLoadGenerationRef.current
}, [])
const isStaleDataLoad = useCallback((generation) => {
return generation !== dataLoadGenerationRef.current
}, [])
const clearTablePages = useCallback(() => {
pagesRef.current = []
flushSync(() => {
setPages([])
})
}, [])
const setTablePages = useCallback((nextPages) => {
pagesRef.current = nextPages
setPages(nextPages)
}, [])
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 renderActions = (objectData) => {
return (
@ -355,7 +525,11 @@ const ObjectTable = forwardRef(
const createPageWindow = useCallback(
(loadedPages, direction) => {
const sortedPages = [...loadedPages].sort(
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 =
@ -381,8 +555,10 @@ const ObjectTable = forwardRef(
const fetchData = useCallback(
async (pageNum = 1, filter = null, sorter = null) => {
const generation = dataLoadGenerationRef.current
try {
const result = await fetchPage(pageNum, filter, sorter)
if (isStaleDataLoad(generation)) return []
const loadedPage = {
pageNum,
items: result.data || [],
@ -394,11 +570,13 @@ const ObjectTable = forwardRef(
setLoading(false)
return result.data || []
} catch (error) {
if (!isStaleDataLoad(generation)) {
setLoading(false)
}
throw error
}
},
[fetchPage]
[fetchPage, isStaleDataLoad]
)
const findRenderedRow = useCallback((scrollTarget, id) => {
@ -493,12 +671,14 @@ const ObjectTable = forwardRef(
currentPages
)
const generation = dataLoadGenerationRef.current
loadingPagesRef.current.add(pageNum)
setLazyLoading(true)
logger.debug(`Loading ${direction} page...`)
try {
const result = await fetchPage(pageNum)
if (isStaleDataLoad(generation)) return
const loadedPage = {
pageNum,
items: result.data || [],
@ -519,21 +699,28 @@ const ObjectTable = forwardRef(
return prev
}
const loadedPages = prev
.filter((page) => !page.isSkeletonPage)
.concat(loadedPage)
const loadedPages = mergeLoadedPage(prev, loadedPage)
return createPageWindow(loadedPages, direction)
})
} catch (error) {
logger.error(`Error loading page ${pageNum}:`, error)
} finally {
loadingPagesRef.current.delete(pageNum)
if (loadingPagesRef.current.size === 0) {
if (
!isStaleDataLoad(generation) &&
loadingPagesRef.current.size === 0
) {
setLazyLoading(false)
}
}
},
[captureScrollAnchor, createPageWindow, fetchPage]
[
captureScrollAnchor,
createPageWindow,
fetchPage,
isStaleDataLoad,
mergeLoadedPage
]
)
const loadNextPage = useCallback(
@ -780,11 +967,20 @@ const ObjectTable = forwardRef(
const loadPage = useCallback(
async (pageNum, filter = null, sorter = null) => {
setPages([createSkeletonPage(pageNum)])
const generation = beginDataReload()
clearTablePages()
if (isStaleDataLoad(generation)) return
const skeletonPage = createSkeletonPage(pageNum)
flushSync(() => {
setTablePages([skeletonPage])
setLoading(true)
})
if (isStaleDataLoad(generation)) return
try {
const firstResult = await fetchPage(pageNum, filter, sorter)
if (isStaleDataLoad(generation)) return
const loadedPages = [
{
pageNum,
@ -793,25 +989,29 @@ const ObjectTable = forwardRef(
}
]
if (firstResult.hasMore) {
setPages([...loadedPages, createSkeletonPage(pageNum + 1)])
const secondResult = await fetchPage(pageNum + 1)
loadedPages.push({
pageNum: pageNum + 1,
items: secondResult.data || [],
hasMore: secondResult.hasMore
})
if (!isStaleDataLoad(generation)) {
setTablePages(createPageWindow(loadedPages, 'next'))
}
setPages(createPageWindow(loadedPages, 'next'))
} catch (error) {
if (!isStaleDataLoad(generation)) {
logger.error(`Error loading page ${pageNum}:`, error)
setPages([])
setTablePages([])
}
} finally {
if (!isStaleDataLoad(generation)) {
setLoading(false)
}
}
},
[createPageWindow, createSkeletonPage, fetchPage]
[
beginDataReload,
clearTablePages,
createPageWindow,
createSkeletonPage,
fetchPage,
isStaleDataLoad,
setTablePages
]
)
const loadInitialPage = useCallback(async () => {
@ -865,6 +1065,8 @@ const ObjectTable = forwardRef(
JSON.stringify(prevValues.masterFilter) !== JSON.stringify(masterFilter)
if (hasChanged) {
beginDataReload()
pagesRef.current = []
setPages([])
activeFilterRef.current = {}
tableSorterRef.current = {}
@ -875,7 +1077,7 @@ const ObjectTable = forwardRef(
setLazyLoading(false)
prevValuesRef.current = { type, masterFilter }
}
}, [type, masterFilter])
}, [type, masterFilter, beginDataReload])
useEffect(() => {
registerPageFilter(sidebarFilter)
@ -887,43 +1089,31 @@ const ObjectTable = forwardRef(
selectedKeys,
confirm,
clearFilters,
propertyName
}) => {
return (
<div style={{ padding: 8 }}>
<Space.Compact>
<Input
placeholder={'Search ' + propertyName}
value={selectedKeys[0]}
onChange={(e) =>
setSelectedKeys(e.target.value ? [e.target.value] : [])
}
onPressEnter={() => confirm()}
style={{ width: 200, display: 'block' }}
visible,
propertyName,
propertyLabel
}) => (
<ColumnFilterDropdown
setSelectedKeys={setSelectedKeys}
selectedKeys={selectedKeys}
confirm={confirm}
clearFilters={clearFilters}
visible={visible}
propertyName={propertyName}
propertyLabel={propertyLabel}
modelType={type}
/>
<Button
onClick={() => {
clearFilters()
confirm()
}}
icon={<XMarkIcon />}
/>
<Button
type='primary'
onClick={() => confirm()}
icon={<CheckIcon />}
/>
</Space.Compact>
</div>
)
}
const handleTableChange = (pagination, filters, sorter) => {
if (isInternalSortUpdateRef.current) return
const next = { ...sidebarFilter }
Object.entries(filters).forEach(([key, value]) => {
if (value && value.length > 0) {
next[key] = value[0]
const expression = toFilterExpression(value)
if (expression !== undefined) {
next[key] = expression
} else {
delete next[key]
}
@ -937,8 +1127,6 @@ const ObjectTable = forwardRef(
setSidebarFilter(next)
setTableSorter(nextSorter)
persistTableState(next, nextSorter)
setPages([])
setLoading(true)
loadPage(initialPage, getActiveFilterValues(next), nextSorter)
}
@ -946,11 +1134,34 @@ const ObjectTable = forwardRef(
(newSidebarFilter) => {
setSidebarFilter(newSidebarFilter)
persistFilter(newSidebarFilter)
setPages([])
setLoading(true)
loadPage(initialPage, getActiveFilterValues(newSidebarFilter))
loadPage(
initialPage,
getActiveFilterValues(newSidebarFilter),
tableSorter.field ? tableSorter : null
)
},
[initialPage, loadPage, persistFilter]
[initialPage, loadPage, persistFilter, tableSorter]
)
const handleSidebarSortChange = useCallback(
(newSorter) => {
const nextSorter = newSorter?.field
? { field: newSorter.field, order: newSorter.order }
: {}
isInternalSortUpdateRef.current = true
setTableSorter(nextSorter)
tableSorterRef.current = nextSorter
persistSort(nextSorter)
loadPage(
initialPage,
getActiveFilterValues(sidebarFilter),
nextSorter.field ? nextSorter : null
)
requestAnimationFrame(() => {
isInternalSortUpdateRef.current = false
})
},
[initialPage, loadPage, persistSort, sidebarFilter]
)
const modelProperties = getModelProperties(type)
@ -1073,18 +1284,21 @@ const ObjectTable = forwardRef(
setSelectedKeys,
selectedKeys,
confirm,
clearFilters
clearFilters,
visible
}) =>
getFilterDropdown({
setSelectedKeys,
selectedKeys,
confirm,
clearFilters,
propertyName: prop.label
visible,
propertyName: prop.name,
propertyLabel: prop.label
})
const sidebarVal = sidebarFilter[prop.name]
columnConfig.filteredValue =
sidebarVal !== undefined && sidebarVal !== '' ? [sidebarVal] : null
columnConfig.filteredValue = fromFilterExpression(
sidebarFilter[prop.name]
)
}
columnsWithSkeleton.push(columnConfig)
@ -1161,7 +1375,7 @@ const ObjectTable = forwardRef(
useLayoutEffect(() => {
if (!cards) return
measureCardColSpan()
}, [cards, showFilterSidebar, measureCardColSpan])
}, [cards, showFilterSidebar, showSortSidebar, measureCardColSpan])
useEffect(() => {
return () => cardsResizeObserverRef.current?.disconnect()
@ -1209,7 +1423,7 @@ const ObjectTable = forwardRef(
}}
>
<div className='objectTableCards'>
<Row gutter={[16, 16]} key={cardColSpan}>
<Row gutter={[16, 16]} key={`${cardColSpan}-${tableListKey}`}>
{tableData.map((record) => {
if (record?._id == undefined) {
return null
@ -1301,6 +1515,7 @@ const ObjectTable = forwardRef(
</div>
) : (
<Table
key={tableListKey}
ref={tableRef}
dataSource={tableData}
columns={columnsWithSkeleton}
@ -1322,14 +1537,32 @@ const ObjectTable = forwardRef(
/>
)}
</Splitter.Panel>
{showFilterSidebar && (
{(showSortSidebar || showFilterSidebar) && (
<Splitter.Panel defaultSize={'25%'}>
<Flex
vertical
gap='large'
style={{ height: '100%', minHeight: 0 }}
>
{showSortSidebar && (
<SortSidebar
type={type}
sorter={tableSorter}
onSortChange={handleSidebarSortChange}
stretchHeight={showSortSidebar && !showFilterSidebar}
/>
)}
{showFilterSidebar && (
<Flex style={{ flex: 1, minHeight: 0 }}>
<FilterSidebar
type={type}
filter={sidebarFilter}
onFilterChange={handleSidebarFilterChange}
masterFilter={masterFilter}
/>
</Flex>
)}
</Flex>
</Splitter.Panel>
)}
</Splitter>
@ -1355,6 +1588,7 @@ ObjectTable.propTypes = {
size: PropTypes.string,
onStateChange: PropTypes.func,
showFilterSidebar: PropTypes.bool,
showSortSidebar: PropTypes.bool,
expandHeight: PropTypes.bool,
showActions: PropTypes.bool,
saveFilterInSession: PropTypes.bool,

View File

@ -84,7 +84,7 @@ const ObjectTableNavigationButtons = ({
}
}
setSearchParams(nextParams)
setSearchParams(nextParams, { replace: true })
},
[searchParams, setSearchParams, objectType]
)

View File

@ -1,20 +1,39 @@
import PropTypes from 'prop-types'
import { Button } from 'antd'
import { Button, Divider, Flex } from 'antd'
import GridIcon from '../../Icons/GridIcon'
import ListIcon from '../../Icons/ListIcon'
const ObjectTableViewButton = ({ viewMode, setViewMode, ...buttonProps }) => (
const ObjectTableViewButton = ({
viewMode,
setViewMode,
showEndingDivider = false,
...buttonProps
}) => {
const content = (
<Button
icon={viewMode === 'cards' ? <ListIcon /> : <GridIcon />}
onClick={() => setViewMode(viewMode === 'cards' ? 'list' : 'cards')}
title={viewMode === 'cards' ? 'Switch to list view' : 'Switch to card view'}
title={
viewMode === 'cards' ? 'Switch to list view' : 'Switch to card view'
}
{...buttonProps}
/>
)
)
if (showEndingDivider) {
return (
<Flex gap='small' align='center'>
<Divider type='vertical' style={{ margin: '0 4px', height: '18px' }} />
{content}
</Flex>
)
}
return content
}
ObjectTableViewButton.propTypes = {
viewMode: PropTypes.oneOf(['list', 'cards']).isRequired,
setViewMode: PropTypes.func.isRequired
setViewMode: PropTypes.func.isRequired,
showEndingDivider: PropTypes.bool
}
export default ObjectTableViewButton

Some files were not shown because too many files have changed in this diff Show More