From 3a4e1a01dd8877a85c940d13f0aafd9c620e4418 Mon Sep 17 00:00:00 2001 From: davy-c Date: Mon, 9 Jun 2025 09:58:47 +0900 Subject: [PATCH 01/10] fix tsc --- src/cloud/components/Modal/contents/DiscountModal.tsx | 2 +- src/cloud/lib/i18n/fr.ts | 3 +++ src/cloud/lib/i18n/ja.ts | 2 ++ src/cloud/lib/i18n/zhCN.ts | 2 ++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cloud/components/Modal/contents/DiscountModal.tsx b/src/cloud/components/Modal/contents/DiscountModal.tsx index 6d90a5c32..2a79a9246 100644 --- a/src/cloud/components/Modal/contents/DiscountModal.tsx +++ b/src/cloud/components/Modal/contents/DiscountModal.tsx @@ -1,4 +1,4 @@ -import React, { useMemo, useState } from 'react' +import React, { useMemo } from 'react' import styled from '../../../../design/lib/styled' import Countdown from 'react-countdown' import { diff --git a/src/cloud/lib/i18n/fr.ts b/src/cloud/lib/i18n/fr.ts index 8bde71289..1906cd4db 100644 --- a/src/cloud/lib/i18n/fr.ts +++ b/src/cloud/lib/i18n/fr.ts @@ -1,6 +1,9 @@ import { TranslationSource, lngKeys } from './types' const frTranslation: TranslationSource = { + [lngKeys.SettingsBeta]: 'Beta', + [lngKeys.SettingsBetaAutomationAndIntegration]: 'Automation & Integration', + //General [lngKeys.GeneralError]: 'Erreur', [lngKeys.GeneralCreate]: 'Créer', diff --git a/src/cloud/lib/i18n/ja.ts b/src/cloud/lib/i18n/ja.ts index 34f8c6b1e..71d2efaf3 100644 --- a/src/cloud/lib/i18n/ja.ts +++ b/src/cloud/lib/i18n/ja.ts @@ -1,6 +1,8 @@ import { lngKeys, TranslationSource } from './types' const jpTranslation: TranslationSource = { + [lngKeys.SettingsBeta]: 'Beta', + [lngKeys.SettingsBetaAutomationAndIntegration]: 'Automation & Integration', //General [lngKeys.GeneralError]: 'エラー', [lngKeys.GeneralCreate]: '作成', diff --git a/src/cloud/lib/i18n/zhCN.ts b/src/cloud/lib/i18n/zhCN.ts index b594105cd..a22fa6ec7 100644 --- a/src/cloud/lib/i18n/zhCN.ts +++ b/src/cloud/lib/i18n/zhCN.ts @@ -1,6 +1,8 @@ import { lngKeys, TranslationSource } from './types' const zhTranslation: TranslationSource = { + [lngKeys.SettingsBeta]: 'Beta', + [lngKeys.SettingsBetaAutomationAndIntegration]: 'Automation & Integration', //General [lngKeys.GeneralError]: '错误', [lngKeys.GeneralCreate]: '创建', From 96579ad8d46c10da6329aa591a420cf864a211cf Mon Sep 17 00:00:00 2001 From: davy-c Date: Wed, 11 Jun 2025 08:07:55 +0900 Subject: [PATCH 02/10] add temporary export modal in sidebar --- src/cloud/api/teams/export.ts | 8 ++ src/cloud/components/Application.tsx | 43 ++++---- .../components/Modal/contents/ExportModal.tsx | 103 ++++++++++++++++++ src/cloud/lib/client.ts | 35 ++++++ 4 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 src/cloud/api/teams/export.ts create mode 100644 src/cloud/components/Modal/contents/ExportModal.tsx diff --git a/src/cloud/api/teams/export.ts b/src/cloud/api/teams/export.ts new file mode 100644 index 000000000..d46004c21 --- /dev/null +++ b/src/cloud/api/teams/export.ts @@ -0,0 +1,8 @@ +import { callApiBlob } from '../../lib/client' + +export async function exportWorkspace(teamId: string) { + const data = await callApiBlob(`api/teams/${teamId}/export`, { + method: 'get', + }) + return data +} diff --git a/src/cloud/components/Application.tsx b/src/cloud/components/Application.tsx index 610191674..ca21ba3a9 100644 --- a/src/cloud/components/Application.tsx +++ b/src/cloud/components/Application.tsx @@ -30,7 +30,7 @@ import { mapUsers } from '../../design/lib/mappers/users' import { mdiCog, mdiDownload, - mdiGiftOutline, + mdiExclamationThick, mdiInbox, mdiLogoutVariant, mdiMagnify, @@ -49,8 +49,6 @@ import { import { useModal } from '../../design/lib/stores/modal' import NewDocButton from './buttons/NewDocButton' import { useCloudSidebarTree } from '../lib/hooks/sidebar/useCloudSidebarTree' -import { isTimeEligibleForDiscount } from '../lib/subscription' -import DiscountModal from './Modal/contents/DiscountModal' import { Notification as UserNotification } from '../interfaces/db/notifications' import useNotificationState from '../../design/lib/hooks/useNotificationState' import { useNotifications } from '../../design/lib/stores/notifications' @@ -78,6 +76,7 @@ import SidebarSubscriptionCTA from './Subscription/SidebarSubscriptionCTA' import { isEmpty } from 'lodash' import LoaderTopbar from '../../design/components/atoms/loaders/LoaderTopbar' import Icon from '../../design/components/atoms/Icon' +import ExportModal from './Modal/contents/ExportModal' interface ApplicationProps { className?: string @@ -101,7 +100,6 @@ const Application = ({ permissions = [], currentUserPermissions, currentUserIsCoreMember, - subscription, navigatingBetweenPage, } = usePage() const { openModal } = useModal() @@ -451,30 +449,27 @@ const Application = ({ }, ]} > - {isTimeEligibleForDiscount(team) && subscription == null ? ( - - - - } - id='sidebar__button__promo' - label={translate(lngKeys.SidebarNewUserDiscount)} - labelClick={() => { - trackEvent(MixpanelActionTrackTypes.DiscountSidebar) - return openModal(, { - showCloseIcon: true, - width: 'large', - }) - }} - /> - ) : null} + + + + } + id='sidebar__button__promo' + label={'Export your data'} + labelClick={() => { + return openModal(, { + showCloseIcon: true, + width: 'large', + }) + }} + /> ) - }, [team, translate, pathname, subscription, push, sendToElectron, openModal]) + }, [team, translate, pathname, push, sendToElectron, openModal]) return ( <> diff --git a/src/cloud/components/Modal/contents/ExportModal.tsx b/src/cloud/components/Modal/contents/ExportModal.tsx new file mode 100644 index 000000000..3e3d7cca5 --- /dev/null +++ b/src/cloud/components/Modal/contents/ExportModal.tsx @@ -0,0 +1,103 @@ +import React, { useCallback, useState } from 'react' +import styled from '../../../../design/lib/styled' +import { usePage } from '../../../lib/stores/pageStore' +import { LoadingButton } from '../../../../design/components/atoms/Button' +import { exportWorkspace } from '../../../api/teams/export' +import Flexbox from '../../../../design/components/atoms/Flexbox' + +const ExportModal = () => { + const { team } = usePage() + const [sending, setSending] = useState(false) + + const handleExportClick = useCallback(async () => { + if (team == null || sending) { + return + } + + setSending(true) + try { + const blob = await exportWorkspace(team.id) + + const url = window.URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `workspace-export.zip` + document.body.appendChild(a) + a.click() + a.remove() + window.URL.revokeObjectURL(url) + } catch (err) { + console.error('Failed to export workspace', err) + } finally { + setSending(false) + } + }, [team, sending]) + + if (team == null) { + return null + } + + return ( + +
+
Export your workspace data
+
+

+ The service for boostnote is planned to be retired at the end of + September. We recommend exporting your workspace's data so that you + do not lose any of your information. +

+

Here is an overview of what can be exported:

+
    +
  • Folders & documents hierarchy
  • +
  • Documents' markdown content
  • +
  • Documents'ttachments
  • +
+ + + + Download ZIP Export + + +
+ ) +} + +const Container = styled.div` + .export__modal__subtitle { + span { + font-size: ${({ theme }) => theme.sizes.fonts.md}px; + display: inline-block; + margin-right: ${({ theme }) => theme.sizes.spaces.sm}px; + } + + margin-bottom: ${({ theme }) => theme.sizes.spaces.md}px; + } + + .export__modal__header { + text-align: center; + } + + .export__modal__title { + margin: 0; + margin-top: ${({ theme }) => theme.sizes.spaces.md}px; + font-size: ${({ theme }) => theme.sizes.fonts.l}px; + } + + .export__modal__header > * + .export__modal__header > * { + margin-top: ${({ theme }) => theme.sizes.spaces.df}px; + } + + .export__modal__description { + margin: ${({ theme }) => theme.sizes.spaces.df}px 0; + text-transform: uppercase; + color: ${({ theme }) => theme.colors.text.subtle}; + font-size: ${({ theme }) => theme.sizes.fonts.md}; + } +` + +export default ExportModal diff --git a/src/cloud/lib/client.ts b/src/cloud/lib/client.ts index e26687514..d123feb25 100644 --- a/src/cloud/lib/client.ts +++ b/src/cloud/lib/client.ts @@ -102,3 +102,38 @@ export async function callPdfApi( retry: 0, }).blob() } + +export async function callApiBlob( + pathname: string, + { + method = 'get', + search, + headers = {}, + signal, + body, + }: CallCloudJsonApiParameter = {} +) { + const mergedHeaders = { + ...headers, + } + const accessToken = getAccessToken() + if ( + usingLegacyElectron && + usingElectron && + accessToken != null && + mergedHeaders['Authorization'] == null + ) { + mergedHeaders['Authorization'] = `Bearer ${accessToken}` + } + return ky(pathname.startsWith('/') ? pathname.substring(1) : pathname, { + prefixUrl: boostHubBaseUrl, + headers: mergedHeaders, + method, + searchParams: search, + signal, + body, + timeout: 60 * 1000, + credentials: usingElectron ? undefined : 'include', + retry: 0, + }).blob() +} From 77fba22d025918afc7b45e5a64dfbff3c6248083 Mon Sep 17 00:00:00 2001 From: davy-c Date: Wed, 11 Jun 2025 09:19:27 +0900 Subject: [PATCH 03/10] export modal changes --- .../components/Modal/contents/ExportModal.tsx | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/cloud/components/Modal/contents/ExportModal.tsx b/src/cloud/components/Modal/contents/ExportModal.tsx index 3e3d7cca5..db33b9722 100644 --- a/src/cloud/components/Modal/contents/ExportModal.tsx +++ b/src/cloud/components/Modal/contents/ExportModal.tsx @@ -21,13 +21,13 @@ const ExportModal = () => { const url = window.URL.createObjectURL(blob) const a = document.createElement('a') a.href = url - a.download = `workspace-export.zip` + a.download = `space-${team.name}-export.zip` document.body.appendChild(a) a.click() a.remove() window.URL.revokeObjectURL(url) } catch (err) { - console.error('Failed to export workspace', err) + console.error('Failed to export space', err) } finally { setSending(false) } @@ -44,14 +44,14 @@ const ExportModal = () => {

The service for boostnote is planned to be retired at the end of - September. We recommend exporting your workspace's data so that you - do not lose any of your information. + September. We recommend exporting your space's data so that you do + not lose any of your information.

Here is an overview of what can be exported:

    -
  • Folders & documents hierarchy
  • -
  • Documents' markdown content
  • -
  • Documents'ttachments
  • +
  • Public & your accessible private Folders & documents hierarchy
  • +
  • Your Documents' content
  • +
  • Your Documents'attachments
@@ -60,7 +60,7 @@ const ExportModal = () => { spinning={sending} onClick={handleExportClick} > - Download ZIP Export + Download ZIP @@ -68,6 +68,7 @@ const ExportModal = () => { } const Container = styled.div` + text-align: center; .export__modal__subtitle { span { font-size: ${({ theme }) => theme.sizes.fonts.md}px; @@ -98,6 +99,10 @@ const Container = styled.div` color: ${({ theme }) => theme.colors.text.subtle}; font-size: ${({ theme }) => theme.sizes.fonts.md}; } + + li { + list-style: none; + } ` export default ExportModal From 9f8eaddfcb1f1fb5cd7af26665fd92334696c267 Mon Sep 17 00:00:00 2001 From: davy-c Date: Wed, 11 Jun 2025 09:29:37 +0900 Subject: [PATCH 04/10] export banner --- src/cloud/components/FolderPage/index.tsx | 2 + .../components/Modal/contents/ExportModal.tsx | 2 +- .../Onboarding/FolderPageExportSection.tsx | 70 +++++++++++++++++++ src/cloud/components/WorkspacePage/index.tsx | 2 + 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 src/cloud/components/Onboarding/FolderPageExportSection.tsx diff --git a/src/cloud/components/FolderPage/index.tsx b/src/cloud/components/FolderPage/index.tsx index 2466ec9df..fa0ec4b4d 100644 --- a/src/cloud/components/FolderPage/index.tsx +++ b/src/cloud/components/FolderPage/index.tsx @@ -33,6 +33,7 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' +import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const FolderPage = () => { const { pageFolder, team, currentUserIsCoreMember } = usePage() @@ -236,6 +237,7 @@ const FolderPage = () => { + { return (
-
Export your workspace data
+
Export your space data

The service for boostnote is planned to be retired at the end of diff --git a/src/cloud/components/Onboarding/FolderPageExportSection.tsx b/src/cloud/components/Onboarding/FolderPageExportSection.tsx new file mode 100644 index 000000000..a78f404b0 --- /dev/null +++ b/src/cloud/components/Onboarding/FolderPageExportSection.tsx @@ -0,0 +1,70 @@ +import React from 'react' +import ColoredBlock from '../../../design/components/atoms/ColoredBlock' +import Flexbox from '../../../design/components/atoms/Flexbox' +import styled from '../../../design/lib/styled' +import Button from '../../../design/components/atoms/Button' +import { mdiExport } from '@mdi/js' +import ExportModal from '../Modal/contents/ExportModal' +import { useModal } from '../../../design/lib/stores/modal' + +const FolderPageExportSection = () => { + const { openModal } = useModal() + + return ( + + + +

BoostNote is getting discontinued
+ + + +

+ We thank you for your continued support. We regret to inform you that + the service will end at the end of September. As such we recommend for + users to export their data to make sure nothing is being lost. +

+ + + ) +} + +const FolderPageExportSectionContainer = styled.div` + margin: ${({ theme }) => theme.sizes.spaces.df}px + ${({ theme }) => theme.sizes.spaces.sm}px; + + .export__section__block { + input { + color: ${({ theme }) => theme.colors.text.subtle}; + } + h5 { + color: ${({ theme }) => theme.colors.text.primary}; + margin: ${({ theme }) => theme.sizes.spaces.sm}px 0; + font-size: ${({ theme }) => theme.sizes.fonts.l}px; + } + p { + color: ${({ theme }) => theme.colors.text.primary}; + font-size: ${({ theme }) => theme.sizes.fonts.df}px; + margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; + } + .form__row__items { + > * { + margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; + } + flex-wrap: wrap; + } + } +` + +export default FolderPageExportSection diff --git a/src/cloud/components/WorkspacePage/index.tsx b/src/cloud/components/WorkspacePage/index.tsx index 9a85a6b6a..6036c3659 100644 --- a/src/cloud/components/WorkspacePage/index.tsx +++ b/src/cloud/components/WorkspacePage/index.tsx @@ -18,6 +18,7 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' +import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const WorkspacePage = ({ workspace: pageWorkspace, @@ -133,6 +134,7 @@ const WorkspacePage = ({ + Date: Thu, 12 Jun 2025 10:03:11 +0900 Subject: [PATCH 05/10] remove banner ( doing via intercom ) --- src/cloud/components/FolderPage/index.tsx | 2 - .../Onboarding/FolderPageExportSection.tsx | 70 ------------------- src/cloud/components/WorkspacePage/index.tsx | 2 - 3 files changed, 74 deletions(-) delete mode 100644 src/cloud/components/Onboarding/FolderPageExportSection.tsx diff --git a/src/cloud/components/FolderPage/index.tsx b/src/cloud/components/FolderPage/index.tsx index fa0ec4b4d..2466ec9df 100644 --- a/src/cloud/components/FolderPage/index.tsx +++ b/src/cloud/components/FolderPage/index.tsx @@ -33,7 +33,6 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' -import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const FolderPage = () => { const { pageFolder, team, currentUserIsCoreMember } = usePage() @@ -237,7 +236,6 @@ const FolderPage = () => { - { - const { openModal } = useModal() - - return ( - - - -
BoostNote is getting discontinued
- - -
-

- We thank you for your continued support. We regret to inform you that - the service will end at the end of September. As such we recommend for - users to export their data to make sure nothing is being lost. -

-
-
- ) -} - -const FolderPageExportSectionContainer = styled.div` - margin: ${({ theme }) => theme.sizes.spaces.df}px - ${({ theme }) => theme.sizes.spaces.sm}px; - - .export__section__block { - input { - color: ${({ theme }) => theme.colors.text.subtle}; - } - h5 { - color: ${({ theme }) => theme.colors.text.primary}; - margin: ${({ theme }) => theme.sizes.spaces.sm}px 0; - font-size: ${({ theme }) => theme.sizes.fonts.l}px; - } - p { - color: ${({ theme }) => theme.colors.text.primary}; - font-size: ${({ theme }) => theme.sizes.fonts.df}px; - margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; - } - .form__row__items { - > * { - margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; - } - flex-wrap: wrap; - } - } -` - -export default FolderPageExportSection diff --git a/src/cloud/components/WorkspacePage/index.tsx b/src/cloud/components/WorkspacePage/index.tsx index 6036c3659..9a85a6b6a 100644 --- a/src/cloud/components/WorkspacePage/index.tsx +++ b/src/cloud/components/WorkspacePage/index.tsx @@ -18,7 +18,6 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' -import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const WorkspacePage = ({ workspace: pageWorkspace, @@ -134,7 +133,6 @@ const WorkspacePage = ({ - Date: Thu, 12 Jun 2025 10:30:12 +0900 Subject: [PATCH 06/10] link change --- src/cloud/components/Application.tsx | 41 ++++++++++++++-------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/cloud/components/Application.tsx b/src/cloud/components/Application.tsx index ca21ba3a9..10642a7e4 100644 --- a/src/cloud/components/Application.tsx +++ b/src/cloud/components/Application.tsx @@ -62,7 +62,6 @@ import SidebarHeader from '../../design/components/organisms/Sidebar/atoms/Sideb import SidebarButtonList from '../../design/components/organisms/Sidebar/molecules/SidebarButtonList' import { getTeamLinkHref } from './Link/TeamLink' import WithPastille from '../../design/components/atoms/WithPastille' -import SidebarButton from '../../design/components/organisms/Sidebar/atoms/SidebarButton' import CloudGlobalSearch from './CloudGlobalSearch' import { useCloudSidebarSpaces } from '../lib/hooks/sidebar/useCloudSidebarSpaces' import { trackEvent } from '../api/track' @@ -404,6 +403,23 @@ const Application = ({ }, id: 'sidebar__button__members', }, + { + label: 'Export your data', + icon: ( + + + + ), + variant: 'transparent', + labelClick: () => { + return openModal(, { + showCloseIcon: true, + width: 'large', + }) + }, + id: 'sidebar__button__export', + pastille: counts[team.id] ? counts[team.id] : undefined, + }, ]} > {currentUserIsCoreMember && } @@ -420,6 +436,7 @@ const Application = ({ team, translate, showSearchScreen, + openModal, ]) const sidebarFooter = useMemo(() => { @@ -448,28 +465,11 @@ const Application = ({ id: 'sidebar__button__shared', }, ]} - > - - - - } - id='sidebar__button__promo' - label={'Export your data'} - labelClick={() => { - return openModal(, { - showCloseIcon: true, - width: 'large', - }) - }} - /> - + /> ) - }, [team, translate, pathname, push, sendToElectron, openModal]) + }, [team, translate, pathname, push, sendToElectron]) return ( <> @@ -530,7 +530,6 @@ const Application = ({ } /> -
Date: Mon, 16 Jun 2025 11:47:16 +0900 Subject: [PATCH 07/10] revert in-app banner --- src/cloud/components/FolderPage/index.tsx | 2 + .../Onboarding/FolderPageExportSection.tsx | 69 +++++++++++++++++++ src/cloud/components/WorkspacePage/index.tsx | 2 + 3 files changed, 73 insertions(+) create mode 100644 src/cloud/components/Onboarding/FolderPageExportSection.tsx diff --git a/src/cloud/components/FolderPage/index.tsx b/src/cloud/components/FolderPage/index.tsx index 2466ec9df..fa0ec4b4d 100644 --- a/src/cloud/components/FolderPage/index.tsx +++ b/src/cloud/components/FolderPage/index.tsx @@ -33,6 +33,7 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' +import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const FolderPage = () => { const { pageFolder, team, currentUserIsCoreMember } = usePage() @@ -236,6 +237,7 @@ const FolderPage = () => { + { + const { openModal } = useModal() + + return ( + + + +
BoostNote is getting discontinued
+ + +
+

+ We thank you for your continued support. We regret to inform you that + the service will end at the end of September. As such we recommend for + users to export their data to make sure nothing is being lost. +

+
+
+ ) +} + +const FolderPageExportSectionContainer = styled.div` + margin: ${({ theme }) => theme.sizes.spaces.df}px + ${({ theme }) => theme.sizes.spaces.sm}px; + .export__section__block { + input { + color: ${({ theme }) => theme.colors.text.subtle}; + } + h5 { + color: ${({ theme }) => theme.colors.text.primary}; + margin: ${({ theme }) => theme.sizes.spaces.sm}px 0; + font-size: ${({ theme }) => theme.sizes.fonts.l}px; + } + p { + color: ${({ theme }) => theme.colors.text.primary}; + font-size: ${({ theme }) => theme.sizes.fonts.df}px; + margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; + } + .form__row__items { + > * { + margin-bottom: ${({ theme }) => theme.sizes.spaces.sm}px; + } + flex-wrap: wrap; + } + } +` + +export default FolderPageExportSection diff --git a/src/cloud/components/WorkspacePage/index.tsx b/src/cloud/components/WorkspacePage/index.tsx index 9a85a6b6a..6036c3659 100644 --- a/src/cloud/components/WorkspacePage/index.tsx +++ b/src/cloud/components/WorkspacePage/index.tsx @@ -18,6 +18,7 @@ import { ViewsManager } from '../Views' import ApplicationPageLoader from '../ApplicationPageLoader' import LoaderFolderPage from '../../../design/components/atoms/loaders/LoaderFolderPage' import ViewerDisclaimer from '../ViewerDisclaimer' +import FolderPageExportSection from '../Onboarding/FolderPageExportSection' const WorkspacePage = ({ workspace: pageWorkspace, @@ -133,6 +134,7 @@ const WorkspacePage = ({ + Date: Mon, 16 Jun 2025 11:48:15 +0900 Subject: [PATCH 08/10] fix markdown view tsc --- src/cloud/components/MarkdownView/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cloud/components/MarkdownView/index.tsx b/src/cloud/components/MarkdownView/index.tsx index 822349c66..02da801c1 100644 --- a/src/cloud/components/MarkdownView/index.tsx +++ b/src/cloud/components/MarkdownView/index.tsx @@ -375,6 +375,7 @@ const MarkdownView = ({ sendToElectron, updateContent, content, + showLinkOpenWarning, ]) const processorRef = useRef(markdownProcessor) @@ -412,7 +413,7 @@ const MarkdownView = ({ onRenderRef.current() } } catch (err) { - setState({ type: 'error', err }) + setState({ type: 'error', err: err as any }) } }, 100, From 1ec22060dafcff1703deacae0504515502fa7343 Mon Sep 17 00:00:00 2001 From: davy-c Date: Mon, 16 Jun 2025 12:33:57 +0900 Subject: [PATCH 09/10] link change --- .../Onboarding/FolderPageExportSection.tsx | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/src/cloud/components/Onboarding/FolderPageExportSection.tsx b/src/cloud/components/Onboarding/FolderPageExportSection.tsx index e5a8b19e0..827f07948 100644 --- a/src/cloud/components/Onboarding/FolderPageExportSection.tsx +++ b/src/cloud/components/Onboarding/FolderPageExportSection.tsx @@ -6,6 +6,7 @@ import Button from '../../../design/components/atoms/Button' import { mdiExport } from '@mdi/js' import ExportModal from '../Modal/contents/ExportModal' import { useModal } from '../../../design/lib/stores/modal' +import { ExternalLink } from '../../../design/components/atoms/Link' const FolderPageExportSection = () => { const { openModal } = useModal() @@ -13,11 +14,27 @@ const FolderPageExportSection = () => { return ( - +
BoostNote is getting discontinued
+ + Learn more + +
+ +

+ We thank you for your continued support. We regret to inform you + that the service will end at the end of September. As such we + recommend for users to export their data to make sure nothing is + being lost. +

-

- We thank you for your continued support. We regret to inform you that - the service will end at the end of September. As such we recommend for - users to export their data to make sure nothing is being lost. -

) @@ -43,6 +55,7 @@ const FolderPageExportSection = () => { const FolderPageExportSectionContainer = styled.div` margin: ${({ theme }) => theme.sizes.spaces.df}px ${({ theme }) => theme.sizes.spaces.sm}px; + .export__section__block { input { color: ${({ theme }) => theme.colors.text.subtle}; @@ -64,6 +77,10 @@ const FolderPageExportSectionContainer = styled.div` flex-wrap: wrap; } } + + .link { + color: ${({ theme }) => theme.colors.text.subtle} !important; + } ` export default FolderPageExportSection From 8772320ced699d3ebe708e70eda6679c2e2baa83 Mon Sep 17 00:00:00 2001 From: davy-c Date: Mon, 16 Jun 2025 13:11:24 +0900 Subject: [PATCH 10/10] add translation --- src/cloud/lib/i18n/enUS.ts | 9 +++++++++ src/cloud/lib/i18n/fr.ts | 9 +++++++++ src/cloud/lib/i18n/ja.ts | 9 +++++++++ src/cloud/lib/i18n/types.ts | 8 ++++++++ src/cloud/lib/i18n/zhCN.ts | 9 +++++++++ 5 files changed, 44 insertions(+) diff --git a/src/cloud/lib/i18n/enUS.ts b/src/cloud/lib/i18n/enUS.ts index aca23e2f7..3555a126e 100644 --- a/src/cloud/lib/i18n/enUS.ts +++ b/src/cloud/lib/i18n/enUS.ts @@ -536,6 +536,15 @@ const enTranslation: TranslationSource = { [lngKeys.ModalUnlockCheckDetails]: 'Check the details of the Standard and Pro plans and learn what you can do with it!', [lngKeys.OverlimitDashboards]: `Your dashboards exceed the limit of your current plan. Consider upgrading your plan or deleting other dashboards in order to continue using this feature with your current plan.`, + + [lngKeys.ExportTitle]: 'Export your space data', + [lngKeys.ExportSubtitle]: `The service for boostnote is planned to be retired at the end of September. We recommend exporting your space's data so that you do not lose any of your information.`, + [lngKeys.ExportContent]: 'Here is an overview of what can be exported:', + [lngKeys.ExportContentOne]: + 'Public & your accessible private Folders & documents hierarchy', + [lngKeys.ExportContentTwo]: `Your Documents' content`, + [lngKeys.ExportContentThree]: `Your Documents' attachments`, + [lngKeys.ExportDownload]: `Download ZIP`, } export default { diff --git a/src/cloud/lib/i18n/fr.ts b/src/cloud/lib/i18n/fr.ts index 1906cd4db..fabf363f5 100644 --- a/src/cloud/lib/i18n/fr.ts +++ b/src/cloud/lib/i18n/fr.ts @@ -548,6 +548,15 @@ const frTranslation: TranslationSource = { [lngKeys.ModalUnlockCheckDetails]: 'Check the details of the Standard and Pro plans and learn what you can do with it!', [lngKeys.OverlimitDashboards]: `Your dashboards exceed the limit of your current plan. Consider upgrading your plan or deleting other dashboards in order to continue using this feature with your current plan.`, + + [lngKeys.ExportTitle]: 'Export your space data', + [lngKeys.ExportSubtitle]: `The service for boostnote is planned to be retired at the end of September. We recommend exporting your space's data so that you do not lose any of your information.`, + [lngKeys.ExportContent]: 'Here is an overview of what can be exported:', + [lngKeys.ExportContentOne]: + 'Public & your accessible private Folders & documents hierarchy', + [lngKeys.ExportContentTwo]: `Your Documents' content`, + [lngKeys.ExportContentThree]: `Your Documents' attachments`, + [lngKeys.ExportDownload]: `Download ZIP`, } export default { diff --git a/src/cloud/lib/i18n/ja.ts b/src/cloud/lib/i18n/ja.ts index 71d2efaf3..ec0187cef 100644 --- a/src/cloud/lib/i18n/ja.ts +++ b/src/cloud/lib/i18n/ja.ts @@ -536,6 +536,15 @@ const jpTranslation: TranslationSource = { [lngKeys.ModalUnlockCheckDetails]: 'Standard・Proプランの詳細を確認し、どれが最適なプランか比較してみましょう!', [lngKeys.OverlimitDashboards]: `無料プランでのDashboard作成上限に到達いたしました。アップグレードを行うことで、Dashboard作成数の上限を無くすことが可能になります。`, + + [lngKeys.ExportTitle]: 'データエクスポート', + [lngKeys.ExportSubtitle]: `Boost Noteは9月30日にサービス終了を予定しています。終了日以降、すべてのデータは完全に削除され、復元することはできません。必ずデータのエクスポートをお願いいたします。`, + [lngKeys.ExportContent]: 'エクスポートできるもの:', + [lngKeys.ExportContentOne]: + 'パブリックフォルダー、アクセス権限があるプライベートフォルダー、ドキュメントの階層', + [lngKeys.ExportContentTwo]: `ドキュメントのコンテンツ`, + [lngKeys.ExportContentThree]: `ドキュメントの添付ファイル`, + [lngKeys.ExportDownload]: `ZIPファイルをダウンロードする`, } export default { diff --git a/src/cloud/lib/i18n/types.ts b/src/cloud/lib/i18n/types.ts index 65e5268a6..5d52ebd00 100644 --- a/src/cloud/lib/i18n/types.ts +++ b/src/cloud/lib/i18n/types.ts @@ -487,6 +487,14 @@ export enum lngKeys { ModalUnlockSmartviewsTitle = 'modal.unlock.smartview.title', ModalUnlockSmartviewsDescription = 'modal.unlock.smartview.description', OverlimitDashboards = 'sub.limit.dashboards', + + ExportTitle = 'export.title', + ExportSubtitle = 'export.subtitle', + ExportContent = 'export.content', + ExportContentOne = 'export.content.one', + ExportContentTwo = 'export.content.two', + ExportContentThree = 'export.content.three', + ExportDownload = 'export.download', } export type TranslationSource = { diff --git a/src/cloud/lib/i18n/zhCN.ts b/src/cloud/lib/i18n/zhCN.ts index a22fa6ec7..7405ab8e7 100644 --- a/src/cloud/lib/i18n/zhCN.ts +++ b/src/cloud/lib/i18n/zhCN.ts @@ -509,6 +509,15 @@ const zhTranslation: TranslationSource = { [lngKeys.ModalUnlockCheckDetails]: 'Check the details of the Standard and Pro plans and learn what you can do with it!', [lngKeys.OverlimitDashboards]: `Your dashboards exceed the limit of your current plan. Consider upgrading your plan or deleting other dashboards in order to continue using this feature with your current plan.`, + + [lngKeys.ExportTitle]: 'Export your space data', + [lngKeys.ExportSubtitle]: `The service for boostnote is planned to be retired at the end of September. We recommend exporting your space's data so that you do not lose any of your information.`, + [lngKeys.ExportContent]: 'Here is an overview of what can be exported:', + [lngKeys.ExportContentOne]: + 'Public & your accessible private Folders & documents hierarchy', + [lngKeys.ExportContentTwo]: `Your Documents' content`, + [lngKeys.ExportContentThree]: `Your Documents' attachments`, + [lngKeys.ExportDownload]: `Download ZIP`, } export default {