refs https://github.com/TryGhost/Team/issues/3351
- adds password validation and reset for non-owner users
- password validation uses basic checks for now and will include more checks from current admin in future
fixes https://github.com/TryGhost/Toolbox/issues/587
- this commit changes two things surrounding the extensions script:
- moves the script tag from the nav menu to the application template
so we always load the script irregardless of if the current page has
a nav menu
- opens up showing the script to all logged-in users and not just
Owners as previous
closes https://github.com/TryGhost/Team/issues/3369
- removes `lexical` from user-visible URL
- only renames path rather than renaming all associated files to keep changeset minimal prior to beta launch
closes https://github.com/TryGhost/Team/issues/3307
This commit includes several important updates to add internationalisation (i18n) support within the signup form package:
- Modified the translate script in `package.json` to include translations for the signup form.
- Added a new test for the signup form resources in `i18n.test.js`.
- Updated `tsconfig.json` to allow synthetic default imports.
- Made updates to `package.json`, including adding a prebuild command for `@tryghost/i18n` to ensure typescript declaration files get built.
- added `vite-plugin-commonjs` so we can bundle commonjs packages to be useable by the browser.
- In `App.tsx`, imported the `i18n` library and created an `i18n` instance for the `signup-form` namespace. This `i18n` instance's `t` function was added to the application context.
- Updated the `AppContextType` in `AppContext.ts` to include the `t` function from i18n
Co-authored-by: Daniel Lockyer <hi@daniellockyer.com>
refs https://github.com/TryGhost/Team/issues/3269
- fixes continuation of list sequence when a non-list-node separates list nodes bringing rendered output in line with editor depiction
refs https://github.com/TryGhost/Team/issues/3318
- adds new file service that allows managing image and file uploads
- wires file upload and save to twitter setting
- fixes issue with dynamic SVG icon loading not working randomly
refs https://github.com/TryGhost/Team/issues/3151
Some settings, like twitter and facebook urls, need transformation on save and read as the value shown to user is shown as the full URL while we save only the username for their facebook and twitter accounts.
This change adds a pattern for handling special (de)serialisation for setting keys.
refs https://github.com/TryGhost/Team/issues/3318
Adds error handling pattern for facebook and twitter account settings same as old admin, showing error message when incorrect value is added and also on blur updates the value to include the facebook/twitter URL
refs https://github.com/TryGhost/Team/issues/3337
Moved current email customization functionality that is behind the
`makeItRain` to its own flag (`emailCustomization`) and removed the now
redundant `makeItRain` flag
refs https://github.com/TryGhost/Team/issues/3151
The api service in admin-x was using hardcoded `x-ghost-version` as we did not have access to version value in the app so far. This change passes the ghost version from ember Admin app to Settings-X app via props, and refactors the api util to use the app version as a common header.
- Adds new services provider to pass common services for the app
- passes API as a service via context for the App
- refactors existing API usage to use api from context
no issue
Added support for `--signup` to `yarn dev`. This will make sure that the signup form preview server is served (with rebuilding) and can be used in admin (instead of using the published version). This is also automatically started when using `yarn dev --all`, but with a twist:
If you only run `yarn dev --all`, it will only build and watch the production build of the signup form. If you use `yarn dev --signup` or `yarn dev --all --signup` it will also serve the demo app on `http://localhost:6173`.
fixes https://github.com/TryGhost/Team/issues/3331
This adds attribution tracking to the signup form. It sends a newly
created url history when sending the signup API call, this url history
will get translated to a proper attribution and saved on the backend. We
send a history with only a single item that contains the referrer
source, medium and path of the Embed form.
This also makes some changes to the E2E tests so that the tests run
in an https environment instead of about:blank.
refs https://github.com/TryGhost/Team/issues/3260
- We need a way to remove posts form collections without fetching the whole collection's content. This API method allows to remove posts from manual collections by collection id and post id.
- As a response it returns up to date collection state without the removed post.
refs https://github.com/TryGhost/Team/issues/3260
- Whenever properties of the DTO are undefined they should be removed to avoid unintentional empty assignments to the stored collection
refs https://github.com/TryGhost/Team/issues/3260
- We need a way to append posts to collections without sending over all of the posts that are already in the collection
- The API would receive post_id and collection_id as required fields and will optionally take in sort_order to control the ordering in the manual collection
closes https://github.com/TryGhost/Team/issues/3134
- the mobile nav was showing for 404 pages when not logged in
- this adds an additional check, so that the nav is only shown when user is logged in, not only when the user is not contributor
no issue
- Removed the postHistory flag from labs
- Post History will be saved and displayed for all lexical posts,
regardless of whether the lexicalEditor flag is currently set
- Post History will still not be displayed for any mobiledoc posts
- With this change, the logic is simplified as we don't have to worry
about flags, but only the content in the given post (mobiledoc vs
lexical)
- If someone toggles the lexicalEditor flag on, creates a new post, then
toggles the lexicalEditor off, we still want Post History to work for
the existing lexical post
refs https://github.com/TryGhost/Team/issues/3329
- product card images have explicit width and height attributes in the markup now, and the image needs auto height for that reason
- without it, the images will lose its original aspect ratio for themes without the auto height images
closes https://github.com/TryGhost/Team/issues/3257
- replaces the TTF with WOFF2 which is more compressed version
- adds a font file for italic style specifically so that the italic text is rendered consistently across different browsers
refs https://github.com/TryGhost/Team/issues/3338
* background and button color can be passed in the script tag dataset
* text color is calculated automatically from background/button color
- This includes changes to support PascalCase filenames for interfaces
- Also bumps newer packages to use the latest version to avoid conflicts
with the underlying eslint-plugin-filenames package
refs https://github.com/TryGhost/Team/issues/3151
- updated save sequence for setting groups where edit button is hidden by default
- shows `Saved` for couple of seconds before disappearing on saving such setting groups
- adds save sequence for default recipient setting group
refs https://github.com/TryGhost/Team/issues/3151
- adds Save -> Saving -> Saved sequence to save buttons on all setting groups
- uses common hook state to manage state across all Settings
refs https://github.com/TryGhost/Team/issues/3151
- updates role info for user details modal for owner user, hides option to change role for owner
- adds saving/saved state for user detail modal
- removes alerts from invite and detail modal
- adds wiring for remaining user detail modal settings
refs https://github.com/TryGhost/Team/issues/3328
<!--
copilot:summary
-->
### <samp>🤖 Generated by Copilot at 8a276bc</samp>
This pull request adds a new DropdownMenu component to the admin-x-ds
global library. It also includes a storybook file to showcase the
component's usage and appearance.
---------
Co-authored-by: Djordje Vlaisavljevic <dzvlais@gmail.com>
refs https://github.com/TryGhost/Team/issues/3307
Added TypeScript support and a new namespace for the `i18n` module. This
enables type checking and localisation for the new signup form component and future typescript projects that may need to add i18n support.
closes https://github.com/TryGhost/Team/issues/3324
- When the recipients batch size is larger than the limit in addition to logging the error we need extra data to figure out what exactly is inside those `2000` or `3000` records causing faulty behavior.
- This change grabs all available models and dumps them into a file inside of the `content/data` folder. The code is temporary and should be removed once the problem is narrowed down
refs. https://github.com/TryGhost/Team/issues/3318
Until now all assets was part of the main app and not the AdminX Design System which could be problematic later when the system becomes a standalone library. Moved the assets folder under the design system for better reusability, less redundancy and for a more self-encapsulated system
refs https://ghost.slack.com/archives/C02G9E68C/p1685446707169999
- `actions/setup-node` has a bug where it doesn't parse paths where the path is pretty-printed with colors, so we have to explicitly disable colors
- Added whitespace change inside signup-form to trigger new CI run
refs https://github.com/TryGhost/Team/issues/1856
- adds a custom duration option with date picker to the complimentary plan when "Custom" is selected
- this allows customers to choose any date as expiration date
---------
Co-authored-by: Michael Barrett <mike@ghost.org>
refs https://github.com/TryGhost/Team/issues/3151
- updates data providers to include roles as well as cleaner api syntax
- updates api methods to cleaner syntax and add roles api
- updated wiring for staff user profile editing and save
- updated data provider location in main app, is used before the modal provider so it has access to common context
- added `useRoles` hook that providers access to roles data for admin
- added `currentUser` to the staff provider
refs: https://github.com/TryGhost/Ghost/issues/16628
This adds a library for interpolating strings with React components, which allows us to pass HTML elements / React components into our i18n templates. We can further templatize those components to have fully translated, nested components.
refs: https://github.com/TryGhost/Ghost/issues/16628
Separate commit for these, this change was a little more complex since the string "Complimentary" was repeated several times, with different additional context.
I decided to keep "Complimentary" by itself as a translatable string, and concatenated a second string for the expiry.
If this would be better as 3 strings, then we could switch to having these:
- "Complimentary"
- "Complimentary ({{label}})"
- "Complimentary - Expires {{expiry date}}"
^ Makes sense only if the use of parentheses & hyphens would be changed in other locales
refs https://github.com/TryGhost/Team/issues/2808
Updated the test to ensure that the date assertions do not unexpectedly
fail if the dates used are computed precisely at the start of a second
(no milliseconds `.000Z`)
refs https://github.com/TryGhost/Team/issues/3234
Added an e2e for the update check script to detect potential breakages
in the script due to uninitialised dependencies in the isolated
execution environment
fixes https://github.com/TryGhost/Team/issues/3296
Adds a new `signupForm` feature flag, that will enable/disable the new embeddable signup form code generation.
Since the new flag shares its name with a new config value (that contains the script location), this also fixes the feature helper to only use a config with the same name if it is a boolean.
refs https://github.com/TryGhost/Team/issues/3151
Using svg imports in React *.tsx files was throwing error as Module `*.svg` did not have any exported member as `ReactComponent`. This change updates the typings to declare the module with exported ReactComponent as an SVG element, allowing svg files to be imported normally.
closes https://github.com/TryGhost/Team/issues/3311
- added event handler to the mobiledoc editor for cut and copy operations that reads mobiledoc from the event data, converts to lexical using `@tryghost/kg-converters` and stores the converted data on the event under the `application/x-lexical-editor` mimetype ready to be pasted into a lexical editor
refs https://github.com/TryGhost/Team/issues/3199
- when content is copied from the Lexical editor the converted mobiledoc post is placed in the clipboardData's `application/x-mobiledoc-editor` mimetype
- added custom paste handling to extract that data and place it into the html content in the same format as a typical mobiledoc copy/paste so that it can then be handled internally by mobiledoc
refs https://github.com/TryGhost/Team/issues/3151
- adds api to fetch staff users
- adds provider to use users data in the application
- wires Users UI to show real owner and other staff users
- combines all data providers for application under a single provider
Rather than using `require` we can add a type definition file, this allows us
to add custom types in the future if we want. We need to add some config for
ts-node to pick up the types correctly.
closes https://github.com/TryGhost/Team/issues/3259
- API output mappers (soon to be serializers) are meant to work based on allowlist set of output properties. Having the allowlist early on will allow to track the API evolution consistently.
refs https://github.com/TryGhost/Team/issues/3294
- The factory method for the Collection and validations should live close together based on our latest architectural direction
closes https://github.com/TryGhost/Ghost/issues/16817
The member activity event filter was broken due to a recursion issue.
This commit changes the usage of a getter fn to a normal class method to
make the logic more performant and remove the recursion issue
refs https://github.com/TryGhost/Team/issues/3168
- This is basic scaffolding for collection resources UI in Admin. For the most part it's a copy-paste of tags code with slight modifications to fit the collections usecase
refs. https://github.com/TryGhost/Team/issues/3150
The sidebar was `sticy` which meant that users had to scroll all the way down to see the bottom of the sidebar. This defeats the purpose of being able to quickly jump to a section.
refs. https://github.com/TryGhost/Team/issues/3150
The style of having only an underline for input textfields and dropdowns sounds good in theory (and we might be able to use it in other context), but in Settings these components were hard to scan.
refs https://github.com/TryGhost/Team/issues/3151
- updates textfield to have password type
- updates wiring for mailgun settings
- updates wiring for analytics settings
- fixes local value read or useSettingGroup
refs https://github.com/TryGhost/Team/issues/3151
- adds new hook for managing state/changes in a Settings Group
- updates existing settings to work with the new hook to clean the code
- wires membership access settings for read/write
- lint cleanup
- this will allow us to see which set of tests are consuming the most
amount of time in CI
- in order to split apart the commands, I've had to override the
coverage thresholds for integration+regression tests in order to keep
c8 happy
- also sprinkled some more labels into the workflows to make things
clearer to read
refs https://github.com/TryGhost/Toolbox/issues/584
- we should strive to provide a good development experience by keeping
the number of "other" setup steps to a minimum
- this adds support for the Announcement Bar app to the dev script so a
simple flag spins up the dev server too
refs https://github.com/TryGhost/Team/issues/2841
- currently, the link to other plans is always shown regardless of
whether if there's any other paid plan or not
- this adds a check to show the link only when there are other plans
refs https://github.com/TryGhost/Team/issues/3248
The current test fixtures didn't include any hidden Tiers, so I've added
a new fixture to test the filtering of hidden Tiers. It's not enabled by
default to avoid breaking the existing tests.
refs https://github.com/TryGhost/Team/issues/3151
- updates hint to apply default styling to custom react nodes as well
- cleans up hint usage for publication language
- updates hint story to include new option
refs https://github.com/TryGhost/Team/issues/3151
- wires facebook and twitter url to real settings data in admin-x
- manages (de)serialisation of facebook/twitter users
- todo: error handling for invalid urls is
refs https://github.com/TryGhost/Team/issues/3167
- Having paging metadata is part of every API response and was missing from initial implementation
- The getAll method has all of the values as "static" as there's nothing to page on.
refs https://github.com/TryGhost/Team/issues/3167
- The core client (API) needs a way to pass in information without an ID when creating a new entity, handling it on service/repository layer makes the most sense.
- Used "require" syntax to import tpl/errors modules, otherwise TS compiler was complaining about type compatibility issues, this works as a temporary workaround and is tracked and an issue to improve in the future.
refs https://github.com/TryGhost/Team/issues/3167
- This is scaffolding for collections API. Contains wiring for service wrapper, e2e test, and a browse endpoint
- Adds basic implementation of the GET /collections endpoint to build up upon
- Note, there are no permissions in this version as they will be added in later stages of development with migrations etc
refs https://github.com/TryGhost/Team/issues/3150
- wires Timezone setting to read list of timezones and allow editing/saving new value
- handles read/write of real timezone setting from settings context
- uses `@tryghost/timezone-data` to fetch list of all timezones
- adds typings.d.ts to handle missing types for @tryghost/timezone-data
refs TryGhost/Team#3229
- The issue we are observing that even though the returned amount of email recipients should not ever accede the max batch size (1000 in case of MailGun), there are rare glitches when this number is doubled and we fetch 2000 records instead.
- The fix takes it's best guess in de-duping data in the batch and then truncates it if the amount of records is still above the threshold. This ensures we at least end up sending the emails out to some of the recipients instead of none.
refs https://github.com/TryGhost/Team/issues/3234
The update check was failing to run due to recent changes in the tiers
service. This service now needs initialising before the update check can
be run.
refs TryGhost/Team#3247
- The feedback form UI is hidden by default
- Enabling “Lexical editor” doesn’t show the feedback form
- Disabling “Lexical editor” shows the feedback form below this lab item
and user can send the feedback
- Refreshing the page or navigating to some other page and then back to
Labs → the form is hidden again
refs https://github.com/TryGhost/Team/issues/1403
- currently, all tiers are grouped together in dropdowns with list of tiers
- this separates them into active and archived groups, so that the status of the tiers is clear when making choices
refs https://github.com/TryGhost/Team/issues/3248
- API queries for tiers are now using the TiersRepository with internal caching
- the repository had a bug with it's `toPrimitive()` method which meant the cached tier objects had very few properties
- the Tier object has all properties as private getters except for standard `events` property which meant the spread operator didn't have anything to spread into the object resulting in all tiers having a shape like `{events: [], active: true, type: 'paid', id: 'abcd'}`
- the `getAll()` method uses nql to match against the cached tier objects but with them not being fully populated it wasn't able to match and so returned an empty array
---
- changing the spread to use `tier.toJSON()` means we're populating all of the tier data properly allowing filter matches to work
refs. https://github.com/TryGhost/Team/issues/3150
There was an opportunity to make a reusable interaction within the Setting Group component so that switching between different states are implicitly handled. With this change it's possible to just add a Setting Group component without the need to build the logic over and over again. The component expects only the "contents" (ie. values in view state or input fields in edit state) as its children. There's a built in header with Edit/Cancel/Save buttons which is overridable with the `customButtons` parameter. A completely custom header can be used via the `customHeader` parameter.
See `TitleAndDescription.tsx` for a working example.
refs https://github.com/TryGhost/Team/issues/3224
When a product has a slug that is a single letter, checking if a user
had access to view a post associated with that product would cause a 500
error. The underlying cause of this issue is
https://github.com/TryGhost/NQL/issues/20 This fix circumvents this
issue by providing a value that the nql lexer will not error out on
refs https://github.com/TryGhost/Team/issues/3151
- adds new settings provider that fetches settings for a site and allows saving them
- adds new helpers for making admin api calls and fetching setting values
refs. https://github.com/TryGhost/Team/issues/3150
- Setting group values were taking their input parameters statically which meant that it didn't auto-extend as new props have been added
refs https://github.com/TryGhost/Team/issues/3151
- splits font loading between css files that are loaded locally for storybook/demo app vs the exported App
- uses local Inter font for exported App vs local asset for demo
no issue
Updated the slug generation logic so that when a mobiledoc post is
duplicated and the title is edited, the slug gets updated to reflect the
new title of the post. See lexical implementation here:
https://github.com/TryGhost/Ghost/pull/16802