no issue
- fixed API returning "Invalid mobiledoc structure" errors when `mobiledoc:null` is sent in the payload alongside `lexical: '{...}'`
- updated Admin's `posts` and `pages` adapters to always add `?formats=mobiledoc,lexical` because the API doesn't return `lexical` by default
- added `lexical` attribute to Admin's Post model
- updated `lexical-editor` controller and related components to work with `lexical` always being a JSON string rather than a parsed object
- updated `<KoenigLexicalEditor>` to pass through the lexical state string as initial state and wired up the `onChange` prop
no issue
- mobiledoc and lexical editors will co-exist for some time so we want to make using both as straight forward as possible
- posts can only have one of `lexical` or `mobiledoc` properties set so in the `edit` route for each editor we detect the opposite property being present and redirect so the right editor is loaded for each post
refs https://github.com/TryGhost/Team/issues/1891
- cleans up mock stats data from hardcoded values for each period to instead have the global stats format with date
- the value for each period is calculated dynamically based on selected option
- is in line with how API data is expected to be returned, allowing it to easily fit in when added
- the template code had moved to a model in Settings but the controller code
hadn't been moved over so the getters were missing
- this moves all the relevant code from What's New to the About modal
no issue
- updated default `editor.url` config to point at the `@tryghost/koenig-lexical` package
- uses unpkg.com for now for the faster cache clearing during active development
- adds `{version}` to the url and `editor.version` config to match the pattern in other apps
- updated `<KoenigLexicalEditor>` to use the new templated URL+version and the new global name used in the UMD build output
- commented out mobiledoc-editor related code in `<GhKoenigEditorLexical>` that could throw errors
closes https://github.com/TryGhost/Ghost/issues/15290
- Capture error from model errors
- Add hasValidated for name property to properly mark field as error/success
- Add property to hasValidated after each failed validation
- Wrap saving on try-catch to suppress uncaught exception (validation error)
closes https://github.com/TryGhost/Ghost/issues/15391
- `vertical-collection` component was throwing errors during render when the tags list was filtered down causing slowdowns or full Admin crashes
- similar regression had popped up before and fixed in https://github.com/TryGhost/Ghost/pull/15207 but the dependency had been bumped again without realising it caused an error
- added a test that triggers the error-throwing behaviour in the tags input to help catch this in future dependency updates
refs https://github.com/TryGhost/Toolbox/issues/403
- as we're moving towards independent Admin releases, we want to make
sure that we can bust cache when an asset is updated
- right now, svg, ttf and ico images aren't fingerprinted, so if they
change, it'll require a browser cache clear to update them
- instead, we should add them to the list of fingerprinted file
extensions to fix this issue
no issue
- relocated the screen-specific modals from `modals/` to `members/modals/` directory as part of a on-going reorganisation of components into screen-specific directories
refs: https://github.com/TryGhost/Team/issues/1121
- use captureMessage instead of captureException in showAlert as showAlert should always have a String not an Error
- this should hopefully improve how these things appear in Sentry
- moved source to a tag, not context, so we can filter on the source in sentry UI
refs: https://github.com/TryGhost/Team/issues/1121
- Reviewing the list of errors in sentry, some of the most common ones are:
- success messages like "Password changed"
- info messages like "Please check your email for instructions."
- warnings like "You need to sign out to register as a new user."
- None of these are errors, so they shouldn't appear in sentry
refs https://github.com/TryGhost/Team/issues/1025
- added `{{humanize-recipient-filter}}` helper that converts an NQL recipient filter into a more readable format
- updated posts list to use the new helper in the sends column tooltip shown when hovering with the mouse
no issue
- relocated screen-specific components into a separate `posts-list/` directory as part of the move to keep the top-level `components/` directory for re-usable components
refs https://github.com/TryGhost/Ghost/issues/14101
- controller was already mostly up-to-date with Octane patterns
- removed unnecessary use of `@computed` and removed `@classic` decorator
no issue
- relocated screen-specific components into a separate `tags/` directory as part of the move to keep the top-level `components/` directory for re-usable components
refs https://github.com/TryGhost/Team/issues/1871
This commit adds a test to the serialize method of `post-emaiserializer`. It checks whether the generated email HTML is valid and standard HTML5 and that all properties are escaped.
To do this validation, I depend on the new `html-validate` dev dependency. Just parsing the HTML with a HTML parser is not enough to guarantee that the HTML is okay.
Apart from that this fixes:
- Removed the sanitizeHTML method and replaced it with normal HTML escaping. We don't want to allow any HTML in the escaped fields. Whereas `sanitizeHTML` still allows valid HTML, but we don't want that and want the same behaviour as on the site. E.g., a post with a title `All your need to know about the <br /> tag` should actually render the same title and non-html content, being `All your need to know about the <br /> tag`
- The file, nft and audio card didn't (always) escape the injected HTML fields (new version @tryghost/kg-default-cards)
- `@tryghost/string` is bumped because it contains the new escapeHtml method
The Posts API does not strip unknown properties when dealing with relations,
which meant that tags were being sent up with a `parent` property which would
always cause the model to be considered "changed". This resulted in the update
methods being called, and leading to unexpected behaviour.
Whilst this change does fix things for the History feature, the correct fix is
to update the admin-api-schema, or the input serializers such that they only
allow through known and allowed properties.
no issue
- fixes error that left the confirmation modal in place when deleting a tag by ensuring we return `true` in the task used by the confirm button, if we return the transition object it trips the "failed" state because the `/tags` route aborts and refreshes when transitioning to it
- fixes missing attached posts count in the tag delete confirmation modal by using the correct `tag.count.posts` attribute in the conditional
- fixes missing slugs in the tags list by using the properties on `@tag` rather than expecting a separate `@slug` argument
- replaced the skipped tags acceptance tests with an updated tests that match the recent redesign
no issue
- Deleted staff picks
- Added Explore Feed Dashboard resource
- Added styles and svgs
- Moved "What's New" resource into a split box with community box
refs https://github.com/TryGhost/Toolbox/issues/356
- this commit updates the route to `/settings/history` and moves all the
files to their new name so we can avoid further cleanup down the line
refshttps://github.com/TryGhost/Team/issues/1738
- Changed sidebar member count to use new API endpoint data.
- Added separate function for getting member count.
- changed `_fetchCountsTask` to use new `/stats/member_count/` endpoint
- updated @task to calculate total members from endpoint data.
refs. https://github.com/TryGhost/Toolbox/issues/356
- renamed page to “History” now to make it less technical
- moved the history page out to the Advanced section in Settings to increase discoverability
- moved the About section from General settings to a modal because that technical data was not connected to General settings
refs. https://github.com/TryGhost/Toolbox/issues/356
- member label was too granular and small piece of information to justify a complete "Member" category, so we ignored to fetch the member label related events for now and removed the "Member" category from the filter list
- the term "users" wasn't consistent with the rest of the UI, changed it to "staff"
no refs.
- after switching to Inter the letter spacing of header cards were too wide which caused the fake cursor to be blinking inside the placeholder
refs https://github.com/TryGhost/Team/issues/1873
- the code for storing the image width/height in the card payload was commented out
- uncommented and renamed to match the payload attr names
refs 41313f6993
- typo in the replacement of emberx-file-input meant that some uses of uploader components were throwing a `When using uploader.triggerFileDialog you must call uploader. registerFileInput first` error
refs 038600c350
- SVGs have titles now and title text content will be included in `element.textContent`
- updated tests that failed to use `.innerText` instead
- via chai-dom's `.rendered.text()`
- via direct access `find('.elem').innerText).to...`
refs https://github.com/TryGhost/Team/issues/1734
- resolves some deprecations raised by the addon which has fallen out of regular maintenance
- we were largely overriding much of the addon so the additional code was minimal, most of the changes were from updating to modern patterns
refs 6290fd6deb
- following the referenced commit, all SVG icons should only be used
with svg-jar and not externally loaded
- this means we are now shipping all the icon files in the packaged tarball, but
they're unused once Admin is built
- this commit prevents the icons from being copied and bundled
Refs 038600c350
- In the reference commit I update config so that svg titles are only removed in production. This causes them to show in tests which causes tests to fail. Config has now been updated to only include svg titles in development.
refs https://github.com/TryGhost/Toolbox/issues/356
- if an actor has been deleted, their icon would just be blank
- we want to show the default user icon
- to accommodate this, and to improve some code along the way, I've also
added `include=actor` to the API request so we get the actor inline in
the response instead of sending off another request
- I should really switch to using models + the store at some point to
cleanup parsing all the API responses manually
refs https://github.com/TryGhost/Ghost/issues/14101
refs https://github.com/TryGhost/Team/issues/1734
- use of the helper was generating deprecation warnings when building Admin
- removed the single usage in favor of using `{{perform}}` directly on a controller task property as there was no need to go via the route
- changed naming of task properties to include a `...Task` suffix so it's clear when dealing with a task object
- More adjustments to make the event stronger and the link lighter and less messy
- Checking in the icons but need to wire them up
refs https://github.com/TryGhost/Team/issues/1851
refs. https://github.com/TryGhost/Toolbox/issues/356
- the list needed avatars and action icons to be able to easily scan who's doing a lot of actions and what actions have been done at the same time
- The extra column made sense logically but was causing too many issues
- Going to try the single setence again but change visual style to be easier to parse
- Making sure this works around the feature flag
refs https://github.com/TryGhost/Team/issues/1851
fixes https://github.com/TryGhost/Team/issues/1850
When member attribution is enabled, the signup or conversion columns are shown when filtering on them. This data is not yet available via the API when browsing members. So these columns are now hidden.
fixes https://github.com/TryGhost/Team/issues/1344
fixes https://github.com/TryGhost/Team/issues/1127
This fixes a couple of bugs with the filter menu on the members page in admin:
- When opening the members page, the filters property was passed back from the filter component to the members controller. This caused a bug that the filter columns where not visible on reload.
- Fixed handling invalid filter parameters
- When updating the URL, the members page now properly reloads
- Fixed a bug that 'falsy' values in the NQL filter were removed on reload:
- Filtering on unsubscribed members was gone after a page reload
- Filtering on 0 emails was gone after a page reload
- This is fixed by converting numbers and booleans to strings after parsing the NQL-filter
- Fixed a bug where boolean values didn't match any value in the select menu, causing the default option to be visible
- Filtering members by 'unsubscribed' -> parsed as false (boolean) -> select menu opened -> false value (boolean) didn't match 'false' (string) so the first option was shown instead (subscribed).
- This is also fixed by converting numbers and booleans to strings after parsing the NQL-filter
The way this is currently handled is not great. The parsing happens in the filter component, but should happen on a different layer, maybe in a different helper.
This is tracked here: https://github.com/TryGhost/Team/issues/1849
refs. https://github.com/TryGhost/Toolbox/issues/356
- the readability of the Audit log table wasn't great as the very repetitive "actor" was the primary info
- the link to the actor (staff user) was missing
refs TryGhost/Team#1826
- allows staff users to manage their email alert settings behind the flag
- only owner and admin users are able to toggle their email alerts
refs https://github.com/TryGhost/Team/issues/1843
- Added link to filtered members list when clicking the signup or conversion member counts in the posts and pages table
- Temporary hover style added
- Some events take up quite a bit of space and so want to be less verbose
- Playing with where to add joins in the interface
- Remove references of subscription unless it's for email
refs https://github.com/TryGhost/Team/issues/1840
- Adding sticky headers so columns are easier to read and parse
- These are working only behind the feature flag
- Checked against narrower viewports and dark mode
refs https://github.com/TryGhost/Team/issues/1837
refs https://github.com/TryGhost/Team/issues/1833
refs https://github.com/TryGhost/Team/issues/1834
We've added the attribution property to subscription and signup events when the
flag is enabled. The attributions resource is fetched by creating multiple relations
on the model, rather than polymorphic as we ran into issues with that as they can't
be nullable/optional.
The parse-member-event structure has been updated to make it easier to work with,
specifically `getObject` is only used when the event is clickable, and there is now a
join property which makes it easier to join the action and the object.
refs https://github.com/TryGhost/Toolbox/issues/356
- the existing structure of 1 checkbox per resource was becoming unsustainable
as we added events for more resources
- instead, we're going to group resources together into categories so
they can be disabled/enabled together
- this implements that, and also enables showing Tier and Offer events
now we have something that works nicely
refs https://github.com/TryGhost/Team/issues/1833
refs https://github.com/TryGhost/Team/issues/1834
We've added the attribution property to subscription and signup events when the
flag is enabled. The attributions resource is fetched by creating multiple relations
on the model, rather than polymorphic as we ran into issues with that as they can't
be nullable/optional.
The parse-member-event structure has been updated to make it easier to work with,
specifically `getObject` is only used when the event is clickable, and there is now a
join property which makes it easier to join the action and the object.
closes https://github.com/TryGhost/Team/issues/1727
- allows site owners to give cardless free trials to members by setting expiry on complimentary subscriptions
- also allows complimentary members to upgrade as paid member
- Made sure feature flag works for new design with table
- Made adjustments to the narrow width look of the table
- Tested across browers and dark mode
refs https://github.com/TryGhost/Toolbox/issues/356
- this allows collection of CRUD events for Offers but we currently don't
show them in the UI until it's overhauled to avoid being monotonously
long
refs https://github.com/TryGhost/Toolbox/issues/356
- this allows collection of CRUD events for Tiers but we currently don't
show them in the UI until it's overhauled to avoid being monotonously
long
- Created a new tag type with max width
- Made sure tags didn't get to large for the box
- Double checked page or post title length
refs https://github.com/TryGhost/Team/issues/1832
refs https://github.com/TryGhost/Toolbox/issues/356
- we have a very crude version of this before but it just wasn't
maintainable
- one of the first things I did here was to add `include=resource` on
the API call, so it returns the fields we need without extra API
requests
- after we have the id/slug, I could build a route and model array
dynamically, or return null if we can't redirect to the object (it
doesn't exist)
refs https://github.com/TryGhost/Toolbox/issues/356
- in order to show data that we might not necessarily still have around
(ie. when you delete a post, you might want the title), we're going to
start utilizing the `context` column
- right now, we store the `primary_name` for deleted events, and we also
store the `setting` `key` and `group` so we can reference it in the
audit log
no issue
We're spending a bit of time playing with an alternative to mobiledoc-kit to test it's feasibility as a base for future editor improvements.
- add `editor.lexicalUrl` config that points at the unpkg release by default
- set up a route on `/ghost/#/lexical-editor/post/` for the test playground which renders `<KoenigLexicialEditor>` as the editor
- adds `<KoenigLexicalEditor>` component that lazy loads the external react component
refs. https://github.com/TryGhost/Toolbox/issues/356
- The page title in Audit log didn't reset the filters and the search value
- Also, the button on the empty list screen didn't work
refs. https://github.com/TryGhost/Toolbox/issues/356
- The entry for Audit log had been temporarily put on the top level Settings screen. Instead it's now accessible from Settings / General from a generic About box which had been moved from the What's new page. This also required to update the layout of the What's new page a little bit.
- the `created_at` key is stored directly under the object we fetch as
the last event, rather than a subkey
- this meant we weren't checking the date of the last event correctly,
which broke pagination
- This has the attribution column back into the dashboard activity
- This works only under the member attribution flag
- There are still some issues with event copy
refs https://github.com/TryGhost/Team/issues/1816
refs https://github.com/TryGhost/Toolbox/issues/356
- events and resources needed to be filtered and sent to the API
differently
- this commit splits them apart and wires up the toggles to query params
and therefore API requests
refs https://github.com/TryGhost/Toolbox/issues/356
- linking is a bit hit-or-miss right now so it's best to only link to
the resources we can
- this implements a `linkable` attribute on an event to indicate if we
can link to its page or not
refs https://github.com/TryGhost/Toolbox/issues/356
- this adds some basic filtering and search across the audit log events
- not all of it works, but filtering by objects and searching for users
should work
- Adjustments to the icon spacing for all tables
- Adjustments to the font weighting and colour for all event tables
- Changed activity on dashboard to have relative time
- Tweaked padding and margins to bring more consistency
- Also fixed a linting bug
refs https://github.com/TryGhost/Team/issues/1816
refs https://github.com/TryGhost/Team/issues/1727
- adds alpha feature flag for expiring comped subs
- adds duration to complimentary subs to set expiry
- shows details for expiring comped subs
refs https://github.com/TryGhost/Toolbox/issues/356
- even though I was hiding the button, it's better to prevent going to
the route entirely by redirecting to the homepage if the labs flag is
not enabled
refs https://github.com/TryGhost/Toolbox/issues/356
- some resources don't have titles, like users, so we should optionally
see if they have a name
- this is starting to become unwieldy so I'll likely pull this logic out
in an upcoming commit
refs https://github.com/TryGhost/Toolbox/issues/356
- this allows you to click on the title and go to whatever resource was
acted upon
- if the resource has not be found, it'll just show the resource ID
closes https://github.com/TryGhost/Team/issues/1715
refs https://github.com/TryGhost/Members/pull/407
- when comped boolean was brought back for backwards compatibility, it accidentally opened a path from admin to set comped stripe subscriptions on members on save, as Admin always sends back `comped` value
- since we don't allow stripe comped subscriptions anymore, this caused weird behavior with assigning the default tier on comped stripe subscription.
- this change removes the `json.comped` value to be sent up from Admin to avoid any weird comped changes to the member
no issue
- switched `parse-audit-log-event` to a class helper to get access to dependency injection
- added `get actor()` to the parsed event object
- uses the store to find the related user record, returning an already loaded record if it exists otherwise fetches the record
- allows use of `event.actor.*` in templates because they are promise-aware and will be filled in once the record is loaded
refs. https://github.com/TryGhost/Team/issues/1813
- All the groups of the Portal settings accordion was closed by default. Opening the first group when showing the modal makes the workflow faster.
- The top heading on the content area had a white background which made the screen visually a bit cluttered.
refs. https://github.com/TryGhost/Team/issues/1812
- The "Copy link" button on the Offer detail screen was only enabled once certain fields were filled. This makes unnecessary cognitive load on the end user.
no issue
- we allowed line breaks to be created in the text-replacement html input used inside email cards but they were removed as soon as the card's edit mode was left
- fixed the clean-text-replacement-html routine so `<br>` atoms aren't stripped
- added the soft-return parser to the `<KoenigTextReplacementHtmlInput>` editor options so the `<br>` elements are correctly parsed back into atoms when entering edit mode
no refs.
- There was a bug on the tier cards action menu dropdown in Settings/Membership that the buttons in the dropdown were clickable even when it was closed.
refs. https://github.com/TryGhost/Team/issues/1806
- free trial indicator - which helps users identify tiers easier - was missing on tier cards in Settings / Membership in the Admin
fixes https://github.com/TryGhost/Ghost/issues/11541
- due to an upstream bug, typing emojis using Safari would show square
boxes in the editor
- the upstream patch has been fixed, so I've pulled it into our
mobiledoc-kit fork
- this commit bumps that package to fix the issue in Ghost
- because of how the npm scripts were set up, we were running the full
Admin integration tests during the unit tests phase of CI
- this commit renames the majority of `test` to `test:unit` in the
package.json files, and aliases `test` to `test:unit`
- special packages like Admin have no-op'd `test:unit` scripts so we
don't end up running its tests