From e2408d0157e19126475e326ab19afd0fb46436f7 Mon Sep 17 00:00:00 2001 From: Tak Tran Date: Tue, 25 Jun 2024 16:03:34 +0100 Subject: [PATCH] AG-11949 - Add license setup page (#1864) * AG-11949 - Make License setup work on charts Move Code and Snippet components to shared folder * AG-11949 - Remove ag-website-shared from ignored * AG-11949 - Update charts dependencies and snippets for license setup * AG-11949 - Update useLicenseData with grid update * AG-11949 - Show charts related errors * AG-11949 - Add right hand menu for license setup Remove hiding menus based on commented out code - not used anymore. * AG-11949 - Don't set license data from url Don't need to configure anything on charts licenses * AG-11949 - Fix formatting * AG-11949 - Update license setup copy * AG-11949 - Add root eslint config for ag-website-shared Need to update, after eslint 9.x upgrade * AG-11949 - Add expiry back in to license setup --- .nxignore | 1 - .prettierignore | 1 - eslint.config.mjs | 39 +++ .../src/components/code/Code.module.scss | 111 ++++++++ .../src/components/code}/Code.tsx | 0 .../components/LicenseSetup.astro | 21 -- .../components/LicenseSetup.module.scss | 9 +- .../license-setup/components/LicenseSetup.tsx | 253 ++++++++++-------- .../utils/getDependencies.test.ts | 67 ++++- .../license-setup/utils/getDependencies.ts | 46 +++- .../license-setup/utils/getSnippets.ts | 18 +- .../license-setup/utils/useLicenseData.ts | 52 ++-- .../utils/useUpdateDataFromUrl.ts | 40 +-- .../src/components/snippet/EmbedSnippet.astro | 4 +- .../src/components/snippet/Snippet.tsx | 65 +++++ .../snippet/SnippetFromRemoteUrl.tsx | 2 +- .../style-guide/TextElements.tsx | 3 +- .../src/images/fw-logos/index.ts | 4 +- .../src/markdoc/tags/embedSnippet.ts | 18 ++ .../src/markdoc/tags/licenseSetup.ts | 6 - .../src/utils/throwDevWarning.ts | 19 ++ packages/ag-charts-website/markdoc.config.ts | 20 +- .../license-setup/LicenseSetup.astro | 21 ++ .../components/SideNavigation.tsx | 39 +-- .../pages-navigation/hooks/useScrollSpy.ts | 26 +- .../src/components/snippet/Snippet.tsx | 44 --- packages/ag-charts-website/src/constants.ts | 2 + .../ag-charts-website/src/content/config.ts | 12 + .../content/docs/license-install/index.mdoc | 21 ++ .../src/content/menu/data.json | 4 + .../components/ApiReference.tsx | 2 +- .../example-runner/components/CodeViewer.tsx | 2 +- .../src/pages/[framework]/[pageName].astro | 18 +- 33 files changed, 683 insertions(+), 307 deletions(-) create mode 100644 eslint.config.mjs create mode 100644 external/ag-website-shared/src/components/code/Code.module.scss rename {packages/ag-charts-website/src/components => external/ag-website-shared/src/components/code}/Code.tsx (100%) delete mode 100644 external/ag-website-shared/src/components/license-setup/components/LicenseSetup.astro rename {packages/ag-charts-website => external/ag-website-shared}/src/components/snippet/EmbedSnippet.astro (84%) create mode 100644 external/ag-website-shared/src/components/snippet/Snippet.tsx rename {packages/ag-charts-website => external/ag-website-shared}/src/components/snippet/SnippetFromRemoteUrl.tsx (92%) create mode 100644 external/ag-website-shared/src/markdoc/tags/embedSnippet.ts delete mode 100644 external/ag-website-shared/src/markdoc/tags/licenseSetup.ts create mode 100644 external/ag-website-shared/src/utils/throwDevWarning.ts create mode 100644 packages/ag-charts-website/src/components/license-setup/LicenseSetup.astro delete mode 100644 packages/ag-charts-website/src/components/snippet/Snippet.tsx create mode 100644 packages/ag-charts-website/src/content/docs/license-install/index.mdoc diff --git a/.nxignore b/.nxignore index 98d9ab178c..4439a43e66 100644 --- a/.nxignore +++ b/.nxignore @@ -1,3 +1,2 @@ __diff_output__ -/external/ag-website-shared/ diff --git a/.prettierignore b/.prettierignore index 7e3c7c29c6..98c4053846 100644 --- a/.prettierignore +++ b/.prettierignore @@ -10,7 +10,6 @@ /packages/ag-charts-react/dist /packages/ag-charts-vue3/dist /packages/ag-charts-vue3/lib -/external/ag-website-shared/ /packages/ag-charts-angular/projects/ag-charts-angular/src/test.ts /.nx/cache \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..5023db752a --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,39 @@ +import pluginJs from '@eslint/js'; +// TODO: Add after eslint upgrade to v9.x +// import eslintImportX from 'eslint-plugin-import-x'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +export default [ + { languageOptions: { globals: { ...globals.browser, ...globals.node } } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + { + plugins: { + // 'import-x': eslintImportX + }, + }, + { + ignores: ['node_modules/', 'dist/'], + }, + { + rules: { + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { + prefer: 'type-imports', + fixStyle: 'separate-type-imports', + }, + ], + 'import-x/consistent-type-specifier-style': 'error', + '@typescript-eslint/no-this-alias': 'off', + 'no-restricted-imports': [ + 'error', + { + patterns: ['community-modules/*', 'enterprise-modules/*', '*/main'], + }, + ], + }, + }, +]; diff --git a/external/ag-website-shared/src/components/code/Code.module.scss b/external/ag-website-shared/src/components/code/Code.module.scss new file mode 100644 index 0000000000..5ceb3df33f --- /dev/null +++ b/external/ag-website-shared/src/components/code/Code.module.scss @@ -0,0 +1,111 @@ +@use 'design-system' as *; + +.clipboardButtonOuter { + display: flex; + align-items: center; + position: absolute; + top: $spacing-size-1; + right: $spacing-size-1; + height: $spacing-size-8; + opacity: 0; + z-index: 2; + overflow: hidden; + transition: opacity 0.33s ease-in-out; + + pre:hover & { + opacity: 1; + } +} + +.clipboardButton, +.clipboardButtonCopied { + display: flex; + align-items: center; + height: $spacing-size-8; + background-color: var(--color-bg-primary); + border-top: 1px solid var(--color-border-primary); + border-bottom: 1px solid var(--color-border-primary); + + #{$selector-darkmode} & { + background-color: var(--color-code-background); + } +} + +.clipboardButton { + width: calc(#{$spacing-size-8} - var(--radius-sm)); + border-top-right-radius: var(--radius-sm); + border-bottom-right-radius: var(--radius-sm); + border-right: 1px solid var(--color-border-primary); + cursor: pointer; + transition: background-color $transition-default-timing; + + svg { + --color-icon: var(--color-util-gray-500); + + position: relative; + left: -2px; + transition: fill $transition-default-timing; + } + + &:hover svg { + --color-icon: var(--color-util-brand-400); + + #{$selector-darkmode} & { + --color-icon: var(--color-link-hover); + } + } +} + +.clipboardButtonCopiedOuter { + overflow: hidden; +} + +.clipboardButtonCopied { + font-size: var(--text-fs-sm); + font-weight: var(--text-semibold); + padding-left: $spacing-size-2; + padding-right: $spacing-size-2; + border-top-left-radius: var(--radius-sm); + border-bottom-left-radius: var(--radius-sm); + border-left: 1px solid var(--color-border-primary); + color: var(--color-fg-white); + transform: translateX(calc(100% - var(--radius-sm))); + transition: + transform $transition-default-timing, + background-color $transition-default-timing, + color $transition-default-timing; + cursor: pointer; + + #{$selector-darkmode} & { + color: var(--color-bg-primary); + } +} + +.hasCopied { + opacity: 1; + + .clipboardButton { + background-color: var(--color-util-gray-700); + } + + .clipboardButton svg { + --color-icon: var(--color-fg-white); + + #{$selector-darkmode} & { + --color-icon: var(--color-bg-primary); + } + } + + .clipboardButton:hover svg { + --color-icon: var(--color-fg-white); + + #{$selector-darkmode} & { + --color-icon: var(--color-bg-primary); + } + } + + .clipboardButtonCopied { + transform: translateX(0); + background-color: var(--color-util-gray-700); + } +} diff --git a/packages/ag-charts-website/src/components/Code.tsx b/external/ag-website-shared/src/components/code/Code.tsx similarity index 100% rename from packages/ag-charts-website/src/components/Code.tsx rename to external/ag-website-shared/src/components/code/Code.tsx diff --git a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.astro b/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.astro deleted file mode 100644 index 925b967f8e..0000000000 --- a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.astro +++ /dev/null @@ -1,21 +0,0 @@ ---- -import type { MenuSection } from '@ag-grid-types'; -import { LicenseSetup } from './LicenseSetup'; -import { getEntry } from 'astro:content'; -import { getFrameworkFromPath } from '@features/docs/utils/urlPaths'; -import seedRepos from '../../../content/seed-projects/grid-seed-projects.json'; -import { getFilteredMenuSections } from '@components/pages-navigation/utils/getFilteredMenuSections'; - -const { pathname } = Astro.url; -const framework = getFrameworkFromPath(pathname); - -const { data: menu } = await getEntry('menu', 'data'); - -// TODO: Need to generalise this to make it work with charts -const menuItems: MenuSection[] = getFilteredMenuSections({ - menuSections: menu.main.sections, - framework, -}); ---- - - diff --git a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.module.scss b/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.module.scss index 7f6519c131..cd7d065f6b 100644 --- a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.module.scss +++ b/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.module.scss @@ -94,12 +94,11 @@ } .licenseData { + display: flex; + flex-direction: column; + gap: $spacing-size-8; margin-top: $spacing-size-2; - > div { - margin-bottom: $spacing-size-8; - } - .inputList { margin-bottom: $spacing-size-10; } @@ -220,6 +219,8 @@ } .results { + margin-top: $spacing-size-8; + h2 { margin-top: $spacing-size-12; } diff --git a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.tsx b/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.tsx index 2ff5b492ef..e1626d2da6 100644 --- a/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.tsx +++ b/external/ag-website-shared/src/components/license-setup/components/LicenseSetup.tsx @@ -1,11 +1,11 @@ -import type { Framework, ImportType, MenuItem } from '@ag-grid-types'; +import type { Framework, ImportType, Library, MenuItem } from '@ag-grid-types'; import Note from '@ag-website-shared/components/alert/Note'; import Success from '@ag-website-shared/components/alert/Success'; import Warning from '@ag-website-shared/components/alert/Warning'; import { Icon } from '@ag-website-shared/components/icon/Icon'; +import { Snippet } from '@ag-website-shared/components/snippet/Snippet'; +import fwLogos from '@ag-website-shared/images/fw-logos'; import { FrameworkSelectorInsideDocs } from '@components/framework-selector-inside-doc/FrameworkSelectorInsideDocs'; -import { Snippet } from '@components/snippet/Snippet'; -import { urlWithBaseUrl } from '@utils/urlWithBaseUrl'; import classnames from 'classnames'; import { type FunctionComponent, useMemo } from 'react'; @@ -24,6 +24,7 @@ interface SeedRepo { } interface Props { + library: Library; framework: Framework; path: string; menuItems: MenuItem[]; @@ -41,7 +42,7 @@ const EmailSales = () => { ); }; -export const LicenseSetup: FunctionComponent = ({ framework, path, menuItems, seedRepos }) => { +export const LicenseSetup: FunctionComponent = ({ library, framework, path, menuItems, seedRepos }) => { const { userLicense, setUserLicense, @@ -57,19 +58,21 @@ export const LicenseSetup: FunctionComponent = ({ framework, path, menuIt licenseState, licenseInvalidErrors, licenseValidMessage, - } = useLicenseData(); + } = useLicenseData({ library }); const dependenciesSnippet = useMemo( () => getDependenciesSnippet({ + library, framework, isIntegratedCharts, importType, }), - [framework, isIntegratedCharts, importType] + [library, framework, isIntegratedCharts, importType] ); const npmInstallSnippet = useMemo( () => getNpmInstallSnippet({ + library, framework, isIntegratedCharts, importType, @@ -97,11 +100,13 @@ export const LicenseSetup: FunctionComponent = ({ framework, path, menuIt }), [seedRepos, isIntegratedCharts, framework, importType] ); + const isGrid = library === 'grid'; + const productName = isGrid ? 'AG Grid' : 'AG Charts'; return ( <>
-

Validate your licence

+

Validate Your Licence