-
Notifications
You must be signed in to change notification settings - Fork 2k
Backups Dashboard: add back up now button #105190
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Jetpack Cloud live (direct link)
Automattic for Agencies live (direct link)
|
|
This PR modifies the release build for the following Calypso Apps: For info about this notification, see here: PCYsg-OT6-p2
To test WordPress.com changes, run |
- Moved button content and tooltip text into a structured object for better readability and maintainability. - Updated mutation function to set the enqueue state before calling the backup function.
39d445d to
81b1780
Compare
client/dashboard/data/site-backup.ts
Outdated
| * @param siteId - The ID of the site to fetch backups for. | ||
| * @returns A promise that resolves to the list of backups. | ||
| */ | ||
| export function fetchSiteBackups( siteId: number ): Promise< BackupEntry[] > { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think there's an opportunity here to separate these two functions into entity/collection pattern of site-backup.ts and site-backups.ts
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Even though it's quite premature to do it with just 2 functions, I think it establishes a good pattern for future backup operations and makes the codebase more predictable. Easy enough to refactor now, so I just did :)
taipeicoder
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Works as intended! We can also display a snackbar upon success but that can be worked together with the error state.
| * @param siteId - The ID of the site to enqueue a backup for. | ||
| * @returns A promise that resolves when the backup is enqueued. | ||
| */ | ||
| export function enqueueSiteBackup( siteId: number ): Promise< void > { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems we can put it in site-backups as well 🤔
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I agree. In the new domain-related data layers, we tend to put "listing" and "details" endpoints in the same file as well. 😄
(We're still figuring things out, though, so it's okay!)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting, we do have domain.ts and domains.ts. What would go into domain.ts?
| }, | ||
| } ); | ||
|
|
||
| const { mutate: triggerBackup, isPending } = useMutation( { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should move this into client/dashboard/app/queries/site-backups.ts and name it to something like enqueueSiteBackuptMutation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So it will be something like this:
const { mutate: triggerBackup, isPending } = useMutation( {
...siteBackupEnqueueMutation,
onMutate: () => {
setIsEnqueued( true );
},
}There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| const isBusy = backupState !== 'default' || isPending; | ||
|
|
||
| const button = ( | ||
| <Button |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can show the tooltip by passing both label and description.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
This Pull Request is now available for translation here: https://translate.wordpress.com/deliverables/19836005 Some locales (Hebrew) have been temporarily machine-translated due to translator availability. All other translations are usually ready within a few days. Untranslated and machine-translated strings will be sent for translation next Monday and are expected to be completed by the following Friday. Thank you @Initsogar for including a screenshot in the description! This is really helpful for our translators. |
|
|
||
| export const siteBackupsQuery = ( siteId: number ) => | ||
| queryOptions( { | ||
| queryKey: [ 'site', siteId, 'rewind', 'backups' ], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think, we don't need 'rewind' in the key because the query and app layers don't have this concept 🤔 (we don't have to 100% mimic the endpoint paths in the query layer)
| queryKey: [ 'site', siteId, 'rewind', 'backups' ], | |
| queryKey: [ 'site', siteId, 'backups' ], |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
|
|
||
| // Determine current state | ||
| const getBackupState = useCallback( | ||
| ( backups: BackupEntry[], enqueued: boolean ): BackupState => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Question: can't we just use the existing isEnqueued state instead of passing a boolean?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| }, | ||
| } ); | ||
|
|
||
| const { mutate: triggerBackup, isPending } = useMutation( { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So it will be something like this:
const { mutate: triggerBackup, isPending } = useMutation( {
...siteBackupEnqueueMutation,
onMutate: () => {
setIsEnqueued( true );
},
}| queryClient.invalidateQueries( { | ||
| queryKey: [ 'site', site.ID, 'rewind', 'backups' ], | ||
| } ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can reuse the query key like this
| queryClient.invalidateQueries( { | |
| queryKey: [ 'site', site.ID, 'rewind', 'backups' ], | |
| } ); | |
| queryClient.invalidateQueries( siteBackupsQuery( site.ID ) ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
| * @param siteId - The ID of the site to fetch backups for. | ||
| * @returns A promise that resolves to the list of backups. | ||
| */ | ||
| export function fetchSiteBackups( siteId: number ): Promise< BackupEntry[] > { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's interesting that the listing and the backup button are using different endpoints 🤔 but I don't have much context on this 😄
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To give you some context, /rewind/backups only returns full backup attempts, so we use it to track their progress.
/activity/rewindable returns all real-time events once they’re ready, including full backups, so we need to use this one for the backup listing.
* Add enqueue and fetch backup functions * Add siteBackupsQuery * Add BackupNowButton * Render BackupNowButton as Backups page header action * Remove backup up now button icon * Refactor BackupNowButton: Simplify button content and tooltip handling - Moved button content and tooltip text into a structured object for better readability and maintainability. - Updated mutation function to set the enqueue state before calling the backup function. * Removed unnecessary empty object from the post request * Refactor backup data layer to entity/collection pattern
* Created the initial structure for the the /contact-info route * Added some initial components to the screen * Using DataForm for domain Contact details * Finished the first interface version * Reading Contact information from /whois endpoint * Validating data before saving Contact Info * Update Contact details data using backend API * Added isDurty state for the save button * Added basic validation on DataForm * Getting supported contries list from our API * Add support to opt-out 60-day option * Add Save contact info warning * Add support to State selection from selected country * Move country and state logic to inside the contact form component * Fix re-render issue that removed the focus from text input while typing * Add eslint rule to prevent lodash usage * Refactor domain-supported contries and states and removed lodash usage * Move mutate events to contact-form * My Jetpack: Updating user connection page header and button text. (#105149) * Substack Import: fix flow bug (#105167) * Only display error message in the expiry column in the Site Overview (#105168) * Enable summer special (#105169) * Site Overview: Implement renew now action (#105160) * Site Overview: Implement renew now action * Fix types * Use replaceAll * Redirect by window.location.href * Increase timeout between atomic transfer and redirect (#105174) * Increase timeout between atomic transfer and redirect * Remove unnecessary delay * Connect Refresh: Extract Gravatar Magic Login into its own space (#104863) * Connect Refresh: Extract Gravatar Magic Login into its own space * whole lotta love * migrate styles * cleanup. fix publicToken use? * unfix publicToken use? * cmon. works now * fix loginUrl * lots of cleanup * fix form outlines * fix navigation to login * extract inner components into outer scope * extract inner components into outer scope * cleanup. address feedback * cleanup * Update client/login/magic-login/gravatar/style.scss Co-authored-by: Welly Shen <hivoid19@gmail.com> * address feedback. progress on code-validated * fix interval not resetting * fix code validation transition * Update client/login/magic-login/gravatar/index.tsx Co-authored-by: Welly Shen <hivoid19@gmail.com> * Update client/login/magic-login/gravatar/index.tsx Co-authored-by: Welly Shen <hivoid19@gmail.com> * Update client/login/magic-login/gravatar/index.tsx Co-authored-by: Welly Shen <hivoid19@gmail.com> * cleanup redirect --------- Co-authored-by: Welly Shen <hivoid19@gmail.com> * Connect Refresh: Migrate Akismet create-account to unified Signup (#105116) * Fixes the Promote Post version check hook (#105163) * Allow plugins upload for plans without sftp (#105176) * Connect Refresh: Migrate VIP create-account to unified Signup (#105132) * Remove Summer Special install plugin feature from Business and Ecommerce (#105177) * Updating @wordpress/components and @wordpress/dataviews packages (#105142) * Updating @wordpress/components and @wordpress/dataviews packages * Fix plugin icon * Fix site icon --------- Co-authored-by: arthur <arthur.chu@automattic.com> * Fix font size when rendering ZD HTML (#105180) * Site settings: add missing learn more links (#105150) * Staging Sites Redesign: Update Tooltip and checkbox disable style (#105158) * Improve styles * Ensure we have checkbox * Fix both disabaled and checked * Fix tooltip position * Clean comments * Update message * Fix typo * Break tooltip in two lines * Allow full sync when selective sync is not disabled --------- Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> * Hosting Dashboard: Add site logs initial dataviews with data (#105118) * Connect Refresh: Migrate Jetpack Cloud create-account to unified Signup (#105178) * add null checks (#105165) * Staging Sites: Notify syncing after completing the endpoint call (#105112) * Staging Sites: Notify syncing after completing the endpoint call * Add the callback to the pull action too * Disable sync button immediately after starting syncing * Check inflight mutations to disable Sync button * close modal after mutation completes --------- Co-authored-by: Gergely Csécsey <gcsecsey@gmail.com> * Connect Refresh: Migrate Studio create-account to unified Signup (#105133) * Components: Fix ambiguous `rem()` import (#103385) * Domains Hosting Dashboard: Create "Add new DNS record" page (#105095) * (WIP) Create "Add new DNS record" page to Hosting Dashboard * Create forms to add all supported DNS record types * Remove some console.logs and refactor some code * Refactor code splitting the form configuration for each record type in its own file * Fix field types and add "required" validation * Add trailing dot automatically for fields that need to be a FQDN * Use text area component for TXT record data * Add description field for DNS records * Remove empty default element from select fields * Make placeholders translatable * Reset form data when changing record types * Navigate to DNS overview page when clicking on "Cancel" * Remove query that does not belong to this PR * Refactor DNSRecord type * Consolidate component in /dns/add/index.tsx * Rename `AddDNSRecordFormData` to `DNSRecordFormData` and fix form typing * Remove `isValid` properties from DNS record configs * Move DNS record configs to types file * Rename `types.ts` to `dns-record-configs.ts` * Small refactor * Replace straight quote mark by a curly quote mark * Do not translate DNS record types (e.g. A, ALIAS, CNAME) * Navigate to DNS overview page after adding a record * Remove translation from CAA tags * Improve FQDN comment in the data transformation function * Remove translations from SRV protocol labels * Translate placeholder strings for DNS records * Translate page title * Remove `WPCOMDNSRecord` that was not being used * Fix type error because ALIAS did not have a `name` property * Update type names and definitions to align with #105129 * Update type names to keep consistency * Update mutation function to a more generic one * Update mutation function to align with #105129 * A4A > Sign up: Show Onboarding tour in WC flow (#105175) * Jetpack Cloud: skip wpcomJetpackScanAtomicTransfer middleware on Cloud and A4A (#105189) * Staging Sites: Add separate expand button and allow selecting nodes by clicking on them in the Jetpack Backup FileBrowser (#105161) * Allow selecting files by clicking on them * Add separate expand button option to file browser component * Remove unnecessary min-width * Correct grammar in a comment * Fix styling * Add RTL support for chevrons * Improve checkbox accessibility * Adjust accessibility * Remove tab index from the node button only when `showFileCard` option is disabled * Add `expandDirectoriesOnClick` prop to control directory expansion behavior in file browser * Introduce separate `handleExpandButtonClick` handler * Expansion directories only when `expandDirectoriesOnClick` prop is true * Simplify checkbox change logic * Improve contents of --------- Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> * Redirect from deletion banner when the staging site is deleted (#105164) * redirect from deletion banner when the staging site is deleted * check if query is undefined * use calypso/state notices instead of snackbar * clean up comments * CalloutOverlay: Fix the overlapping issue (#105195) * Fix section name in track events (#105196) * Hosting Dashboard: Add domain glue records DataView (#105184) * ZD: Fix metadata when creating a ticket (#105183) * Packages: Add domain-search to tsconfig (#105186) * Dashboard v2: render expiring purchase in color (#105170) * Gravatar: Adjust login-related screens for Gravatar-owned services (#105192) * Gravatar: Adjust login-related screens for Gravatar owned services * Reuse one more variable --------- Co-authored-by: Welly Shen <welly.shen@automattic.com> * Domain Dashboard: Render registered date and renewal CTA (#105188) * Render the header and registered date * Render the renew now button if eligible * Wrap domain name if it doesnt fit in the container * Use purchase properties * Revert callback changes * Hosting dashboard: Add a custom empty state to the site list (#104544) * Backups Dashboard: add back up now button (#105190) * Add enqueue and fetch backup functions * Add siteBackupsQuery * Add BackupNowButton * Render BackupNowButton as Backups page header action * Remove backup up now button icon * Refactor BackupNowButton: Simplify button content and tooltip handling - Moved button content and tooltip text into a structured object for better readability and maintainability. - Updated mutation function to set the enqueue state before calling the backup function. * Removed unnecessary empty object from the post request * Refactor backup data layer to entity/collection pattern * Domains Hosting Dashboard: DNS records list (#105129) * Add dns list placeholder * Add basic data * Implement data view * Add value column * Update section header * Hide DataView header * Add actions placeholders * Add action menu placeholder * Update dns record list - handle protected records * Move action to a separate file * Move fields in a separate file * Add restore default records actions placeholders * Add logit to enable/disable dns actions * Work in progress * Add delete/edit callback * Minor fixes after rebase * Fix edit dns route * Implement domain restore actions * Fine tuning * Fix type issue * Restore params * Fix type error * Restore DnsRecordType * Fix type * Address PR review comments * Fix dropdown * Address PR review comments * Add more tracking information around creating conversations (#105199) * Fix double login e2e (#101899) * Site Overview: Implement change site address action (#105191) * Site Overview: Implement change site address action * Fix types * Update eslint * Address feedback * Fix display incorrect wpcom domain * fix(sites): prevent PreviewSizePicker crash from invalid previewSize … (#105206) * fix(sites): prevent PreviewSizePicker crash from invalid previewSize values * Move previewSize sanitization to existing `sanitizeView` function * Simplify code for updating `previewSize` to a valid value * Use `undefined` instead of `230` in order to explicitly get the default * Check whether the previewSize is smaller than the smallest value * Check whether the previewSize is NaN --------- Co-authored-by: Arun <arun@arun.blog> Co-authored-by: arthur <arthur.chu@automattic.com> * Domains: Create name-servers component (#105062) * Create name-servers component * Marketplace Site Selector: Fix highlight styles within component (#105047) * Fix styles within component * Improve syntax * Remove content-fade * Cleanup comments * Remove unnecessary overide * Keep fade in * Revert reader changes * Update colors and fade in * Improve fade in removal * Ensure the hover state on badges remain the same * Only apply the overrides for specific badges * Fix unintended changes * Fix unintended change * Remove redundant styles --------- Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> * Add the hosting dashboard domain forwarding add/edit form (#105113) The Hosting Dashboard add and edit form for Domain Forwarding rules. There are a few follow up tasks that we'll fix * Newsletter importer: Update billing warning copy (#105203) * Newsletter importer: Update billing warning copy. * Connect Refresh: Fix layout issues with Woo DNA/JPC signup (create-account) form (#105156) * Domain Search: Update experiment name (#105131) * Domain Search: Update experiment name * Enable eligibility only for logged in users --------- Co-authored-by: Luis Felipe Zaguini <luisfelipezaguini@gmail.com> * Getting supported contries list from our API * Fix merge conflict * Add support to State selection from selected country * Refactor domain-supported contries and states and removed lodash usage * Remove unnecessary code after merge * Renamed contact-details directory to domain-contact-details * Update domain data type and removed types file * Use contact-form-fields to store them so the main file doesn't get too big * Final review changes * Removed unnecessary css files and fixed types * Readability improvements * Fix data types * Improve support links usage * Improve the usage of queries for validate mutation * Fix unnecessary type mapping and remove older query * Fix type error on StateFieldEdit component * Fix render error during component update --------- Co-authored-by: Grzegorz Chudzinski-Pawlowski <112354940+grzegorz-cp@users.noreply.github.com> Co-authored-by: Tony Arcangelini <33258733+arcangelini@users.noreply.github.com> Co-authored-by: Griffith Chen <griffith.chen@automattic.com> Co-authored-by: Veselin Nikolov <veselin@automattic.com> Co-authored-by: arthur791004 <arthur.chu@automattic.com> Co-authored-by: Claudiu Filip <claudiu.filip@automattic.com> Co-authored-by: Christos <chriskmnds@gmail.com> Co-authored-by: Welly Shen <hivoid19@gmail.com> Co-authored-by: Sebastián Barbosa <sebabarbosa@gmail.com> Co-authored-by: Omar Alshaker <omar@omaralshaker.com> Co-authored-by: Ashar Fuadi <ashar.fuadi@automattic.com> Co-authored-by: katinthehatsite <katerynakodonenko@gmail.com> Co-authored-by: Kateryna Kodonenko <kateryna@automattic.com> Co-authored-by: Karen Attfield <karenlattfield@gmail.com> Co-authored-by: Gergely Csécsey <gergely.csecsey@automattic.com> Co-authored-by: Roberto Aranda <roberto.aranda@automattic.com> Co-authored-by: Gergely Csécsey <gcsecsey@gmail.com> Co-authored-by: Lena Morita <lena@jaguchi.com> Co-authored-by: leonardost <leonardost@users.noreply.github.com> Co-authored-by: Yashwin Poojary <yashwinpoojary@gmail.com> Co-authored-by: Rafael Agostini <rafael.agostini@automattic.com> Co-authored-by: Ivan Ottinger <ivan.ottinger@automattic.com> Co-authored-by: Miroslav Mitev <m1r0@users.noreply.github.com> Co-authored-by: Payton Swick <payton@automattic.com> Co-authored-by: Welly Shen <welly.shen@automattic.com> Co-authored-by: Luis Felipe Zaguini <26530524+zaguiini@users.noreply.github.com> Co-authored-by: Philip Jackson <p-jackson@users.noreply.github.com> Co-authored-by: Igor Giussani <igor.giussani@automattic.com> Co-authored-by: Arun <arun@arun.blog> Co-authored-by: Bogdan Nikolic <bogdan.nikolic87@gmail.com> Co-authored-by: Kamen Stanev <kamen.stanev@automattic.com> Co-authored-by: Allison Levine <1689238+allilevine@users.noreply.github.com> Co-authored-by: Luis Felipe Zaguini <luisfelipezaguini@gmail.com>
Part of DOTDASH-234
Proposed Changes
rewind/backups/enqueueandrewind/backupsendpointssiteBackupsQueryqueryrewind/backupsendpoint once we enqueue the backup, so we can grab the progress of the backup.This is an initial iteration. Next steps will include:
siteRewindableActivityLogEntriesQueryonce the new backup is completed, so we can reflect it in the backups list. I didn’t include this in the PR to keep it simpler and because we are working on updating the dashboard to align with the designs.Why are these changes being made?
Testing Instructions
/v2/sites/SITE_SLUG/backupsusing a site with the backup featureBack up nowbuttonBack up nowbutton, it should switch toEnqueuedstate saying "Backup enqueued".After some seconds, you could refresh the Backup dashboard to see the new Backup. In a future iteration we will start polling the
siteRewindableActivityLogEntriesQueryand handle error scenarios.Area.mp4
Pre-merge Checklist