Compare commits

...

21 Commits

Author SHA1 Message Date
0eef478a41 feat(filters): Eingabevalidierung für IntFilter hinzufügen, um nur numerische Werte zuzulassen 2025-07-07 10:01:15 +02:00
55ba6031eb feat(num-filter.tsx): created to handle numerical inputs 2025-07-07 09:43:19 +02:00
21d47b1f90 Remove unused import and update BoolFilterProps
Removed the import statement for `FormControlLabel` from `bool-filter.tsx`. Also, eliminated the optional `onClick` property from the `BoolFilterProps` type definition.
2025-07-04 14:29:10 +02:00
9b831c86d4 Refactor DocSearchView to use BoolFilter component
Introduced a new `BoolFilter` component to encapsulate the checkbox and switch functionality previously handled in `DocSearchView`. This refactor improves code organization and reusability. Removed unnecessary imports from `doc-search-view.tsx` and added imports for the new component in `bool-filter.tsx`.
2025-07-04 14:01:22 +02:00
8893b96e9b Update MUI packages and enhance DocSearchView component
- Added `@mui/icons-material` package (v^7.2.0).
- Updated several MUI packages to version 7.2.0.
- Updated `@babel/runtime` to version 7.27.6.
- Updated `@emotion/cache` to version 11.14.0.
- Updated `react-is` to version ^19.1.0.
- Modified `DocSearchView` to use a `Checkbox` with icons for boolean filters.
2025-07-04 13:30:53 +02:00
673efe51ed Add filter state management and UI updates
Introduce state management for disabled filter states in the DocSearchView component. Add Material-UI components for switches and update rendering logic to conditionally display enabled/disabled states. Adjust handling of VARCHAR filters to ensure correct TextField IDs.
2025-07-04 12:50:23 +02:00
b06595e8d8 Refactor filter rendering in DocSearchView component
Updated the rendering logic for filters to use a switch statement, allowing for flexible handling of different filter types. The layout remains unchanged, but the logic for rendering each filter type has been enhanced for future extensibility.
2025-07-04 10:39:18 +02:00
05c7b49bbc Refactor DocSearchView layout and update button text
- Added a new <Box> component to wrap <DocSearch> and <DocSort> for improved styling.
- Changed button text from "New post" to "New filter".
- Removed the old <Box> structure and integrated its contents into the new layout.
2025-07-04 10:11:23 +02:00
b107273db3 Update filter type and refactor DocSearchView component
- Made the `label` property in the `Filter` type optional for greater flexibility.
- Added `TextField` import in `doc-search-view.tsx` for user input.
- Removed `DocSearch` and `DocSort` components, replacing them with a `TextField` that uses `filter.label` or `filter.type` as its label.
2025-07-04 10:07:55 +02:00
5f6eda0fc7 Enhance DocSearchView with filters and sorting options
Updated the `DocSearchView` component to initialize the `filters` state with an empty array. Added a new section to render filters, mapping over the `filters` array to display `DocSearch` and `DocSort` components. This improves the user interface by enabling sorting and filtering of displayed posts.
2025-07-04 09:36:36 +02:00
f8be0b0b5f Add filters state and fetch logic in DocSearchView
Updated imports to include useEffect for side effects.
Introduced a new state variable `filters` to manage Filter objects.
Implemented useEffect to asynchronously fetch filters using getFiltersAsync.
2025-07-04 09:13:26 +02:00
a73ff5b9a4 Update Document Search icon and add SVG asset
Changed the icon for the 'Document Search' entry in
`nav-config-dashboard.tsx` from `ic-cart` to `ic-doc-search`.
Added a new SVG file `ic-doc-search.svg` containing the
markup for the updated icon.
2025-07-03 17:07:59 +02:00
1a9a683b25 Rebrand project and add Document Search feature
Updated project name and version in package-lock.json.
Modified navigation to include a new 'Document Search' item.
Introduced lazy-loaded DocumentSearch component in sections.tsx.
Created doc-search.tsx with a DocSearchView for displaying posts.
2025-07-03 16:59:54 +02:00
e8a96dd6c4 Add document management features and components
Introduces `DocItem`, `DocSearch`, and `DocSort` components for displaying, searching, and sorting documents. The `DocSearchView` component integrates these functionalities, providing a user interface for document management, including a button to create new posts. Updates `index.ts` to export the new `DocSearchView` component.
2025-07-03 16:13:45 +02:00
e9aa405464 Update default route to ProductsPage in sections.tsx
Replaced the DashboardPage component with ProductsPage
for the default index route in the routesSection array.
2025-07-03 14:57:59 +02:00
62f99842b3 Remove unused nav items and comment out info property
This commit removes several navigation items from the `navData` array in `nav-config-dashboard.tsx`, including 'Dashboard', 'User', 'Blog', 'Sign in', and 'Not found'. The 'Product' item's `info` property has also been commented out. A commented-out section has been added to preserve the removed items for reference, and `#region` and `#endregion` comments have been introduced for better code organization.
2025-07-03 14:51:35 +02:00
caf507fe1a Remove Iconify import and add Fab component
This commit removes the import statement for the `Iconify` component from `src/components/iconify` in `app.tsx`. It also adds an import for the `Fab` component from the `@mui/material` library.
2025-07-03 14:35:10 +02:00
ba08b3a3d0 Refactor product data structure and imports
- Added import for `Product` type in `_data.ts`.
- Renamed `_products` to `_productsTextile` and defined a new array of product objects.
- Updated `getProductsAsync` in `product-service.ts` to return the new `_products` array from mock data.
2025-07-03 14:33:28 +02:00
b0c6cdcd13 Add filter functionality and async retrieval
Introduce a new `_filters` constant in `_data.ts` that defines various filter objects for invoices and related data. Update `filter-service.ts` to import `_filters` and define the `Filter` type. Implement `getFiltersAsync` function to asynchronously retrieve the filter data.
2025-07-03 14:26:17 +02:00
3fd7553ce8 Refactor Filter type structure
Updated the `Filter` type to include `id` and `label` properties. Removed the `dataType` property and replaced it with a `type` property that utilizes the `Type` type. This enhances the filter's structure by providing unique identification and standardizing data type representation.
2025-07-03 14:16:27 +02:00
947257646d Add Type and Filter type definitions
Introduced a new `Type` definition with five string values: 'BOOLEAN', 'DATE', 'VARCHAR', 'INTEGER', and 'DECIMAL'. Added a `Filter` type that includes a `name` property and a `dataType` property of type `Type`.
2025-07-03 14:08:10 +02:00
18 changed files with 848 additions and 173 deletions

View File

@ -1,12 +1,12 @@
{ {
"name": "@minimal/material-kit-react", "name": "dd-hub-react",
"version": "3.0.0", "version": "0.0.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "@minimal/material-kit-react", "name": "dd-hub-react",
"version": "3.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@emotion/cache": "^11.14.0", "@emotion/cache": "^11.14.0",
"@emotion/react": "^11.14.0", "@emotion/react": "^11.14.0",
@ -14,6 +14,7 @@
"@fontsource-variable/dm-sans": "^5.2.5", "@fontsource-variable/dm-sans": "^5.2.5",
"@fontsource/barlow": "^5.2.5", "@fontsource/barlow": "^5.2.5",
"@iconify/react": "^5.2.1", "@iconify/react": "^5.2.1",
"@mui/icons-material": "^7.2.0",
"@mui/lab": "^7.0.0-beta.10", "@mui/lab": "^7.0.0-beta.10",
"@mui/material": "^7.0.1", "@mui/material": "^7.0.1",
"apexcharts": "^4.5.0", "apexcharts": "^4.5.0",
@ -128,13 +129,10 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.27.0", "version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"license": "MIT", "license": "MIT",
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
} }
@ -1164,15 +1162,41 @@
} }
}, },
"node_modules/@mui/core-downloads-tracker": { "node_modules/@mui/core-downloads-tracker": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.2.0.tgz",
"integrity": "sha512-T5DNVnSD9pMbj4Jk/Uphz+yvj9dfpl2+EqsOuJtG12HxEihNG5pd3qzX5yM1Id4dDwKRvM3dPVcxyzavTFhJeA==", "integrity": "sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==",
"license": "MIT", "license": "MIT",
"funding": { "funding": {
"type": "opencollective", "type": "opencollective",
"url": "https://opencollective.com/mui-org" "url": "https://opencollective.com/mui-org"
} }
}, },
"node_modules/@mui/icons-material": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.2.0.tgz",
"integrity": "sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.27.6"
},
"engines": {
"node": ">=14.0.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/mui-org"
},
"peerDependencies": {
"@mui/material": "^7.2.0",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@mui/lab": { "node_modules/@mui/lab": {
"version": "7.0.0-beta.10", "version": "7.0.0-beta.10",
"resolved": "https://registry.npmjs.org/@mui/lab/-/lab-7.0.0-beta.10.tgz", "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-7.0.0-beta.10.tgz",
@ -1218,22 +1242,22 @@
} }
}, },
"node_modules/@mui/material": { "node_modules/@mui/material": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/material/-/material-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.2.0.tgz",
"integrity": "sha512-tQwjIIsn/UUSCHoCIQVkANuLua67h7Ro9M9gIHoGWaFbJFuF6cSO4Oda2olDVqIs4SWG+PaDChuu6SngxsaoyQ==", "integrity": "sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10", "@babel/runtime": "^7.27.6",
"@mui/core-downloads-tracker": "^7.0.1", "@mui/core-downloads-tracker": "^7.2.0",
"@mui/system": "^7.0.1", "@mui/system": "^7.2.0",
"@mui/types": "^7.4.0", "@mui/types": "^7.4.4",
"@mui/utils": "^7.0.1", "@mui/utils": "^7.2.0",
"@popperjs/core": "^2.11.8", "@popperjs/core": "^2.11.8",
"@types/react-transition-group": "^4.4.12", "@types/react-transition-group": "^4.4.12",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"csstype": "^3.1.3", "csstype": "^3.1.3",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-is": "^19.0.0", "react-is": "^19.1.0",
"react-transition-group": "^4.4.5" "react-transition-group": "^4.4.5"
}, },
"engines": { "engines": {
@ -1246,7 +1270,7 @@
"peerDependencies": { "peerDependencies": {
"@emotion/react": "^11.5.0", "@emotion/react": "^11.5.0",
"@emotion/styled": "^11.3.0", "@emotion/styled": "^11.3.0",
"@mui/material-pigment-css": "^7.0.1", "@mui/material-pigment-css": "^7.2.0",
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
@ -1267,13 +1291,13 @@
} }
}, },
"node_modules/@mui/private-theming": { "node_modules/@mui/private-theming": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz",
"integrity": "sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ==", "integrity": "sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10", "@babel/runtime": "^7.27.6",
"@mui/utils": "^7.0.1", "@mui/utils": "^7.2.0",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
}, },
"engines": { "engines": {
@ -1294,13 +1318,13 @@
} }
}, },
"node_modules/@mui/styled-engine": { "node_modules/@mui/styled-engine": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.2.0.tgz",
"integrity": "sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ==", "integrity": "sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10", "@babel/runtime": "^7.27.6",
"@emotion/cache": "^11.13.5", "@emotion/cache": "^11.14.0",
"@emotion/serialize": "^1.3.3", "@emotion/serialize": "^1.3.3",
"@emotion/sheet": "^1.4.0", "@emotion/sheet": "^1.4.0",
"csstype": "^3.1.3", "csstype": "^3.1.3",
@ -1328,16 +1352,16 @@
} }
}, },
"node_modules/@mui/system": { "node_modules/@mui/system": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.2.0.tgz",
"integrity": "sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA==", "integrity": "sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10", "@babel/runtime": "^7.27.6",
"@mui/private-theming": "^7.0.1", "@mui/private-theming": "^7.2.0",
"@mui/styled-engine": "^7.0.1", "@mui/styled-engine": "^7.2.0",
"@mui/types": "^7.4.0", "@mui/types": "^7.4.4",
"@mui/utils": "^7.0.1", "@mui/utils": "^7.2.0",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"csstype": "^3.1.3", "csstype": "^3.1.3",
"prop-types": "^15.8.1" "prop-types": "^15.8.1"
@ -1368,12 +1392,12 @@
} }
}, },
"node_modules/@mui/types": { "node_modules/@mui/types": {
"version": "7.4.0", "version": "7.4.4",
"resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz", "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz",
"integrity": "sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ==", "integrity": "sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10" "@babel/runtime": "^7.27.6"
}, },
"peerDependencies": { "peerDependencies": {
"@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
@ -1385,17 +1409,17 @@
} }
}, },
"node_modules/@mui/utils": { "node_modules/@mui/utils": {
"version": "7.0.1", "version": "7.2.0",
"resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz", "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.2.0.tgz",
"integrity": "sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g==", "integrity": "sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.26.10", "@babel/runtime": "^7.27.6",
"@mui/types": "^7.4.0", "@mui/types": "^7.4.4",
"@types/prop-types": "^15.7.14", "@types/prop-types": "^15.7.15",
"clsx": "^2.1.1", "clsx": "^2.1.1",
"prop-types": "^15.8.1", "prop-types": "^15.8.1",
"react-is": "^19.0.0" "react-is": "^19.1.0"
}, },
"engines": { "engines": {
"node": ">=14.0.0" "node": ">=14.0.0"
@ -2099,9 +2123,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/prop-types": { "node_modules/@types/prop-types": {
"version": "15.7.14", "version": "15.7.15",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz",
"integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/react": { "node_modules/@types/react": {
@ -5698,12 +5722,6 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
"integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
"license": "MIT"
},
"node_modules/regexp.prototype.flags": { "node_modules/regexp.prototype.flags": {
"version": "1.5.4", "version": "1.5.4",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",

View File

@ -32,6 +32,7 @@
"@fontsource-variable/dm-sans": "^5.2.5", "@fontsource-variable/dm-sans": "^5.2.5",
"@fontsource/barlow": "^5.2.5", "@fontsource/barlow": "^5.2.5",
"@iconify/react": "^5.2.1", "@iconify/react": "^5.2.1",
"@mui/icons-material": "^7.2.0",
"@mui/lab": "^7.0.0-beta.10", "@mui/lab": "^7.0.0-beta.10",
"@mui/material": "^7.0.1", "@mui/material": "^7.0.1",
"apexcharts": "^4.5.0", "apexcharts": "^4.5.0",

View File

@ -0,0 +1,3 @@
<svg width="24" height="24" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="M20 19.59V8l-6-6H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c.45 0 .85-.15 1.19-.4l-4.43-4.43c-.8.52-1.74.83-2.76.83-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5c0 1.02-.31 1.96-.83 2.75zM9 13c0 1.66 1.34 3 3 3s3-1.34 3-3-1.34-3-3-3-3 1.34-3 3"></path>
</svg>

After

Width:  |  Height:  |  Size: 356 B

View File

@ -1,3 +1,6 @@
import { Filter } from 'src/api/filter-service';
import { Product } from 'src/api/product-service';
import { import {
_id, _id,
_price, _price,
@ -74,7 +77,7 @@ const COLORS = [
'#FFC107', '#FFC107',
]; ];
export const _products = [...Array(24)].map((_, index) => { export const _productsTextile = [...Array(24)].map((_, index) => {
const setIndex = index + 1; const setIndex = index + 1;
return { return {
@ -208,3 +211,29 @@ export const _notifications = [
isUnRead: false, isUnRead: false,
}, },
]; ];
export const _products: Product[] = [
{
id: '1',
name: "User Manager",
version: "1.0.0"
},
{
id: '2',
name: "Envelope Generator",
version: "1.0.0"
}
];
export const _filters: Filter[] = [
{ id: 1, label: 'Rechnungsnummer', name: 'invoiceNumber', type: 'VARCHAR' },
{ id: 2, label: 'Kundenname', name: 'customerName', type: 'INTEGER' },
{ id: 3, label: 'Startdatum', name: 'startDate', type: 'DATE' },
{ id: 4, label: 'Enddatum', name: 'endDate', type: 'DATE' },
{ id: 5, label: 'Status der Rechnung', name: 'status', type: 'VARCHAR' },
{ id: 6, label: 'Mindestbetrag', name: 'minAmount', type: 'DECIMAL' },
{ id: 7, label: 'Höchstbetrag', name: 'maxAmount', type: 'DECIMAL' },
{ id: 8, label: 'Steuer inbegriffen?', name: 'taxIncluded', type: 'BOOLEAN' },
{ id: 9, label: 'Währung', name: 'currency', type: 'VARCHAR' },
{ id: 10, label: 'Erstellungsdatum', name: 'createdAt', type: 'DATE' }
];

View File

@ -0,0 +1,14 @@
import { _filters } from 'src/_mock/_data';
export type Type = 'BOOLEAN' | 'DATE' | 'VARCHAR' | 'INTEGER' | 'DECIMAL';
export type Filter = {
id: number;
label?: string;
name: string;
type: Type;
};
export function getFiltersAsync(): Promise<Filter[]> {
return Promise.resolve(_filters);
}

View File

@ -1,3 +1,5 @@
import { _products } from "src/_mock";
export type Product = { export type Product = {
id: string; id: string;
name: string; name: string;
@ -16,16 +18,5 @@ export type Product = {
*/ */
export function getProductsAsync(): Promise<Product[]> { export function getProductsAsync(): Promise<Product[]> {
//TODO: Implement the API call using fetch or axios //TODO: Implement the API call using fetch or axios
return Promise.resolve([ return Promise.resolve(_products);
{
id: '1',
name: "User Manager",
version: "1.0.0"
},
{
id: '2',
name: "Envelope Generator",
version: "1.0.0"
}
]);
} }

View File

@ -8,8 +8,6 @@ import { usePathname } from 'src/routes/hooks';
import { ThemeProvider } from 'src/theme/theme-provider'; import { ThemeProvider } from 'src/theme/theme-provider';
import { Iconify } from 'src/components/iconify';
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
type AppProps = { type AppProps = {

View File

@ -1,4 +1,3 @@
import { Label } from 'src/components/label';
import { SvgColor } from 'src/components/svg-color'; import { SvgColor } from 'src/components/svg-color';
// ---------------------------------------------------------------------- // ----------------------------------------------------------------------
@ -13,39 +12,48 @@ export type NavItem = {
}; };
export const navData = [ export const navData = [
{
title: 'Dashboard',
path: '/',
icon: icon('ic-analytics'),
},
{
title: 'User',
path: '/user',
icon: icon('ic-user'),
},
{ {
title: 'Product', title: 'Product',
path: '/products', path: '/products',
icon: icon('ic-cart'), icon: icon('ic-cart'),
info: ( //#region example component
<Label color="error" variant="inverted"> // info: (
+3 // <Label color="error" variant="inverted">
</Label> // +3
), // </Label>
// ),
//#endregion
}, },
{ {
title: 'Blog', title: 'Document Search',
path: '/blog', path: '/doc-search',
icon: icon('ic-blog'), icon: icon('ic-doc-search'),
}, }
{ //#region example pages
title: 'Sign in', // {
path: '/sign-in', // title: 'Dashboard',
icon: icon('ic-lock'), // path: '/',
}, // icon: icon('ic-analytics'),
{ // },
title: 'Not found', // {
path: '/404', // title: 'User',
icon: icon('ic-disabled'), // path: '/user',
}, // icon: icon('ic-user'),
// },
// {
// title: 'Blog',
// path: '/blog',
// icon: icon('ic-blog'),
// },
// {
// title: 'Sign in',
// path: '/sign-in',
// icon: icon('ic-lock'),
// },
// {
// title: 'Not found',
// path: '/404',
// icon: icon('ic-disabled'),
// },
//#endregion
]; ];

View File

@ -0,0 +1,16 @@
import { _posts } from 'src/_mock';
import { CONFIG } from 'src/config-global';
import { DocSearchView } from 'src/sections/document/view';
// ----------------------------------------------------------------------
export default function Page() {
return (
<>
<title>{`Document Search - ${CONFIG.appName}`}</title>
<DocSearchView posts={_posts} />
</>
);
}

View File

@ -18,6 +18,7 @@ export const UserPage = lazy(() => import('src/pages/user'));
export const SignInPage = lazy(() => import('src/pages/sign-in')); export const SignInPage = lazy(() => import('src/pages/sign-in'));
export const ProductsPage = lazy(() => import('src/pages/products')); export const ProductsPage = lazy(() => import('src/pages/products'));
export const Page404 = lazy(() => import('src/pages/page-not-found')); export const Page404 = lazy(() => import('src/pages/page-not-found'));
export const DocumentSearch = lazy(() => import('src/pages/doc-search'));
const renderFallback = () => ( const renderFallback = () => (
<Box <Box
@ -49,9 +50,10 @@ export const routesSection: RouteObject[] = [
</DashboardLayout> </DashboardLayout>
), ),
children: [ children: [
{ index: true, element: <DashboardPage /> }, { index: true, element: <ProductsPage /> },
{ path: 'user', element: <UserPage /> }, { path: 'doc-search', element: <DocumentSearch /> },
{ path: 'products', element: <ProductsPage /> }, { path: 'products', element: <ProductsPage /> },
{ path: 'user', element: <UserPage /> },
{ path: 'blog', element: <BlogPage /> }, { path: 'blog', element: <BlogPage /> },
], ],
}, },

View File

@ -0,0 +1,33 @@
import { useState } from 'react';
import Switch from '@mui/material/Switch';
import Checkbox from '@mui/material/Checkbox';
import FormGroup from '@mui/material/FormGroup';
import AddBoxIcon from '@mui/icons-material/AddBox';
import FormControlLabel from '@mui/material/FormControlLabel';
import AddBoxTwoToneIcon from '@mui/icons-material/AddBoxTwoTone';
// ----------------------------------------------------------------------
type BoolFilterProps = {
label: string;
}
export function BoolFilter({ label }: BoolFilterProps) {
const [disabled, setDisabled] = useState<boolean>(true);
return (
<FormGroup row>
<Checkbox
{...{ inputProps: { 'aria-label': 'Checkbox demo' } }}
icon={<AddBoxTwoToneIcon />}
checkedIcon={<AddBoxIcon />}
onClick={() => setDisabled(!disabled)}
/>
{
disabled
? <FormControlLabel disabled control={<Switch />} label={label} />
: <FormControlLabel control={<Switch />} label={label} />
}
</FormGroup>
);
}

View File

@ -0,0 +1,211 @@
import type { CardProps } from '@mui/material/Card';
import type { IconifyName } from 'src/components/iconify';
import { varAlpha } from 'minimal-shared/utils';
import Box from '@mui/material/Box';
import Link from '@mui/material/Link';
import Card from '@mui/material/Card';
import Avatar from '@mui/material/Avatar';
import Typography from '@mui/material/Typography';
import { fDate } from 'src/utils/format-time';
import { fShortenNumber } from 'src/utils/format-number';
import { Iconify } from 'src/components/iconify';
import { SvgColor } from 'src/components/svg-color';
// ----------------------------------------------------------------------
export type IDocItem = {
id: string;
title: string;
coverUrl: string;
totalViews: number;
description: string;
totalShares: number;
totalComments: number;
totalFavorites: number;
postedAt: string | number | null;
author: {
name: string;
avatarUrl: string;
};
};
export function DocItem({
sx,
post,
latestDoc,
latestDocLarge,
...other
}: CardProps & {
post: IDocItem;
latestDoc: boolean;
latestDocLarge: boolean;
}) {
const renderAvatar = (
<Avatar
alt={post.author.name}
src={post.author.avatarUrl}
sx={{
left: 24,
zIndex: 9,
bottom: -24,
position: 'absolute',
...((latestDocLarge || latestDoc) && {
top: 24,
}),
}}
/>
);
const renderTitle = (
<Link
color="inherit"
variant="subtitle2"
underline="hover"
sx={{
height: 44,
overflow: 'hidden',
WebkitLineClamp: 2,
display: '-webkit-box',
WebkitBoxOrient: 'vertical',
...(latestDocLarge && { typography: 'h5', height: 60 }),
...((latestDocLarge || latestDoc) && {
color: 'common.white',
}),
}}
>
{post.title}
</Link>
);
const renderInfo = (
<Box
sx={{
mt: 3,
gap: 1.5,
display: 'flex',
flexWrap: 'wrap',
color: 'text.disabled',
justifyContent: 'flex-end',
}}
>
{[
{ number: post.totalComments, icon: 'solar:chat-round-dots-bold' },
{ number: post.totalViews, icon: 'solar:eye-bold' },
{ number: post.totalShares, icon: 'solar:share-bold' },
].map((info, _index) => (
<Box
key={_index}
sx={{
display: 'flex',
...((latestDocLarge || latestDoc) && {
opacity: 0.64,
color: 'common.white',
}),
}}
>
<Iconify width={16} icon={info.icon as IconifyName} sx={{ mr: 0.5 }} />
<Typography variant="caption">{fShortenNumber(info.number)}</Typography>
</Box>
))}
</Box>
);
const renderCover = (
<Box
component="img"
alt={post.title}
src={post.coverUrl}
sx={{
top: 0,
width: 1,
height: 1,
objectFit: 'cover',
position: 'absolute',
}}
/>
);
const renderDate = (
<Typography
variant="caption"
component="div"
sx={{
mb: 1,
color: 'text.disabled',
...((latestDocLarge || latestDoc) && {
opacity: 0.48,
color: 'common.white',
}),
}}
>
{fDate(post.postedAt)}
</Typography>
);
const renderShape = (
<SvgColor
src="/assets/icons/shape-avatar.svg"
sx={{
left: 0,
width: 88,
zIndex: 9,
height: 36,
bottom: -16,
position: 'absolute',
color: 'background.paper',
...((latestDocLarge || latestDoc) && { display: 'none' }),
}}
/>
);
return (
<Card sx={sx} {...other}>
<Box
sx={(theme) => ({
position: 'relative',
pt: 'calc(100% * 3 / 4)',
...((latestDocLarge || latestDoc) && {
pt: 'calc(100% * 4 / 3)',
'&:after': {
top: 0,
content: "''",
width: '100%',
height: '100%',
position: 'absolute',
bgcolor: varAlpha(theme.palette.grey['900Channel'], 0.72),
},
}),
...(latestDocLarge && {
pt: {
xs: 'calc(100% * 4 / 3)',
sm: 'calc(100% * 3 / 4.66)',
},
}),
})}
>
{renderShape}
{renderAvatar}
{renderCover}
</Box>
<Box
sx={(theme) => ({
p: theme.spacing(6, 3, 3, 3),
...((latestDocLarge || latestDoc) && {
width: 1,
bottom: 0,
position: 'absolute',
}),
})}
>
{renderDate}
{renderTitle}
{renderInfo}
</Box>
</Card>
);
}

View File

@ -0,0 +1,59 @@
import type { Theme, SxProps } from '@mui/material/styles';
import TextField from '@mui/material/TextField';
import InputAdornment from '@mui/material/InputAdornment';
import Autocomplete, { autocompleteClasses } from '@mui/material/Autocomplete';
import { Iconify } from 'src/components/iconify';
import type { IDocItem } from './doc-item';
// ----------------------------------------------------------------------
type DocSearchProps = {
posts: IDocItem[];
sx?: SxProps<Theme>;
};
export function DocSearch({ posts, sx }: DocSearchProps) {
return (
<Autocomplete
sx={{ width: 280 }}
autoHighlight
popupIcon={null}
slotProps={{
paper: {
sx: {
width: 320,
[`& .${autocompleteClasses.option}`]: {
typography: 'body2',
},
...sx,
},
},
}}
options={posts}
getOptionLabel={(post) => post.title}
isOptionEqualToValue={(option, value) => option.id === value.id}
renderInput={(params) => (
<TextField
{...params}
placeholder="Search post..."
slotProps={{
input: {
...params.InputProps,
startAdornment: (
<InputAdornment position="start">
<Iconify
icon="eva:search-fill"
sx={{ ml: 1, width: 20, height: 20, color: 'text.disabled' }}
/>
</InputAdornment>
),
},
}}
/>
)}
/>
);
}

View File

@ -0,0 +1,96 @@
import type { ButtonProps } from '@mui/material/Button';
import { useState, useCallback } from 'react';
import { varAlpha } from 'minimal-shared/utils';
import Button from '@mui/material/Button';
import Popover from '@mui/material/Popover';
import MenuList from '@mui/material/MenuList';
import MenuItem, { menuItemClasses } from '@mui/material/MenuItem';
import { Iconify } from 'src/components/iconify';
// ----------------------------------------------------------------------
type DocSortProps = ButtonProps & {
sortBy: string;
onSort: (newSort: string) => void;
options: { value: string; label: string }[];
};
export function DocSort({ options, sortBy, onSort, sx, ...other }: DocSortProps) {
const [openPopover, setOpenPopover] = useState<HTMLButtonElement | null>(null);
const handleOpenPopover = useCallback((event: React.MouseEvent<HTMLButtonElement>) => {
setOpenPopover(event.currentTarget);
}, []);
const handleClosePopover = useCallback(() => {
setOpenPopover(null);
}, []);
return (
<>
<Button
disableRipple
color="inherit"
onClick={handleOpenPopover}
endIcon={
<Iconify
icon={openPopover ? 'eva:arrow-ios-upward-fill' : 'eva:arrow-ios-downward-fill'}
sx={{
ml: -0.5,
}}
/>
}
sx={[
{
bgcolor: (theme) => varAlpha(theme.vars.palette.grey['500Channel'], 0.08),
},
...(Array.isArray(sx) ? sx : [sx]),
]}
{...other}
>
{options.find((option) => option.value === sortBy)?.label}
</Button>
<Popover
open={!!openPopover}
anchorEl={openPopover}
onClose={handleClosePopover}
anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}
transformOrigin={{ vertical: 'top', horizontal: 'right' }}
>
<MenuList
disablePadding
sx={{
p: 0.5,
gap: 0.5,
width: 160,
display: 'flex',
flexDirection: 'column',
[`& .${menuItemClasses.root}`]: {
px: 1,
gap: 2,
borderRadius: 0.75,
[`&.${menuItemClasses.selected}`]: { bgcolor: 'action.selected' },
},
}}
>
{options.map((option) => (
<MenuItem
key={option.value}
selected={option.value === sortBy}
onClick={() => {
onSort(option.value);
handleClosePopover();
}}
>
{option.label}
</MenuItem>
))}
</MenuList>
</Popover>
</>
);
}

View File

@ -0,0 +1,35 @@
import { useState } from 'react';
import TextField from '@mui/material/TextField';
// ----------------------------------------------------------------------
type BoolFilterProps = {
label: string;
}
const isNumbers = (str: string) => /^[0-9]*$/.test(str);
export function IntFilter({ label }: BoolFilterProps) {
const [val, setVal] = useState("");
const onInputChange = (event: any) => {
const value = event.target.value;
if (isNumbers(value)) {
setVal(value);
}
};
return (
<TextField label={label} value={val} onChange={onInputChange} />
);
}
export function DecimalFilter({ label }: BoolFilterProps) {
return (
<TextField
type="number"
label={label}
variant="standard"
/>
);
}

View File

@ -0,0 +1,160 @@
import React from 'react';
import { useState, useCallback, useEffect } from 'react';
import Box from '@mui/material/Box';
import Grid from '@mui/material/Grid';
import Button from '@mui/material/Button';
import TextField from '@mui/material/TextField';
import Typography from '@mui/material/Typography';
import Pagination from '@mui/material/Pagination';
import { DashboardContent } from 'src/layouts/dashboard';
import { Filter, getFiltersAsync } from 'src/api/filter-service';
import { Iconify } from 'src/components/iconify';
import { DocItem } from '../doc-item';
import { BoolFilter } from '../bool-filter';
import { DecimalFilter, IntFilter } from '../num-filter';
import type { IDocItem } from '../doc-item';
// ----------------------------------------------------------------------
type Props = {
posts: IDocItem[];
};
export function DocSearchView({ posts }: Props) {
const [sortBy, setSortBy] = useState('latest');
const [filters, setFilters] = useState<Filter[]>([])
const [disabledStates, setDisabledStates] = useState<Record<number, boolean>>({});
const setDisabledState = useCallback((index: number, state: boolean) => {
setDisabledStates(prev => ({
...prev,
[index]: state,
}));
}, []);
const handleSort = useCallback((newSort: string) => {
setSortBy(newSort);
}, []);
useEffect(() => {
getFiltersAsync().then((res) => {
setFilters(res);
const newDisabledStates = res.reduce<Record<number, boolean>>((acc, filter, index) => {
if (filter.type === 'BOOLEAN') {
acc[index] = true;
}
return acc;
}, {});
setDisabledStates(newDisabledStates);
});
}, []);
//#region example components
// <Box
// sx={{
// mb: 5,
// display: 'flex',
// alignItems: 'center',
// justifyContent: 'space-between',
// }}
// >
// <DocSearch posts={posts} />
// <DocSort
// sortBy={sortBy}
// onSort={handleSort}
// options={[
// { value: 'latest', label: 'Latest' },
// { value: 'popular', label: 'Popular' },
// { value: 'oldest', label: 'Oldest' },
// ]}
// />
// </Box>
//#endregion
return (
<DashboardContent>
<Box
sx={{
mb: 5,
display: 'flex',
alignItems: 'center',
}}
>
<Typography variant="h4" sx={{ flexGrow: 1 }}>
Document Search
</Typography>
<Button
variant="contained"
color="inherit"
startIcon={<Iconify icon="mingcute:add-line" />}
>
New filter
</Button>
</Box>
<>
{filters.map((filter, index) => {
let filterComp;
switch (filter.type) {
case 'BOOLEAN':
filterComp = <BoolFilter label={filter.label ?? filter.name} />
break;
case 'INTEGER':
filterComp = <IntFilter label={filter.label ?? filter.name} />
break;
case 'DECIMAL':
filterComp = <DecimalFilter label={filter.label ?? filter.name} />
break;
case 'VARCHAR':
case 'DATE':
default:
filterComp = <TextField id={`filter-${filter.id.toString()}`} label={filter.label ?? filter.type} variant="filled" />
break;
}
return (
<Box
sx={{
mb: 5,
display: 'flex',
alignItems: 'center',
justifyContent: 'space-between',
}}
>
{filterComp}
</Box>
)
}
)}
</>
<Grid container spacing={3}>
{posts.map((post, index) => {
const latestDocLarge = index === 0;
const latestDoc = index === 1 || index === 2;
return (
<Grid
key={post.id}
size={{
xs: 12,
sm: latestDocLarge ? 12 : 6,
md: latestDocLarge ? 6 : 3,
}}
>
<DocItem post={post} latestDoc={latestDoc} latestDocLarge={latestDocLarge} />
</Grid>
);
})}
</Grid>
<Pagination count={10} color="primary" sx={{ mt: 8, mx: 'auto' }} />
</DashboardContent>
);
}

View File

@ -0,0 +1 @@
export * from './doc-search-view';

View File

@ -47,12 +47,10 @@
dependencies: dependencies:
"@babel/types" "^7.27.0" "@babel/types" "^7.27.0"
"@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.26.10", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.3", "@babel/runtime@^7.26.10", "@babel/runtime@^7.27.6", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7":
version "7.27.0" version "7.27.6"
resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz"
integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== integrity sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==
dependencies:
regenerator-runtime "^0.14.0"
"@babel/template@^7.27.0": "@babel/template@^7.27.0":
version "7.27.0" version "7.27.0"
@ -101,7 +99,7 @@
source-map "^0.5.7" source-map "^0.5.7"
stylis "4.2.0" stylis "4.2.0"
"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": "@emotion/cache@^11.14.0":
version "11.14.0" version "11.14.0"
resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz" resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz"
integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==
@ -351,10 +349,17 @@
"@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/resolve-uri" "^3.1.0"
"@jridgewell/sourcemap-codec" "^1.4.14" "@jridgewell/sourcemap-codec" "^1.4.14"
"@mui/core-downloads-tracker@^7.0.1": "@mui/core-downloads-tracker@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.2.0.tgz"
integrity sha512-T5DNVnSD9pMbj4Jk/Uphz+yvj9dfpl2+EqsOuJtG12HxEihNG5pd3qzX5yM1Id4dDwKRvM3dPVcxyzavTFhJeA== integrity sha512-d49s7kEgI5iX40xb2YPazANvo7Bx0BLg/MNRwv+7BVpZUzXj1DaVCKlQTDex3gy/0jsCb4w7AY2uH4t4AJvSog==
"@mui/icons-material@^7.2.0":
version "7.2.0"
resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.2.0.tgz"
integrity sha512-gRCspp3pfjHQyTmSOmYw7kUQTd9Udpdan4R8EnZvqPeoAtHnPzkvjBrBqzKaoAbbBp5bGF7BcD18zZJh4nwu0A==
dependencies:
"@babel/runtime" "^7.27.6"
"@mui/lab@^7.0.0-beta.10": "@mui/lab@^7.0.0-beta.10":
version "7.0.0-beta.10" version "7.0.0-beta.10"
@ -368,77 +373,77 @@
clsx "^2.1.1" clsx "^2.1.1"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/material@^7.0.1": "@mui/material@^7.0.1", "@mui/material@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/material/-/material-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/material/-/material-7.2.0.tgz"
integrity sha512-tQwjIIsn/UUSCHoCIQVkANuLua67h7Ro9M9gIHoGWaFbJFuF6cSO4Oda2olDVqIs4SWG+PaDChuu6SngxsaoyQ== integrity sha512-NTuyFNen5Z2QY+I242MDZzXnFIVIR6ERxo7vntFi9K1wCgSwvIl0HcAO2OOydKqqKApE6omRiYhpny1ZhGuH7Q==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@mui/core-downloads-tracker" "^7.0.1" "@mui/core-downloads-tracker" "^7.2.0"
"@mui/system" "^7.0.1" "@mui/system" "^7.2.0"
"@mui/types" "^7.4.0" "@mui/types" "^7.4.4"
"@mui/utils" "^7.0.1" "@mui/utils" "^7.2.0"
"@popperjs/core" "^2.11.8" "@popperjs/core" "^2.11.8"
"@types/react-transition-group" "^4.4.12" "@types/react-transition-group" "^4.4.12"
clsx "^2.1.1" clsx "^2.1.1"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
react-is "^19.0.0" react-is "^19.1.0"
react-transition-group "^4.4.5" react-transition-group "^4.4.5"
"@mui/private-theming@^7.0.1": "@mui/private-theming@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.2.0.tgz"
integrity sha512-1kQ7REYjjzDukuMfTbAjm3pLEhD7gUMC2bWhg9VD6f6sHzyokKzX0XHzlr3IdzNWBjPytGkzHpPIRQrUOoPLCQ== integrity sha512-y6N1Yt3T5RMxVFnCh6+zeSWBuQdNDm5/UlM0EAYZzZR/1u+XKJWYQmbpx4e+F+1EpkYi3Nk8KhPiQDi83M3zIw==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@mui/utils" "^7.0.1" "@mui/utils" "^7.2.0"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/styled-engine@^7.0.1": "@mui/styled-engine@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.2.0.tgz"
integrity sha512-BeGe4xZmF7tESKhmctYrL54Kl25kGHPKVdZYM5qj5Xz76WM/poY+d8EmAqUesT6k2rbJWPp2gtOAXXinNCGunQ== integrity sha512-yq08xynbrNYcB1nBcW9Fn8/h/iniM3ewRguGJXPIAbHvxEF7Pz95kbEEOAAhwzxMX4okhzvHmk0DFuC5ayvgIQ==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@emotion/cache" "^11.13.5" "@emotion/cache" "^11.14.0"
"@emotion/serialize" "^1.3.3" "@emotion/serialize" "^1.3.3"
"@emotion/sheet" "^1.4.0" "@emotion/sheet" "^1.4.0"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/system@^7.0.1": "@mui/system@^7.0.1", "@mui/system@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/system/-/system-7.2.0.tgz"
integrity sha512-pK+puz0hRPHEKGlcPd80mKYD3jpyi0uVIwWffox1WZgPTQMw2dCKLcD+9ndMDJADnrKzmKlpoH756PPFh2UvWA== integrity sha512-PG7cm/WluU6RAs+gNND2R9vDwNh+ERWxPkqTaiXQJGIFAyJ+VxhyKfzpdZNk0z0XdmBxxi9KhFOpgxjehf/O0A==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@mui/private-theming" "^7.0.1" "@mui/private-theming" "^7.2.0"
"@mui/styled-engine" "^7.0.1" "@mui/styled-engine" "^7.2.0"
"@mui/types" "^7.4.0" "@mui/types" "^7.4.4"
"@mui/utils" "^7.0.1" "@mui/utils" "^7.2.0"
clsx "^2.1.1" clsx "^2.1.1"
csstype "^3.1.3" csstype "^3.1.3"
prop-types "^15.8.1" prop-types "^15.8.1"
"@mui/types@^7.4.0": "@mui/types@^7.4.0", "@mui/types@^7.4.4":
version "7.4.0" version "7.4.4"
resolved "https://registry.npmjs.org/@mui/types/-/types-7.4.0.tgz" resolved "https://registry.npmjs.org/@mui/types/-/types-7.4.4.tgz"
integrity sha512-TxJ4ezEeedWHBjOmLtxI203a9DII9l4k83RXmz1PYSAmnyEcK2PglTNmJGxswC/wM5cdl9ap2h8lnXvt2swAGQ== integrity sha512-p63yhbX52MO/ajXC7hDHJA5yjzJekvWD3q4YDLl1rSg+OXLczMYPvTuSuviPRCgRX8+E42RXz1D/dz9SxPSlWg==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@mui/utils@^7.0.1": "@mui/utils@^7.0.1", "@mui/utils@^7.2.0":
version "7.0.1" version "7.2.0"
resolved "https://registry.npmjs.org/@mui/utils/-/utils-7.0.1.tgz" resolved "https://registry.npmjs.org/@mui/utils/-/utils-7.2.0.tgz"
integrity sha512-SJKrrebNpmK9rJCnVL29nGPhPXQYtBZmb7Dsp0f58uIUhQfAKcBXHE4Kjs06SX4CwqeCuwEVgcHY+MgAO6XQ/g== integrity sha512-O0i1GQL6MDzhKdy9iAu5Yr0Sz1wZjROH1o3aoztuivdCXqEeQYnEjTDiRLGuFxI9zrUbTHBwobMyQH5sNtyacw==
dependencies: dependencies:
"@babel/runtime" "^7.26.10" "@babel/runtime" "^7.27.6"
"@mui/types" "^7.4.0" "@mui/types" "^7.4.4"
"@types/prop-types" "^15.7.14" "@types/prop-types" "^15.7.15"
clsx "^2.1.1" clsx "^2.1.1"
prop-types "^15.8.1" prop-types "^15.8.1"
react-is "^19.0.0" react-is "^19.1.0"
"@nodelib/fs.scandir@2.1.5": "@nodelib/fs.scandir@2.1.5":
version "2.1.5" version "2.1.5"
@ -571,10 +576,10 @@
resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz" resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz"
integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==
"@types/prop-types@^15.7.14": "@types/prop-types@^15.7.15":
version "15.7.14" version "15.7.15"
resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz" resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz"
integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== integrity sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==
"@types/react-dom@^19.1.1": "@types/react-dom@^19.1.1":
version "19.1.1" version "19.1.1"
@ -2308,7 +2313,7 @@ react-is@^16.7.0:
resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^19.0.0: react-is@^19.1.0:
version "19.1.0" version "19.1.0"
resolved "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz" resolved "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz"
integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg== integrity sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==
@ -2364,11 +2369,6 @@ reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9:
get-proto "^1.0.1" get-proto "^1.0.1"
which-builtin-type "^1.2.1" which-builtin-type "^1.2.1"
regenerator-runtime@^0.14.0:
version "0.14.1"
resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz"
integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==
regexp.prototype.flags@^1.5.3: regexp.prototype.flags@^1.5.3:
version "1.5.4" version "1.5.4"
resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz" resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz"