landing
This commit is contained in:
commit
a55fe9914b
32
.eslintrc.js
Normal file
32
.eslintrc.js
Normal file
@ -0,0 +1,32 @@
|
||||
module.exports = {
|
||||
env: {
|
||||
browser: true,
|
||||
node: true,
|
||||
es2021: true,
|
||||
},
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:react/recommended',
|
||||
'plugin:@typescript-eslint/recommended',
|
||||
'plugin:react-hooks/recommended',
|
||||
],
|
||||
parser: '@typescript-eslint/parser',
|
||||
parserOptions: {
|
||||
cmaFeatures: {
|
||||
jsx: true,
|
||||
},
|
||||
ecmaVersion: 12,
|
||||
sourceType: 'module',
|
||||
},
|
||||
plugins: ['react', '@typescript-eslint'],
|
||||
rules: {
|
||||
'@typescript-eslint/explicit-module-boundary-types': 'off',
|
||||
'react/prop-types': 'off',
|
||||
'@typescript-eslint/no-unused-vars': [
|
||||
'warn',
|
||||
{ argsIgnorePattern: '^_', caughtErrors: 'none' },
|
||||
],
|
||||
'@typescript-eslint/ban-types': 'off',
|
||||
'@typescript-eslint/no-var-requires': 'off',
|
||||
},
|
||||
};
|
51
.gitignore
vendored
Normal file
51
.gitignore
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
# These are some examples of commonly ignored file patterns.
|
||||
# You should customize this list as applicable to your project.
|
||||
# Learn more about .gitignore:
|
||||
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
|
||||
|
||||
# Node artifact files
|
||||
node_modules/
|
||||
dist/
|
||||
coverage/
|
||||
|
||||
# Compiled Java class files
|
||||
*.class
|
||||
|
||||
# Compiled Python bytecode
|
||||
*.py[cod]
|
||||
|
||||
# Log files
|
||||
*.log
|
||||
|
||||
# Package files
|
||||
*.jar
|
||||
|
||||
# Maven
|
||||
target/
|
||||
dist/
|
||||
|
||||
# JetBrains IDE
|
||||
.idea/
|
||||
|
||||
# Unit test reports
|
||||
TEST*.xml
|
||||
|
||||
# Generated by MacOS
|
||||
.DS_Store
|
||||
|
||||
# Generated by Windows
|
||||
Thumbs.db
|
||||
|
||||
# Applications
|
||||
*.app
|
||||
*.exe
|
||||
*.war
|
||||
|
||||
# Large media files
|
||||
*.mp4
|
||||
*.tiff
|
||||
*.avi
|
||||
*.flv
|
||||
*.mov
|
||||
*.wmv
|
||||
|
7
.prettierignore
Normal file
7
.prettierignore
Normal file
@ -0,0 +1,7 @@
|
||||
# Ignore artifacts:
|
||||
build
|
||||
dist
|
||||
coverage
|
||||
stubs
|
||||
logs
|
||||
d-scripts
|
7
.prettierrc.json
Normal file
7
.prettierrc.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"tabWidth": 2,
|
||||
"semi": true,
|
||||
"jsxBracketSameLine": true,
|
||||
"arrowParens": "avoid",
|
||||
"singleQuote": true
|
||||
}
|
26
.vscode/launch.json
vendored
Normal file
26
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Attach by Process ID",
|
||||
"processId": "${command:PickProcess}",
|
||||
"request": "attach",
|
||||
"skipFiles": ["<node_internals>/**"],
|
||||
"type": "pwa-node"
|
||||
},
|
||||
{
|
||||
"type": "node",
|
||||
"name": "vscode-jest-tests",
|
||||
"request": "launch",
|
||||
"args": ["--runInBand", "--no-cache"],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"console": "integratedTerminal",
|
||||
"internalConsoleOptions": "neverOpen",
|
||||
"disableOptimisticBPs": true,
|
||||
"program": "${workspaceFolder}/node_modules/jest/bin/jest"
|
||||
}
|
||||
]
|
||||
}
|
10
@types/emotion.d.ts
vendored
Normal file
10
@types/emotion.d.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
import '@emotion/react';
|
||||
|
||||
import { lightTheme } from '../src/app.theme';
|
||||
|
||||
declare module '@emotion/react' {
|
||||
export interface Theme {
|
||||
colors: typeof lightTheme.colors,
|
||||
shadows: typeof lightTheme.shadows
|
||||
}
|
||||
}
|
19
@types/index.d.ts
vendored
Normal file
19
@types/index.d.ts
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
declare const IS_PROD: string;
|
||||
|
||||
declare module '*.svg' {
|
||||
const value: string;
|
||||
|
||||
export default value;
|
||||
}
|
||||
|
||||
declare module '*.jpg' {
|
||||
const value: string;
|
||||
|
||||
export default value;
|
||||
}
|
||||
|
||||
declare module '*.png' {
|
||||
const value: string;
|
||||
|
||||
export default value;
|
||||
}
|
31
Jenkinsfile
vendored
Normal file
31
Jenkinsfile
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
pipeline {
|
||||
agent {
|
||||
docker {
|
||||
image 'node:16'
|
||||
}
|
||||
}
|
||||
|
||||
stages {
|
||||
stage('install') {
|
||||
steps {
|
||||
sh 'node -v'
|
||||
sh 'npm -v'
|
||||
sh 'npm ci'
|
||||
}
|
||||
}
|
||||
|
||||
stage('eslint') {
|
||||
steps {
|
||||
sh 'npm run eslint'
|
||||
}
|
||||
}
|
||||
|
||||
stage('clean-all') {
|
||||
steps {
|
||||
sh 'rm -rf .[!.]*'
|
||||
sh 'rm -rf ./*'
|
||||
sh 'ls -a'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
6
babel.config.js
Normal file
6
babel.config.js
Normal file
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
presets: [
|
||||
['@babel/preset-env', { targets: { node: 'current' } }],
|
||||
'@babel/preset-typescript',
|
||||
],
|
||||
};
|
2
d-scripts/re-run.sh
Normal file
2
d-scripts/re-run.sh
Normal file
@ -0,0 +1,2 @@
|
||||
sh stop.sh;
|
||||
sh up-nginx.sh;
|
1
d-scripts/stop.sh
Normal file
1
d-scripts/stop.sh
Normal file
@ -0,0 +1 @@
|
||||
docker stop adminka_nginx2;
|
1
d-scripts/up-nginx.sh
Normal file
1
d-scripts/up-nginx.sh
Normal file
@ -0,0 +1 @@
|
||||
docker run --name adminka_nginx2 -v $PWD/nginx.conf:/etc/nginx/nginx.conf:ro -v $PWD/dist:/usr/share/nginx/html --rm -d -p 3072:80 nginx;
|
17
ijl.config.js
Normal file
17
ijl.config.js
Normal file
@ -0,0 +1,17 @@
|
||||
const pkg = require('./package')
|
||||
|
||||
module.exports = {
|
||||
apiPath: 'stubs/api',
|
||||
webpackConfig: {
|
||||
output: {
|
||||
publicPath: `/static/${pkg.name}/${process.env.VERSION || pkg.version}/`
|
||||
}
|
||||
},
|
||||
/* use https://kc.admin.inno-js.ru/ to create config, navigations and features */
|
||||
navigations: {
|
||||
},
|
||||
features: {
|
||||
},
|
||||
config: {
|
||||
}
|
||||
}
|
9
jest.config.js
Normal file
9
jest.config.js
Normal file
@ -0,0 +1,9 @@
|
||||
module.exports = {
|
||||
clearMocks: true,
|
||||
collectCoverage: true,
|
||||
collectCoverageFrom: ['./src/**/*.ts?(x)'],
|
||||
coverageDirectory: 'coverage',
|
||||
coverageProvider: 'v8',
|
||||
preset: 'ts-jest',
|
||||
testEnvironment: 'jsdom',
|
||||
};
|
1
locales/en-EN.json
Normal file
1
locales/en-EN.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
3
locales/en.json
Normal file
3
locales/en.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
|
||||
}
|
1
locales/ru-RU.json
Normal file
1
locales/ru-RU.json
Normal file
@ -0,0 +1 @@
|
||||
{}
|
3
locales/ru.json
Normal file
3
locales/ru.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
|
||||
}
|
15512
package-lock.json
generated
Normal file
15512
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
55
package.json
Normal file
55
package.json
Normal file
@ -0,0 +1,55 @@
|
||||
{
|
||||
"name": "bro.landing",
|
||||
"version": "2.0.1",
|
||||
"description": "",
|
||||
"main": "./src/index.tsx",
|
||||
"scripts": {
|
||||
"docker:rerun": "docker stop adminka_nginx2 && sh d-scripts/up-nginx.sh",
|
||||
"predeploy": "npm i && npm run build:prod",
|
||||
"redeploy": "npm run predeploy && npm run docker:rerun || sh d-scripts/up-nginx.sh",
|
||||
"clean": "rimraf dist",
|
||||
"eslint": "npx eslint src",
|
||||
"prettier": "prettier --write .",
|
||||
"test": "jest --coverage",
|
||||
"start": "brojs server --port=8099 --with-open-browser",
|
||||
"build": "npm run clean && brojs build --dev",
|
||||
"build:prod": "npm run clean && brojs build"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@babel/preset-typescript": "7.24.7",
|
||||
"@brojs/cli": "^0.0.4-alpha.6",
|
||||
"@chakra-ui/icons": "^2.1.1",
|
||||
"@chakra-ui/react": "^2.8.2",
|
||||
"@emotion/css": "^11.13.0",
|
||||
"@emotion/react": "^11.13.0",
|
||||
"@emotion/styled": "^11.13.0",
|
||||
"@reduxjs/toolkit": "^2.2.6",
|
||||
"dayjs": "^1.11.12",
|
||||
"express": "^4.19.2",
|
||||
"i18next": "^23.12.2",
|
||||
"i18next-browser-languagedetector": "^8.0.0",
|
||||
"i18next-xhr-backend": "^3.2.2",
|
||||
"lottie-react": "^2.4.0",
|
||||
"prettier": "^3.3.3",
|
||||
"react": "^18.3.1",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-helmet": "^6.1.0",
|
||||
"react-i18next": "^15.0.0",
|
||||
"react-redux": "^9.1.2",
|
||||
"react-router-dom": "^6.25.1",
|
||||
"redux": "^5.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/jest": "^29.5.12",
|
||||
"babel-jest": "^29.7.0",
|
||||
"eslint": "8.57.0",
|
||||
"eslint-plugin-react": "^7.35.0",
|
||||
"eslint-plugin-react-hooks": "^4.6.2",
|
||||
"html-webpack-plugin": "^5.6.0",
|
||||
"jest": "^29.7.0",
|
||||
"ts-jest": "^29.2.3"
|
||||
}
|
||||
}
|
31
readme.md
Normal file
31
readme.md
Normal file
@ -0,0 +1,31 @@
|
||||
# PL админки ijl
|
||||
|
||||
Данный проект является презентационным слоем админки от стендов ijl
|
||||
|
||||
## Установка зависимостей
|
||||
|
||||
```shell
|
||||
npm install
|
||||
```
|
||||
|
||||
## Запуск
|
||||
|
||||
```shell
|
||||
npm start
|
||||
```
|
||||
|
||||
## Собрать
|
||||
|
||||
```shell
|
||||
npm run build:prod
|
||||
```
|
||||
|
||||
## Деплой
|
||||
|
||||
Для деплоя используется простой докер образ nginx раздающий директорию dist. Для запуска необходимо воспользоваться скриптами из директории d-scripts.
|
||||
|
||||
Команда запуска на сервере
|
||||
|
||||
```shell
|
||||
sh d-scripts/up-nginx.sh
|
||||
```
|
1
src/__data__/assets/lottie/under-construction.json
Normal file
1
src/__data__/assets/lottie/under-construction.json
Normal file
File diff suppressed because one or more lines are too long
20
src/app.tsx
Normal file
20
src/app.tsx
Normal file
@ -0,0 +1,20 @@
|
||||
import React, { Suspense } from "react";
|
||||
import { BrowserRouter } from "react-router-dom";
|
||||
import {Helmet} from 'react-helmet';
|
||||
|
||||
import { Dashboard } from './dashboard';
|
||||
|
||||
const App = () => {
|
||||
return (
|
||||
<>
|
||||
<Helmet>
|
||||
<title>bro js</title>
|
||||
</Helmet>
|
||||
<BrowserRouter>
|
||||
<Dashboard />
|
||||
</BrowserRouter>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default App;
|
22
src/dashboard.tsx
Normal file
22
src/dashboard.tsx
Normal file
@ -0,0 +1,22 @@
|
||||
import React, { Suspense } from 'react';
|
||||
import { Routes, Route } from 'react-router-dom';
|
||||
import { Spinner } from '@chakra-ui/react';
|
||||
|
||||
import { UnderConstructionPage } from './pages';
|
||||
const Hello = () => <h1>Hello</h1>;
|
||||
|
||||
export const Dashboard = () => {
|
||||
return (
|
||||
<Routes>
|
||||
<Route
|
||||
path={'*'}
|
||||
element={
|
||||
<Suspense fallback={<Spinner />}>
|
||||
<UnderConstructionPage />
|
||||
</Suspense>
|
||||
}
|
||||
/>
|
||||
<Route path={'*'} element={<h1>Страница не найдена</h1>} />
|
||||
</Routes>
|
||||
);
|
||||
};
|
18
src/index.ejs
Normal file
18
src/index.ejs
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
<link href="https://fonts.googleapis.com/css?family=Montserrat:400,600,700,900&subset=cyrillic,cyrillic-ext" rel="stylesheet" />
|
||||
<title>bro-js admin</title>
|
||||
<style>body {margin: 0; padding: 0;}</style>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/87860751" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<div id="app"></div>
|
||||
</body>
|
||||
</html>
|
26
src/index.tsx
Normal file
26
src/index.tsx
Normal file
@ -0,0 +1,26 @@
|
||||
import React from 'react';
|
||||
import i18next from 'i18next';
|
||||
import { i18nextReactInitConfig } from '@brojs/cli/lib/i18next';
|
||||
import { createRoot } from 'react-dom/client'
|
||||
|
||||
import App from './app';
|
||||
|
||||
i18next.t = i18next.t.bind(i18next);
|
||||
const i18nextPromise = i18nextReactInitConfig(i18next);
|
||||
const MOUNT_NODE = document.getElementById('app');
|
||||
|
||||
(async () => {
|
||||
await Promise.all([i18nextPromise]);
|
||||
const rootElement = createRoot(MOUNT_NODE)
|
||||
rootElement.render(<App />);
|
||||
|
||||
if (module.hot) {
|
||||
module.hot.accept('./app', async () => {
|
||||
await i18next.reloadResources();
|
||||
rootElement.render(<App />);
|
||||
});
|
||||
}
|
||||
})();
|
||||
|
||||
export const mount = () => console.log('mounted');
|
||||
export const unmount = () => console.log('unmounted');
|
3
src/pages/index.ts
Normal file
3
src/pages/index.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import { lazy } from 'react';
|
||||
|
||||
export const UnderConstructionPage = lazy(() => import('./under-construction'));
|
3
src/pages/under-construction/index.ts
Normal file
3
src/pages/under-construction/index.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import { UnderConstruction } from './underConstruction';
|
||||
|
||||
export default UnderConstruction;
|
14
src/pages/under-construction/underConstruction.tsx
Normal file
14
src/pages/under-construction/underConstruction.tsx
Normal file
@ -0,0 +1,14 @@
|
||||
import React from 'react';
|
||||
import Lottie from "lottie-react";
|
||||
import animation from '../../__data__/assets/lottie/under-construction.json';
|
||||
|
||||
export const UnderConstruction = () => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<Lottie animationData={animation} />
|
||||
|
||||
<h3><center>Сайт в разработке</center></h3>
|
||||
</div>
|
||||
)
|
||||
}
|
8
stubs/api/index.js
Normal file
8
stubs/api/index.js
Normal file
@ -0,0 +1,8 @@
|
||||
const router = require('express').Router();
|
||||
|
||||
const timer = (time = 300) => (req, res, next) => setTimeout(next, time);
|
||||
|
||||
router.use(timer());
|
||||
|
||||
|
||||
module.exports = router;
|
25
tsconfig.json
Normal file
25
tsconfig.json
Normal file
@ -0,0 +1,25 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2017"
|
||||
],
|
||||
"outDir": "./dist/",
|
||||
"sourceMap": true,
|
||||
"esModuleInterop": true,
|
||||
"noImplicitAny": false,
|
||||
"module": "esnext",
|
||||
"moduleResolution": "node",
|
||||
"target": "es6",
|
||||
"jsx": "react",
|
||||
"typeRoots": ["node_modules/@types", "src/typings"],
|
||||
"types" : ["webpack-env", "node"],
|
||||
"resolveJsonModule": true
|
||||
},
|
||||
"exclude": [
|
||||
"node_modules",
|
||||
"**/*.test.ts",
|
||||
"**/*.test.tsx",
|
||||
"node_modules/@types/jest"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue
Block a user