From 3c14eddef583bbcd041e2ef5b8de4c507818cd77 Mon Sep 17 00:00:00 2001 From: Cody O'Donnell Date: Thu, 23 Jan 2025 14:43:30 -0800 Subject: [PATCH] Update cookiecutter templates --- .../base/{@cookiecutter.name@}/.eslintrc | 49 ++++ .../{@cookiecutter.name@}/.husky/pre-commit | 2 + .../base/{@cookiecutter.name@}/.lintstagedrc | 3 + .../base/{@cookiecutter.name@}/.prettierrc | 9 + .../base/{@cookiecutter.name@}/README.md | 2 +- .../{@cookiecutter.name@}/cypress.config.ts | 7 +- .../cypress/e2e/home.cy.ts | 2 +- .../cypress/support/commands.ts | 2 +- .../cypress/support/e2e.ts | 4 +- .../base/{@cookiecutter.name@}/package.json | 20 +- .../contribute-data/contributor_datasets.json | 43 ++- .../monitor-activities/experiment_detail.json | 2 +- .../data/default/run-computation/inputs.json | 2 +- .../data/default/run-computation/list.json | 2 +- .../run-computation/results_bar_chart.json | 2 +- .../run-computation/results_line_chart.json | 2 +- .../run-computation/results_table.json | 2 +- .../search-data-repositories/datasets.json | 155 +++++++++-- .../base/{@cookiecutter.name@}/src/App.tsx | 15 +- .../src/components/ApiModal.tsx | 33 ++- .../src/components/AppLink.tsx | 16 +- .../src/components/ArrayWithPopover.tsx | 26 +- .../src/components/CellWithPopover.tsx | 16 +- .../src/components/CheckboxList.tsx | 23 +- .../src/components/Collapsible.tsx | 32 +-- .../src/components/FilterContext.tsx | 80 +++--- .../src/components/FilterField.tsx | 172 ++++++++---- .../src/components/FilterGroup.tsx | 59 ++-- .../src/components/Filters.tsx | 60 +++-- .../src/components/FiltersPanel.tsx | 20 +- .../src/components/Footer.tsx | 14 +- .../src/components/Formula.tsx | 12 +- .../src/components/ImageWrapper.css | 2 +- .../src/components/ImageWrapper.tsx | 8 +- .../src/components/LabelValueTable.tsx | 39 ++- .../src/components/Layout.tsx | 6 +- .../src/components/LinearMeter.tsx | 12 +- .../src/components/PageHeader.tsx | 26 +- .../src/components/RangeSlider.tsx | 18 +- .../src/components/SciDataGrid.tsx | 115 ++++---- .../src/components/StrudelSlider.tsx | 18 +- .../src/components/TopBar.tsx | 22 +- .../src/context/ContextProvider.tsx | 47 ++-- .../src/context/actions.ts | 4 +- .../src/declarations.d.ts | 5 +- .../base/{@cookiecutter.name@}/src/index.css | 2 +- .../base/{@cookiecutter.name@}/src/main.tsx | 12 +- .../{@cookiecutter.name@}/src/pages/index.tsx | 76 ++++-- .../src/pages/playground/index.tsx | 18 +- .../base/{@cookiecutter.name@}/src/router.ts | 30 ++- .../base/{@cookiecutter.name@}/src/theme.tsx | 32 +-- .../src/types/filters.types.tsx | 10 +- .../src/utils/filters.utils.ts | 48 ++-- .../src/utils/queryParams.utils.ts | 92 +++++-- .../src/utils/string.utils.ts | 4 +- .../src/utils/useDataFromSource.tsx | 26 +- .../src/utils/useDetailQuery.ts | 47 ++++ .../src/utils/useInterval.tsx | 26 +- .../src/utils/useListQuery.ts | 77 ++++++ .../{@cookiecutter.name@}/strudel.config.ts | 14 +- .../base/{@cookiecutter.name@}/tsconfig.json | 8 +- .../base/{@cookiecutter.name@}/vite.config.ts | 6 +- .../_config/taskflow.config.ts | 88 +++--- .../_config/taskflow.types.ts | 48 ++-- .../_context/ContextProvider.tsx | 83 +++--- .../{@cookiecutter.name@}/_context/actions.ts | 20 +- .../{@cookiecutter.name@}/_layout.tsx | 14 +- .../_tests/compare-data.cy.ts | 26 ++ .../{@cookiecutter.name@}/compare.tsx | 13 +- .../{@cookiecutter.name@}/index.tsx | 64 +++-- .../{@cookiecutter.name@}/new.tsx | 20 +- .../_components/DataFilesPanel.tsx | 147 +++++----- .../_components/DatasetView.tsx | 82 +++--- .../_components/MetadataPanel.tsx | 71 +++-- .../_components/ValidationChecks.tsx | 82 +++--- .../_config/taskflow.config.ts | 68 ++--- .../_config/taskflow.types.ts | 42 +-- .../_context/ContextProvider.tsx | 49 ++-- .../{@cookiecutter.name@}/_context/actions.ts | 2 +- .../{@cookiecutter.name@}/_context/utils.ts | 38 ++- .../{@cookiecutter.name@}/_layout.tsx | 6 +- .../_tests/contribute-data.cy.ts | 32 +++ .../{@cookiecutter.name@}/index.tsx | 189 ++++++++----- .../{@cookiecutter.name@}/new.tsx | 32 ++- .../{@cookiecutter.name@}/portal.tsx | 61 +++-- .../{@cookiecutter.name@}/review.tsx | 38 ++- .../{@cookiecutter.name@}/[id].tsx | 62 ++--- .../_components/DataView.tsx | 75 ++---- .../_components/DataViewHeader.tsx | 19 +- .../_components/FiltersPanel.tsx | 10 +- .../_components/PreviewPanel.tsx | 127 +++++---- .../_config/taskflow.config.ts | 118 ++++---- .../_config/taskflow.types.ts | 66 ++--- .../{@cookiecutter.name@}/_layout.tsx | 8 +- .../_tests/explore-data.cy.ts | 4 +- .../{@cookiecutter.name@}/index.tsx | 23 +- .../_config/taskflow.config.ts | 18 +- .../_config/taskflow.types.ts | 20 +- .../{@cookiecutter.name@}/_layout.tsx | 6 +- .../_tests/monitor-activities.cy.ts | 24 ++ .../{@cookiecutter.name@}/calendar.tsx | 8 +- .../{@cookiecutter.name@}/detail.tsx | 85 +++--- .../{@cookiecutter.name@}/index.tsx | 68 ++--- .../{@cookiecutter.name@}/[id]/_layout.tsx | 41 ++- .../[id]/data-inputs.tsx | 73 +++-- .../{@cookiecutter.name@}/[id]/results.tsx | 96 ++++--- .../{@cookiecutter.name@}/[id]/running.tsx | 61 ++++- .../{@cookiecutter.name@}/[id]/settings.tsx | 66 ++++- .../_components/NewScenarioModal.tsx | 33 ++- .../_config/taskflow.config.ts | 145 +++++----- .../_config/taskflow.types.ts | 75 +++--- .../_context/ContextProvider.tsx | 170 +++++++----- .../{@cookiecutter.name@}/_context/actions.ts | 22 +- .../{@cookiecutter.name@}/_layout.tsx | 38 +-- .../_tests/run-computation.cy.ts | 39 +++ .../{@cookiecutter.name@}/index.tsx | 41 +-- .../{@cookiecutter.name@}/[id].tsx | 252 +++++++++++------- .../_components/DataListCard.tsx | 100 ++++--- .../_components/DataListPanel.tsx | 203 ++++++++++---- .../_components/FiltersPanel.tsx | 99 ++----- .../_components/PreviewPanel.tsx | 182 ++++++++----- .../_config/taskflow.config.ts | 117 ++++---- .../_config/taskflow.types.ts | 60 +++-- .../_context/ContextProvider.tsx | 108 +++++--- .../{@cookiecutter.name@}/_context/actions.ts | 24 +- .../{@cookiecutter.name@}/_layout.tsx | 24 +- .../{@cookiecutter.name@}/index.tsx | 108 ++++---- 127 files changed, 3631 insertions(+), 2340 deletions(-) create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/.eslintrc create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/.husky/pre-commit create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/.lintstagedrc create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/.prettierrc create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/src/utils/useDetailQuery.ts create mode 100644 strudel-cookiecutter/base/{@cookiecutter.name@}/src/utils/useListQuery.ts create mode 100644 strudel-cookiecutter/compare-data/{@cookiecutter.name@}/_tests/compare-data.cy.ts create mode 100644 strudel-cookiecutter/contribute-data/{@cookiecutter.name@}/_tests/contribute-data.cy.ts create mode 100644 strudel-cookiecutter/monitor-activities/{@cookiecutter.name@}/_tests/monitor-activities.cy.ts create mode 100644 strudel-cookiecutter/run-computation/{@cookiecutter.name@}/_tests/run-computation.cy.ts diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/.eslintrc b/strudel-cookiecutter/base/{@cookiecutter.name@}/.eslintrc new file mode 100644 index 00000000..b4ff0458 --- /dev/null +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/.eslintrc @@ -0,0 +1,49 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "project": "./tsconfig.json", + "ecmaVersion": 2020, // Allows for the parsing of modern JS + "ecmaFeatures": { + "jsx": true // Allows for the parsing of JSX + } + }, + "ignorePatterns": [ + "package-lock.json", + "package.json", + "!.stylelintrc.json", + "*.md", + "*.css", + "dist" + ], + "extends": ["airbnb-typescript", "plugin:prettier/recommended"], + "plugins": ["@typescript-eslint", "import", "react", "prettier"], + "rules": { + "@typescript-eslint/no-explicit-any": "off", // allow any because template often can't predict users' types + "import/no-extraneous-dependencies": ["error", { "devDependencies": true }], + "react/no-danger": "off", // it's self explainatory that no-danger should be used sparingly + "react/prop-types": "off", // as long as TS strict mode is off this is not required + "react/function-component-definition": [ + 2, + { + "namedComponents": "arrow-function", + "unnamedComponents": "arrow-function" + } + ], + "react/jsx-props-no-spreading": "off", + "react/react-in-jsx-scope": "off", + "no-console": "error", // no console statements allowed, + "no-plusplus": "off", + "prettier/prettier": "off" // don't show prettier errors as it will be fixed when saved anyway + }, + "settings": { + "react": { + "version": "detect" + } + }, + "env": { + "node": true, + "browser": true, + "amd": true + } +} \ No newline at end of file diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/.husky/pre-commit b/strudel-cookiecutter/base/{@cookiecutter.name@}/.husky/pre-commit new file mode 100644 index 00000000..62cdd246 --- /dev/null +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/.husky/pre-commit @@ -0,0 +1,2 @@ +cd strudel-taskflows +npx lint-staged \ No newline at end of file diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/.lintstagedrc b/strudel-cookiecutter/base/{@cookiecutter.name@}/.lintstagedrc new file mode 100644 index 00000000..6bcb9598 --- /dev/null +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "*.{js,jsx,ts,tsx,css,md,mdx}": ["eslint --cache --fix", "prettier --write"] +} diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/.prettierrc b/strudel-cookiecutter/base/{@cookiecutter.name@}/.prettierrc new file mode 100644 index 00000000..488d1350 --- /dev/null +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/.prettierrc @@ -0,0 +1,9 @@ +{ + "tabWidth": 2, + "useTabs": false, + "printWidth": 80, + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "endOfLine": "lf" +} diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/README.md b/strudel-cookiecutter/base/{@cookiecutter.name@}/README.md index 178f2b25..113983b3 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/README.md +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/README.md @@ -26,7 +26,7 @@ npm start Open [http://localhost:3000](http://localhost:3000) to view the app in the browser. -Begin modifying the templates in `src/app`. +Begin modifying the templates in `src/pages`. ## Learn More diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress.config.ts b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress.config.ts index f5b3bb98..86254da6 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress.config.ts +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress.config.ts @@ -1,8 +1,11 @@ -import { defineConfig } from "cypress"; +import { defineConfig } from 'cypress'; export default defineConfig({ e2e: { baseUrl: 'http://localhost:5175/', - specPattern: ['cypress/e2e/**/*.cy.{js,jsx,ts,tsx}', 'src/**/*.cy.{js,jsx,ts,tsx}'] + specPattern: [ + 'cypress/e2e/**/*.cy.{js,jsx,ts,tsx}', + 'src/**/*.cy.{js,jsx,ts,tsx}', + ], }, }); diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/e2e/home.cy.ts b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/e2e/home.cy.ts index 6cc7372f..b8b37eb2 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/e2e/home.cy.ts +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/e2e/home.cy.ts @@ -3,4 +3,4 @@ describe('The Home Page', () => { cy.visit('/'); cy.contains('Registered Pages'); }); -}); \ No newline at end of file +}); diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/commands.ts b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/commands.ts index 698b01a4..95857aea 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/commands.ts +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/commands.ts @@ -34,4 +34,4 @@ // visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable // } // } -// } \ No newline at end of file +// } diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/e2e.ts b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/e2e.ts index f80f74f8..598ab5f0 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/e2e.ts +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/cypress/support/e2e.ts @@ -14,7 +14,7 @@ // *********************************************************** // Import commands.js using ES2015 syntax: -import './commands' +import './commands'; // Alternatively you can use CommonJS syntax: -// require('./commands') \ No newline at end of file +// require('./commands') diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/package.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/package.json index f9076eb2..f42ccaaf 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/package.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/package.json @@ -8,9 +8,14 @@ "start": "vite", "dev": "vite", "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "deploy": "gh-pages -d dist -e demo" + "deploy": "gh-pages -d dist -e demo", + "style:all": "tsc && npm run lint && npm run prettier", + "lint": "eslint . '**/*.{js,jsx,ts,tsx}'", + "lint:fix": "eslint . --fix '**/*.{js,jsx,ts,tsx}'", + "prettier": "prettier . --check '**/*.{js,jsx,ts,tsx}'", + "prettier:fix": "prettier . --write '**/*.{js,jsx,ts,tsx}'", + "prepare": "cd ../ && husky ./strudel-taskflows/.husky" }, "dependencies": { "@emotion/react": "^11.11.4", @@ -41,11 +46,20 @@ "@vitejs/plugin-react": "^4.2.1", "cypress": "^13.15.0", "eslint": "^8.57.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-import": "^2.31.0", + "eslint-plugin-jsx-a11y": "^6.10.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "gh-pages": "^6.1.1", + "husky": "^9.1.6", + "lint-staged": "^15.2.10", + "prettier": "^3.3.3", "typescript": "^5.2.2", - "vite": "^5.2.10" + "vite": "^5.4.14" }, "engines": { "node": "^18.18.0 || >=20.0.0" diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/contribute-data/contributor_datasets.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/contribute-data/contributor_datasets.json index c6af0d1a..2c8d0b59 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/contribute-data/contributor_datasets.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/contribute-data/contributor_datasets.json @@ -8,7 +8,15 @@ "citation": "Lindsey, B.D., Johnson, T.D., and Belitz, Kenneth, 2018, Data from Decadal Change in Groundwater Quality Web Site, 1988-2012: U.S. Geological Survey data release, https://doi.org/10.5066/F7PC30WD.", "doi": "10.5066/F7PC30WD", "summary": "Groundwater quality data were collected in 5,000 wells between 1988-2001 by the National Water-Quality Assessment Project. About 1,500 of these wells were sampled again between 2002-2012 to evaluate decadal changes in groundwater quality. Monitoring wells, domestic supply wells, and some public supply wells were included in this study.", - "tags": [ "NAWQA", "National Water Quality Program", "USGS Science Data Catalog (SDC)", "Cycle 3", "groundwater quality", "trends", "water quality"], + "tags": [ + "NAWQA", + "National Water Quality Program", + "USGS Science Data Catalog (SDC)", + "Cycle 3", + "groundwater quality", + "trends", + "water quality" + ], "category": "Groundwater", "purpose": "Data were collected as a part of the NAWQA Land use studies or Major aquifer studies. Initially data were collected to characterize the quality of shallow and medium depths of groundwater in the nation. Subsequent samples were collected to evaluate changes in concentrations over a decadal time span. Mapping criteria and benchmarks: The NAWQA Project has developed an interactive mapping tool that displays decadal changes in concentrations.", "point_of_contact": "Bruce D. Lindsey", @@ -41,7 +49,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Geospatial data were developed to characterize pre-fire biomass, burn severity, and biomass consumed for the Black Dragon Fire that burned in northern China in 1987. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -74,7 +88,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Heavy rainfall occurred across Louisiana, Texas, Arkansas, and Mississippi in March 2016 as a result of a slow-moving southward dip in the jetstream , funneling tropical moisture into Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Louisiana", "Mississippi", "Texas", "Floods", "USGS Data Catalog (SDC)"], + "tags": [ + "Louisiana", + "Mississippi", + "Texas", + "Floods", + "USGS Data Catalog (SDC)" + ], "category": "Floods", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -107,7 +127,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Bathymetric survey data of the Brandon Road Dam spillway was collected on May 27 and May 28, 2015 by the US Geological Survey (USGS) using Trimble Real-Time Kinematic Global Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Dam", "GPS measurement", "Brandon Road Lock and Dam", "Floods", "USGS Data Catalog (SDC)"], + "tags": [ + "Dam", + "GPS measurement", + "Brandon Road Lock and Dam", + "Floods", + "USGS Data Catalog (SDC)" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -140,7 +166,12 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "This data set presents the results of conducting Mercury Intrusion Porosimetry on core samples of the mudstone underlying the Naval Air Warfare Center, West Trenton, New Jersey Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Sedimentary rock", "porosity", "West Trenton", "USGS Data Catalog (SDC)"], + "tags": [ + "Sedimentary rock", + "porosity", + "West Trenton", + "USGS Data Catalog (SDC)" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -164,4 +195,4 @@ } ] } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/monitor-activities/experiment_detail.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/monitor-activities/experiment_detail.json index f8625cd7..f709181c 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/monitor-activities/experiment_detail.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/monitor-activities/experiment_detail.json @@ -89,4 +89,4 @@ "content": "Culpa id officia laborum cupidatat dolor mollit." } ] -} \ No newline at end of file +} diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/inputs.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/inputs.json index 1aa06d36..812ee6ea 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/inputs.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/inputs.json @@ -39,4 +39,4 @@ "upperBound": 1, "constraints": "value" } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/list.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/list.json index 246fa9cc..f564ef14 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/list.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/list.json @@ -34,4 +34,4 @@ "createdDate": "05/23/2023", "status": "Completed" } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_bar_chart.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_bar_chart.json index 743c8e93..b1050155 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_bar_chart.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_bar_chart.json @@ -11,4 +11,4 @@ "name": "Group 2", "type": "bar" } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_line_chart.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_line_chart.json index 2e72bae1..de996997 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_line_chart.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_line_chart.json @@ -9,4 +9,4 @@ "y": [16, 5, 11, 9], "type": "scatter" } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_table.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_table.json index 1aa06d36..812ee6ea 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_table.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/run-computation/results_table.json @@ -39,4 +39,4 @@ "upperBound": 1, "constraints": "value" } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/search-data-repositories/datasets.json b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/search-data-repositories/datasets.json index a74ca7bf..a52174f2 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/search-data-repositories/datasets.json +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/public/data/default/search-data-repositories/datasets.json @@ -8,7 +8,15 @@ "citation": "Lindsey, B.D., Johnson, T.D., and Belitz, Kenneth, 2018, Data from Decadal Change in Groundwater Quality Web Site, 1988-2012: U.S. Geological Survey data release, https://doi.org/10.5066/F7PC30WD.", "doi": "10.5066/F7PC30WD", "summary": "Groundwater quality data were collected in 5,000 wells between 1988-2001 by the National Water-Quality Assessment Project. About 1,500 of these wells were sampled again between 2002-2012 to evaluate decadal changes in groundwater quality. Monitoring wells, domestic supply wells, and some public supply wells were included in this study.", - "tags": [ "NAWQA", "National Water Quality Program", "USGS Science Data Catalog (SDC)", "Cycle 3", "groundwater quality", "trends", "water quality"], + "tags": [ + "NAWQA", + "National Water Quality Program", + "USGS Science Data Catalog (SDC)", + "Cycle 3", + "groundwater quality", + "trends", + "water quality" + ], "category": "Groundwater", "purpose": "Data were collected as a part of the NAWQA Land use studies or Major aquifer studies. Initially data were collected to characterize the quality of shallow and medium depths of groundwater in the nation. Subsequent samples were collected to evaluate changes in concentrations over a decadal time span. Mapping criteria and benchmarks: The NAWQA Project has developed an interactive mapping tool that displays decadal changes in concentrations.", "point_of_contact": "Bruce D. Lindsey", @@ -57,7 +65,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Geospatial data were developed to characterize pre-fire biomass, burn severity, and biomass consumed for the Black Dragon Fire that burned in northern China in 1987. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -106,7 +120,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Heavy rainfall occurred across Louisiana, Texas, Arkansas, and Mississippi in March 2016 as a result of a slow-moving southward dip in the jetstream , funneling tropical moisture into Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Louisiana", "Mississippi", "Texas", "Floods", "USGS Data Catalog (SDC)"], + "tags": [ + "Louisiana", + "Mississippi", + "Texas", + "Floods", + "USGS Data Catalog (SDC)" + ], "category": "Floods", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -155,7 +175,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Bathymetric survey data of the Brandon Road Dam spillway was collected on May 27 and May 28, 2015 by the US Geological Survey (USGS) using Trimble Real-Time Kinematic Global Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Dam", "GPS measurement", "Brandon Road Lock and Dam", "Floods", "USGS Data Catalog (SDC)"], + "tags": [ + "Dam", + "GPS measurement", + "Brandon Road Lock and Dam", + "Floods", + "USGS Data Catalog (SDC)" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -204,7 +230,12 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "This data set presents the results of conducting Mercury Intrusion Porosimetry on core samples of the mudstone underlying the Naval Air Warfare Center, West Trenton, New Jersey Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Sedimentary rock", "porosity", "West Trenton", "USGS Data Catalog (SDC)"], + "tags": [ + "Sedimentary rock", + "porosity", + "West Trenton", + "USGS Data Catalog (SDC)" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -253,7 +284,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Acetylene fermentation assays, nitrogen fixation assays, and growth studies were performed with Pelobacter sp. strain SFB93 and Pelobacter acetylenicus DSM3246. Data includes concentrations of acetylene and ethylene over time, and growth measured with OD680 and cell counts.", - "tags": ["Genetics", "Ecology", "Environmental health", "Geo Chemistry", "USGS Data Catalog (SDC)"], + "tags": [ + "Genetics", + "Ecology", + "Environmental health", + "Geo Chemistry", + "USGS Data Catalog (SDC)" + ], "category": "Biology", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -302,7 +339,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "The spring 2017 mainland sea otter count began on April 30, and although the shore-based counts were completed by May 12, 2017, the aerial counts were not completed until July 12. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["California", "Sea Otters", "Census", "Coastal", "USGS Data Catalog (SDC)"], + "tags": [ + "California", + "Sea Otters", + "Census", + "Coastal", + "USGS Data Catalog (SDC)" + ], "category": "Biology", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -351,7 +394,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Earthquakes", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -400,7 +449,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -449,7 +504,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -498,7 +559,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -547,7 +614,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Floods", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -596,7 +669,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Biology", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -645,7 +724,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Earthquakes", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -694,7 +779,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -743,7 +834,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Floods", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -792,7 +889,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Earthquakes", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -841,7 +944,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Groundwater", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -890,7 +999,13 @@ "citation": "Labore proident do aute et esse adipisicing veniam eiusmod culpa pariatur sunt officia.", "doi": "0000000000", "summary": "Est deserunt elit aliquip labore duis nostrud mollit sunt proident cillum. Mollit nisi sint laboris esse labore velit laboris. Ipsum id laborum et dolor laboris ut sint officia voluptate. Ipsum consectetur fugiat laboris sit Lorem duis minim fugiat.", - "tags": ["Boreal forest", "Carbon and greenhouse gas emissions", "China", "Ecology", "Forestry"], + "tags": [ + "Boreal forest", + "Carbon and greenhouse gas emissions", + "China", + "Ecology", + "Forestry" + ], "category": "Fires", "purpose": "Nostrud ullamco ea id consequat ex. Tempor deserunt laborum amet ex quis culpa laborum Lorem Lorem sunt do sit excepteur. Sunt ea velit non magna ut Lorem magna eu aute aliquip.", "point_of_contact": "Ernest O. Lawrence", @@ -930,4 +1045,4 @@ } ] } -] \ No newline at end of file +] diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/App.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/App.tsx index 8b65e235..f3380414 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/App.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/App.tsx @@ -2,8 +2,8 @@ import React, { useEffect } from 'react'; import { ThemeProvider } from '@mui/material/styles'; import { CssBaseline } from '@mui/material'; import { LocalizationProvider } from '@mui/x-date-pickers'; -import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' -import { routes } from '@generouted/react-router' +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import { routes } from '@generouted/react-router'; import { theme } from './theme'; import { AppProvider } from './context/ContextProvider'; import { ApiModal } from './components/ApiModal'; @@ -11,10 +11,9 @@ import { RouterProvider, createBrowserRouter } from 'react-router-dom'; import { config } from '../strudel.config'; import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; -const queryClient = new QueryClient() +const queryClient = new QueryClient(); const App: React.FC = () => { - /** * Set the html title for the app using the title in the config. */ @@ -28,13 +27,17 @@ const App: React.FC = () => { - + ); -} +}; export default App; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ApiModal.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ApiModal.tsx index 1ab5102d..ab57c99e 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ApiModal.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ApiModal.tsx @@ -1,7 +1,14 @@ import * as React from 'react'; import { useAppState } from '../context/ContextProvider'; import { closeApiModal } from '../context/actions'; -import { Button, Modal, Paper, Stack, TextField, Typography } from '@mui/material'; +import { + Button, + Modal, + Paper, + Stack, + TextField, + Typography, +} from '@mui/material'; import { useState } from 'react'; export const ApiModal: React.FC = () => { @@ -11,13 +18,13 @@ export const ApiModal: React.FC = () => { const handleClose = () => { app.dispatch(closeApiModal()); - } + }; const handleSubmit = () => { localStorage.setItem('apiTokenName', name); localStorage.setItem('apiTokenValue', value); window.location.reload(); - } + }; return (
@@ -27,7 +34,7 @@ export const ApiModal: React.FC = () => { aria-labelledby="modal-modal-title" aria-describedby="modal-modal-description" > - { API Authentication Required - Enter the name of your API token (e.g. X-ApiToken) and the value of your API token (e.g. abc123). + Enter the name of your API token (e.g. X-ApiToken) and the value + of your API token (e.g. abc123). - { setName(event.target.value); }} /> - { setValue(event.target.value); }} /> - @@ -70,4 +75,4 @@ export const ApiModal: React.FC = () => {
); -} \ No newline at end of file +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/AppLink.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/AppLink.tsx index cf46fc58..972a3c9f 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/AppLink.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/AppLink.tsx @@ -7,16 +7,10 @@ interface AppLinkProps extends LinkProps { } /** * Link component for in-app links. - * Wrapper for the MUI Link component with the - * react-router Link injected as the component so + * Wrapper for the MUI Link component with the + * react-router Link injected as the component so * that in-app links work. */ -export const AppLink: React.FC = ({ to, ...rest}) => { - return ( - - ) -} \ No newline at end of file +export const AppLink: React.FC = ({ to, ...rest }) => { + return ; +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ArrayWithPopover.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ArrayWithPopover.tsx index 19d2c884..c91aadbc 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ArrayWithPopover.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ArrayWithPopover.tsx @@ -1,16 +1,18 @@ -import { Box, Stack, Chip, Popover, Grid } from "@mui/material"; -import { useState } from "react"; +import { Box, Stack, Chip, Popover, Grid } from '@mui/material'; +import { useState } from 'react'; interface ArrayWithPopoverProps { - values: string[] | number[] + values: string[] | number[]; } /** * Array of Chips with a popover to show the full list. - * This is used to render arrays in table cells where the + * This is used to render arrays in table cells where the * list is cut off by the edge of the cell. */ -export const ArrayWithPopover: React.FC = ({ values }) => { +export const ArrayWithPopover: React.FC = ({ + values, +}) => { const [anchorEl, setAnchorEl] = useState(null); const handlePopoverOpen = (event: React.MouseEvent) => { @@ -23,15 +25,13 @@ export const ArrayWithPopover: React.FC = ({ values }) => const open = Boolean(anchorEl); return ( - + {values.map((v) => ( @@ -73,5 +73,5 @@ export const ArrayWithPopover: React.FC = ({ values }) => - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CellWithPopover.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CellWithPopover.tsx index f62ad083..b56aff65 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CellWithPopover.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CellWithPopover.tsx @@ -1,5 +1,5 @@ -import { Box, Popover } from "@mui/material"; -import { PropsWithChildren, useState } from "react"; +import { Box, Popover } from '@mui/material'; +import { PropsWithChildren, useState } from 'react'; /** * Generic inner cell content with a popover to show the full contents. @@ -19,13 +19,11 @@ export const CellWithPopover: React.FC = ({ children }) => { const open = Boolean(anchorEl); return ( - + = ({ children }) => { - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CheckboxList.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CheckboxList.tsx index 9cf879fc..b7138bdd 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CheckboxList.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/CheckboxList.tsx @@ -1,4 +1,9 @@ -import { Checkbox, FormControlLabel, FormGroup, FormGroupProps } from '@mui/material'; +import { + Checkbox, + FormControlLabel, + FormGroup, + FormGroupProps, +} from '@mui/material'; import React, { useEffect, useState } from 'react'; export type CheckboxOptionValue = string | number; @@ -21,8 +26,10 @@ export const CheckboxList: React.FC = ({ sx, ...rest }) => { - const [checkValues, setCheckValues] = useState(values); - + const [checkValues, setCheckValues] = useState( + values + ); + const handleChange = (checked: boolean, value: CheckboxOption['value']) => { if (checkValues === null && checked) { setCheckValues([value]); @@ -52,7 +59,7 @@ export const CheckboxList: React.FC = ({ @@ -69,17 +76,17 @@ export const CheckboxList: React.FC = ({ pr: 1, pl: 1, pb: 0, - pt: 0 + pt: 0, }} /> } sx={{ '&:not(:last-child)': { - mb: 1 - } + mb: 1, + }, }} /> ))} ); -} \ No newline at end of file +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Collapsible.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Collapsible.tsx index b78fec36..465c52b5 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Collapsible.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Collapsible.tsx @@ -20,7 +20,7 @@ export const Collapsible: React.FC = ({ const handleClick = () => { setIsOpenState(!isOpenState); - } + }; useEffect(() => { setIsOpenState(isOpen); @@ -40,37 +40,33 @@ export const Collapsible: React.FC = ({ width: '100%', '&:hover': { background: 'none', - opacity: 0.7 - } + opacity: 0.7, + }, }} > {!isOpenState && ( - )} {isOpenState && ( - )} {label} - {isOpenState && ( - - {children} - - )} + {isOpenState && {children}} - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterContext.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterContext.tsx index 8330b271..316f0fb7 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterContext.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterContext.tsx @@ -1,4 +1,9 @@ -import React, { PropsWithChildren, useContext, useEffect, useReducer } from 'react'; +import React, { + PropsWithChildren, + useContext, + useEffect, + useReducer, +} from 'react'; import { FilterOperator } from './FilterField'; export interface DataFilter { @@ -12,27 +17,35 @@ export interface FilterState { expandedGroup: string | number | boolean; } -const FilterContextAPI = React.createContext<{ - activeFilters: FilterState['activeFilters']; - expandedGroup: FilterState['expandedGroup']; - dispatch: React.Dispatch -} | undefined>(undefined); +const FilterContextAPI = React.createContext< + | { + activeFilters: FilterState['activeFilters']; + expandedGroup: FilterState['expandedGroup']; + dispatch: React.Dispatch; + } + | undefined +>(undefined); const initialState: FilterState = { activeFilters: [], expandedGroup: false, -} +}; -export type FilterAction = - | { type: 'SET_FILTER', payload: { field: string, value: any, operator: FilterOperator } } - | { type: 'SET_ACTIVE_FILTERS', payload: FilterState['activeFilters'] } - | { type: 'SET_EXPANDED_GROUP', payload: FilterState['expandedGroup']; } +export type FilterAction = + | { + type: 'SET_FILTER'; + payload: { field: string; value: any; operator: FilterOperator }; + } + | { type: 'SET_ACTIVE_FILTERS'; payload: FilterState['activeFilters'] } + | { type: 'SET_EXPANDED_GROUP'; payload: FilterState['expandedGroup'] }; function filterReducer(state: FilterState, action: FilterAction): FilterState { switch (action.type) { case 'SET_FILTER': { const filter = action.payload; - const existingIndex = state.activeFilters.findIndex((f) => f.field === filter.field); + const existingIndex = state.activeFilters.findIndex( + (f) => f.field === filter.field + ); const activeFilters = [...state.activeFilters]; if (existingIndex > -1) { if (filter.value) { @@ -45,23 +58,23 @@ function filterReducer(state: FilterState, action: FilterAction): FilterState { } return { ...state, - activeFilters - } + activeFilters, + }; } case 'SET_ACTIVE_FILTERS': { return { ...state, - activeFilters: action.payload - } + activeFilters: action.payload, + }; } case 'SET_EXPANDED_GROUP': { return { ...state, - expandedGroup: action.payload - } + expandedGroup: action.payload, + }; } default: { - throw new Error(`Unhandled action type`) + throw new Error(`Unhandled action type`); } } } @@ -71,16 +84,19 @@ interface FilterContextProps extends PropsWithChildren { onChange?: (filters: FilterState['activeFilters']) => void; } -export const FilterContext: React.FC = ({ +export const FilterContext: React.FC = ({ activeFilters = [], - onChange = (filters) => null, - children + onChange = () => null, + children, }) => { - const [state, dispatch] = useReducer(filterReducer, { ...initialState, activeFilters }); - const value = { + const [state, dispatch] = useReducer(filterReducer, { + ...initialState, + activeFilters, + }); + const value = { activeFilters: state.activeFilters, - expandedGroup: state.expandedGroup, - dispatch + expandedGroup: state.expandedGroup, + dispatch, }; /** @@ -94,13 +110,13 @@ export const FilterContext: React.FC = ({ {children} - ) -} + ); +}; export const useFilters = () => { - const context = useContext(FilterContextAPI) + const context = useContext(FilterContextAPI); if (context === undefined) { - throw new Error('useFilters must be used within a FilterContext') + throw new Error('useFilters must be used within a FilterContext'); } - return context -} \ No newline at end of file + return context; +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterField.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterField.tsx index 16959547..0ec26ff2 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterField.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterField.tsx @@ -1,14 +1,31 @@ import React, { useEffect, useState } from 'react'; -import { Box, Stack, StackProps, TextField, Tooltip, Typography } from '@mui/material'; +import { + Box, + Stack, + StackProps, + TextField, + Tooltip, + Typography, +} from '@mui/material'; import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; import { CheckboxList } from './CheckboxList'; import { RangeSlider } from './RangeSlider'; import { DatePicker } from '@mui/x-date-pickers'; import { useFilters } from './FilterContext'; -export type FilterOperator = 'contains' | 'contains-one-of' | 'equals' | 'equals-one-of' | 'between-inclusive' | 'between-dates-inclusive'; +export type FilterOperator = + | 'contains' + | 'contains-one-of' + | 'equals' + | 'equals-one-of' + | 'between-inclusive' + | 'between-dates-inclusive'; -export type FilterComponent = 'RangeSlider' | 'CheckboxList' | 'DateRange' | 'TextField'; +export type FilterComponent = + | 'RangeSlider' + | 'CheckboxList' + | 'DateRange' + | 'TextField'; interface FilterFieldProps extends StackProps { label: string; @@ -22,12 +39,15 @@ interface FilterFieldProps extends StackProps { /** * The type of the value should be dependent on the filterComponent */ -type FilterValue = - T extends 'RangeSlider' ? number[] : - T extends 'CheckboxList' ? string[] | number[] | null : - T extends 'DateRange' ? [Date | null, Date | null] : - T extends 'TextField' ? string | null : - never; +type FilterValue = T extends 'RangeSlider' + ? number[] + : T extends 'CheckboxList' + ? string[] | number[] | null + : T extends 'DateRange' + ? [Date | null, Date | null] + : T extends 'TextField' + ? string | null + : never; /** * Determine if a value is truthy or falsy in the context of a filter. @@ -42,10 +62,10 @@ export const hasValue = (value: any) => { } else { return !!value; } -} +}; /** - * + * */ export const FilterField: React.FC = ({ label, @@ -62,7 +82,7 @@ export const FilterField: React.FC = ({ const isActive = hasValue(currentFilter?.value); /** - * When a filter is canceled, reset its value to the proper + * When a filter is canceled, reset its value to the proper * empty or base state depending on the filter type. * In the activeFilters variable, empty filters will always be marked as null. */ @@ -81,42 +101,52 @@ export const FilterField: React.FC = ({ setValue(null); break; default: - console.log('Unknown filter type'); + throw new Error('Unknown filter type'); } - - dispatch({ type: 'SET_FILTER', payload: { field: field, value: null, operator } }); - } + + dispatch({ + type: 'SET_FILTER', + payload: { field: field, value: null, operator }, + }); + }; /** * Render filter component based on the `filterComponent` prop. */ - const getFilterComponent = ( - field: FilterFieldProps['field'], - filterComponent: FilterFieldProps['filterComponent'], - filterProps: FilterFieldProps['filterProps'], - ) => { + const getFilterComponent = () => { switch (filterComponent) { case 'CheckboxList': { return ( dispatch({ type: 'SET_FILTER', payload: { field: field, value: values, operator } })} + onChange={(values) => + dispatch({ + type: 'SET_FILTER', + payload: { field: field, value: values, operator }, + }) + } {...filterProps} /> ); } case 'RangeSlider': { - const handleSliderChange = (event: Event | React.SyntheticEvent, values: number | number[]) => { + const handleSliderChange = ( + event: Event | React.SyntheticEvent, + values: number | number[] + ) => { if (!Array.isArray(values)) { return; } let newValues: number[] | null = [...values]; /** Set to null if both ends of slider are at min/max */ if (values[0] === filterProps.min && values[1] === filterProps.max) { - newValues = null + newValues = null; } - dispatch({ type: 'SET_FILTER', payload: { field: field, value: newValues, operator } }) + dispatch({ + type: 'SET_FILTER', + payload: { field: field, value: newValues, operator }, + }); }; return ( @@ -126,53 +156,84 @@ export const FilterField: React.FC = ({ min={filterProps.min} max={filterProps.max} value={value || [filterProps.min, filterProps.max]} - onChange={(e, value) => setValue(value as number[])} + onChange={(e, v) => setValue(v as number[])} onChangeCommitted={handleSliderChange} {...filterProps} /> ); } case 'DateRange': { - const currentDateRange = activeFilters.find((filter) => filter.field === filter.field)?.value; - const hasValue = currentDateRange && Array.isArray(currentDateRange) && currentDateRange.length === 2; - const currentMin = hasValue && Array.isArray(currentDateRange) ? currentDateRange[0] : null; - const currentMax = hasValue && Array.isArray(currentDateRange) ? currentDateRange[1] : null; + const currentDateRange = activeFilters.find( + (filter) => filter.field === filter.field + )?.value; + const hasDateValue = + currentDateRange && + Array.isArray(currentDateRange) && + currentDateRange.length === 2; + const currentMin = + hasDateValue && Array.isArray(currentDateRange) + ? currentDateRange[0] + : null; + const currentMax = + hasDateValue && Array.isArray(currentDateRange) + ? currentDateRange[1] + : null; return ( - dispatch({ type: 'SET_FILTER', payload: { field: field, value: [value, currentMax], operator } })} + onChange={(v) => + dispatch({ + type: 'SET_FILTER', + payload: { + field: field, + value: [v, currentMax], + operator, + }, + }) + } /> - dispatch({ type: 'SET_FILTER', payload: { field: field, value: [currentMin, value], operator } })} + onChange={(v) => + dispatch({ + type: 'SET_FILTER', + payload: { + field: field, + value: [currentMin, v], + operator, + }, + }) + } /> ); } case 'TextField': { - /** * Debounce the dispatch so that activeFilters isn't rapidly updated. */ useEffect(() => { const timeout = setTimeout(() => { - dispatch({ type: 'SET_FILTER', payload: { field: field, value: value, operator } }) + dispatch({ + type: 'SET_FILTER', + payload: { field: field, value: value, operator }, + }); }, 1000); return () => { clearTimeout(timeout); - } + }; }, [value]); return ( @@ -185,7 +246,7 @@ export const FilterField: React.FC = ({ ); } } - } + }; /** * When activeFilters changes, make sure the value changes accordingly. @@ -196,16 +257,19 @@ export const FilterField: React.FC = ({ setValue(currentFilter?.value || null); } else if (filterComponent === 'RangeSlider') { /** RangeSliders should be considered off if both values are min and max */ - if (value && (value[0] !== filterProps.min || value[1] !== filterProps.max)) { + if ( + value && + (value[0] !== filterProps.min || value[1] !== filterProps.max) + ) { handleCancelFilter(); } } else if (hasValue(value)) { handleCancelFilter(); } - },[JSON.stringify(activeFilters)]); + }, [JSON.stringify(activeFilters)]); return ( - = ({ '&:last-child': { borderBottom: 'none', paddingBottom: 0, - } + }, }} {...rest} > - handleCancelFilter()} @@ -236,7 +300,7 @@ export const FilterField: React.FC = ({ sx={{ textDecoration: 'underline', textDecorationStyle: 'dotted', - textUnderlineOffset: '0.25rem' + textUnderlineOffset: '0.25rem', }} > {label} @@ -251,14 +315,10 @@ export const FilterField: React.FC = ({ {label} )} - {isActive && ( - - )} + {isActive && } - - {getFilterComponent(field, filterComponent, filterProps)} - + {getFilterComponent()} - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterGroup.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterGroup.tsx index 551835c3..ecb622e1 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterGroup.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FilterGroup.tsx @@ -1,5 +1,12 @@ import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp'; -import { Accordion, AccordionDetails, AccordionSummary, Chip, Stack, Typography } from '@mui/material'; +import { + Accordion, + AccordionDetails, + AccordionSummary, + Chip, + Stack, + Typography, +} from '@mui/material'; import React from 'react'; import { useFilters } from './FilterContext'; import { hasValue } from './FilterField'; @@ -13,14 +20,14 @@ interface FilterGroupProps { export const FilterGroup: React.FC = ({ label, groupId, - children + children, }) => { const { activeFilters, expandedGroup, dispatch } = useFilters(); - + /** * Count the number of active filters in this group by using * the `field` prop from the FilterField children to look up - * that filter in `activeFilters` + * that filter in `activeFilters` */ let activeChildren = 0; React.Children.forEach(children, (child) => { @@ -29,19 +36,24 @@ export const FilterGroup: React.FC = ({ child.props.field && hasValue(activeFilters.find((f: any) => f.field === child.props.field)) ) { - return activeChildren++ + return activeChildren++; } - }) - - const handleChange = (panel: string | number) => (event: React.SyntheticEvent, newExpanded: boolean) => { - dispatch({ type: 'SET_EXPANDED_GROUP', payload: newExpanded ? panel : false }); - }; - + }); + + const handleChange = + (panel: string | number) => + (event: React.SyntheticEvent, newExpanded: boolean) => { + dispatch({ + type: 'SET_EXPANDED_GROUP', + payload: newExpanded ? panel : false, + }); + }; + return ( - = ({ }} > } - aria-controls="panel1d-content" + expandIcon={} + aria-controls="panel1d-content" id="panel1d-header" sx={{ flexDirection: 'row-reverse', @@ -76,20 +88,17 @@ export const FilterGroup: React.FC = ({ {label} {activeChildren > 0 && ( - )} - - {children} - + {children} - - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Filters.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Filters.tsx index 25e2a30e..66412c85 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Filters.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Filters.tsx @@ -1,5 +1,13 @@ import CloseIcon from '@mui/icons-material/Close'; -import { Box, Button, Chip, IconButton, Paper, PaperProps, Stack } from '@mui/material'; +import { + Box, + Button, + Chip, + IconButton, + Paper, + PaperProps, + Stack, +} from '@mui/material'; import React from 'react'; import { FilterState, useFilters } from './FilterContext'; import { hasValue } from './FilterField'; @@ -14,7 +22,7 @@ interface FilterPanelProps extends Omit { /** * Container panel for FilterField(s) and FilterGroup(s). - * Acts as a multi-dimensional input where you can monitor + * Acts as a multi-dimensional input where you can monitor * the active state of all filters contained inside the component. */ export const Filters: React.FC = ({ @@ -25,13 +33,13 @@ export const Filters: React.FC = ({ config, children, ...rest -}) => { +}) => { const { activeFilters, dispatch } = useFilters(); /** * Count the number of active filters in this group by using * the `field` prop from the FilterField children to look up - * that filter in `activeFilters` + * that filter in `activeFilters` */ let activeChildren = 0; React.Children.forEach(children, (child) => { @@ -40,24 +48,20 @@ export const Filters: React.FC = ({ child.props.field && hasValue(activeFilters.find((f: any) => f.field === child.props.field)) ) { - return activeChildren++ + return activeChildren++; } - }) + }); const handleReset = () => { - dispatch({ type: 'SET_ACTIVE_FILTERS', payload: []}) - } + dispatch({ type: 'SET_ACTIVE_FILTERS', payload: [] }); + }; return ( - + {header && ( - = ({ {header} {activeChildren > 0 && ( - )} - - - - )} - {grouped && ( - - {children} + + + )} + {grouped && {children}} {!grouped && ( {children} @@ -103,5 +105,5 @@ export const Filters: React.FC = ({ )} - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FiltersPanel.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FiltersPanel.tsx index e901c30a..ad0f03a8 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FiltersPanel.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/FiltersPanel.tsx @@ -27,20 +27,22 @@ interface FiltersProps extends StackProps { // }) // }; -export const Filters: React.FC = ({ +export const Filters: React.FC = ({ onClose, children, ...rest -}) => { +}) => { return ( - FILTERS - - - - {children} + + FILTERS + + + + + {children} - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Footer.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Footer.tsx index 2ca31199..7abf7b48 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Footer.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Footer.tsx @@ -13,13 +13,13 @@ export const Footer: React.FC = () => { - { {config.footer.image && ( - + )} @@ -48,5 +52,5 @@ export const Footer: React.FC = () => { - ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Formula.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Formula.tsx index 5f2c594c..30c622f1 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Formula.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Formula.tsx @@ -30,15 +30,9 @@ export const Formula: React.FC = ({ content, ...rest }) => { const splitFormula = content.match(ELEMENTS_SPLIT_REGEX); formula = ( - {splitFormula?.map((s, i) => ( - {formulaItem(s)} - ))} + {splitFormula?.map((s, i) => {formulaItem(s)})} ); - return ( - - {formula} - - ); -}; \ No newline at end of file + return {formula}; +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.css b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.css index 9731bfe3..426cf01d 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.css +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.css @@ -6,4 +6,4 @@ .relative-width { height: auto; width: 100%; -} \ No newline at end of file +} diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.tsx index 783d03a1..bae1c6c0 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/ImageWrapper.tsx @@ -9,7 +9,7 @@ interface ImageWrapperProps extends BoxProps { /** * Generic image wrapper component for sizing images relatively - * based on container sizes. Provide either a height or width and + * based on container sizes. Provide either a height or width and * the image will size to that value and maintain its aspect ratio. */ export const ImageWrapper: React.FC = ({ @@ -32,9 +32,11 @@ export const ImageWrapper: React.FC = ({ {React.Children.map(children, (child) => { if (React.isValidElement(child)) { const imgClass = width ? 'relative-width' : 'relative-height'; - return React.cloneElement(child as React.ReactElement, { className: `${child.props.className} ${imgClass}` }); + return React.cloneElement(child as React.ReactElement, { + className: `${child.props.className} ${imgClass}`, + }); } })} ); -} \ No newline at end of file +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/LabelValueTable.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/LabelValueTable.tsx index ab34c4c3..fefc01ef 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/LabelValueTable.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/LabelValueTable.tsx @@ -1,5 +1,11 @@ import React, { ReactNode } from 'react'; -import { Table, TableBody, TableCell, TableProps, TableRow } from '@mui/material'; +import { + Table, + TableBody, + TableCell, + TableProps, + TableRow, +} from '@mui/material'; interface LabelValuePair { label: ReactNode; @@ -21,34 +27,27 @@ export const LabelValueTable: React.FC = ({ ...rest }) => { return ( - +
{rows?.map((row, i) => ( - + {row.label} - {row.value} @@ -57,5 +56,5 @@ export const LabelValueTable: React.FC = ({ ))}
- ) -} \ No newline at end of file + ); +}; diff --git a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Layout.tsx b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Layout.tsx index dde4b0b3..aa42da4e 100644 --- a/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Layout.tsx +++ b/strudel-cookiecutter/base/{@cookiecutter.name@}/src/components/Layout.tsx @@ -10,7 +10,7 @@ export const Layout: React.FC = ({ children }) => { return ( @@ -23,5 +23,5 @@ export const Layout: React.FC = ({ children }) => {