Skip to content

Commit acc81d2

Browse files
Merge pull request #131 from technote-space/release/next-v0.14.21
release: v0.15.0
2 parents 50f7c44 + 22e20c6 commit acc81d2

23 files changed

+2653
-2511
lines changed

package.json

Lines changed: 41 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@technote-space/ga-framework",
3-
"version": "0.14.21",
3+
"version": "0.15.0",
44
"description": "GA Framework",
55
"keywords": [
66
"genetic algorithm"
@@ -36,55 +36,56 @@
3636
"prepublishOnly": "[ -n \"$CI\" ] || [ ! -f node_modules/.bin/pinst ] || pinst --disable",
3737
"postpublish": "[ -n \"$CI\" ] || [ ! -f node_modules/.bin/pinst ] || pinst --enable",
3838
"test": "yarn lint",
39-
"update": "npx npm-check-updates -u && yarn install && yarn upgrade && yarn audit"
39+
"update": "npm_config_yes=true npx npm-check-updates -u --timeout 100000 && yarn install && yarn upgrade && yarn audit"
4040
},
4141
"dependencies": {
4242
"@egjs/hammerjs": "^2.0.17",
43-
"@material-ui/core": "^4.12.3",
44-
"@material-ui/icons": "^4.11.2",
45-
"@mui-treasury/layout": "^4.5.1",
46-
"@technote-space/genetic-algorithms-js": "^0.8.24",
47-
"@technote-space/worker-controller": "^0.5.46",
48-
"chart.js": "^3.7.0",
49-
"clsx": "^1.1.1",
43+
"@emotion/react": "^11.10.5",
44+
"@emotion/styled": "^11.10.5",
45+
"@mui-treasury/layout": "^5.0.0",
46+
"@mui/icons-material": "^5.11.0",
47+
"@mui/material": "^5.11.1",
48+
"@technote-space/genetic-algorithms-js": "^0.8.27",
49+
"@technote-space/worker-controller": "^0.5.56",
50+
"chart.js": "^4.1.1",
51+
"clsx": "^1.2.1",
5052
"keycharm": "^0.4.0",
51-
"moment": "^2.29.1",
52-
"react": "^17.0.2",
53-
"react-dom": "^17.0.2",
53+
"moment": "^2.29.4",
54+
"react": "^18.2.0",
55+
"react-dom": "^18.2.0",
5456
"react-helmet": "^6.1.0",
55-
"styled-components": "^5.3.3",
56-
"vis-data": "^7.1.2",
57-
"vis-network": "^9.1.0",
58-
"vis-util": "^5.0.2"
57+
"vis-data": "^7.1.4",
58+
"vis-network": "^9.1.2",
59+
"vis-util": "^5.0.3"
5960
},
6061
"devDependencies": {
61-
"@babel/core": "^7.16.12",
62-
"@babel/plugin-proposal-class-properties": "^7.16.7",
63-
"@babel/plugin-proposal-object-rest-spread": "^7.16.7",
64-
"@babel/plugin-transform-react-inline-elements": "^7.16.7",
65-
"@babel/preset-env": "^7.16.11",
66-
"@babel/preset-flow": "^7.16.7",
67-
"@babel/preset-react": "^7.16.7",
68-
"@babel/preset-typescript": "^7.16.7",
69-
"@commitlint/cli": "^16.1.0",
70-
"@commitlint/config-conventional": "^16.0.0",
71-
"@types/node": "^17.0.14",
72-
"@types/react-helmet": "^6.1.5",
73-
"@types/styled-components": "^5.1.21",
74-
"@typescript-eslint/eslint-plugin": "^5.10.2",
75-
"@typescript-eslint/parser": "^5.10.2",
62+
"@babel/core": "^7.20.7",
63+
"@babel/plugin-proposal-class-properties": "^7.18.6",
64+
"@babel/plugin-proposal-object-rest-spread": "^7.20.7",
65+
"@babel/plugin-transform-react-inline-elements": "^7.18.6",
66+
"@babel/preset-env": "^7.20.2",
67+
"@babel/preset-flow": "^7.18.6",
68+
"@babel/preset-react": "^7.18.6",
69+
"@babel/preset-typescript": "^7.18.6",
70+
"@commitlint/cli": "^17.3.0",
71+
"@commitlint/config-conventional": "^17.3.0",
72+
"@types/node": "^18.11.17",
73+
"@types/react-helmet": "^6.1.6",
74+
"@types/styled-components": "^5.1.26",
75+
"@typescript-eslint/eslint-plugin": "^5.47.0",
76+
"@typescript-eslint/parser": "^5.47.0",
7677
"babel-plugin-react-html-attrs": "^3.0.5",
7778
"babel-plugin-transform-class-properties": "^6.24.1",
78-
"copy-webpack-plugin": "^10.2.4",
79-
"eslint": "^8.8.0",
80-
"eslint-plugin-react": "^7.28.0",
81-
"eslint-plugin-react-hooks": "^4.3.0",
79+
"copy-webpack-plugin": "^11.0.0",
80+
"eslint": "^8.30.0",
81+
"eslint-plugin-react": "^7.31.11",
82+
"eslint-plugin-react-hooks": "^4.6.0",
8283
"html-webpack-plugin": "^5.5.0",
83-
"husky": "^7.0.4",
84-
"lint-staged": "^12.3.2",
85-
"pinst": "^2.1.6",
86-
"typescript": "^4.5.5",
87-
"webpack": "^5.68.0"
84+
"husky": "^8.0.2",
85+
"lint-staged": "^13.1.0",
86+
"pinst": "^3.0.0",
87+
"typescript": "^4.9.4",
88+
"webpack": "^5.75.0"
8889
},
8990
"publishConfig": {
9091
"access": "public"

src/app/App.tsx

Lines changed: 84 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,125 @@
1-
import type {FC} from 'react';
2-
import type {AppOptions} from '$/types';
3-
import type {StatusResult} from '@technote-space/worker-controller';
4-
import React, {memo, useMemo, useEffect} from 'react';
5-
import {Helmet} from 'react-helmet';
6-
import styled from 'styled-components';
7-
import LayoutBuilder, {
1+
import type { FC } from 'react';
2+
import type { AppOptions } from '$/types';
3+
import type { StatusResult } from '@technote-space/worker-controller';
4+
import React, { memo, useMemo, useEffect } from 'react';
5+
import { Helmet } from 'react-helmet';
6+
import {
87
Root,
9-
getHeader,
10-
getDrawerSidebar,
11-
getSidebarContent,
12-
getContent,
13-
getSidebarTrigger,
8+
Header,
9+
SidebarContent,
10+
Content,
11+
EdgeTrigger,
12+
EdgeSidebar,
13+
EdgeTriggerProps,
1414
} from '@mui-treasury/layout';
1515
import {
1616
Toolbar,
1717
CssBaseline,
18-
} from '@material-ui/core';
19-
import {createTheme, responsiveFontSizes, makeStyles, createStyles} from '@material-ui/core/styles';
20-
import {useTheme} from './hooks';
18+
} from '@mui/material';
19+
import { ThemeProvider, createTheme, responsiveFontSizes } from '@mui/material/styles';
20+
import { useTheme } from './hooks';
2121
import {
2222
ContentEx,
2323
HeaderEx,
2424
NavContentEx,
2525
} from './templates';
26-
import {useDispatchContext, useStoreContext} from './Store';
27-
import {Controller} from '@technote-space/worker-controller';
28-
import {getProcessContext, getTitle, updateStatus} from './common';
29-
30-
const useStyles = makeStyles(() => createStyles({
31-
content: {
32-
height: '100%',
33-
},
34-
}));
35-
36-
const scheme = LayoutBuilder();
37-
scheme.configureHeader(builder => {
38-
builder
39-
.registerConfig('xs', {
40-
position: 'sticky',
41-
initialHeight: 56,
42-
})
43-
.registerConfig('md', {
44-
position: 'sticky',
45-
initialHeight: 64,
46-
clipped: true,
47-
});
48-
});
49-
scheme.configureEdgeSidebar(builder => {
50-
builder
51-
.create('primarySidebar', {
52-
anchor: 'left',
53-
})
54-
.registerTemporaryConfig('xs', {
55-
width: 275,
56-
})
57-
.registerPermanentConfig('md', {
58-
width: 275,
59-
collapsible: false,
60-
})
61-
.registerPermanentConfig('lg', {
62-
width: 275,
63-
collapsible: false,
64-
});
65-
});
66-
const Header = getHeader(styled);
67-
const DrawerSidebar = getDrawerSidebar(styled);
68-
const SidebarContent = getSidebarContent(styled);
69-
const SidebarTrigger = getSidebarTrigger(styled);
70-
const Content = getContent(styled);
26+
import { useDispatchContext, useStoreContext } from './Store';
27+
import { Controller } from '@technote-space/worker-controller';
28+
import { getProcessContext, getTitle, updateStatus } from './common';
7129

7230
const App: FC<{
7331
options: AppOptions;
74-
}> = memo(({options}: { options: AppOptions }) => {
75-
const {store: {themeColor, reloadWorker}, store} = useStoreContext();
76-
const {dispatch} = useDispatchContext();
77-
const themeObject = useTheme(themeColor);
78-
const theme = responsiveFontSizes(createTheme(themeObject));
79-
const classes = useStyles({theme});
32+
}> = memo(({ options }: { options: AppOptions }) => {
33+
const { store: { themeColor, reloadWorker }, store } = useStoreContext();
34+
const { dispatch } = useDispatchContext();
35+
const themeObject = useTheme(themeColor);
36+
const theme = responsiveFontSizes(createTheme(themeObject));
8037

8138
const title = useMemo(() => getTitle(options, store), [store]);
8239
const cssBaseline = useMemo(() => <CssBaseline/>, []);
8340
const header = useMemo(() => <Header>
8441
<Toolbar>
85-
<SidebarTrigger sidebarId="primarySidebar"/>
42+
<EdgeTrigger target={{ anchor: 'left', field: 'open' }}>
43+
{((open, setOpen) => (
44+
<button onClick={() => setOpen(!open)}>{open ? 'Close' : 'Open'}</button>
45+
)) as EdgeTriggerProps['children']}
46+
</EdgeTrigger>
8647
<HeaderEx options={options}/>
8748
</Toolbar>
8849
</Header>, []);
89-
const sidebar = useMemo(() => <DrawerSidebar sidebarId="primarySidebar">
90-
<SidebarContent>
91-
<NavContentEx options={options}/>
92-
</SidebarContent>
93-
</DrawerSidebar>, []);
94-
const content = useMemo(() => <Content className={classes.content}>
50+
const sidebar = useMemo(() => <EdgeSidebar anchor="left">
51+
{({ setOpen }) => (
52+
<SidebarContent>
53+
<NavContentEx options={options} setOpen={setOpen}/>
54+
</SidebarContent>
55+
)}
56+
</EdgeSidebar>, []);
57+
const content = useMemo(() => <Content sx={{ height: '100%' }}>
9558
<ContentEx options={options}/>
96-
</Content>, [classes]);
59+
</Content>, []);
9760

9861
useEffect(() => {
9962
(async(): Promise<void> => {
100-
dispatch({type: 'INITIALIZE'});
63+
dispatch({ type: 'INITIALIZE' });
10164
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10265
const worker = new Controller((result: any | StatusResult) => {
10366
if ('status' in result) {
10467
updateStatus(result.status, dispatch);
10568
} else {
106-
dispatch({type: 'RESULT', result});
69+
dispatch({ type: 'RESULT', result });
10770
}
10871
}, {
10972
context: await getProcessContext(options, store),
11073
});
111-
dispatch({type: 'WORKER', worker});
112-
dispatch({type: 'INITIALIZED'});
74+
dispatch({ type: 'WORKER', worker });
75+
dispatch({ type: 'INITIALIZED' });
11376
})().then();
11477
}, [reloadWorker]);
11578

11679
return useMemo(() => (
117-
<Root scheme={scheme} theme={theme}>
118-
<Helmet title={title}/>
119-
{cssBaseline}
120-
{header}
121-
{sidebar}
122-
{content}
123-
</Root>
124-
), [title, classes, theme]);
80+
<ThemeProvider theme={theme}>
81+
<Root scheme={{
82+
header: {
83+
config: {
84+
xs: {
85+
position: 'sticky',
86+
height: 56,
87+
},
88+
md: {
89+
position: 'relative',
90+
height: 64,
91+
clipped: true,
92+
},
93+
},
94+
},
95+
leftEdgeSidebar: {
96+
autoCollapse: 'sm',
97+
config: {
98+
xs: {
99+
variant: 'temporary',
100+
width: 275,
101+
},
102+
md: {
103+
variant: 'permanent',
104+
width: 275,
105+
collapsible: false,
106+
},
107+
lg: {
108+
variant: 'permanent',
109+
width: 275,
110+
collapsible: false,
111+
},
112+
},
113+
},
114+
}}>
115+
<Helmet title={title}/>
116+
{cssBaseline}
117+
{header}
118+
{sidebar}
119+
{content}
120+
</Root>
121+
</ThemeProvider>
122+
), [title, theme]);
125123
});
126124

127125
App.displayName = 'App';

src/app/Store.tsx

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type {FC} from 'react';
2-
import type {AppOptions} from '$/types';
3-
import React, {memo, useReducer, createContext, useContext, useCallback, useEffect} from 'react';
4-
import {getProcessContext} from './common';
1+
import type { FC, PropsWithChildren } from 'react';
2+
import type { AppOptions } from '$/types';
3+
import React, { memo, useReducer, createContext, useContext, useCallback, useEffect } from 'react';
4+
import { getProcessContext } from './common';
55

66
const StoreContext = createContext({});
77
// eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -59,7 +59,7 @@ const resultReducer = (store, result) => {
5959
const index = histories.findIndex(value => value.x === dataX);
6060
// eslint-disable-next-line no-magic-numbers
6161
if (index < 0) {
62-
histories.push({x: dataX, y: dataY});
62+
histories.push({ x: dataX, y: dataY });
6363
} else {
6464
histories[index].y = dataY;
6565
}
@@ -71,20 +71,20 @@ const resultReducer = (store, result) => {
7171
};
7272

7373
const reducerActions = {
74-
PAGE: (store, action) => ({...store, page: action.page}),
75-
THEME_COLOR: (store, action) => ({...store, themeColor: action.themeColor}),
76-
WORKER: (store, action) => ({...store, worker: action.worker}),
74+
PAGE: (store, action) => ({ ...store, page: action.page }),
75+
THEME_COLOR: (store, action) => ({ ...store, themeColor: action.themeColor }),
76+
WORKER: (store, action) => ({ ...store, worker: action.worker }),
7777
UPDATE_STATUS: (store, action) => {
7878
if (store.status === 'disabled') {
7979
return store;
8080
}
8181

82-
return {...store, status: action.result.status};
82+
return { ...store, status: action.result.status };
8383
},
84-
RELOAD_WORKER: (store) => ({...store, reloadWorker: !store.reloadWorker}),
85-
SET_NOTICE: (store, action) => ({...store, notice: {...store.notice, ...{open: true, variant: 'success'}, ...action.notice}}),
86-
SET_ERROR: (store, action) => ({...store, notice: {...store.notice, ...{open: true, variant: 'error'}, ...action.notice}}),
87-
CLOSE_NOTICE: (store) => ({...store, notice: {...store.notice, ...{open: false}}}),
84+
RELOAD_WORKER: (store) => ({ ...store, reloadWorker: !store.reloadWorker }),
85+
SET_NOTICE: (store, action) => ({ ...store, notice: { ...store.notice, ...{ open: true, variant: 'success' }, ...action.notice } }),
86+
SET_ERROR: (store, action) => ({ ...store, notice: { ...store.notice, ...{ open: true, variant: 'error' }, ...action.notice } }),
87+
CLOSE_NOTICE: (store) => ({ ...store, notice: { ...store.notice, ...{ open: false } } }),
8888
PAGINATION_INITIALIZED: (store) => ({
8989
...store,
9090
pagination: {
@@ -116,9 +116,9 @@ const reducerActions = {
116116
return store;
117117
},
118118
};
119-
const StoreContextProvider: FC<{
119+
const StoreContextProvider: FC<PropsWithChildren<{
120120
options: AppOptions;
121-
}> = memo(({children, options}) => {
121+
}>> = memo(({ children, options }) => {
122122
// eslint-disable-next-line @typescript-eslint/no-explicit-any
123123
const getReducer = useCallback((store, action): any => {
124124
if (action.type in reducerActions) {
@@ -141,11 +141,11 @@ const StoreContextProvider: FC<{
141141
onReloadNeeded().then();
142142
}, []);
143143

144-
return <StoreContext.Provider value={{store}}>
145-
<DispatchContext.Provider value={{dispatch, onReloadNeeded}}>
144+
return <StoreContext.Provider value={{ store }}>
145+
<DispatchContext.Provider value={{ dispatch, onReloadNeeded }}>
146146
{children}
147147
</DispatchContext.Provider>
148148
</StoreContext.Provider>;
149149
});
150150
StoreContextProvider.displayName = 'StoreContextProvider';
151-
export {StoreContextProvider};
151+
export { StoreContextProvider };

0 commit comments

Comments
 (0)