Compare commits

...

3 Commits

Author SHA1 Message Date
24502dddfc Fixed charts lazy loading. 2025-12-27 17:25:04 +00:00
b3961871ff Fixed rollup. 2025-12-27 16:51:16 +00:00
01287f39ae Define mask for compat. 2025-12-27 16:38:43 +00:00
3 changed files with 60 additions and 29 deletions

View File

@ -26,6 +26,7 @@
background: background:
radial-gradient(farthest-side, #008eff 94%, #0000) top/6px 6px no-repeat, radial-gradient(farthest-side, #008eff 94%, #0000) top/6px 6px no-repeat,
conic-gradient(#0000 30%, #008eff); conic-gradient(#0000 30%, #008eff);
mask: radial-gradient(farthest-side, #0000 calc(100% - 6px), #000 0);
-webkit-mask: radial-gradient(farthest-side, #0000 calc(100% - 6px), #000 0); -webkit-mask: radial-gradient(farthest-side, #0000 calc(100% - 6px), #000 0);
animation: l13 1s infinite linear; animation: l13 1s infinite linear;
} }

View File

@ -1,6 +1,19 @@
import { useEffect, useState, useContext, useMemo } from 'react' import { useEffect, useState, useContext, useMemo, lazy, Suspense } from 'react'
import { Card, Segmented, Flex, Popover, DatePicker, Button, Space } from 'antd' import {
import { Column } from '@ant-design/charts' Card,
Segmented,
Flex,
Popover,
DatePicker,
Button,
Space,
Skeleton
} from 'antd'
const Column = lazy(() =>
import('@ant-design/charts').then((module) => ({ default: module.Column }))
)
import PropTypes from 'prop-types' import PropTypes from 'prop-types'
import { getModelByName } from '../../../database/ObjectModels' import { getModelByName } from '../../../database/ObjectModels'
import { ApiServerContext } from '../context/ApiServerContext' import { ApiServerContext } from '../context/ApiServerContext'
@ -378,7 +391,21 @@ const HistoryDisplay = ({
<LoadingPlaceholder message='Loading history data...' /> <LoadingPlaceholder message='Loading history data...' />
</Flex> </Flex>
)} )}
{chartData.length > 0 && <Column {...config} />} {chartData.length > 0 && (
<Suspense
fallback={
<Flex
justify='center'
align='center'
style={{ height: `${height}px` }}
>
<Skeleton active paragraph={{ rows: 4 }} />
</Flex>
}
>
<Column {...config} />
</Suspense>
)}
{loading == false && chartData.length == 0 && ( {loading == false && chartData.length == 0 && (
<Flex justify='center' align='center' style={{ height: `${height}px` }}> <Flex justify='center' align='center' style={{ height: `${height}px` }}>
<MissingPlaceholder message='No data available.' /> <MissingPlaceholder message='No data available.' />

View File

@ -5,6 +5,7 @@ import svgr from 'vite-plugin-svgr'
import svgo from 'vite-plugin-svgo' import svgo from 'vite-plugin-svgo'
import path from 'path' import path from 'path'
import { fileURLToPath } from 'url' import { fileURLToPath } from 'url'
import { visualizer } from 'rollup-plugin-visualizer'
const __filename = fileURLToPath(import.meta.url) const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename) const __dirname = path.dirname(__filename)
@ -19,10 +20,10 @@ export default defineConfig({
optimizeDeps: { optimizeDeps: {
include: ['@ant-design/icons'] include: ['@ant-design/icons']
}, },
plugins: [react(), svgo(), svgr(), eslintPlugin()], plugins: [react(), svgo(), svgr(), eslintPlugin(), visualizer()],
build: { build: {
outDir: 'build', outDir: 'build',
chunkSizeWarningLimit: 1500, chunkSizeWarningLimit: 2000,
rollupOptions: { rollupOptions: {
output: { output: {
manualChunks(id) { manualChunks(id) {
@ -36,18 +37,34 @@ export default defineConfig({
return 'lezer' return 'lezer'
} }
// --- Ant Design // --- Core Vendor (Ant Design, React, etc.)
if (id.includes('node_modules/antd')) { if (
id.includes('node_modules/antd') ||
id.includes('node_modules/@ant-design') ||
id.includes('node_modules/rc-') ||
id.includes('node_modules/antd-style') ||
id.includes('node_modules/@rc-component') ||
id.includes('node_modules/dayjs') ||
id.includes('node_modules/react') ||
id.includes('node_modules/react-dom') ||
id.includes('node_modules/react-router-dom')
) {
// EXCLUDE charts so they are handled by lazy loading in HistoryDisplay.jsx
if (
id.includes('node_modules/@ant-design/charts') ||
id.includes('node_modules/@ant-design/plots') ||
id.includes('node_modules/@ant-design/graphs') ||
id.includes('node_modules/@ant-design/charts-util') ||
id.includes('node_modules/@antv')
) {
return
}
return 'antd' return 'antd'
} }
if (id.includes('node_modules/@ant-design/charts')) { // --- Lodash
return 'ant-charts' if (id.includes('node_modules/lodash')) {
} return 'lodash'
// --- AntV
if (id.includes('node_modules/@antv')) {
return 'antv'
} }
// --- Three.js // --- Three.js
@ -65,11 +82,6 @@ export default defineConfig({
return 'online-3d-viewer' return 'online-3d-viewer'
} }
// --- Lodash
if (id.includes('node_modules/lodash')) {
return 'lodash'
}
// --- tsparticles // --- tsparticles
if ( if (
id.includes('node_modules/@tsparticles') || id.includes('node_modules/@tsparticles') ||
@ -77,15 +89,6 @@ export default defineConfig({
) { ) {
return 'tsparticles' return 'tsparticles'
} }
// --- React vendor
if (
id.includes('node_modules/react') ||
id.includes('node_modules/react-dom') ||
id.includes('node_modules/react-router-dom')
) {
return 'react-vendor'
}
} }
} }
} }