Commit Graph

319 Commits

Author SHA1 Message Date
Kevin Ansfield
595018098d Switched design screen from modals to standard routes
refs https://github.com/TryGhost/Team/issues/1130

- added `ui.contextualNavMenu` property that when set will switch the main nav menu between components, if it's not set then it will show the default "main" menu component
- added `design` menu sub-component of `gh-nav-menu` ready for use via `contextualNavMenu`
  - moved sidebar contents from the design modal into this component
- updated design route to set/reset `ui.contextualNavMenu` to `design` on entering/leaving the route
  - all other design routes are sub-routes so this works across all other design screens
- moved base design modal preview into the `settings/design/index` controller/template
  - using index means that it's the default screen for `/settings/design` but will be automatically replaced by any other `design.x` routes
- moved `design/advanced` modal content into the `settings.design.advanced` controller/template and removed the modal handling from the route
2021-10-11 15:24:46 +01:00
Rishabh
e82bd1579a Removed nested offers code under memberships
no refs

- offers has moved out to its own page in Admin, the old route and controller for wiring of offers under membership screen is no longer needed
2021-10-08 09:30:41 +05:30
Kevin Ansfield
a15cc41f03 Removed unused blogUrl CP from theme controller
no issue

- general cleanup for easier functionality extraction to re-usable components
2021-10-05 14:37:51 +01:00
Kevin Ansfield
fe48f7ed80 Added utils service with downloadFile() method
no issue

- pattern of downloading a file by creating an iframe and setting the `src` attribute was repeated throughout the codebase and was using a mix of native and jQuery patterns
- added a `utils` service for housing one-off utility methods like this to avoid repetition and mixed patterns becoming more widespread (we want to get rid of jQuery usage)
2021-10-05 14:21:19 +01:00
Kevin Ansfield
63b1e1d385 Dropped intermediate design screen and moved to full-overlay modal
refs https://github.com/TryGhost/Team/issues/1111
refs https://github.com/TryGhost/Team/issues/1103

- moved customize modal from a link on the design screen to the main design screen
- changed modal design to be a full-screen overlay with side bar that emulates standard Admin design
- added toggled groups of settings in sidebar
  - added `{{set-has}}` helper for use in conditionals matching when a Set contains an object
  - added grouping of theme settings
- dropped unfinished advanced/change theme modals
2021-10-04 16:34:28 +01:00
Peter Zimon
3013263498 Added static UI for offers list
- Added list and basic empty screen for offers list
- Removed offers list from Membership settings
2021-10-04 13:55:17 +02:00
Kevin Ansfield
223e5c71cf Fixed error when saving custom design modal
no issue

- `Promise.all()` requires a promise so it was erroring about uniterable symbols
2021-09-30 14:53:39 +01:00
Rishabh
9a07c59538 🐛 Fixed incorrect unsaved changes popup on memberships screen
closes https://github.com/TryGhost/Team/issues/1100

- fixes unsaved changes popup which was triggered due to incorrect price comparison on membership screen
- issue only happened if the stripe price entered translated to a decimal value as the price change check was parsing it as integer
2021-09-30 14:21:55 +05:30
Kevin Ansfield
d10e102de4 Wired up saving of custom theme settings
refs https://github.com/TryGhost/Team/issues/1070

- split select form component into it's own component so it's cleaner when we get to additional setting types
  - added change handler that updates the setting record's value when a new option is selected
- added `.isDirty` to the custom-theme-settings service so we can warn of unsaved changes and revert any changed values when needed
- added save of custom theme settings to the customize design modal's save routine
- added missing `notifications` service import to customize design controller
2021-09-28 16:50:28 +01:00
Peter Zimon
f790e7df52 Added placeholders to Offers static modal 2021-09-27 12:02:29 +02:00
Peter Zimon
6ee2e48c92 Added static list of offers 2021-09-22 17:23:26 +02:00
Peter Zimon
d8c42876a3 Added base files for Offer modal 2021-09-22 16:10:38 +02:00
Kevin Ansfield
73139ea6dd Added general/theme tabs to customize design modal
refs https://github.com/TryGhost/Team/issues/1045

- added tabs to the the customise design modal's sidebar for general settings and theme settings
  - copied settings from the existing branding modal plus site description from general settings screen into the general settings tab
  - theme settings tab left blank ready for static design
- `saveTask` put on the controller so that we can access it from the route, allowing us to pause modal closing when navigating away (implementation left for later)
2021-09-17 10:27:53 +01:00
Peter Zimon
cdedf7b0a8 Updated copy for Tiers early-access flow 2021-09-08 10:40:52 +02:00
Peter Zimon
eb1d3c370f Added early-access modal for Tiers 2021-09-07 13:36:23 +02:00
Rishabh
b2616de5d1 Fixed portal preview for tier changes
refs https://github.com/TryGhost/Team/issues/981

- saving a new or existing tier needed a hit on top right save on settings as well or it wasn't showing on the front-end. This change refreshes portal preview once a tier is saved from its modal window so that frontend can correctly reflect the right data immediately.
2021-08-26 13:33:32 +05:30
Peter Zimon
95359d56f2 Copy refinements for tiers
- changed 'Products' to 'Tiers'
- changed 'A segment' to 'Specific tiers'
2021-08-20 12:15:20 +02:00
Rishabh
e52bdf88f9 🐛 Fixed Admin hitting dead API response on Stripe connect
refs https://github.com/TryGhost/Team/issues/994

Non-owner admin users have visibility of the "Connect with Stripe" UI in Admin, but lack permissions to setup the Stripe session in order to actually connect Stripe. This leads to a dead-end with a raw JSON api response, which should never be the case. This change patches the UI by removing Stripe Connect paths for non-owner admins.
2021-08-17 15:24:12 +05:30
Thibaut Patel
a7f47b30b7 Added a feature flag to the oauth login feature
issue https://github.com/TryGhost/Team/issues/614

- Makes the feature confiration more similar to other feature flags
2021-07-20 23:18:45 +02:00
Rishabh
0f9177919c Refined segment selection in default post access setting
closes https://github.com/TryGhost/Team/issues/862

- allows deleting a single product in the segment dropdown
- shows error message in segment when no product is selected
2021-07-16 18:31:23 +05:30
Kevin Ansfield
c646e78fff Made session.user a synchronous property rather than a promise
no issue

Having `session.user` return a promise made dealing with it in components difficult because you always had to remember it returned a promise rather than a model and had to handle the async behaviour. It also meant that you couldn't use any current user properties directly inside getters which made refactors to Glimmer/Octane idioms harder to reason about.

`session.user` was a cached computed property so it really made no sense for it to be a promise - it was loaded on first access and then always returned instantly but with a fulfilled promise rather than the  underlying model.

Refactoring to a synchronous property that is loaded as part of the authentication flows (we load the current user to check that we're logged in - we may as well make use of that!) means one less thing to be aware of/remember and provides a nicer migration process to Glimmer components. As part of the refactor, the auth flows and pre-load of required data across other services was also simplified to make it easier to find and follow.

- refactored app setup and `session.user`
  - added `session.populateUser()` that fetches a user model from the current user endpoint and sets it on `session.user`
  - removed knowledge of app setup from the `cookie` authenticator and moved it into = `session.postAuthPreparation()`, this means we have the same post-authentication setup no matter which authenticator is used so we have more consistent behaviour in tests which don't use the `cookie` authenticator
  - switched `session` service to native class syntax to get the expected `super()` behaviour
  - updated `handleAuthentication()` so it populate's `session.user` and performs post-auth setup before transitioning (handles sign-in after app load)
  - updated `application` route to remove duplicated knowledge of app preload behaviour that now lives in `session.postAuthPreparation()` (handles already-authed app load)
  - removed out-of-date attempt at pre-loading data from setup controller as that's now handled automatically via `session.handleAuthentication`
- updated app code to not treat `session.user` as a promise
  - predominant usage was router `beforeModel` hooks that transitioned users without valid permissions, this sets us up for an easier removal of the `current-user-settings` mixin in the future
2021-07-08 14:54:31 +01:00
Rishabh
450ad78f61 Added custom segment option for default post access setting
refs https://github.com/TryGhost/Team/issues/803

With multiple products we'll re-enable segmentation by product for posts, which also means need to add a new option to the default post access setting in Membership settings. This change -

- adds new `A segment` option to default post access dropdown behind the alpha flag for multiple products
- shows member segment select dropdown for `A segment` option
- handles update of `defaultContentVisibility` to allow setting custom filter
2021-07-05 17:14:26 +05:30
Rishabh Garg
46b311b561 Wired benefits section to API (#2023)
refs https://github.com/TryGhost/Team/issues/792

- updates product benefit to use `name` instead of `label` attribute for benefit text
- updates model/serializer/validator to correctly handle benefit attributes
- added `+` button for adding new labels as the enter behavior is closing the popup(needs fix)
2021-06-28 15:19:54 +05:30
Rishabh
1df55f76f7 Fixed product save handling on membership settings
no refs

- the settings save on memberships was incorrectly relying on developerExperiments flag instead of multipleProducts feature flag
2021-06-22 14:19:08 +05:30
Kevin Ansfield
1b85b9244b Updated email previews to show full from email address
no issue

- moved duplicated email domain generation from `members-email` controller and `<GhMembersEmailSetting>` to `config.emailDomain`
- added `{{from-email-address emailStr}}` helper that will output the passed in emailStr value if it contains an `@` or concat `emailStr@emailDomain` if it doesn't - lets us use `settings.membersFromAddress` to always get a full email address when it could be just a name (`noreply`) or a full address
- updated customise email and post email preview templates to use the new helper
2021-06-11 16:42:27 +01:00
Rishabh
46e281241e Wired new membership tiers UI to API
refs https://github.com/TryGhost/Team/issues/712
closes https://github.com/TryGhost/Team/issues/717

The product API is updated to support `monthly/yearly_price` on each product instead of using list of stripe prices. This change updates the handling of membership settings to use the updated API instead of `stripe_prices` property.
2021-06-04 13:30:11 +05:30
Kevin Ansfield
c10f8d014a Added query param for email design settings modal
no issue

- allows for easier development because modal stays open when refreshing as UI state is stored in the URL
2021-06-03 17:22:59 +01:00
Kevin Ansfield
3d43964bcd 🐛 Fixed portal preview resize when using split front-end/admin URLs (#1980)
no issue

- switched to listening to Portal's `message` events that now include a height
- removes need to reach into Portal preview iframe contents which is blocked by browser security when working cross-origin
2021-05-27 13:20:37 +01:00
Kevin Ansfield
c8f1fb5b45 🐛 Fixed error on membership screen when using split front-end/admin URLs
no issue

- when the preview iframe origin does not match the admin origin (ie, front-end and admin live on different URLs) we would hit browser security restrictions for accessing contents of a cross-origin iframe
- added a guard around the preview resize code so we abort resizing when we hit a security error
2021-05-27 11:00:10 +01:00
ceecko
0b31be4c90 🎨 Added error message from limit service to theme upload
no issue

- Addresses 634d2daa13 (r49241896)
- Uses limit service to display the configured error message
2021-05-26 19:05:19 +02:00
Kevin Ansfield
2f39953917 Fixed preview background flash when switching from none -> all/invite
no issue

- flash was occurring because as soon as the setting was changed we switched to showing the portal preview but at that time the preview URL is still set to an old url value. The url doesn't get changed until the settings save completes which gives enough time for a non-portal page to load before being replaced
- added a `switchFromNoneTask` that is triggered when switching away from a saved none value and updated the template to stay on the "disabled" view until the save has completed so we don't trigger multiple page loads
2021-05-25 09:40:17 +01:00
Kevin Ansfield
2bd118eef9 Attempted fix of portal background flash going from nobody->anybody/invite
no issue

- dropped use of `@guid` tracked param in favour of adding query param to URL in `updatePortalPreview()` and making sure we only update it when necessary
2021-05-24 19:29:18 +01:00
Kevin Ansfield
956ec8f302 Added animation to portal preview height (#1977)
no issue

- add CSS transition for height attribute of portal preview container
- before adjusting height of container, apply styles to portal preview nested iframe to prevent scrollbars from showing
2021-05-24 18:55:18 +01:00
Kevin Ansfield
baafe011a2 Fixed portal preview resize and cached page bugs
no issue

- moved `@onLoad` trigger from `load` event to the `makeVisible()` task so that consumer code isn't called before load has fully finished
  - fixes issue with portal sometimes not being ready when we perform the resize on the membership screen
- added guid as a cache-busting `?v={guid}` query param
  - fixes issue where preview iframe can load stale data after a settings change resulting in a blank preview after going from "nobody" to "invite/anybody" because the loaded homepage is stale and doesn't have the portal script injected
2021-05-24 17:28:01 +01:00
Rishabh
757f061362 Added stripe connect guard for saving product
no refs

While saving on membership screen, we also try and save the product with any prices that have changed. In case Stripe is not connected, saving Product doesn't make sense as we should not edit prices for the default product without Stripe connection.
2021-05-24 21:17:40 +05:30
Rishabh
1b491aa083 Fixed price reset when no monthly/yearly prices
no refs

When we reset the prices on leaving the membership settings screen, its possible we don't have the prices created already and not able to read any monthly/yearly price.
2021-05-24 20:02:49 +05:30
Kevin Ansfield
29dc178261 Removed unused members-payments route
no issue

- stripe connect/disconnect functionality has moved to a modal as part of the new membership screen
- removed `settings/members-payments` route and related route/controller/template files
- updated link to stripe connect in product screen to show an alert as a reminder to update to use the new modal (products screens are not usable for now, they'll be worked on again later)
2021-05-21 08:57:28 +01:00
Kevin Ansfield
345cfd6f36 Fixed error when changing subscription access back to saved setting
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
2021-05-20 15:00:46 +01:00
Kevin Ansfield
dee5129edf Fixed portal preview not updating when changing from a saved "Nobody" access
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
2021-05-20 14:43:04 +01:00
Kevin Ansfield
03844d5b97 Fixed portal preview not updating when connecting/disconnecting Stripe
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
2021-05-20 14:31:51 +01:00
Rishabh
510e31e6e6 Fixed unsaved change modal on new prices
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.
2021-05-20 14:52:21 +05:30
Kevin Ansfield
eebdd4a835 Added radix to parseInt calls in changed-prices check
no issue

- `parseInt` doesn't default to base 10 so the radix argument is required
2021-05-20 09:13:39 +01:00
Kevin Ansfield
3bed117b57 Fixed unsaved changes warning for prices when they've already been saved
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
2021-05-19 20:44:41 +01:00
Kevin Ansfield
6339770a67 Fixed "connect to stripe" button in portal settings modal
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
2021-05-19 20:24:18 +01:00
Kevin Ansfield
f9f925d923 Fixed "confirm leave" modal not showing if prices are unsaved in membership screen
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
2021-05-19 18:32:37 +01:00
Kevin Ansfield
5a3c9a54b1 Re-ordered memberships controller code
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
2021-05-19 18:32:37 +01:00
Rishabh
4e6051a5bd Fixed portal plans change not triggering recompute
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.
2021-05-19 20:19:54 +05:30
Rishabh Garg
69367de59e Added SSL precondition for Stripe Connect UI (#1967)
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>
2021-05-19 19:56:45 +05:30
Rishabh
e22d54ba3b Updated portal preview to update on price change
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
2021-05-18 23:00:10 +05:30
Kevin Ansfield
db09b317eb Added auto height adjustment to membership portal preview
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
2021-05-18 18:26:07 +01:00