diff --git a/.storybook/main.ts b/.storybook/main.ts index f592219f..e8be2816 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,4 +1,6 @@ import type { StorybookConfig } from '@storybook/react-vite'; +import path from 'path'; +import fs from 'fs'; const config: StorybookConfig = { stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'], @@ -16,6 +18,64 @@ const config: StorybookConfig = { reactDocgen: 'react-docgen-typescript', }, staticDirs: ['./public'], + viteFinal: async (config) => { + const dataVisDir = path.resolve(process.cwd(), 'src/components/DataVis'); + const wcdatavisSrc = path.resolve(process.cwd(), 'node_modules/wcdatavis/src'); + const wcdatavisAvailable = fs.existsSync(wcdatavisSrc); + + config.resolve = config.resolve || {}; + const existingAliases = Array.isArray(config.resolve.alias) + ? config.resolve.alias + : Object.entries(config.resolve.alias || {}).map(([find, replacement]) => ({ find, replacement })); + + if (wcdatavisAvailable) { + // Full wcdatavis integration — shim loads jQuery globals + plugins, + // then re-exports wcdatavis classes for the DataVis component. + const wcdatavisNodeModules = path.resolve(process.cwd(), 'node_modules/wcdatavis/node_modules'); + + config.resolve.alias = [ + ...existingAliases, + { + find: /^wcdatavis$/, + replacement: path.resolve(dataVisDir, 'wcdatavis-shim.js'), + }, + { + find: /^@mieweb\/wcdatavis$/, + replacement: path.resolve(dataVisDir, 'wcdatavis-shim.js'), + }, + // Resolve wcdatavis's jQuery plugins from its nested node_modules so they + // extend the same jQuery instance the source files import + { find: /^jquery-ui(.*)$/, replacement: `${wcdatavisNodeModules}/jquery-ui$1` }, + { find: /^jquery-contextmenu$/, replacement: path.join(wcdatavisNodeModules, 'jquery-contextmenu') }, + { find: /^sumoselect$/, replacement: path.join(wcdatavisNodeModules, 'sumoselect') }, + { find: /^flatpickr$/, replacement: path.join(wcdatavisNodeModules, 'flatpickr') }, + { find: /^jquery$/, replacement: path.join(wcdatavisNodeModules, 'jquery') }, + ]; + + // Pre-bundle wcdatavis and its jQuery plugins + config.optimizeDeps = config.optimizeDeps || {}; + config.optimizeDeps.include = [ + ...(config.optimizeDeps.include || []), + 'wcdatavis/src/source.js', + 'wcdatavis/src/computed_view.js', + 'wcdatavis/src/grid.js', + 'wcdatavis/src/graph.js', + 'wcdatavis/src/prefs.js', + ]; + } else { + // wcdatavis not installed (CI, fresh checkouts) — alias to lightweight + // stubs so the Storybook build completes. DataVis stories will render + // an error state instead of the live grid. + config.resolve.alias = [ + ...existingAliases, + { find: /^wcdatavis\/dist\/wcdatavis\.css/, replacement: path.resolve(dataVisDir, 'wcdatavis-stub.css') }, + { find: /^wcdatavis$/, replacement: path.resolve(dataVisDir, 'wcdatavis-stub.js') }, + { find: /^@mieweb\/wcdatavis$/, replacement: path.resolve(dataVisDir, 'wcdatavis-stub.js') }, + ]; + } + + return config; + }, }; export default config; diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html index a98e03b2..f3a7dea1 100644 --- a/.storybook/preview-head.html +++ b/.storybook/preview-head.html @@ -1,3 +1,11 @@ + + +