From 0bb902145c2292446ddcf5d3aec57b3c6a16df1d Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Sat, 30 Dec 2023 14:46:43 +0300 Subject: [PATCH] Minor format changes and fixes --- .vscode/settings.json | 6 +++ README.md | 17 ++++++- rsconcept/frontend/index.html | 5 +-- rsconcept/frontend/postcss.config.js | 8 ++-- rsconcept/frontend/src/App.tsx | 32 ++++++------- rsconcept/frontend/tailwind.config.js | 11 ++--- rsconcept/frontend/vite.config.ts | 65 +++++++++++---------------- 7 files changed, 74 insertions(+), 70 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 37daf584..9f88a70f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,6 +41,7 @@ "Backquote", "BIGPR", "cctext", + "Certbot", "CIHT", "clsx", "codemirror", @@ -51,6 +52,7 @@ "datv", "Debool", "Decart", + "djangorestframework", "Downvote", "EMPTYSET", "exteor", @@ -72,6 +74,7 @@ "Litr", "loct", "moprho", + "mypy", "nomn", "nooverlap", "NPRO", @@ -83,11 +86,13 @@ "PRTS", "pssv", "pyconcept", + "pylint", "pymorphy", "Quantor", "razdel", "reagraph", "Reindex", + "rsconcept", "rsedit", "rseditor", "rsform", @@ -98,6 +103,7 @@ "signup", "Slng", "SMALLPR", + "tailwindcss", "tanstack", "toastify", "tooltipic", diff --git a/README.md b/README.md index f8697d60..a8e9c2c0 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,17 @@ # ConceptPortal + React + Django based web portal for editing RSForm schemas. This readme file is used mostly to document project dependencies # Contributing notes + !BEFORE PUSHING INTO MAIN! + - use Test config in VSCode to run tests before pushing commits / requests - cd rsconcept/frontend & npm run build # Frontend stack & Tooling [Vite + React + Typescript] +
npm install
@@ -35,7 +39,9 @@ This readme file is used mostly to document project dependencies
 
npm install -D
-  - tailwindcss postcss autoprefixer
+  - tailwindcss
+  - postcss
+  - autoprefixer
   - eslint-plugin-simple-import-sort
   - eslint-plugin-tsdoc
   - jest
@@ -57,6 +63,7 @@ This readme file is used mostly to document project dependencies
 
# Backend stack & Tooling [Django + PostgreSQL/SQLite] + - [ConceptCore](https://github.com/IRBorisov/ConceptCore)
requirements @@ -93,20 +100,24 @@ This readme file is used mostly to document project dependencies
# DevOps + - Docker compose - PowerShell - Certbot - Docker VSCode extension # Developer Notes + ## Local build (Windows 10+) + - this is main developers build - Install Python 3.9, NodeJS, VSCode, Docker Desktop - copy import wheels from ConceptCore to rsconcept/backend/import - run rsconcept/backend/LocalEnvSetup.ps1 -- use VSCode configs in root folder to start developement +- use VSCode configs in root folder to start development ## Development build + - this build does not use HTTPS and nginx for networking - backend and frontend debugging is supported - hmr (hot updates) for frontend @@ -114,11 +125,13 @@ This readme file is used mostly to document project dependencies - populate initial data: 'scripts/dev/PopulateDevData.ps1' ## Local production build + - this build is same as production except not using production secrets and working on localhost - provide TLS certificate (can be self-signed) 'nginx/cert/local-cert.pem' and 'nginx/cert/local-key.pem' - run via 'docker compose -f "docker-compose-prod-local.yml" up --build -d' ## Production build + - provide secrets: 'secrets/db_password.txt' and 'django_key.txt' - setup domain names for application and API in configs: 'frontend\env\.env.production', 'rsconcept\backend\.env.dev', 'nginx\production.conf' - provide privacy policy document in PDF: 'frontend/public/privacy.pdf' diff --git a/rsconcept/frontend/index.html b/rsconcept/frontend/index.html index 55721fcc..e277f4c7 100644 --- a/rsconcept/frontend/index.html +++ b/rsconcept/frontend/index.html @@ -1,4 +1,4 @@ - + @@ -13,8 +13,7 @@ if ( localStorage.getItem('darkMode') === 'true' || localStorage.getItem('color-theme') === 'dark' || - (!('color-theme' in localStorage) && - window.matchMedia('(prefers-color-scheme: dark)').matches) + (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches) ) { document.documentElement.classList.add('dark'); } else { diff --git a/rsconcept/frontend/postcss.config.js b/rsconcept/frontend/postcss.config.js index 0fa420c0..09c32be6 100644 --- a/rsconcept/frontend/postcss.config.js +++ b/rsconcept/frontend/postcss.config.js @@ -2,7 +2,7 @@ export default { plugins: { 'postcss-import': {}, 'tailwindcss/nesting': {}, - tailwindcss: {}, - autoprefixer: {}, - }, -} + 'tailwindcss': {}, + 'autoprefixer': {} + } +}; diff --git a/rsconcept/frontend/src/App.tsx b/rsconcept/frontend/src/App.tsx index 67888739..94461fad 100644 --- a/rsconcept/frontend/src/App.tsx +++ b/rsconcept/frontend/src/App.tsx @@ -1,21 +1,21 @@ import { createBrowserRouter, Outlet, RouterProvider } from 'react-router-dom'; -import ConceptToaster from './components/ConceptToaster'; -import Footer from './components/Footer'; -import Navigation from './components/Navigation'; -import { NavigationState } from './context/NavigationContext'; -import { useConceptTheme } from './context/ThemeContext'; -import CreateRSFormPage from './pages/CreateRSFormPage'; -import HomePage from './pages/HomePage'; -import LibraryPage from './pages/LibraryPage'; -import LoginPage from './pages/LoginPage'; -import ManualsPage from './pages/ManualsPage'; -import NotFoundPage from './pages/NotFoundPage'; -import RegisterPage from './pages/RegisterPage'; -import RestorePasswordPage from './pages/RestorePasswordPage'; -import RSFormPage from './pages/RSFormPage'; -import UserProfilePage from './pages/UserProfilePage'; -import { globalIDs } from './utils/constants'; +import ConceptToaster from '@/components/ConceptToaster'; +import Footer from '@/components/Footer'; +import Navigation from '@/components/Navigation'; +import { NavigationState } from '@/context/NavigationContext'; +import { useConceptTheme } from '@/context/ThemeContext'; +import CreateRSFormPage from '@/pages/CreateRSFormPage'; +import HomePage from '@/pages/HomePage'; +import LibraryPage from '@/pages/LibraryPage'; +import LoginPage from '@/pages/LoginPage'; +import ManualsPage from '@/pages/ManualsPage'; +import NotFoundPage from '@/pages/NotFoundPage'; +import RegisterPage from '@/pages/RegisterPage'; +import RestorePasswordPage from '@/pages/RestorePasswordPage'; +import RSFormPage from '@/pages/RSFormPage'; +import UserProfilePage from '@/pages/UserProfilePage'; +import { globalIDs } from '@/utils/constants'; function Root() { const { viewportHeight, mainHeight, showScroll } = useConceptTheme(); diff --git a/rsconcept/frontend/tailwind.config.js b/rsconcept/frontend/tailwind.config.js index 460ab37c..7bea2fdb 100644 --- a/rsconcept/frontend/tailwind.config.js +++ b/rsconcept/frontend/tailwind.config.js @@ -1,12 +1,9 @@ /** @type {import('tailwindcss').Config} */ export default { darkMode: 'class', - content: [ - './src/**/*.{js,jsx,ts,tsx}', - ], + content: ['./src/**/*.{js,jsx,ts,tsx}'], theme: { - extend: {}, + extend: {} }, - plugins: [], -} - + plugins: [] +}; diff --git a/rsconcept/frontend/vite.config.ts b/rsconcept/frontend/vite.config.ts index 3a475470..d75d350c 100644 --- a/rsconcept/frontend/vite.config.ts +++ b/rsconcept/frontend/vite.config.ts @@ -1,46 +1,38 @@ import react from '@vitejs/plugin-react'; import path from 'path'; -import { defineConfig, loadEnv,PluginOption } from 'vite'; +import { defineConfig, loadEnv, PluginOption } from 'vite'; import { dependencies } from './package.json'; // Packages to include in main app bundle const inlinePackages = ['react', 'react-router-dom', 'react-dom']; -// Roolup warnings that should not be displayed -const warningsToIgnore = [ - ['SOURCEMAP_ERROR', "Can't resolve original location of error"] -]; +// Rollup warnings that should not be displayed +const warningsToIgnore = [['SOURCEMAP_ERROR', "Can't resolve original location of error"]]; // https://vitejs.dev/config/ -export default (({ mode }: { mode: string }) => { +export default ({ mode }: { mode: string }) => { process.env = { ...process.env, ...loadEnv(mode, process.cwd()) }; const enableHttps = process.env.VITE_PORTAL_FRONT_HTTPS === 'true'; return defineConfig({ - plugins: [ - react(), - muteWarningsPlugin(warningsToIgnore), - ], + appType: 'spa', + plugins: [react(), muteWarningsPlugin(warningsToIgnore)], server: { port: Number(process.env.VITE_PORTAL_FRONT_PORT), - - // NOTE: https is not used for dev builds currently - https: enableHttps, + https: enableHttps }, + publicDir: 'public', build: { chunkSizeWarningLimit: 4000, // KB sourcemap: false, rollupOptions: { output: { - manualChunks: { - // Load chunks for dependencies separately - ...renderChunks(dependencies), - }, - }, - }, + manualChunks: { ...renderChunks(dependencies) } + } + } }, resolve: { alias: { @@ -48,19 +40,17 @@ export default (({ mode }: { mode: string }) => { } } }); -}); - +}; // ======== Internals ======= - function renderChunks(deps: Record) { const chunks = {}; - Object.keys(deps).forEach((key) => { + Object.keys(deps).forEach(key => { if (inlinePackages.includes(key)) { return; } chunks[key] = [key]; - }) + }); return chunks; } @@ -69,15 +59,14 @@ function muteWarningsPlugin(warningsToIgnore: string[][]): PluginOption { return { name: 'mute-warnings', enforce: 'pre', - config: (userConfig) => ({ + config: userConfig => ({ build: { rollupOptions: { onwarn(warning, defaultHandler) { if (warning.code) { const muted = warningsToIgnore.find( - ([code, message]) => - code == warning.code && warning.message.includes(message), - ) + ([code, message]) => code == warning.code && warning.message.includes(message) + ); if (muted) { mutedMessages.add(muted.join()); @@ -86,20 +75,20 @@ function muteWarningsPlugin(warningsToIgnore: string[][]): PluginOption { } if (userConfig.build?.rollupOptions?.onwarn) { - userConfig.build.rollupOptions.onwarn(warning, defaultHandler) + userConfig.build.rollupOptions.onwarn(warning, defaultHandler); } else { - defaultHandler(warning) + defaultHandler(warning); } - }, - }, - }, + } + } + } }), closeBundle() { - const diff = warningsToIgnore.filter((x) => !mutedMessages.has(x.join())); + const diff = warningsToIgnore.filter(x => !mutedMessages.has(x.join())); if (diff.length > 0) { this.warn('Some of your muted warnings never appeared during the build process:'); - diff.forEach((m) => this.warn(`- ${m.join(': ')}`)); + diff.forEach(m => this.warn(`- ${m.join(': ')}`)); } - }, - } -} \ No newline at end of file + } + }; +}