no issue
- updated `<GhFullscreenModal>` to pass `@modifier` and `@updateModifier` through to child modal components so they can adjust their own classes
- added an `updateSuccessModifier()` action to `<ModalStripeConnect>` to set the modal size when first opening and on `@onConnected/Disconnected` actions passed to the `<GhMembersPaymentsSetting>` component
- updated `<GhMembersPaymentsSetting>` to call passed in `onConnected/Disconnected` actions when connection or disconnection is finalised
no refs
On Stripe connect in launch wizard, we add the default prices on the new Stripe account in the DB so the site has prices in Portal checked from the start. It behaves the same way as connecting stripe from membership settings.
no issue
- if you switch back to the saved subscription access setting we attempted to use destructuring assignment from an `undefined` value
- switched to using direct assignment and optional chaining
no issue
When members signup access is saved as "none" the front-end won't inject the portal script when rendering meaning changing to "all" or "invite" in Admin will show the preview but there's no portal script injected for the portal to show up.
- detect when we're switching from a saved "none" state and force a save and full refresh of the iframe
no issue
- store current stripe connection status when opening the stripe connect modal and if it's different when the modal is closed force a save and refresh of the portal preview
no refs
Reworks the set pricing page on the launch wizard to work similar to membership settings, where instead of being disabled when prices exist, it shows existing monthly/yearly prices as well as handles creation of new prices and updating portal settings.
no refs
When creating new prices on save in membership settings, we were incorrectly calculating if price has changed since the last save and showing the unsaved changes modal incorrectly.
no issue
- The Ghost(Pro) billing app would request a token once mounted to which Ghost sends the response to
- Before, we wouldn't wait for the token to be sent and request subscription information from the Ghost(Pro) app straight away, which resulted in another token request (because it's not there yet)
- This change will wait for the token to be sent before requesting subscription information from the Ghost(Pro) app to avoid duplicated requests to our servers
no issue
- amount properties on the controller are set to strings rather than numbers so the comparison would still be false even if the "numbers" matched
no issue
- passed correct action for opening stripe connect modal through to portal settings modal
- updated `<GhTaskButton>` to accept a `@unlinkedTask=true/false` property
- ember-concurrency will throw warnings about unsafe task cancellation if the initiator of a task is destroyed due to the actions of a task. Eg. the stripe connect button being replaced with the plan checkboxes because stripe connect details are added to settings
- to avoid warnings ember-concurrency expects the task initiation to be marked as "unlinked" so that the task is allowed to continue even though the initiator is destroyed
- updated `<GhSiteIframe>` to force a refresh when the `@guid` property changes
- we want the portal preview to fully reload so that it can fetch server data and see that stripe is connected
- updated portal settings modal to initiate a refresh when switching from "connect to stripe" to the plans checkboxes that happens automatically after a successful stripe connection
no issue
- added `hasChangedPrices` method to check the controller's price properties against the active product prices
- check `hasChangedPrices` alongside changed settings when deciding if the confirm leave modal needs to be shown
- call a `resetPrices` method if a leave is forced which changes controller properties back to the amounts in the active product prices
no issue
- put setup and leave methods at the beginning so it's clearer what is happening when the screen is navigated to / away from
- move "private" method to the end to keep it out of the way
no issue
- portal settings modal is now initiated from the membership screen so the code for showing/closing it in the settings controller is not needed
no refs
With custom products, we added a new modal to add a complimentary price to a member. Since we want to handle the comp prices implicitly with new changes, this change updates the comp subscription assignment to a member directly without opening a modal, by using the old `comped` flag in API. The `comped` flag takes care of creating the right complimentary subscription for member.
In case a member already has a comped subscription, we hide the option to add another subscription.
no refs
Portal plan settings are updated on the membership page when the plans are changed, but its not reflected in Portal settings because we were not updating the array the ember way.
no issue
On the membership screen we save settings before opening the portal settings modal but we weren't waiting for the save to finish which meant that the portal settings modal could load using stale data.
- passed the save settings task in via the portal settings modal's model
- added a `finishPreloading` action that contains all of the dynamic setup tasks that were previously in the component's `init` method
- if a preload task was passed in and it's currently running (as it would be if the modal is opened via the membership screen button) then it will wait for the task to finish before running the setup tasks
- trigger the `finishPreloading` action when the modal is rendered
- show a loading spinner in place of the modal contents whilst pre-loading
refs https://github.com/TryGhost/Team/issues/598
Stripe Webhooks require SSL in production, and so we should not be
allowing connecting to Stripe in production mode unless the site is
running with SSL. This change -
- Updates Setup wizard to skip Stripe Connect steps if site is not on SSL in production
- Adds warning on set subscriptions page
Co-authored-by: Peter Zimon <zimo@ghost.org>
no refs
Portal preview on membership settings reflects the currently set monthly/yearly price directly by passing in the updated amount to portal preview URL
no issue
- added `@onDestroyed` argument to `<GhSiteIframe>` so consumers can clean up any references
- used `@onLoaded` and `@onDestroyed` to handle a reference to the preview iframe
- updated portal preview load handler and update method to trigger a resize task
- add a 100ms delay to allow for portal to re-render itself
- reach through the two iframes to get the portal container element and use it's height to set the style attribute on the portal preview container element
no refs
Portal plans setting contains list of prices that are allowed by site owner to use in Portal UI. Since we now switch monthly/yearly prices dynamically, we need to update portal plans on price change to still reflect updated monthly/yearly prices in Portal UI.
no issue
- added `@invisibleUntilLoaded` boolean argument to `<GhSiteIframe>`
- when set to true add `.invisible` class until iframe's `load` event is triggered
- removed manual iframe hiding with 1.2sec delay from portal settings modal
- added `@onLoad` argument to `<GhSiteIframe>` for consumers to hook in if needed
no refs
We only want to show currently active monthly/yearly prices in Portal and Portal settings based on new settings for price ids, and hide all other prices
no refs
Previously, we were fetching product and prices in the constructor of the controller which did not guarantee settings were updated when picking active prices from the price list. This updates the setup to use `did-insert` modifier to correctly fetch and populate product/price data.
no issue
- fixed styling issues
- fixed portal preview taking over the screen by adding `position: relative` to the container
- fixed portal preview being interactive by disabling pointer events
- added portal preview URL generation to memberships controller
- moved much of the preview params knowledge/calculations from the `<ModalPortalSettings>` component into the `members-utils` service so that a portal preview URL can be generated from anywhere using current settings values rather than the method consumer needing to have knowledge of all params and how to generate them
- updated actions in controller that modify settings to also update the preview url
- added `onChange` event to the `<Settings/MembersSubscriptionAccess>` component so the controller can react and update preview
- used `<GhSiteIframe>` with generated portal preview URL for live display of portal changes on memberships screen
refs 4627d1c26a
- Adds new settings for monthly/yearly price ids in the settings modal
- Updates logic to save product on membership settings - Creates new prices for monthly/yearly when it doesn't exist, updates the monthly/yearly price ids in the settings
- Fixes selected currency value in dropdown
no refs
- Wired Premium membership UI to existing monthly/yearly prices in the default product
- Wired free membership UI to redirect URI setting
- Updated save to validate settings/errors
no issue
- added actions for handling close/confirm/cancel of portal settings rather than re-using the route-level leave modal because the portal settings modal does not need any knowledge of the route
- added controller reset that is called when the route is exited to ensure no modals are shown when navigating back to the membership screen
- fixed "cannot set on destroyed" error when portal settings are opened and closed quickly
- removed usage of old `{{action}}` helper - this has been replaced with `{{on}}` and `{{fn}}`
no issue
- we're currently limited to a single product so it doesn't make sense to show it as an option as it creates two different routes to "paid members" that we'd like to avoid for now
no issue
- add icon + icon color to the subscription access and default post access option lists
- updated templates to use icon in trigger and option display
- fixed ember-power-select styles overriding svgs in trigger
refs https://github.com/TryGhost/Team/issues/581
Setting post visibility to a label results in undesirable and confusing behaviour with no good way to manage access long-term. Coupled with products being limited to a single product for now we're reverting the UI back to the "Public", "Members", and "Paid" options.
no issue
- provides clearer indication of current setting without having to expand anything
- has more minimal UI which helps when settings screen has multiple areas
no issue
- the membership setting screen will be covering a lot of areas, having individual settings as discrete components allows for easier re-organisation and cleaner parent templates and controllers
no issue
Members related settings are being consolidated into a single screen.
- renamed access to membership as the starting point for redesign and consolidation of other settings screens
no issue
- the dependencies are released at different cadences and are not interlinked
- allows independent upgrades when one dependency with a slow release is buggy
no issue
- catch `undefined` error when saving posts in editor which is thrown by our validation system and handled elsewhere
- bumped `ember-power-select` and switched `ember-power-datepicker` to a github ref so dependency-update fixes are included (version not released yet, see https://github.com/cibernox/ember-power-datepicker/issues/61)
- added a resolution for `ember-basic-dropdown@3.0.16`, with the latest `3.0.17` nothing is shown for the publish/post-settings menus for the date picker dropdown
refs https://github.com/TryGhost/Team/issues/581
- when free and paid members are selected it doesn't make sense to offer any other options because they will have no effect
- reduces confusion from showing options that get removed by the API as soon as they are selected
- `status:free,status:-free,...` is always shortened to `members` (`status:free,status:-free` equivalent)
no refs
It may take couple of seconds before we fetch product information on set-pricing launch wizard, we don't want to show the subscription is set message till the loading is complete.
refs https://github.com/TryGhost/Team/issues/588
- The bump is done to have the latest fixes in the upstream. The feature for checking the max periodic emails limit will be implemented once there's an apetite for it. Note, it might need some thinking around how to approach this problem (outlined in the referenced commit)
https://github.com/TryGhost/Team/issues/581
The API now supports `posts.visibility` being an NQL string as well as the special-case `'members'` and `'paid'` values so the post settings menu visibility select needs to be updated to reflect that.
- swapped visibility dropdown for two radio buttons, "Public" and "Members-only" which uses the `<GhMembersSegmentSelect>` component
- updated post model to use a `visibility-string` transform
- converts `members` and `paid` to/from the NQL equivalent for correct display in the segment select
- updated post model with two additional properties `isPublic` and `visibilitySegment`
- `isPublic` helps with the radio button display
- `visibilitySegment` allows fallback to the default content visibility setting when set to public
- added validation for `post.visibility` so we can show an error and skip saving when members-only is selected and the segment select is cleared
- deleted the now-unused `<GhPsmVisibilityInput>` component
no refs
If a custom price is already set before completing the wizard, the set pricing wizard hides the UI to create default custom prices as it doesn't make sense and instead shows a custom message.
closes https://github.com/TryGhost/Team/issues/672
Custom products and prices were behind dev experiment flag as it was under active development over last couple of releases. Now that its coming out of development, this removes the dev flag for custom products changes.
closes https://github.com/TryGhost/Team/issues/678
closes https://github.com/TryGhost/Team/issues/681
The prices in "Add subscription" modal should follow the same ordering as on the product detail screen, ie. currency, amount. Also, we only want to allow adding subscriptions for active prices, so the list is filtered on that. Since a Stripe customer is not allowed to have subscriptions in multiple currencies, this also filters the available currency prices based on any active subscription for a member.
refs https://github.com/TryGhost/Team/issues/678
Covers error handling for missing name/amount/billing period for a price modal when adding a new price or editing existing price.
refs https://github.com/TryGhost/Team/issues/678
Product name is a mandatory field for a custom product, this change adds error handling on save and custom error message if product is attempted to save without name.
refs https://github.com/TryGhost/Team/issues/588
- When the email limit was reached the hardcoded "members" error message was shown. Have changed implementation of the upgrade modal to take the "message" coming from the server into account
no refs
Disables Edit/Archive actions on a price while an active save is ongoing for Product to avoid unwanted states due to multiple saves being called.
no refs
On (un)archiving a price, the visible amount for a price fluctuated till the save was completed due to incorrect amount calculation, fixed here.
refs https://github.com/TryGhost/Team/issues/641
When default prices are created via the setup wizard, this adds a default description for Monthly and Yearly prices that mimics the values set for them currently in Portal.
refs https://github.com/TryGhost/Team/issues/496
- all/free/paid are selectable via the segment select
- radio buttons should be kept to 3-4 max
- fixed pluralisation of member count below member segment when only 1 member is selected
refs https://github.com/TryGhost/Team/issues/637
With custom products it's possible to change the name and description of any price. This assumes that people would want to change the same properties of a Free membership, and wires up the values for free membership price settings to API
Co-authored-by: Peter Zimon <zimo@ghost.org>
refs https://github.com/TryGhost/Team/issues/643
Currently, the whole setup for choosing plans is built around hardcoded `monthly` / `yearly` which is also exposed in the Portal links/data attributes. Since we now have custom prices, this updates the UI to show links/attributes for all available custom prices and allowing them to function via their price ids.
refs https://github.com/TryGhost/Team/issues/581
requires https://github.com/TryGhost/Ghost/pull/12932
- added segment option and select to default newsletter recipients setting
- updated segment selector to fetch labels/products and show as options
- updated segment selector and count component to call an action when count changes so we can use it in the email confirmation modal
- removed usage and mapping of older `'none'`, `'all'`, `'free'`, and `'paid'` email recipient filter values
This reverts commit 0cf2fc9c24.
Hiding the launch wizard when there are existing prices causes an annoying flicker on the dashboard everytime we reload the page or navigate away. Instead of handling this client side, we'll push up the logic to hide the wizard on server.
refs https://github.com/TryGhost/Team/issues/644
In case the prices are already set for the default product, its confusing to have the launch wizard show the price setup again. We remove the wizard completely if the prices are already created for the default product.
refs https://github.com/TryGhost/Team/issues/496
reqs https://github.com/TryGhost/Ghost/pull/12925
The publish menu was meant to default to matching post visibility but that wasn't working consistently and didn't make sense for sites which don't email every post to their members.
A "Default newsletter recipients" option has been added to the "Email newsletter" settings screen and the publish menu updated to reflect the option. The free/paid toggles in the publish menu have also been swapped out for a multi-select style component that will cater to more complex member segmentation.
refs https://github.com/TryGhost/Team/issues/611
The UI for welcome page for paid signups is moved from Portal settings to Product page, this change wires up the new UI to the settings API as in Portal settings to function correctly
refs https://github.com/TryGhost/Team/issues/637
The paid signup setting was incorrectly still checking only for Monthly and yearly prices instead of custom prices list to show the paid signup input.
no issue
- simplified query params as they are only used to display a notification
- removed all controller knowledge and associated reset behaviour for query params
- moved notification display from `setupController` to `beforeModel` so the raw query params can be pulled off of the transition object
- removed unused service injections from `<GhMembersEmailSetting>`
- removed unused service injections and properties from members-email controller that were left over from a copy/paste
- converted members-email controller to a native class
- fixed "leave settings" confirmation modal behaviour that wasn't moved across in the the settings screen re-org
no refs.
- added subscription count to the product list in member details screen if there are multiple subscriptions for the given product. This is to make it clear and avoid confusion around the edge case when members have multiple subscriptions for the same product.
refs https://github.com/TryGhost/Team/issues/658
- Node 10 become EOL as of April 30th so it's time to drop support
- this commit removes the 10.x range from the `node` `engines` block
refs https://github.com/TryGhost/Team/issues/586
The `products` and `prices` UI were not hooked to description
data which will be used by Portal to display information about the
products and prices, this change wires it to the API for edit/read.
no issue
Our token input component removes already-selected options from the list of available options but it was expecting a non-grouped set of options.
- updated to recursively walk the options list and build a filtered list being careful not to modify the original groups by reference
- swapped task decorator syntax out for the more easily readable `ember-concurrency-decorators` style
refs https://github.com/TryGhost/Team/issues/588
- The change allows to give information about not being able to send a newsletter along with publishing the post instead of waiting for a server response to fail
- Implements client-side limit check for email along with information coming from limit's error message
no refs
The dropdown button component was missing `type="button"` when used as a button, which caused it to act like a `submit` button when used as part of a form, like in Member details page. This change adds type attribute to the button to fix the issue.
refs https://github.com/TryGhost/Team/issues/648
All sites will include a default Free "Product" which is used for free memberships. This change adds UI for handling free membership settings. Also -
- Updates product icons in list and responsive sizes
- Copy updates
refs https://github.com/TryGhost/Team/issues/644
Updates site setup to create custom Monthly/Yearly prices in default product as part of launch wizard. Also updates available portal plans based on user selection.
refs https://github.com/TryGhost/Team/issues/588
refs a83cccd84b
- This bump allows to pass configuration for "emails" limit (flag type for now) and allows to do checks against this limit as a consequence
- Useful to be able to do basic checks for newsletter-related functionality
- It's a symmetric change to the server-side one
refs https://github.com/TryGhost/Team/issues/587
- Because we lack context when the component is called in "create new users" (invite) or in "modify existing user" (role upgrade) made copy more generic to fit both cases.
refs https://github.com/TryGhost/Team/issues/587
- Previous behavior wa showing a generic API error in the top banner which wasn't ideal UX
- With these changes user is informed about the limitation before performing any action with clear call to upgrade through the billing page
refs https://github.com/TryGhost/Team/issues/590
- 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/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