Compare commits

..

26 Commits

Author SHA1 Message Date
41385f7c5e Update @lezer/common version in lock files to 1.5.0 for consistency
All checks were successful
farmcontrol/farmcontrol-ui/pipeline/head This commit looks good
- Changed the version of @lezer/common from 1.5.2 to 1.5.0 in both bun.lock and pnpm-lock.yaml files.
- Ensured all references to @lezer/common across dependencies are aligned with the fixed version, improving compatibility and stability.
2026-08-10 03:34:18 +01:00
eeccfe077f Enhance fcTemplateLang with autocompletion support and XML schema integration
- Updated fcTemplateLang to accept an autoCompleteObject parameter, improving JavaScript autocompletion capabilities.
- Introduced a new schema.js file defining XML attributes and elements for FarmControl templates, enhancing template editing.
- Modified CodeBlockEditor and ObjectProperty components to pass autoCompleteObject, ensuring consistent autocompletion behavior.
- Updated TemplateEditor to utilize objectData for autocompletion, improving user experience in template editing.
2026-08-10 03:33:01 +01:00
24959ce9d8 Update package.json and Vite config for @lezer/common compatibility
Some checks failed
farmcontrol/farmcontrol-ui/pipeline/head There was a failure building this commit
- Changed the version of @lezer/common in package.json to a fixed version (1.5.0) for consistency.
- Updated Vite config to resolve @lezer/common directly from node_modules, ensuring compatibility with CodeMirror parsers and preventing issues with version mismatches.
- Enhanced the fcTemplateLang parser to support XML overlay across Text regions, improving EJS template handling.
2026-08-10 03:24:08 +01:00
0b210f50cd Add fcTemplateLang support for EJS templates in CodeMirror
- Introduced a new language support for EJS templates with XML integration, allowing for custom scriptlets and improved syntax highlighting.
- Updated CodeBlockEditor and TemplateEditor components to utilize the new fcTemplateLang for EJS language handling.
- Modified DocumentTemplate model to reflect the new language type for content.
- Added necessary grammar and parser files for fcTemplateLang, enhancing the overall template editing experience.
2026-08-10 03:17:21 +01:00
3a70df3ef7 Update SimpleDateTimePropertyFilter styles to enforce layout consistency
- Added !important to top and bottom properties for the tree switcher line in the SimpleDateTimePropertyFilter component, ensuring consistent rendering across different contexts.
2026-08-10 02:44:45 +01:00
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
147 changed files with 2712 additions and 388 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 !important;
bottom: -24px !important;
}

View File

@ -26,6 +26,9 @@
"@codemirror/state": "6.7.1",
"@codemirror/theme-one-dark": "^6.1.3",
"@codemirror/view": "6.39.12",
"@lezer/common": "1.5.0",
"@lezer/highlight": "^1.2.3",
"@lezer/lr": "^1.4.8",
"@simplewebauthn/browser": "^13.1.2",
"@tanstack/react-query": "^5.90.10",
"@tiptap/extension-link": "^3.20.1",
@ -494,7 +497,7 @@
"@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "3.1.2", "@jridgewell/sourcemap-codec": "1.5.5" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
"@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="],
"@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/cpp": ["@lezer/cpp@1.1.5", "", { "dependencies": { "@lezer/common": "1.5.0", "@lezer/highlight": "1.2.3", "@lezer/lr": "1.4.8" } }, "sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw=="],
@ -2740,27 +2743,9 @@
"@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
"@codemirror/autocomplete/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/commands/@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="],
"@codemirror/lang-css/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-go/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-html/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-javascript/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-markdown/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-php/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-python/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-sql/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-xml/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/lang-yaml/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@codemirror/language/@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="],
"@codemirror/lint/crelt": ["crelt@1.0.6", "", {}, "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="],
@ -2806,33 +2791,7 @@
"@jimp/js-png/pngjs": ["pngjs@7.0.0", "", {}, "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow=="],
"@lezer/cpp/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/css/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/go/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/highlight/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/html/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/java/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/javascript/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/json/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/lr/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/markdown/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/php/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/python/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/rust/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/xml/@lezer/common": ["@lezer/common@1.5.0", "", {}, "sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA=="],
"@lezer/yaml/@lezer/common": ["@lezer/common@1.5.2", "", {}, "sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ=="],
"@malept/flatpak-bundler/fs-extra": ["fs-extra@9.1.0", "", { "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ=="],

View File

@ -74,7 +74,10 @@
"styled-components": "^6.1.19",
"three": "^0.179.1",
"tsparticles": "^3.9.1",
"web-vitals": "^5.1.0"
"web-vitals": "^5.1.0",
"@lezer/common": "1.5.0",
"@lezer/highlight": "^1.2.3",
"@lezer/lr": "^1.4.8"
},
"main": "build/electron.js",
"description": "3D Printer ERP and Control Software.",

93
pnpm-lock.yaml generated
View File

@ -79,6 +79,15 @@ importers:
'@codemirror/view':
specifier: 6.39.12
version: 6.39.12
'@lezer/common':
specifier: 1.5.0
version: 1.5.0
'@lezer/highlight':
specifier: ^1.2.3
version: 1.2.3
'@lezer/lr':
specifier: ^1.4.8
version: 1.4.8
'@simplewebauthn/browser':
specifier: ^13.1.2
version: 13.2.2
@ -1134,79 +1143,67 @@ packages:
resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-arm@1.0.5':
resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.0.4':
resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@img/sharp-libvips-linux-x64@1.0.4':
resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.0.4':
resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.0.4':
resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
cpu: [x64]
os: [linux]
libc: [musl]
'@img/sharp-linux-arm64@0.33.5':
resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@img/sharp-linux-arm@0.33.5':
resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
libc: [glibc]
'@img/sharp-linux-s390x@0.33.5':
resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@img/sharp-linux-x64@0.33.5':
resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.33.5':
resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@img/sharp-linuxmusl-x64@0.33.5':
resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@img/sharp-wasm32@0.33.5':
resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
@ -1382,9 +1379,6 @@ packages:
'@lezer/common@1.5.0':
resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==}
'@lezer/common@1.5.2':
resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==}
'@lezer/cpp@1.1.5':
resolution: {integrity: sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==}
@ -1598,79 +1592,66 @@ packages:
resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==}
cpu: [arm]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm-musleabihf@4.57.1':
resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==}
cpu: [arm]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-arm64-gnu@4.57.1':
resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-arm64-musl@4.57.1':
resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-loong64-gnu@4.57.1':
resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==}
cpu: [loong64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-loong64-musl@4.57.1':
resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==}
cpu: [loong64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-ppc64-gnu@4.57.1':
resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-ppc64-musl@4.57.1':
resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==}
cpu: [ppc64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-riscv64-gnu@4.57.1':
resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-riscv64-musl@4.57.1':
resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==}
cpu: [riscv64]
os: [linux]
libc: [musl]
'@rollup/rollup-linux-s390x-gnu@4.57.1':
resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-gnu@4.57.1':
resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rollup/rollup-linux-x64-musl@4.57.1':
resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==}
cpu: [x64]
os: [linux]
libc: [musl]
'@rollup/rollup-openbsd-x64@4.57.1':
resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==}
@ -6934,7 +6915,7 @@ snapshots:
'@codemirror/language': 6.12.1
'@codemirror/state': 6.7.1
'@codemirror/view': 6.39.12
'@lezer/common': 1.5.2
'@lezer/common': 1.5.0
'@codemirror/lang-cpp@6.0.3':
dependencies:
@ -7052,7 +7033,7 @@ snapshots:
dependencies:
'@codemirror/state': 6.7.1
'@codemirror/view': 6.39.12
'@lezer/common': 1.5.2
'@lezer/common': 1.5.0
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.8
style-mod: 4.1.3
@ -7915,8 +7896,6 @@ snapshots:
'@lezer/common@1.5.0': {}
'@lezer/common@1.5.2': {}
'@lezer/cpp@1.1.5':
dependencies:
'@lezer/common': 1.5.0
@ -7998,7 +7977,7 @@ snapshots:
'@lezer/yaml@1.0.4':
dependencies:
'@lezer/common': 1.5.2
'@lezer/common': 1.5.0
'@lezer/highlight': 1.2.3
'@lezer/lr': 1.4.8
@ -10339,17 +10318,17 @@ snapshots:
dependencies:
eslint: 9.39.2(jiti@2.6.1)
eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1):
eslint-config-standard-jsx@11.0.0(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@8.57.1):
dependencies:
eslint: 8.57.1
eslint-plugin-react: 7.37.5(eslint@8.57.1)
eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1))
eslint-config-standard@17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1):
dependencies:
eslint: 8.57.1
eslint-plugin-import: 2.32.0(eslint@8.57.1)
eslint-plugin-n: 15.7.0(eslint@8.57.1)
eslint-plugin-promise: 6.6.0(eslint@8.57.1)
eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-n: 15.7.0(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-promise: 6.6.0(eslint@9.39.2(jiti@2.6.1))
eslint-import-resolver-node@0.3.9:
dependencies:
@ -10359,22 +10338,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.1):
eslint-module-utils@2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1)):
dependencies:
debug: 3.2.7
optionalDependencies:
eslint: 8.57.1
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
eslint-plugin-es@4.1.0(eslint@8.57.1):
eslint-plugin-es@4.1.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
eslint: 8.57.1
eslint: 9.39.2(jiti@2.6.1)
eslint-utils: 2.1.0
regexpp: 3.2.0
eslint-plugin-import@2.32.0(eslint@8.57.1):
eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@ -10383,9 +10362,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
eslint: 8.57.1
eslint: 9.39.2(jiti@2.6.1)
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@8.57.1)
eslint-module-utils: 2.12.1(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.6.1))
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@ -10401,12 +10380,12 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
eslint-plugin-n@15.7.0(eslint@8.57.1):
eslint-plugin-n@15.7.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
builtins: 5.1.0
eslint: 8.57.1
eslint-plugin-es: 4.1.0(eslint@8.57.1)
eslint-utils: 3.0.0(eslint@8.57.1)
eslint: 9.39.2(jiti@2.6.1)
eslint-plugin-es: 4.1.0(eslint@9.39.2(jiti@2.6.1))
eslint-utils: 3.0.0(eslint@9.39.2(jiti@2.6.1))
ignore: 5.3.2
is-core-module: 2.16.1
minimatch: 3.1.2
@ -10423,9 +10402,9 @@ snapshots:
'@types/eslint': 9.6.1
eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-promise@6.6.0(eslint@8.57.1):
eslint-plugin-promise@6.6.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
eslint: 8.57.1
eslint: 9.39.2(jiti@2.6.1)
eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
@ -10493,9 +10472,9 @@ snapshots:
dependencies:
eslint-visitor-keys: 1.3.0
eslint-utils@3.0.0(eslint@8.57.1):
eslint-utils@3.0.0(eslint@9.39.2(jiti@2.6.1)):
dependencies:
eslint: 8.57.1
eslint: 9.39.2(jiti@2.6.1)
eslint-visitor-keys: 2.1.0
eslint-visitor-keys@1.3.0: {}
@ -13636,10 +13615,10 @@ snapshots:
dependencies:
eslint: 8.57.1
eslint-config-standard: 17.1.0(eslint-plugin-import@2.32.0(eslint@8.57.1))(eslint-plugin-n@15.7.0(eslint@8.57.1))(eslint-plugin-promise@6.6.0(eslint@8.57.1))(eslint@8.57.1)
eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.32.0(eslint@8.57.1)
eslint-plugin-n: 15.7.0(eslint@8.57.1)
eslint-plugin-promise: 6.6.0(eslint@8.57.1)
eslint-config-standard-jsx: 11.0.0(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@8.57.1)
eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-n: 15.7.0(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-promise: 6.6.0(eslint@9.39.2(jiti@2.6.1))
eslint-plugin-react: 7.37.5(eslint@8.57.1)
standard-engine: 15.1.0
version-guard: 1.1.3

View File

@ -0,0 +1,45 @@
// FarmControl EJS outer grammar for fcTemplateLang.
// Regenerate the parser with:
// pnpm exec lezer-generator src/codemirror/fcTemplateLang/ejs.grammar --output src/codemirror/fcTemplateLang/ejs.parser.js
//
// Outer language = EJS scriptlets; Text regions are overlaid with XML and
// JavascriptExpression nodes are mounted with the JS parser (parseMixed).
@top Template { content* }
content {
Scriptlet |
Output |
Comment |
Text
}
Scriptlet { OpeningTag JavascriptExpression ClosingTag }
Output { OutputTag JavascriptExpression ClosingTag }
@skip {} {
Comment { CommentTag (CommentContent | commentNewLine)* commentEnd }
}
@local tokens {
commentEnd { ClosingTag }
commentNewLine { "\n" }
@else CommentContent
}
@tokens {
// Prefer longer tags via @precedence below
OpeningTag[closedBy=ClosingTag] { "<%" }
OutputTag[closedBy=ClosingTag] { "<%=" | "<%-" | "<%_" }
CommentTag[closedBy=ClosingTag] { "<%#" }
ClosingTag[openedBy="OpeningTag OutputTag CommentTag"] { ("-" | "_")? "%>" }
@precedence { OutputTag, CommentTag, OpeningTag }
}
@external tokens javascriptExpressionOrText from "./tokens.js" {
JavascriptExpression,
Text
}
@detectDelim

View File

@ -0,0 +1,21 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
import {LRParser, LocalTokenGroup} from "@lezer/lr"
import {javascriptExpressionOrText} from "./tokens.js"
export const parser = LRParser.deserialize({
version: 14,
states: "#YQQOROOO`OQO'#C`OeOQO'#CcOjOSO'#CeOOOQ'#Ck'#CkOOOQ'#Ch'#ChQQOROOOuOPO,58zOzOPO,58}OOOO'#Ci'#CiO!POSO,59POOOQ,59P,59POOOQ-E6f-E6fOOOQ1G.f1G.fOOOQ1G.i1G.iOOOO-E6g-E6gOOOQ1G.k1G.k",
stateData: "!a~OQSOTPOWQOYRO~OPVO~OPWO~OZXO`XOaZO~OU]O~OU^O~OZXO`XOa`O~OWYTY~",
goto: "u`PPPPaPPaPaPPekPqTSOUQUOR[UQYRR_YTTOU",
nodeNames: "⚠ JavascriptExpression Text Template Scriptlet OpeningTag ClosingTag Output OutputTag Comment CommentTag CommentContent",
maxTerm: 17,
nodeProps: [
["closedBy", -3,5,8,10,"ClosingTag"],
["openedBy", 6,"OpeningTag OutputTag CommentTag"]
],
skippedNodes: [0],
repeatNodeCount: 2,
tokenData: "!c~RSuv_}!Oj!^!_p#R#Sj~bP!`!ae~jOU~~mPuv_~sPuvv~{ST~st!X}!O!^!_!`!^#R#S!^~!^OY~~!cOW~",
tokenizers: [1, javascriptExpressionOrText, new LocalTokenGroup("v~RSYZ_uvd}!Oo#R#So~dO`~~gP!`!aj~oOa~~rPuvd~", 37, 11)],
topRules: {"Template":[0,3]},
tokenPrec: 58
})

View File

@ -0,0 +1,13 @@
// This file was generated by lezer-generator. You probably shouldn't edit it.
export const
JavascriptExpression = 1,
Text = 2,
Template = 3,
Scriptlet = 4,
OpeningTag = 5,
ClosingTag = 6,
Output = 7,
OutputTag = 8,
Comment = 9,
CommentTag = 10,
CommentContent = 11

View File

@ -0,0 +1,115 @@
import {
LRLanguage,
LanguageSupport,
indentNodeProp,
delimitedIndent,
foldNodeProp,
foldInside
} from '@codemirror/language'
import { styleTags, tags as t } from '@lezer/highlight'
import { parseMixed } from '@lezer/common'
import {
javascriptLanguage,
scopeCompletionSource,
localCompletionSource
} from '@codemirror/lang-javascript'
import {
xmlLanguage,
completeFromSchema,
autoCloseTags
} from '@codemirror/lang-xml'
import { parser as ejsParser } from './ejs.parser.js'
import {
fcTemplateElements,
fcTemplateAttributes,
fcTemplateHelpers
} from './schema.js'
/**
* FarmControl document template language: custom XML tags with EJS
* scriptlets (`<% %>`, `<%= %>`, etc.). Uses mixed-language parsing so
* XML and JavaScript each get their own highlighting/support.
*
* @see https://codemirror.net/examples/mixed-language/
* @see https://codemirror.net/examples/autocompletion/
*/
const fcTemplateParser = ejsParser.configure({
props: [
indentNodeProp.add({
JavascriptExpression: delimitedIndent({ closing: '%>', align: false })
}),
foldNodeProp.add({
Scriptlet: foldInside,
Output: foldInside,
Comment: foldInside
}),
styleTags({
'OpeningTag OutputTag CommentTag ClosingTag': t.controlKeyword,
CommentContent: t.blockComment
})
],
wrap: parseMixed((node) => {
// Mount JS inside EJS bodies
if (node.name === 'JavascriptExpression') {
return { parser: javascriptLanguage.parser }
}
// Overlay XML across all Text regions so tags that wrap EJS
// (e.g. <Text><%= x %></Text>) stay one coherent XML tree.
if (node.type.isTop) {
return {
parser: xmlLanguage.parser,
overlay: (n) => n.name === 'Text'
}
}
return null
})
})
export const fcTemplateLanguage = LRLanguage.define({
name: 'fcTemplateLang',
parser: fcTemplateParser,
languageData: {
commentTokens: { block: { open: '<%#', close: '%>' } },
closeBrackets: { brackets: ['(', '[', '{', '"', "'", '`'] }
}
})
function buildJsScope(autoCompleteObject) {
let data = autoCompleteObject
if (typeof data === 'string') {
try {
data = JSON.parse(data)
} catch {
data = {}
}
}
if (!data || typeof data !== 'object' || Array.isArray(data)) {
data = {}
}
return {
...data,
fc: fcTemplateHelpers
}
}
/**
* Language support for FarmControl EJS+XML document templates.
* @param {{ autoCompleteObject?: object|string }} [options]
*/
export function fcTemplateLang(options = {}) {
const { autoCompleteObject } = options
const jsScope = buildJsScope(autoCompleteObject)
return new LanguageSupport(fcTemplateLanguage, [
xmlLanguage.data.of({
autocomplete: completeFromSchema(
fcTemplateElements,
fcTemplateAttributes
)
}),
autoCloseTags,
javascriptLanguage.data.of({
autocomplete: [localCompletionSource, scopeCompletionSource(jsScope)]
})
])
}

View File

@ -0,0 +1,106 @@
/**
* XML schema for FarmControl document template tags.
* Mirrors custom elements / style attrs handled in farmcontrol-ws TemplateManager.
*/
const styleAttrs = [
'padding',
'width',
'height',
'maxWidth',
'maxHeight',
'gap',
'justify',
'align',
'border',
'borderRadius',
'vertical',
'grow',
'shrink',
'color',
'background',
'scale',
'textAlign',
'textSize',
'wordWrap'
]
const justifyValues = [
'flex-start',
'flex-end',
'center',
'space-between',
'space-around',
'space-evenly'
]
const alignValues = [
'flex-start',
'flex-end',
'center',
'stretch',
'baseline'
]
/** @type {import('@codemirror/lang-xml').AttrSpec[]} */
export const fcTemplateAttributes = [
...styleAttrs.map((name) => {
const attr = { name, global: true }
if (name === 'vertical') attr.values = ['true', 'false']
if (name === 'justify') attr.values = justifyValues
if (name === 'align') attr.values = alignValues
if (name === 'textAlign') {
attr.values = ['left', 'center', 'right', 'justify']
}
return attr
}),
{
name: 'format',
values: ['code128', 'code39', 'ean13', 'ean8', 'upc', 'qrcode']
},
{ name: 'barcodeWidth' },
{
name: 'type',
values: ['header', 'footer', 'body']
}
]
const allTags = [
'Flex',
'Container',
'Title1',
'Title2',
'Title3',
'Title4',
'Text',
'Bold',
'Divider',
'ProgressBar',
'Barcode',
'DateTime',
'Table',
'Row',
'Col'
]
/** @type {import('@codemirror/lang-xml').ElementSpec[]} */
export const fcTemplateElements = allTags.map((name) => {
const el = { name, top: true, children: allTags }
if (name === 'Barcode') {
el.attributes = ['format', 'barcodeWidth', ...styleAttrs]
} else if (name === 'Row') {
el.attributes = ['type', ...styleAttrs]
} else if (name === 'Divider') {
el.children = []
}
return el
})
/** Runtime helpers available as `fc` inside templates. */
export const fcTemplateHelpers = {
listObjects: async () => [],
getObject: async () => ({}),
formatDate: () => ''
}

View File

@ -0,0 +1,37 @@
import { ExternalTokenizer } from '@lezer/lr'
import { JavascriptExpression, Text } from './ejs.parser.terms.js'
const percent = 37
const closeAngle = 62
const dash = 45
const underscore = 95
const openAngle = 60
export const javascriptExpressionOrText = new ExternalTokenizer(
(input, stack) => {
let { next } = input
const start = input.pos
while (next !== -1) {
if (next === openAngle && input.peek(1) === percent) break
if (
([dash, underscore].includes(next) &&
input.peek(1) === percent &&
input.peek(2) === closeAngle) ||
(next === percent && input.peek(1) === closeAngle)
) {
break
}
next = input.advance()
}
if (stack.canShift(JavascriptExpression)) {
// Empty expressions are valid: <% %>
input.acceptToken(JavascriptExpression)
} else if (stack.canShift(Text) && input.pos > start) {
// Never emit empty Text — that loops forever at EOF
input.acceptToken(Text)
}
},
{ contextual: 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 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}
/>

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