Commit Graph

39447 Commits

Author SHA1 Message Date
Kevin Ansfield
459a2c553e Added full-page refresh when new post route is in a bad state
ref https://linear.app/tryghost/issue/ONC-323

When the store gets into a bad state for new posts that causes saves to fail we can detect that by looking at the `model.isNew` property. Currently our best approach to fix this state is to restart the app.

- added a `didTransition()` hook to our `lexical-edit.new` route
  - detects the bad state, logs the error, and triggers a browser refresh
  - logs with a `recreatedPostIsGood` property that will let us know if we could instead just try recreating the post and avoiding a full refresh (so far we have no reproduction case so we need to learn what we can)
- added `sinon-chai` dependency for better assertions on spies/stubs
- added `sentry-testkit` dependency so we can test our Sentry integration calls
  - we can't use sinon for these calls because of the way Sentry's es6 imports work
- extracted our full Sentry config object generation to a util function so it can be re-used in unit tests
  - updated our integrations list to disable the default `dedupe` integration because it can cause very unexpected/difficult to debug test failures when you're asserting using `sentry-testkit`
2024-09-23 22:38:34 +01:00
Djordje Vlaisavljevic
f1553c385d Added break-all to links inside notes to avoid overflows
ref https://linear.app/tryghost/issue/AP-412/need-break-all-for-long-strings-in-replies
2024-09-23 21:59:18 +01:00
Djordje Vlaisavljevic
281f497606 Added formatting for numbers in Tab counters and FeedItem stat counters
ref https://linear.app/tryghost/issue/AP-425/use-formatted-numbers-everywhere
2024-09-23 21:59:18 +01:00
Djordje Vlaisavljevic
b7ef6ef521 Added more flexible layout for profile attachments
ref https://linear.app/tryghost/issue/AP-305/profile-viewer-component-that-can-render-activitypub-actor-data
2024-09-23 21:59:18 +01:00
Djordje Vlaisavljevic
2ab618709a Linked timestamps to original post URLs for easier navigation
ref https://linear.app/tryghost/issue/AP-408/add-link-to-original-post-location-in-ui-for-better-navigation
2024-09-23 21:59:18 +01:00
Sag
577362aabf
🐛 Fixed navigations links for Ghost sites hosted on a subdirectory (#21071)
ref https://linear.app/tryghost/issue/ENG-1570

- for a Ghost site hosted on a subdirectory, e.g. `/blog/`, adding a
navigation link to `/blog/page/` was being re-written as `/page/` in Admin settings
- fixed the underlying `formatUrl` utility function and added unit tests
2024-09-23 18:37:05 +02:00
Daniel Lockyer
9093ffbf98 Fixed browser tests incorrectly executing Stripe CLI
- we shouldn't try and load the Stripe CLI via the dev script because
  it's done in the browser tests and involves more setup than the dev
  script contains
- this cuts 2mins from the browser tests because they're no longer
  waiting for the Stripe CLI to be auth'd
2024-09-23 17:43:53 +02:00
Sanne de Vries
0656bd4de8
Added more specificity to newsletter title line-height (#21070)
REF DES-770
- In certain email clients such as Protonmail, the newsletter title
line-height was inherited from the `body` rather than the parent `td`.
This commit adds line-height to the title link explicitly.
2024-09-23 16:29:07 +02:00
Daniel Lockyer
7c346c28eb Enabled Nx caching on main
- we should be able to trust Nx enough that we can sustain the build
  cache across commits, which will speed up the workflow because we
  don't need to rebuild our TS projects all the time
2024-09-23 15:19:31 +02:00
Daniel Lockyer
5791be4937 Merged setup steps in CI
- we don't need these to be separate steps and having them separate
  actually makes CI slower because it takes ~10-12s for GitHub to start
  new jobs
2024-09-23 14:48:17 +02:00
renovate[bot]
7d441f24be Update dependency ember-auto-import to v2.8.1 2024-09-23 09:34:16 +02:00
renovate[bot]
894a961f9e Update dependency tailwindcss to v3.4.12 2024-09-23 09:13:59 +02:00
renovate[bot]
a1dcd9168d Update dependency ember-auto-import to v2.8.0 2024-09-23 09:08:50 +02:00
renovate[bot]
56af0e0095 Update dependency html-validate to v8.23.0 2024-09-23 08:59:09 +02:00
renovate[bot]
ed04bd4a8b Pin dependency microdiff to 1.4.0 2024-09-23 08:56:08 +02:00
Ghost CI
887fdbd430 v5.94.2 2024-09-23 06:43:10 +00:00
renovate[bot]
6d80063539 Update dependency @uiw/react-codemirror to v4.23.3 2024-09-23 06:34:27 +00:00
Fabien O'Carroll
2681e526f6 Fixed type errors for admin-x-activitypub
We didn't catch these because ci type checks weren't running, but they are now!
2024-09-21 10:20:20 +07:00
Fabien O'Carroll
92c17ade34 Ensured types are checked as part of unit tests
Otherwise we get green ticks on a PR and then the build fails on main
2024-09-21 10:20:20 +07:00
Djordje Vlaisavljevic
674227941e Added nicer focus state so text and button don't clash
ref https://linear.app/tryghost/issue/AP-307/component-for-replying-to-objects-in-the-inboxfeed
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
ae50afe307 Fixed linting issue
ref https://linear.app/tryghost/issue/AP-307/component-for-replying-to-objects-in-the-inboxfeed
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
9bd2b26226 Fixed avatars appearing stretched in replies
ref https://linear.app/tryghost/issue/AP-374/add-design-for-replies
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
9b2228708a Improved feed item layout and typography
ref https://linear.app/tryghost/issue/AP-282/render-notes-in-the-frontend
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
6d873600f0 Simplified drawer design
ref https://linear.app/tryghost/issue/AP-282/render-notes-in-the-frontend
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
4aa5e4f091 Added Just now as a timestamp
ref https://linear.app/tryghost/issue/AP-282/render-notes-in-the-frontend
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
0cf5d11bf2 Fixed bugs with textarea focus on disabled states 2024-09-21 09:39:42 +07:00
Fabien O'Carroll
bd2a0369ed Added new reply to the comments state
ref https://linear.app/tryghost/issue/AP-395

This is a stopgap solution, because currently we don't have any of our own
reply data in the frontend, so this will show the new reply, but it won't be
present on page reload. Should be enough for a demo video, but I think we need
to either fetch our outbox, or make a new replies endpoint and fetch from there
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
8cc3646c29 Fixed post reply button
ref b9d02f8051beb9120a282bcbf0f70440c2a3c39e

Because we disabled the button on blue of the textarea, it was being disabled
before the click would be handled! Using the mousedown event means that our
event gets handled before the blur.
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
78bb1461a8 Focused reply input when clicking comment button in drawer
ref https://linear.app/tryghost/issue/AP-396

We need to use a number instead of boolean here so that the state is always
refreshed, otherwise we can run into issues where we set `focused` to true but
there's no rerender because it was previously set to true, but unfocused
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
6a3632e457 Updated button based on focus state
ref https://linear.app/tryghost/issue/AP-398

This adds an internal focus state so that we can render the reply box different
based on whether or not the textarea is focused!
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
403cac4c42 Focused reply box when clicking comment button on feed item
ref https://linear.app/tryghost/issue/AP-396

I think it's nicer API to pass in a focused property, rather than an
element ref, but I don't have much experience here, so it might be the
wrong approach!
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
3e6b3bda8a Populated reply box avatar
ref https://linear.app/tryghost/issue/AP-397

I think we're gonna want to pass this data into the component long
term, but this will do for now, I'm going to look at cleaning up these
components in my next B week
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
e8e44a0312 Added toast notification for successful reply
ref https://linear.app/tryghost/issue/AP-395
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
5ff7dce5a2 Emptied reply textarea after reply success
ref https://linear.app/tryghost/issue/AP-395

I've also set the disabled prop here too, not sure if necessary
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
82328708ac Set loading state of the post reply button
ref https://linear.app/tryghost/issue/AP-394

I've also passed the disabled prop, but not sure if it's necessary
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
f60f22be2d Added placeholder text to AP reply box
ref https://linear.app/tryghost/issue/AP-399/add-reply-box-placeholder
2024-09-21 09:39:42 +07:00
Fabien O'Carroll
ea9fcd8f2a Initial wire up of reply box to the API
ref https://linear.app/tryghost/issue/AP-287
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
b6c5cca890 Updated AP reply box design
ref https://linear.app/tryghost/issue/AP-307/component-for-replying-to-objects-in-the-inboxfeed
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
6df9ad6537 Added Copy link button to feed items
ref https://linear.app/tryghost/issue/AP-308/ui-for-deleting-replies
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
6708787731 Added static reply box for ActivityPub content
ref https://linear.app/tryghost/issue/AP-307/component-for-replying-to-objects-in-the-inboxfeed
2024-09-21 09:39:42 +07:00
Djordje Vlaisavljevic
1680817da2 Added More menu for feed items and static Delete menu item
ref https://linear.app/tryghost/issue/AP-308/ui-for-deleting-replies

- Added `dotdotdot` icon
- Added optional `destructive` prop to `Menu` items
2024-09-21 09:39:42 +07:00
Kevin Ansfield
c41c44b02d Fixed "Editor crashed" error showing for a valid 404
ref https://linear.app/tryghost/issue/ONC-323

- sometimes posts can be deleted by another user or in a different tab but then edited in an old tab that had the post loaded in the editor
- in this situation we were displaying our "Editor crashed" error put in place for the  rarer situation where the editor is genuinely in a bad state
- added an extra conditional for the bad state and a custom error message for the deleted post state
2024-09-20 09:40:44 +01:00
Kevin Ansfield
64118c139e Added extra post model state properties to debug logs
ref https://linear.app/tryghost/issue/ONC-323

- include post model state properties as well as the state name
2024-09-20 09:14:39 +01:00
Chris Raible
cc88757e2a
Added local revisions to the editor as backstop against data loss (#21044)
ref https://app.incident.io/ghost/incidents/107

- We have a rare bug that causes the initial `POST` request to create a
new post from the editor to be skipped or fail. Subsequent `PUT`
requests then fail because there is no post ID, potentially resulting in
data loss. The aim of this commit is to start saving revisions of posts
in the editor to the browser's localStorage, as a last-ditch option to
restore lost work.
- Since we don't know where the bug is yet, and to protect against
future bugs, we've deliberately avoided depending too heavily on the
`lexical-editor` controller or the ember store. We've aimed to create a
direct route to the state in the editor, by hooking into the
`updateScratch` method (effectively the `onChange` handler for the
editor).
- The `scheduleSave` function on the new `local-revisions` service is
called immediately upon any changes to the state of the lexical editor,
which is effectively every keystroke. The service has some logic and
timeouts, so it doesn't actually save a revision on every change to the
editor.
- The "schema" of the datastore is a simple key-value store, where the
key is of the format: `post-revision-${postId}-${timestamp}` if the post
has an ID, or `post-revision-draft-${timestamp}` for an unsaved draft.
There is also an array of all the revisions' keys, which allows us to
clear all the revisions without having to loop over every key in
localStorage (along with some other conveniences, like filtering).
- There is currently no UI for viewing/restoring revisions. In the event
that you need to restore a revision, you can access the service in the
browser console. You can access all the saved revisions using the
`list()` method, which logs all the revisions to the console by title &
timestamp. You can then choose a revision to restore, and call
`restore(revision_key)`, which will `POST` the revision's data to the
server to create a new post.
- Since localStorage data is limited to a 5mb quota in most browsers,
the service has a mechanism for evicting the oldest revisions once it
meets the quota. If a save fails because it would exceed the quota, the
`performSave` method will evict the oldest revision, then recursively
try to save again.

---------

Co-authored-by: Steve Larson <9larsons@gmail.com>
2024-09-20 00:08:28 -07:00
Kevin Ansfield
8ab7182bfe Added logging of post state changes
ref https://linear.app/tryghost/issue/ONC-323

- added debug logs to print to console each time the post state changes and include a full list of post state changes within the editor session in the error reports when we hit the 404 error caused by a bad editor state
2024-09-19 17:31:20 +01:00
renovate[bot]
78ad06226a Update dependency react-select to v5.8.1 2024-09-19 15:41:43 +00:00
Kevin Ansfield
bd6ca272dd 🐛 Fixed wrong breadcrumb and missing post status when starting new post from analytics
closes https://linear.app/tryghost/issue/ENG-1533

- the code to switch to "from analytics" state for the editor was applying when clicking the create post button in the nav menu whilst on the analytics screen which was confusing because you not only lost the `< Posts` link in the editor but you couldn't see the post's saving status
2024-09-19 16:27:40 +01:00
renovate[bot]
46aa2a7ce7
Update Koenig packages (#21048)
Ref: https://linear.app/tryghost/issue/ENG-904/bookmark-card-hot-linking-favicons

When a bookmark is added(pasting a URL) into the editor we’re immediately hitting the oembed endpoint twice.
The editor shouldn’t be firing a second bookmark oembed request when it’s already been given all the bookmark data from the first request.
Details: https://linear.app/tryghost/issue/ENG-904/bookmark-card-hot-linking-favicons#comment-852d53dc
2024-09-19 18:19:36 +05:30
Cathy Sarisky
6b84d9a900
🎨 wrapped missing i18n strings in portal (#21042)
ref https://forum.ghost.org/t/how-to-translate-the-date-intervals-year-and-month-in-portal-js/25599

- Added sneaky missing translation wrapping, notably the elusive year and month strings. Also "Change Plan" and "Choose Plan" for upgrade situations.
- Finding and adding these missing wrappings is critical to making Ghost's i18n usable for customers using other languages
2024-09-19 13:30:45 +01:00
Hannah Wolfe
f828ddefee Updated missed references to unique visitors
ref https://github.com/TryGhost/Ghost/pull/21035

- We decided to rename unique visitors to unique visits, but I missed a few places. Updated test case names for good measure
2024-09-19 12:09:46 +01:00