Paket Deprecated uyarıları kaldırıldı
This commit is contained in:
parent
deb7fdfee6
commit
47faf2a6ff
9 changed files with 1093 additions and 1449 deletions
|
|
@ -1,5 +0,0 @@
|
||||||
node_modules/
|
|
||||||
dist/
|
|
||||||
.prettierrc.js
|
|
||||||
.eslintrc.js
|
|
||||||
env.d.ts
|
|
||||||
|
|
@ -1,67 +0,0 @@
|
||||||
{
|
|
||||||
"env": { "browser": true, "es2021": true },
|
|
||||||
"extends": [
|
|
||||||
"eslint:recommended",
|
|
||||||
"plugin:@typescript-eslint/recommended",
|
|
||||||
"plugin:react-hooks/recommended",
|
|
||||||
"plugin:react/recommended",
|
|
||||||
"standard-with-typescript",
|
|
||||||
"plugin:import/recommended",
|
|
||||||
"plugin:react/jsx-runtime",
|
|
||||||
"prettier",
|
|
||||||
// This disables the formatting rules in ESLint that Prettier is going to be responsible for handling.
|
|
||||||
// Make sure it's always the last config, so it gets the chance to override other configs.
|
|
||||||
"eslint-config-prettier"
|
|
||||||
],
|
|
||||||
"ignorePatterns": ["dist", ".eslintrc.json"],
|
|
||||||
"settings": {
|
|
||||||
"react": {
|
|
||||||
// Tells eslint-plugin-react to automatically detect the version of React to use.
|
|
||||||
"version": "detect"
|
|
||||||
},
|
|
||||||
"import/parsers": {
|
|
||||||
"@typescript-eslint/parser": [".ts", ".tsx"] // use typescript-eslint parser for .ts|tsx files.
|
|
||||||
},
|
|
||||||
// Tells eslint how to resolve imports
|
|
||||||
"import/resolver": {
|
|
||||||
// "node": {
|
|
||||||
// "paths": ["src"],
|
|
||||||
// "extensions": [".js", ".jsx", ".ts", ".tsx"]
|
|
||||||
// },
|
|
||||||
"typescript": {
|
|
||||||
"project": "./tsconfig.eslint.json",
|
|
||||||
"alwaysTryTypes": true // always try to resolve types under `<root>@types` directory even it doesn't contain any source code, like `@types/unist`.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": "latest",
|
|
||||||
"sourceType": "module",
|
|
||||||
"ecmaFeatures": { "jsx": true }
|
|
||||||
},
|
|
||||||
"plugins": ["react", "react-refresh", "typescript-eslint"],
|
|
||||||
"rules": {
|
|
||||||
// Add your own rules here to override ones from the extended configs.
|
|
||||||
"react-refresh/only-export-components": ["warn", { "allowConstantExport": true }],
|
|
||||||
// suppress errors for missing 'import React' in files
|
|
||||||
"react/react-in-jsx-scope": "off",
|
|
||||||
"import/first": "warn",
|
|
||||||
"import/default": "off",
|
|
||||||
"import/newline-after-import": "warn",
|
|
||||||
"import/no-named-as-default-member": "off",
|
|
||||||
"import/no-duplicates": "error",
|
|
||||||
"import/no-named-as-default": 0,
|
|
||||||
"react/prop-types": "off",
|
|
||||||
"react/jsx-sort-props": [
|
|
||||||
"warn",
|
|
||||||
{
|
|
||||||
"callbacksLast": true,
|
|
||||||
"shorthandFirst": true,
|
|
||||||
"ignoreCase": true,
|
|
||||||
"reservedFirst": true,
|
|
||||||
"noSortAlphabetically": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
77
ui/eslint.config.js
Normal file
77
ui/eslint.config.js
Normal file
|
|
@ -0,0 +1,77 @@
|
||||||
|
import js from '@eslint/js'
|
||||||
|
import tsParser from '@typescript-eslint/parser'
|
||||||
|
import tsPlugin from '@typescript-eslint/eslint-plugin'
|
||||||
|
import importPlugin from 'eslint-plugin-import'
|
||||||
|
import reactPlugin from 'eslint-plugin-react'
|
||||||
|
import reactHooks from 'eslint-plugin-react-hooks'
|
||||||
|
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||||
|
import prettier from 'eslint-config-prettier'
|
||||||
|
import globals from 'globals'
|
||||||
|
|
||||||
|
export default [
|
||||||
|
{
|
||||||
|
ignores: [
|
||||||
|
'node_modules/**',
|
||||||
|
'dist/**',
|
||||||
|
'dev-dist/**',
|
||||||
|
'public/**',
|
||||||
|
'env.d.ts',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
js.configs.recommended,
|
||||||
|
{
|
||||||
|
files: ['**/*.{js,jsx,ts,tsx}'],
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 'latest',
|
||||||
|
sourceType: 'module',
|
||||||
|
globals: globals.browser,
|
||||||
|
parserOptions: { ecmaFeatures: { jsx: true } },
|
||||||
|
},
|
||||||
|
plugins: {
|
||||||
|
import: importPlugin,
|
||||||
|
react: reactPlugin,
|
||||||
|
'react-hooks': reactHooks,
|
||||||
|
'react-refresh': reactRefresh,
|
||||||
|
},
|
||||||
|
settings: {
|
||||||
|
react: { version: 'detect' },
|
||||||
|
'import/parsers': { '@typescript-eslint/parser': ['.ts', '.tsx'] },
|
||||||
|
'import/resolver': {
|
||||||
|
typescript: { project: './tsconfig.eslint.json', alwaysTryTypes: true },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
...reactPlugin.configs.recommended.rules,
|
||||||
|
...reactPlugin.configs['jsx-runtime'].rules,
|
||||||
|
'react-hooks/rules-of-hooks': 'error',
|
||||||
|
'react-hooks/exhaustive-deps': 'warn',
|
||||||
|
...importPlugin.configs.recommended.rules,
|
||||||
|
'react-refresh/only-export-components': ['warn', { allowConstantExport: true }],
|
||||||
|
'react/react-in-jsx-scope': 'off',
|
||||||
|
'import/first': 'warn',
|
||||||
|
'import/default': 'off',
|
||||||
|
'import/newline-after-import': 'warn',
|
||||||
|
'import/no-named-as-default-member': 'off',
|
||||||
|
'import/no-duplicates': 'error',
|
||||||
|
'import/no-named-as-default': 'off',
|
||||||
|
'react/prop-types': 'off',
|
||||||
|
'react/jsx-sort-props': [
|
||||||
|
'warn',
|
||||||
|
{
|
||||||
|
callbacksLast: true,
|
||||||
|
shorthandFirst: true,
|
||||||
|
ignoreCase: true,
|
||||||
|
reservedFirst: true,
|
||||||
|
noSortAlphabetically: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx}'],
|
||||||
|
languageOptions: { parser: tsParser },
|
||||||
|
plugins: { '@typescript-eslint': tsPlugin },
|
||||||
|
rules: tsPlugin.configs.recommended.rules,
|
||||||
|
},
|
||||||
|
prettier,
|
||||||
|
]
|
||||||
2279
ui/package-lock.json
generated
2279
ui/package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
|
@ -9,7 +9,7 @@
|
||||||
"build": "node scripts/generate-version.js && vite build",
|
"build": "node scripts/generate-version.js && vite build",
|
||||||
"build:production": "vite build",
|
"build:production": "vite build",
|
||||||
"preview": "vite preview",
|
"preview": "vite preview",
|
||||||
"lint": "eslint . --ext .js,.jsx,.ts,.tsx,.json",
|
"lint": "eslint .",
|
||||||
"lint:fix": "npm run lint -- --fix",
|
"lint:fix": "npm run lint -- --fix",
|
||||||
"prettier": "prettier --ignore-path .gitignore src --check",
|
"prettier": "prettier --ignore-path .gitignore src --check",
|
||||||
"prettier:fix": "npm run prettier -- --write",
|
"prettier:fix": "npm run prettier -- --write",
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
"@monaco-editor/react": "^4.6.0",
|
"@monaco-editor/react": "^4.6.0",
|
||||||
"@tanstack/react-query": "^4.29.19",
|
"@tanstack/react-query": "^4.29.19",
|
||||||
"@tanstack/react-table": "^8.8.5",
|
"@tanstack/react-table": "^8.8.5",
|
||||||
"axios": "^1.7.9",
|
"axios": "^1.18.1",
|
||||||
"classnames": "^2.5.1",
|
"classnames": "^2.5.1",
|
||||||
"dayjs": "^1.11.13",
|
"dayjs": "^1.11.13",
|
||||||
"devexpress-reporting-react": "^25.2.3",
|
"devexpress-reporting-react": "^25.2.3",
|
||||||
|
|
@ -42,13 +42,13 @@
|
||||||
"devextreme-react": "^25.2.3",
|
"devextreme-react": "^25.2.3",
|
||||||
"easy-peasy": "^6.0.5",
|
"easy-peasy": "^6.0.5",
|
||||||
"emoji-picker-react": "^4.14.1",
|
"emoji-picker-react": "^4.14.1",
|
||||||
"exceljs": "^4.4.0",
|
"devextreme-exceljs-fork": "^4.4.11",
|
||||||
"file-saver": "^2.0.2",
|
"file-saver": "^2.0.2",
|
||||||
"formik": "^2.4.6",
|
"formik": "^2.4.6",
|
||||||
"framer-motion": "^11.15.0",
|
"framer-motion": "^11.15.0",
|
||||||
"jspdf": "^4.0.0",
|
"jspdf": "^4.2.1",
|
||||||
"jwt-decode": "^4.0.0",
|
"jwt-decode": "^4.0.0",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.18.1",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-advanced-cropper": "^0.20.0",
|
"react-advanced-cropper": "^0.20.0",
|
||||||
"react-arborist": "^3.4.0",
|
"react-arborist": "^3.4.0",
|
||||||
|
|
@ -59,9 +59,8 @@
|
||||||
"react-highlight-words": "^0.20.0",
|
"react-highlight-words": "^0.20.0",
|
||||||
"react-icons": "^5.4.0",
|
"react-icons": "^5.4.0",
|
||||||
"react-modal": "^3.16.3",
|
"react-modal": "^3.16.3",
|
||||||
"react-router-dom": "^6.14.1",
|
"react-router-dom": "^6.30.4",
|
||||||
"react-select": "^5.9.0",
|
"react-select": "^5.9.0",
|
||||||
"redux-state-sync": "^3.1.4",
|
|
||||||
"yet-another-react-lightbox": "^3.25.0",
|
"yet-another-react-lightbox": "^3.25.0",
|
||||||
"yup": "^1.6.1"
|
"yup": "^1.6.1"
|
||||||
},
|
},
|
||||||
|
|
@ -76,33 +75,36 @@
|
||||||
"@types/react-helmet": "^6.1.9",
|
"@types/react-helmet": "^6.1.9",
|
||||||
"@types/react-highlight-words": "^0.16.4",
|
"@types/react-highlight-words": "^0.16.4",
|
||||||
"@types/react-modal": "^3.13.1",
|
"@types/react-modal": "^3.13.1",
|
||||||
"@types/redux-state-sync": "^3.1.9",
|
"@eslint/js": "^9.39.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
"@typescript-eslint/eslint-plugin": "^8.62.1",
|
||||||
"@typescript-eslint/parser": "^8.0.0",
|
"@typescript-eslint/parser": "^8.62.1",
|
||||||
"@vitejs/plugin-react": "^4.2.1",
|
"@vitejs/plugin-react": "^4.2.1",
|
||||||
"autoprefixer": "^10.4.14",
|
"autoprefixer": "^10.4.14",
|
||||||
"baseline-browser-mapping": "^2.9.19",
|
"baseline-browser-mapping": "^2.9.19",
|
||||||
"browserslist": "^4.25.2",
|
"browserslist": "^4.25.2",
|
||||||
"caniuse-lite": "^1.0.30001734",
|
"caniuse-lite": "^1.0.30001734",
|
||||||
"cssnano": "^6.0.1",
|
"cssnano": "^6.0.1",
|
||||||
"eslint": "^8.36.0",
|
"eslint": "^9.39.0",
|
||||||
"eslint-config-prettier": "^8.8.0",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-import-resolver-alias": "^1.1.2",
|
"eslint-import-resolver-alias": "^1.1.2",
|
||||||
"eslint-import-resolver-typescript": "^3.5.3",
|
"eslint-import-resolver-typescript": "^4.4.5",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.27.5",
|
||||||
"eslint-plugin-jsx-a11y": "^6.7.1",
|
"eslint-plugin-jsx-a11y": "^6.7.1",
|
||||||
"eslint-plugin-n": "^17.7.0",
|
|
||||||
"eslint-plugin-prettier": "^5.1.3",
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
"eslint-plugin-promise": "^6.2.0",
|
|
||||||
"eslint-plugin-react": "^7.32.2",
|
"eslint-plugin-react": "^7.32.2",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^7.1.1",
|
||||||
"eslint-plugin-react-refresh": "^0.4.1",
|
"eslint-plugin-react-refresh": "^0.5.3",
|
||||||
|
"globals": "^16.0.0",
|
||||||
"postcss": "^8.4.21",
|
"postcss": "^8.4.21",
|
||||||
"prettier": "^3.1.1",
|
"prettier": "^3.1.1",
|
||||||
"tailwindcss": "^3.4.17",
|
"tailwindcss": "^3.4.17",
|
||||||
"typescript": "^4.9.3",
|
"typescript": "^4.9.3",
|
||||||
"vite": "^7.1.2",
|
"vite": "^7.3.6",
|
||||||
"vite-plugin-pwa": "^1.0.2"
|
"vite-plugin-pwa": "^1.3.0"
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"dompurify": "3.4.11",
|
||||||
|
"glob": "13.0.6"
|
||||||
},
|
},
|
||||||
"volta": {
|
"volta": {
|
||||||
"node": "24.13.0",
|
"node": "24.13.0",
|
||||||
|
|
|
||||||
39
ui/src/store/stateSync.ts
Normal file
39
ui/src/store/stateSync.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
const syncedActionTypes = new Set([
|
||||||
|
'@action.auth.signOut',
|
||||||
|
'@action.auth.signIn',
|
||||||
|
'@action.locale.setLang',
|
||||||
|
])
|
||||||
|
|
||||||
|
const channel =
|
||||||
|
typeof BroadcastChannel === 'undefined'
|
||||||
|
? undefined
|
||||||
|
: new BroadcastChannel('sozsoft-platform-state-sync')
|
||||||
|
|
||||||
|
const receivedActions = new WeakSet<object>()
|
||||||
|
|
||||||
|
const isSyncedAction = (action: unknown): action is { type: string } =>
|
||||||
|
typeof action === 'object' &&
|
||||||
|
action !== null &&
|
||||||
|
'type' in action &&
|
||||||
|
typeof action.type === 'string' &&
|
||||||
|
syncedActionTypes.has(action.type)
|
||||||
|
|
||||||
|
export const stateSyncMiddleware = () => (next: (action: unknown) => unknown) =>
|
||||||
|
(action: unknown) => {
|
||||||
|
const result = next(action)
|
||||||
|
|
||||||
|
if (isSyncedAction(action) && !receivedActions.has(action)) {
|
||||||
|
channel?.postMessage(action)
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
export const initStateSync = (store: { dispatch: (action: never) => unknown }) => {
|
||||||
|
channel?.addEventListener('message', ({ data }: MessageEvent<unknown>) => {
|
||||||
|
if (!isSyncedAction(data)) return
|
||||||
|
|
||||||
|
receivedActions.add(data)
|
||||||
|
store.dispatch(data as never)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,4 @@
|
||||||
import { createStore, createTypedHooks, persist } from 'easy-peasy'
|
import { createStore, createTypedHooks, persist } from 'easy-peasy'
|
||||||
import {
|
|
||||||
Config as ReduxStateSyncConfig,
|
|
||||||
createStateSyncMiddleware,
|
|
||||||
initMessageListener,
|
|
||||||
} from 'redux-state-sync'
|
|
||||||
import * as abpConfigService from '../services/abpConfig.service'
|
import * as abpConfigService from '../services/abpConfig.service'
|
||||||
import * as listFormService from '../services/admin/list-form.service'
|
import * as listFormService from '../services/admin/list-form.service'
|
||||||
import { AbpConfigModel, abpConfigModel } from './abpConfig.model'
|
import { AbpConfigModel, abpConfigModel } from './abpConfig.model'
|
||||||
|
|
@ -14,6 +9,7 @@ import { LocaleModel, localeModel } from './locale.model'
|
||||||
import { ThemeModel, themeModel } from './theme.model'
|
import { ThemeModel, themeModel } from './theme.model'
|
||||||
import { refreshToken } from '../services/auth.service'
|
import { refreshToken } from '../services/auth.service'
|
||||||
import { MenuService } from '../services/menu.service'
|
import { MenuService } from '../services/menu.service'
|
||||||
|
import { initStateSync, stateSyncMiddleware } from './stateSync'
|
||||||
|
|
||||||
export interface StoreModel {
|
export interface StoreModel {
|
||||||
abpConfig: AbpConfigModel
|
abpConfig: AbpConfigModel
|
||||||
|
|
@ -34,25 +30,6 @@ const injections = {
|
||||||
}
|
}
|
||||||
export type Injections = typeof injections
|
export type Injections = typeof injections
|
||||||
|
|
||||||
const reduxStateSyncConfig: ReduxStateSyncConfig = {
|
|
||||||
predicate: (action) => {
|
|
||||||
const blacklist = [
|
|
||||||
'persist/FLUSH',
|
|
||||||
'persist/REHYDRATE',
|
|
||||||
'persist/PAUSE',
|
|
||||||
'persist/PERSIST',
|
|
||||||
'persist/PURGE',
|
|
||||||
'persist/REGISTER',
|
|
||||||
]
|
|
||||||
const whitelist = ['@action.auth.signOut', '@action.auth.signIn', '@action.locale.setLang']
|
|
||||||
if (typeof action !== 'function') {
|
|
||||||
return whitelist.indexOf(action.type) >= 0
|
|
||||||
// return blacklist.indexOf(action.type) < 0
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export const store = createStore<StoreModel>(
|
export const store = createStore<StoreModel>(
|
||||||
persist(
|
persist(
|
||||||
{
|
{
|
||||||
|
|
@ -69,13 +46,13 @@ export const store = createStore<StoreModel>(
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
middleware: [createStateSyncMiddleware(reduxStateSyncConfig)],
|
middleware: [stateSyncMiddleware],
|
||||||
devTools: import.meta.env.DEV,
|
devTools: import.meta.env.DEV,
|
||||||
injections,
|
injections,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
initMessageListener(store)
|
initStateSync(store)
|
||||||
|
|
||||||
const typedHooks = createTypedHooks<StoreModel>()
|
const typedHooks = createTypedHooks<StoreModel>()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1345,7 +1345,7 @@ const Grid = (props: GridProps) => {
|
||||||
if (e.format === 'xlsx') {
|
if (e.format === 'xlsx') {
|
||||||
// Sadece Excel için gerekli kütüphaneleri yükle
|
// Sadece Excel için gerekli kütüphaneleri yükle
|
||||||
const [{ Workbook }, { saveAs }, { exportDataGrid }] = await Promise.all([
|
const [{ Workbook }, { saveAs }, { exportDataGrid }] = await Promise.all([
|
||||||
import('exceljs'),
|
import('devextreme-exceljs-fork'),
|
||||||
import('file-saver'),
|
import('file-saver'),
|
||||||
import('devextreme/excel_exporter'),
|
import('devextreme/excel_exporter'),
|
||||||
])
|
])
|
||||||
|
|
@ -1367,7 +1367,7 @@ const Grid = (props: GridProps) => {
|
||||||
} else if (e.format === 'csv') {
|
} else if (e.format === 'csv') {
|
||||||
// Sadece CSV için gerekli kütüphaneleri yükle (exceljs CSV desteği için)
|
// Sadece CSV için gerekli kütüphaneleri yükle (exceljs CSV desteği için)
|
||||||
const [{ Workbook }, { saveAs }] = await Promise.all([
|
const [{ Workbook }, { saveAs }] = await Promise.all([
|
||||||
import('exceljs'),
|
import('devextreme-exceljs-fork'),
|
||||||
import('file-saver'),
|
import('file-saver'),
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -206,7 +206,7 @@ const Pivot = (props: PivotProps) => {
|
||||||
try {
|
try {
|
||||||
// PivotGrid sadece Excel export destekliyor
|
// PivotGrid sadece Excel export destekliyor
|
||||||
const [{ Workbook }, { saveAs }, { exportPivotGrid }] = await Promise.all([
|
const [{ Workbook }, { saveAs }, { exportPivotGrid }] = await Promise.all([
|
||||||
import('exceljs'),
|
import('devextreme-exceljs-fork'),
|
||||||
import('file-saver'),
|
import('file-saver'),
|
||||||
import('devextreme/excel_exporter'),
|
import('devextreme/excel_exporter'),
|
||||||
])
|
])
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue