From abe79620a3feb6e7451cb9e51271bfefcd1fcc46 Mon Sep 17 00:00:00 2001 From: Andrew Burnett-Thompson Date: Fri, 23 Dec 2022 18:56:03 +0000 Subject: [PATCH 1/3] Deleted the javascript-ohlc-chart example. We want to redirect this to javascript-candlestick-chart --- .../src/components/AppRouter/examplePages.ts | 5 - Examples/src/components/AppRouter/examples.ts | 3 - .../OhlcChart/GENERATED_GITHUB_URL.ts | 1 - .../BasicChartTypes/OhlcChart/data/data.ts | 160 ------------------ .../BasicChartTypes/OhlcChart/exampleInfo.tsx | 61 ------- .../BasicChartTypes/OhlcChart/index.tsx | 75 -------- .../OhlcChart/javascript-ohlc-chart.jpg | Bin 43640 -> 0 bytes 7 files changed, 305 deletions(-) delete mode 100644 Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/GENERATED_GITHUB_URL.ts delete mode 100644 Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/data/data.ts delete mode 100644 Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/exampleInfo.tsx delete mode 100644 Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/index.tsx delete mode 100644 Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/javascript-ohlc-chart.jpg diff --git a/Examples/src/components/AppRouter/examplePages.ts b/Examples/src/components/AppRouter/examplePages.ts index 3a0f90629..830356228 100644 --- a/Examples/src/components/AppRouter/examplePages.ts +++ b/Examples/src/components/AppRouter/examplePages.ts @@ -4,7 +4,6 @@ import { digitalBandSeriesChartExampleInfo } from "../Examples/Charts2D/BasicCha import { fanChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/FanChart/exampleInfo"; import { bubbleChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/BubbleChart/exampleInfo"; import { candlestickChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/CandlestickChart/exampleInfo"; -import { ohlcChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/OhlcChart/exampleInfo"; import { columnChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/ColumnChart/exampleInfo"; import { impulseChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/ImpulseChart/exampleInfo"; import { errorBarsChartExampleInfo } from "../Examples/Charts2D/BasicChartTypes/ErrorBarsChart/exampleInfo"; @@ -174,10 +173,6 @@ export const EXAMPLES_PAGES = asRecord({ id: "chart2D_basicCharts_CandlestickChart", ...candlestickChartExampleInfo }, - chart2D_basicCharts_OhlcChart: { - id: "chart2D_basicCharts_OhlcChart", - ...ohlcChartExampleInfo - }, chart2D_basicCharts_ErrorBarsChart: { id: "chart2D_basicCharts_ErrorBarsChart", ...errorBarsChartExampleInfo diff --git a/Examples/src/components/AppRouter/examples.ts b/Examples/src/components/AppRouter/examples.ts index 73ee82ad3..3d2871370 100644 --- a/Examples/src/components/AppRouter/examples.ts +++ b/Examples/src/components/AppRouter/examples.ts @@ -3,7 +3,6 @@ import DigitalBandSeriesChart from "../Examples/Charts2D/BasicChartTypes/Digital import FanChart from "../Examples/Charts2D/BasicChartTypes/FanChart"; import BubbleChart from "../Examples/Charts2D/BasicChartTypes/BubbleChart"; import CandlestickChart from "../Examples/Charts2D/BasicChartTypes/CandlestickChart"; -import OhlcChart from "../Examples/Charts2D/BasicChartTypes/OhlcChart"; import ColumnChart from "../Examples/Charts2D/BasicChartTypes/ColumnChart"; import ImpulseChart from "../Examples/Charts2D/BasicChartTypes/ImpulseChart"; import HeatmapChart from "../Examples/Charts2D/BasicChartTypes/HeatmapChart"; @@ -355,8 +354,6 @@ export const getExampleComponent = (exampleId: string): (() => JSX.Element) => { return BubbleChart; case EXAMPLES_PAGES.chart2D_basicCharts_CandlestickChart.id: return CandlestickChart; - case EXAMPLES_PAGES.chart2D_basicCharts_OhlcChart.id: - return OhlcChart; case EXAMPLES_PAGES.chart2D_basicCharts_ColumnChart.id: return ColumnChart; case EXAMPLES_PAGES.chart2D_basicCharts_ErrorBarsChart.id: diff --git a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/GENERATED_GITHUB_URL.ts b/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/GENERATED_GITHUB_URL.ts deleted file mode 100644 index 92151bd0c..000000000 --- a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/GENERATED_GITHUB_URL.ts +++ /dev/null @@ -1 +0,0 @@ -export const githubUrl = "/components/Examples/Charts2D/BasicChartTypes/OhlcChart/index.tsx"; \ No newline at end of file diff --git a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/data/data.ts b/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/data/data.ts deleted file mode 100644 index f61f4df0d..000000000 --- a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/data/data.ts +++ /dev/null @@ -1,160 +0,0 @@ -export const dateValues: number[] = [ - 915408000, - 915494400, - 915580800, - 915667200, - 915753600, - 916012800, - 916099200, - 916185600, - 916272000, - 916358400, - 916617600, - 916704000, - 916790400, - 916876800, - 916963200, - 917222400, - 917308800, - 917395200, - 917481600, - 917568000, - 917827200, - 917913600, - 918000000, - 918086400, - 918172800, - 918432000, - 918518400, - 918604800, - 918691200, - 918777600, -]; -export const openValues: number[] = [ - 1.1801, - 1.1815, - 1.1761, - 1.1623, - 1.1713, - 1.1575, - 1.1504, - 1.1561, - 1.1673, - 1.1683, - 1.1565, - 1.1605, - 1.1598, - 1.1567, - 1.1605, - 1.1579, - 1.1555, - 1.1562, - 1.1445, - 1.1407, - 1.1382, - 1.1323, - 1.1353, - 1.1309, - 1.1343, - 1.1262, - 1.1312, - 1.1314, - 1.1323, - 1.1219, -]; -export const highValues: number[] = [ - 1.1862, - 1.1835, - 1.1773, - 1.1735, - 1.172, - 1.161, - 1.158, - 1.179, - 1.1728, - 1.1749, - 1.162, - 1.1642, - 1.1611, - 1.1619, - 1.1626, - 1.1608, - 1.1591, - 1.1565, - 1.147, - 1.1433, - 1.1397, - 1.1365, - 1.1363, - 1.1346, - 1.1373, - 1.133, - 1.1345, - 1.136, - 1.1336, - 1.1308, -]; -export const lowValues: number[] = [ - 1.1769, - 1.175, - 1.1553, - 1.1612, - 1.1533, - 1.1487, - 1.1447, - 1.1553, - 1.1614, - 1.1552, - 1.1564, - 1.1563, - 1.1539, - 1.1545, - 1.1559, - 1.1547, - 1.155, - 1.1408, - 1.1378, - 1.1342, - 1.129, - 1.1284, - 1.13, - 1.1247, - 1.1253, - 1.122, - 1.1281, - 1.127, - 1.1214, - 1.1216, -]; -export const closeValues: number[] = [ - 1.1815, - 1.1758, - 1.1623, - 1.1712, - 1.1585, - 1.1503, - 1.1555, - 1.1681, - 1.1681, - 1.1563, - 1.1605, - 1.1603, - 1.1566, - 1.1601, - 1.1587, - 1.1552, - 1.1562, - 1.144, - 1.1407, - 1.1367, - 1.1323, - 1.1352, - 1.1306, - 1.1344, - 1.126, - 1.1315, - 1.1315, - 1.1326, - 1.1218, - 1.1306, -]; diff --git a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/exampleInfo.tsx b/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/exampleInfo.tsx deleted file mode 100644 index 4dae19e59..000000000 --- a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/exampleInfo.tsx +++ /dev/null @@ -1,61 +0,0 @@ -import * as React from "react"; -import { TExampleInfo } from "../../../../AppRouter/examplePages"; -import { githubUrl } from "./GENERATED_GITHUB_URL"; -import { ExampleStrings } from "../../../ExampleStrings"; -import { TDocumentationLink } from "../../../../../helpers/types/ExampleDescriptionTypes"; -import { GalleryItem } from "../../../../../helpers/types/types"; - -const previewDescription = `SciChart.js supports Candlestick Charts or OHLC with custom colours per bar and Date X-Axis.`; -const description = `OHLC charts can be animated, dynamically updated for real trading apps or combined with other series types to draw technical indicators or shapes.`; -const tips = [ - `Try dragging on the chart to pan or zoom it. Use the mousewheel to zoom and double-click to zoom to fit.` -]; - -const documentationLinks: TDocumentationLink[] = [ - { - href: ExampleStrings.urlDocumentationHome, - title: ExampleStrings.titleDocumentationHome, - linkTitle: "SciChart.js Documentation Home" - }, - { - href: ExampleStrings.urlTutorialsHome, - title: ExampleStrings.titleTutorialsHome, - linkTitle: "SciChart.js Tutorials" - }, - { - href: ExampleStrings.urlOhlcChartDocumentation, - title: ExampleStrings.urlTitleOhlcChartDocumentation, - linkTitle: "JavaScript OHLC Chart Documentation" - }, - { - href: ExampleStrings.urlRenderSeriesPropertiesDocumentation, - title: ExampleStrings.urlTitleRenderSeriesProperties, - linkTitle: "Common RenderableSeries Properties" - } -]; - -const Subtitle = () => ( -

- For this example, we demonstrate how to create a JavaScript OHLC Chart{" "} - or Stock Chart using SciChart.js. This is our powerful{" "} - - JavaScript Chart Component - . -

-); - -export const ohlcChartExampleInfo: TExampleInfo = { - title: ExampleStrings.titleOhlcChart, - pageTitle: ExampleStrings.pageTitleOhlcChart, - path: ExampleStrings.urlOhlcChart, - subtitle: Subtitle, - documentationLinks, - tips, - description, - previewDescription, - githubUrl, - metaDescription: - "Easily create JavaScript OHLC Chart or Stock Chart using feature-rich SciChart.js chart library. Supports custom colors. Get your free trial now. ", - metaKeywords: "ohlc, stock, trading, chart, javascript, webgl, canvas", - thumbnailImage: "javascript-ohlc-chart.jpg" -}; diff --git a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/index.tsx b/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/index.tsx deleted file mode 100644 index d06081c39..000000000 --- a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/index.tsx +++ /dev/null @@ -1,75 +0,0 @@ -import * as React from "react"; -import { SciChartSurface } from "scichart"; -import { CategoryAxis } from "scichart/Charting/Visuals/Axis/CategoryAxis"; -import { NumberRange } from "scichart/Core/NumberRange"; -import { NumericAxis } from "scichart/Charting/Visuals/Axis/NumericAxis"; -import { OhlcDataSeries } from "scichart/Charting/Model/OhlcDataSeries"; -import { ZoomPanModifier } from "scichart/Charting/ChartModifiers/ZoomPanModifier"; -import { ZoomExtentsModifier } from "scichart/Charting/ChartModifiers/ZoomExtentsModifier"; -import { closeValues, dateValues as xValues, highValues, lowValues, openValues } from "./data/data"; -import { FastOhlcRenderableSeries } from "scichart/Charting/Visuals/RenderableSeries/FastOhlcRenderableSeries"; -import { MouseWheelZoomModifier } from "scichart/Charting/ChartModifiers/MouseWheelZoomModifier"; -import { SweepAnimation } from "scichart/Charting/Visuals/RenderableSeries/Animations/SweepAnimation"; -import classes from "../../../../Examples/Examples.module.scss"; -import { SmartDateLabelProvider } from "scichart/Charting/Visuals/Axis/LabelProvider/SmartDateLabelProvider"; -import {ENumericFormat} from "scichart/types/NumericFormat"; - -const divElementId = "chart"; - -// SCICHART EXAMPLE -const drawExample = async () => { - - // Create a SciChartSurface - const { sciChartSurface, wasmContext } = await SciChartSurface.create(divElementId); - - // Add an XAxis of type CategoryAxis - which collapses gaps in stock market data - // SmartLabelProvider returns useful labels for stock market data - sciChartSurface.xAxes.add(new CategoryAxis(wasmContext, { - labelProvider: new SmartDateLabelProvider(), - growBy: new NumberRange(0.05, 0.05) - })); - - // Create a NumericAxis on the YAxis with 4 Decimal Places - sciChartSurface.yAxes.add(new NumericAxis(wasmContext, { - visibleRange: new NumberRange(1.1, 1.2), - growBy: new NumberRange(0.1, 0.1), - labelFormat: ENumericFormat.Decimal, - labelPrecision: 4, - })); - - // Create the Ohlc series and add to the chart - sciChartSurface.renderableSeries.add(new FastOhlcRenderableSeries(wasmContext, { - dataSeries: new OhlcDataSeries(wasmContext, { xValues, openValues, highValues, lowValues, closeValues }), - strokeThickness: 1, - dataPointWidth: 0.7, - strokeUp: "#50ff50", - strokeDown: "#ff5050", - animation: new SweepAnimation({ duration: 800, fadeEffect: true }) - })); - - // Optional: Add some interactivity modifiers - sciChartSurface.chartModifiers.add( - new ZoomExtentsModifier(), - new ZoomPanModifier(), - new MouseWheelZoomModifier()); - - sciChartSurface.zoomExtents(); - return { sciChartSurface, wasmContext }; -}; - -// React component needed as our examples app is react. -// SciChart can be used in Angular, Vue, Blazor and vanilla JS! See our Github repo for more info -export default function OhlcChart() { - const [sciChartSurface, setSciChartSurface] = React.useState(); - - React.useEffect(() => { - (async () => { - const res = await drawExample(); - setSciChartSurface(res.sciChartSurface); - })(); - // Delete sciChartSurface on unmount component to prevent memory leak - return () => sciChartSurface?.delete(); - }, []); - - return
; -} diff --git a/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/javascript-ohlc-chart.jpg b/Examples/src/components/Examples/Charts2D/BasicChartTypes/OhlcChart/javascript-ohlc-chart.jpg deleted file mode 100644 index ccb98a2b9371e8a387fd72b70a42a6935cc8e1db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43640 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 qDpXz_Fo0NG From e6666bfae3e3e0db1ed32f3a038633346e9e6ac4 Mon Sep 17 00:00:00 2001 From: Andrew Burnett-Thompson Date: Fri, 23 Dec 2022 19:57:26 +0000 Subject: [PATCH 2/3] Added redirection rules and redirected Ohlc-Chart to Candlestick-Chart --- Examples/src/components/App.tsx | 10 +++++++++- Examples/src/components/AppRouter/redirectionRules.ts | 7 +++++++ Examples/tsconfig.json | 8 +++++++- 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 Examples/src/components/AppRouter/redirectionRules.ts diff --git a/Examples/src/components/App.tsx b/Examples/src/components/App.tsx index 60af8f70b..ac60f4f83 100644 --- a/Examples/src/components/App.tsx +++ b/Examples/src/components/App.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import { useLocation } from "react-router-dom"; +import {Navigate, useLocation} from "react-router-dom"; import { Theme } from "@material-ui/core/styles"; import Drawer from "@material-ui/core/Drawer"; import useMediaQuery from "@material-ui/core/useMediaQuery"; @@ -23,9 +23,17 @@ import Gallery from "./Gallery/Gallery"; import { PAGES } from "./AppRouter/pages"; import {GalleryItem} from "../helpers/types/types"; import {allGalleryItems, getSeeAlsoGalleryItems} from "../helpers/SciChartExamples"; +import {REDIRECTION_RULES} from "./AppRouter/redirectionRules"; export default function App() { const location = useLocation(); + + // Process redirection rules first + const pathWithoutSlash = location.pathname.endsWith("/") ? location.pathname.slice(0, -1) : location.pathname; + if (REDIRECTION_RULES.has(pathWithoutSlash)) { + return + } + // For charts without layout we use '/iframe' prefix, for example '/iframe/javascript-multiline-labels' const isIFrame = location.pathname.substring(1, 7) === 'iframe'; const pathname = isIFrame ? location.pathname.substring(7) : location.pathname; diff --git a/Examples/src/components/AppRouter/redirectionRules.ts b/Examples/src/components/AppRouter/redirectionRules.ts new file mode 100644 index 000000000..b8f25e0bb --- /dev/null +++ b/Examples/src/components/AppRouter/redirectionRules.ts @@ -0,0 +1,7 @@ +import { Navigate } from "react-router-dom"; + +// Redirection URLs from - to +export const REDIRECTION_RULES = new Map([ + ["/javascript-ohlc-chart", "javascript-candlestick-chart"], +]); + diff --git a/Examples/tsconfig.json b/Examples/tsconfig.json index 0029cc08a..5bca8d013 100644 --- a/Examples/tsconfig.json +++ b/Examples/tsconfig.json @@ -22,7 +22,13 @@ "./src/types", "./node_modules/@types"], "esModuleInterop": false, "skipLibCheck": false, - "forceConsistentCasingInFileNames": true + "forceConsistentCasingInFileNames": true, + "lib": [ + "dom", + "es5", + "scripthost", + "es2015.collection" + ] }, "include": [ "src/**/*", From a977b5eebcd5787f3dc82a485601b91321937118 Mon Sep 17 00:00:00 2001 From: Andrew Burnett-Thompson Date: Fri, 23 Dec 2022 21:53:31 +0000 Subject: [PATCH 3/3] My really basic HTTP404 implementation. --- Examples/src/components/App.tsx | 61 ++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/Examples/src/components/App.tsx b/Examples/src/components/App.tsx index ac60f4f83..afdf1001c 100644 --- a/Examples/src/components/App.tsx +++ b/Examples/src/components/App.tsx @@ -1,5 +1,5 @@ import * as React from "react"; -import {Navigate, useLocation} from "react-router-dom"; +import {Link, Navigate, Route, Routes, useLocation} from "react-router-dom"; import { Theme } from "@material-ui/core/styles"; import Drawer from "@material-ui/core/Drawer"; import useMediaQuery from "@material-ui/core/useMediaQuery"; @@ -25,6 +25,13 @@ import {GalleryItem} from "../helpers/types/types"; import {allGalleryItems, getSeeAlsoGalleryItems} from "../helpers/SciChartExamples"; import {REDIRECTION_RULES} from "./AppRouter/redirectionRules"; +const NotFound = () => ( +
+

404 - Not Found!

+ Go Home +
+) + export default function App() { const location = useLocation(); @@ -103,17 +110,41 @@ export default function App() { } }, [currentExampleId]); - if (isIFrame) { + const isHttp404 = PAGES.homapage.path !== location.pathname && currentExampleKey === undefined; + + if (isIFrame && !isHttp404) { return } const testIsOpened = (id: string): boolean => !!openedMenuItems[id]; + + const pageContent = <>{PAGES.homapage.path === location.pathname && } +
+
+ { + }} + /> +
+ {PAGES.homapage.path === location.pathname ? ( +
+ +
+ ) : ( + + )} +
+ ; + + return (
- - {PAGES.homapage.path === location.pathname && } - -
-
- {}} - /> -
- {PAGES.homapage.path === location.pathname ? ( -
- -
- ) : ( - - )} -
- - + + {isHttp404 ? : pageContent} +
);