refs https://github.com/TryGhost/Team/issues/589
- Previous upgrade button behavior was opening up a new browser window leading to now retired billing site. Tha behavior change looks like an oversight we missed to cleanup when introducing an in-admin billing pabe "/pro"
- The change follows similar pattern used in other limit check mesages where tha "upgrade" button takes the user to the billing page
refs https://github.com/TryGhost/Team/issues/599
- Previously user received genetic limit error after putting in integration name and clicking "create" button. This created a little frustrating experience.
- The updated flow does the check before loading the integration modal, so the user receives communication about needed upgrade before doing any work
refs https://github.com/TryGhost/Team/issues/579
- portal reads `allowSelfSignup` from config at startup and so won't show the free plan if it was not selected when preview is first opened
- updated `membersUtils.getPortalPreviewUrl()` to duplicate the `allowSelfSignup` logic from the server so it can be passed through to portal dynamically
no issue
- the original `portalPlans` array was being modified by reference which was throwing off Ember Data's change tracking
- switched to always creating a new plans array before any modifications take place
no issue
- base modal component was throwing an error because the passed in `confirm` action for the leave settings modal wasn't async and didn't have a `.finally()` method
refs https://github.com/TryGhost/Team/issues/579
- subscription access set to 'invite' or 'none' disables signup so it doesn't make sense to allow those options to be changed when the portal preview won't reflect the settings
- fixed "expand"/"close" button not changing on the access screen signup access block
refs TryGhost/Team#627
This updates the new Products settings screens to use real data from API for existing Custom Products and Prices to populate them on UI and allow site owners to edit them.
- List all Products of site and allow editing Product name
- List all Prices for a product and allow editing individual Price names
- Add new Prices on a Product
refs https://github.com/TryGhost/Team/issues/627
This is the reworked Member detail screen for Custom Products and adds
new functionality, or includes existing including:
- List Products for a Member, and the associated Subscriptions
- Allow cancelling/continuing said Subscriptions
- Adding a Product to a Member with a zero-amount Price
This reverts commit 7c6bace12e.
- the previous wording was correct and the behaviour needs to be changed to match rather than following the "allow free member signup" toggle behaviour
no issue
- `<GhTokenInput>` is based around `<PowerSelect>` but using Power Select's grouped options feature didn't work because we weren't falling back to it's built-in group component
- updated the `<GhTokenInput>` template to use a supplied block as the option display rather than only displaying the option's label (allows for counts etc to be shown alongside dropdown options)
refs https://github.com/TryGhost/Team/issues/579
"Only people I invite" did not marry with behaviour. When selected it matches the old "Allow free member signup = false" toggle setting which only disables free member signup rather than disabling all front-end signup
refs https://github.com/TryGhost/Team/issues/627
Wires the real Products data from API to the mock Product settings screen including Product Prices list as well as opening of edit/new price modals. The new Product setting is still behind the developer experiment flag as is under active development, the changes in this commit only allows readonly data but not save/edit upstream.
Co-authored-by: Fabien O'Carroll <fabien@allou.is>
refs https://github.com/TryGhost/Team/issues/579
- new Access settings screen that moves subscription access and default post visibility from the Payments settings screen
- expanded "Free signup" toggle into three signup access options
- "anyone" - same as previous "allow free member signup" option set to `true`
- "invite only" - same as previous "allow free member signup" option set to `false`
- "nobody" - completely disables member signup and login. Removes injected portal and stripe scripts on the front-end and hides member related sections on the admin dashboard
(this commit moves the above changes out from behind the developer experiments flag and cleans up now-unused code)
no issue
- The modal only appears when the user hits a limitation trying to activate a custom theme not part of the allowlist (if the custom theme allowlist is configured)
- Changed the upgrade button to green to match the design
no issue
Unsaved changes handling hadn't been moved across fully to the payments screen when settings were re-jigged meaning changes on the payments screen would make settings dirty and show unsaved changes modal unexpectedly on other screens.
- refactored `members-payments` route to use native classes
- used same unsaved changes pattern as `members-access` route/controller
no issue
- having owner-only access control in the template meant the route was accessible but would show a blank page
- updated access control in the `members-payments` route to redirect admins to the settings index screen and non-admins to the default home screen
no issue
- when the role selection was extracted to an external component the limit validation was also extracted but had no way of feeding back to the consumer
- added `onValidationSuccess` and `onValidationFailure` arguments to the role selection component to allow validation feedback to the consumer
- updated staff invite modal with actions to update state based on validation so the modal's buttons can update accordingly
refs https://github.com/TryGhost/Team/issues/579
Members is essentially disabled when signup access is set to "Nobody" so it doesn't make sense to show members related charts and actions in the dashboard.
- adds `showMembersData` property to the dashboard controller that returns `false` when members is disabled
- wraps members related sections of the dashboard in conditionals
refs https://github.com/TryGhost/Team/issues/579
- adds "Nobody" option that will set `members_signup_access` setting to `'none'`
- when selected also sets `default_content_visibility` setting to `'public'`, expands it if collapsed and disables other options (that setting doesn't make sense when members is disabled, individual post access can still be set manually if needed)
requires https://github.com/TryGhost/Ghost/pull/12886
- renamed `membersAllowFreeSignup` to `membersSignupAccess` and changed type to match new setting
- added `membersAllowFreeSignup` computed property to map to the new setting to avoid having to migrate code elsewhere that will be removed once the new options are out of developer experiments
Prepring for custom products we'll change the overall layout of member forms. This commit has a component that's loaded when dev flag is on for the new layout with mocked product data.
Updated product details mock screen for the first version:
- removed icon and chart
- added status to price list
- changed icons to text links on price list
refs https://github.com/TryGhost/Team/issues/579
- moved "Allow free member signup" toggle from Payments screen to Settings screen and switched to a radio selection that allows for better description and further selection of options
refs https://github.com/TryGhost/Team/issues/579
- updated access section on Payments screen to only show when not running developer experiments
- added default post access settings to Access screen
Co-authored-by: Kevin Ansfield <kevin@lookingsideways.co.uk>
refs https://github.com/TryGhost/Admin/pull/1901
Ember has deprecated mixins in preparation for 4.0 and `ember-simple-auth` has now done the same in 3.1.0.
- removed all imports of Ember Simple Auth mixins
- moved authenticated and invalidated handling from application route to session service
- moved server-notification loading from application route to session service
- updated `AuthenticatedRoute` to use the session service directly rather than authenticated route mixin
- added `UnauthenticatedRoute` that incorporates the behaviour from our overridden `UnauthenticatedRouteMixin` and switches to using the session service directly
closes https://github.com/TryGhost/Team/issues/572
Role selection when inviting users was updated to show information about each staff role. This change updates the staff edit screen to use the same UI for changing the role of an existing user.
- added `select-user-role` modal which uses `<GhRoleSelection>` to allow role selection
- replaced the `<select>` input for changing a user's role with a button that triggers the role selection modal
- role is not set unless the "Set role" button is clicked after making a selection, cancel or close will leave the original role selected
no issue
- initial role was always being set to Contributor due to incorrect argument being used when checking if the default role should be applied
- there was considerable layout shift of the `<GhRoleSelection>` container after role loading was finished, quick-fix applied by specifying a width and height to the loading spinner container that matches the final width/height
refs c1ecb6a572
refs https://github.com/TryGhost/Admin/pull/1830
- using `renovate-config-validator` it appears Renovate doesn't support extends within packageRules or at least requires direct selectors rather than extended selectors
- copied package rules from `@tryghost:pkgCSS` across rather than using `extends`
refs https://github.com/TryGhost/Admin/pull/1830
- Renovate hasn't tried to update any packages since January when the postcss dependencies were pinned and Renovate config updated to try and disable css related package updates
- it's possible the `enabled: false` was affecting everything because the wrong extends was used in the package rule. Swapped from `groupCSS` to `pkgCSS` to better match the intention of disabling specific packages
refs https://github.com/TryGhost/Team/issues/585
- updated bulk destroy task to first use the current query params to fetch from the appropriate CSV export endpoint and trigger a download
- fetches via JS and triggers download from a blob URL link instead of an iframe so that we can be sure the download is successful before we hit the bulk delete endpoint
- works differently to user deletion download because the server is not generating an export file and saving it meaning the client has to be sure we don't delete data before it's exported
- updated copy in the confirmation modal to reflect the download behaviour
refs e25e36352d
- referenced refactor accidentally removed direct usage of `params` in `fetchMembersTask()`
- because it's called from the `model()` hook the query param properties on `this` have not yet been updated to the new params meaning we were querying the API with stale params
no issue
- code for generating a members API query was duplicated across listing, export, and bulk delete
- extracted the duplicated code into a reusable method
- removed `?all=true` param generation for bulk members delete because we don't provide that option in the UI
refs https://github.com/TryGhost/Team/issues/585
requires https://github.com/TryGhost/Ghost/pull/12082
When a label or status filter is selected on the members screen show a "Delete selected" option in the actions dropdown. Bulk deleted members will _not_ have any subscription data modified in Stripe, if a member should be deleted and have their subscription cancelled it's necessary to do that on a per-member basis.
- updated bulk delete handling to match API
- added link to bulk delete confirmation modal in members actions dropdown (only shown when label, status, or search is used)
- updated testing framework for members
- added label factory for easier test setup
- updated `GET /members` and `DEL /members` endpoints to work with label filters
- updated test selectors for easier reference in tests
refs https://github.com/TryGhost/Team/issues/587
- When user's instance reaches a "staff" limit we need a way to proactively notify them about reached limit and give enough information about why it was reached and what the next action would be to unblock them
- The implementeation uses a frontend implementation of the limit-service which allows to do preventative checks for the reached limits
refs https://github.com/TryGhost/Team/issues/587
- This is first pass on the frontend limit-service integration. Max count queries are substituted with HTTP requests to mimick backend checks. Note, they are not meant to substitute backend checks only to suplment them.
This reverts commit 9a1037b850.
- a sub-dependency was causing "Uncaught exception undefined" errors when post publish times were changed
- reverting until there is time to track down exactly which dependency was causing the problem
refs https://github.com/TryGhost/Team/issues/572
- Replaced dropdown in invite-user modal with radio buttons
- Added description for each user role
- Added icon to provide more info on hover for each role
- Got rid of unused box styling
refs https://github.com/TryGhost/Team/issues/587
refs e30b9735fa
- It was not possible to invite a new Contributor to a site that has reached its limit
- This fix divides the resend invite action into two separate steps: 1. Deleting existing invite 2. Creating a new one for the same data
- It was hitting the limit because the permissions were correctly checking for "add" action being executed when the limit of invites/staff users was already used up. By removing existing invite we mimic the behavior the server would do for us anyway (2111992dd4/core/server/services/invites/invites.js (L18-L22))
Co-authored-by: Rish <zrishabhgarg@gmail.com>
no issue
- we want to disable automerging of TryGhost dependencies in order to
allow commits that contain emojis and context for the bump
- similar to 54a09842a6
in Ghost, this commit adds the new preset to disable automerging of @TryGhost dependencies
no issue
- `config.blogDomain` includes subdirectory and `config.ghostPaths.subdir` includes a leading `/` which resulted in the search engine result preview url incorrectly showing as `mysite.com/subdir > /subdir > slug`
- replaced the in-template construction of the url previews with a getter on the backing class that constructs the preview url based on parsing the configured url
refs https://github.com/TryGhost/Team/issues/579
- empty screen ready for signup access and default post access level settings to be moved to
- has unsaved settings changes modal ready
closes https://github.com/TryGhost/Team/issues/397
The default newsletter/support email address for a site is currently setup as noreply@DOMAIN , which means for a custom domain setup with www the email address becomes noreply@www.somesite.com which is not the expected behavior.
Note: This fix only removes `www` subdomain from addresses and no other subdomains
closes https://github.com/TryGhost/Team/issues/561
In case the last event for a new member on site was before 30 day period, the count for members was showing 0 instead of the actual value. The change fixes the count to show the correct value even if there is no new recent member activity.
closes https://github.com/TryGhost/Team/issues/568
Displaying amount in cents in context of overall MRR forecast/estimate doesn't add much value, the change rounds MRR value to nearest whole number on dashboard
closes https://github.com/TryGhost/Team/issues/550
The MRR chart relied on first currency from the list in case of data for multiple currencies, falling back to USD in case of no MRR data for the site. This can be misleading, specially when the active currency set in payment settings is different from one picked to show on MRR chart.
The change updates dashboard to always pick the currency from Payment settings as default for showing chart data.
refs TryGhost/Team#536
From 4.0, we ensure and require that accent colour is always set. This change removes hardcoded accent color fallbacks to avoid confusion as well as cause accidental fallback that is undesired.
no issue
The current `/billing` route needs to be renamed into `/pro`, so we can use sub-routes like `/pro/billing` and `/pro/domain` in the billing app.
This reverts commit 9b6d4822e7.
- there is an issue with properties not being tracked correctly and the menu not being shown when returning from the editor
- reverting to working version with computed properties for now
no refs
MRR start date value for charts was being calculated with start value as 0, assuming we have the data for first date in our range to use as start value. Since the events data returned only has data on dates where any MRR event happened, in case the first date in our range didn't have any. data we started from 0 instead of value on previous date. This fix
- updates calculation to pick the start value for chart based on value on last date in our range(30 days)
- adds unit tests for stats
no issue
- the billing nav menu item isn't a regular route link so we don't get "active" classes by default
- added active class manually based on the service property that controls billing screen visibility
no issue
- the billing modal is always rendered, it's contents being shown/hidden via CSS
- when the billing modal was rendered it was changing the `key` scope and binding the enter key, however because it's always rendered this was messing with the default key scope for all other areas of the app
- removed all keyboard handling from the billing modal because it wasn't actually doing anything (there is nothing to handle the "confirm" action when Enter is pressed) which fixes the unexpected key scope change
- Have created a new v4 template, which is the same as the v3 template.
- Updating this reference now keeps it versioned, so that if we need to make changes just for v4 we can easily by just updating the asset
no issue
- the stale data checks would always return false because the calculation was reversed
- `old date - new date` will always result in a negative number so it would never be greater than 60000
- switched to `new date - old date` to get a positive number so the `>` comparison works
- moved `1 * 60 * 1000` into a constant so it's easier to the intended behaviour at a glance
no issue
- when viewing the email preview in the post preview modal having your email address pre-filled makes sending yourself an email preview much quicker as there's no need to type anything
closes https://github.com/TryGhost/Team/issues/535
To ensure accent color is always set for a site, this updates brand settings screen and launch wizard to not allow empty accent color to be set or updated, adding the relevant error on the page which needs to be fixed before saving or continuing on the screens.
- Shows error message for empty accent color on brand settings and launch wizard
- Shows error message for invalid accent color on brand settings and launch wizard
- Blocks save and continue with invalid/empty accent color on brand settings and launch wizard
Co-authored-by: Peter Zimon <zimo@ghost.org>
no issue
- sometimes it was possible for a drop target element to not have a child which would cause an error and cause drag/drop to get stuck with the dragged element sticking to the cursor with no action occurring on mouseup, requiring an `Esc` press but all further drags also being broken
- added a guard so we can handle `element.firstChild` not existing
no refs
For selected currency, we were only checking in the secondary currency list which does not include the top currencies like USD, so if the current selected currency is one of the top currencies, the `selectedCurrency` returned a value of `undefined`. The fix updates selected currency computation to check both top and other currencies
no refs
Fixes the "member since" value on dashboard for Top members table, was incorrectly referencing the `member` variable so all dates were picked as of today.
refs: https://github.com/TryGhost/Team/issues/510
- We now disable publishing, not just emailing, when over member limits
- Ideally, this should use the configured error message, but for now displaying the right info is important
refs: https://github.com/TryGhost/Team/issues/510
- We need to display host limit errors if we get them
- Host limit errors have a custom message added to them, so we show the original context message
refs: https://github.com/TryGhost/Team/issues/510
- The config API has been changed to return the full hostSettings key, not just the billing URL
- This has been done because we are adding more config, and it's easier to reason about if Admin has the same config as server
- Proxying each value also requires multiple updates to the API each time
- This updates all the places where the old values were used
refs f10e133acd
- updated the component backing class with the expected actions/tasks
- largely duplicated from `<GhBrandSettingsForm>` which had more up-to-date code style
No ref
- Added placeholder attributes to focused input fields
- Fixed only text value being clickable vs. entire field
- Added placeholder attributes to PSM meta data inputs
no issue
- the SEO description preview was using old code that was designed for Ghost's 1.0 editor which only had a markdown card where we could parse the markdown contents to get a live excerpt but this doesn't work when there is no markdown card
- removed the old code so the description now uses a meta description -> custom excerpt -> contents excerpt (from API) fallback
- downside to this is that the contents excerpt will no longer reflect changes in unsaved posts but that's preferable to not showing any fallback at all for non-markdown posts
no issue
- when overriding route hooks it's necessary to call `_super` so the extended class hooks will also run, in this case the unauthenticated->signin redirect in the `beforeModel` hook
no issue
- moved `.site-iframe` styling into CSS files so it can be re-used outside of the `<GhSiteIframe>` component
- swapped `<GhSiteIframe>` usage in brand settings modal for a plain `<iframe>` element so that it's not initially rendered with the front-end url in it's `src` attribute
closes https://github.com/TryGhost/Team/issues/506
- launch wizard and brand settings both shared the same design and behaviour for customising brand settings but used duplicated code that had diverged
- extracted the more up-to-date behaviour from the launch wizard into a component
- updated brand settings and launch wizard to use the new component
changes to brand settings modal behaviour:
- preview is no longer interactive
- switches to using iframe contents replacement instead of `postMessage`
refs 10b48b1d6d
refs 1531712d92
- the tour feature is no longer used so all associated code can be removed
- removes `liquid-tether` dependency as it was only used by the tour throbbers/popovers
no issue
- tour items in general are being removed
- preparation for full removal of all tour-related code (to be done in following commit to allow future revert without merge errors through template divergence)
* Added fallback for top members
refs https://github.com/TryGhost/Team/issues/469
We do not have open rates for a member until we've sent at least 5
emails. In order to still display a top members section for sites which
have not sent that many newsletters, we fallback to paid members,
ordered by created_at. This effectively gives us our oldest members,
which are currently paid.
no issue
Fixes a bug where the billing iframe would show a blank page when called directly and user is not logged in. This commit ensures to that we have a valid authenticated session and redirects to the signin page if not.
refs https://github.com/TryGhost/Team/issues/469
- Fixed calculation for total/paid member count to use last value from outside range
- Fixed stats data override in dashboard
refs https://github.com/TryGhost/Team/issues/473
This list of currencies was compiled by taking the union of the UK and US from
https://stripe.com/docs/currencies and removing all non-decimal currencies, e.g.
Japanese Yen.
The members module does not need any additional logic to handle these currencies,
however we do need to clean up hardcoded currency symbols in favour of using the new
`{{price}}` helper and `Intl.NumberFormat`
refs 0503ce5f35
- referenced commit changed `dashboard` to redirect to `site` when logged in user is not an owner or admin
- updated tests to reflect the change
refs https://github.com/TryGhost/Team/issues/480
- switched marketplace themes to a selection of Ghost's own free themes
- added install and preview buttons for all
- show theme screenshot in the install modal if it's a known theme
refs https://github.com/TryGhost/Team/issues/482
- replace titles and descriptions with text fields when clicked
- save on blur
- blur+save on <kbd>Enter</kbd>
- blur+restore on <kbd>Escape</kbd>
- create newline with <kbd>Shift+Enter</kbd> in description fields
- if there's no available image or fallback show a "+ Add image" header in the previews when hovering
- if there is an image show an upload/change image button when hovering
- show a delete image button when hovering once a custom image has been uploaded
Co-authored-by: Sanne de Vries <sannedv@protonmail.com>
no-issue
By fetching data in the constructor, we would fetch data immediately
when the route created the controller. Which would cause us to fetch
data before a user was logged in. By moving the data fetching until
after setupController is called, we can be sure that it will not happen
until the route is being rendered.