Commit Graph

98 Commits

Author SHA1 Message Date
Peter Zimon
c757ddbef8 UI updates (#1835)
* Admin UI update basics

Added the basics for the Admin UI/style update. Very far from being done...

* Admin style updates

- exploring menu
- enabling full width content (integrations selection bg)
- updated main screens
2021-02-03 20:08:01 +01:00
Sanne de Vries
ffe0f84700 Added open-rate column and ordering to the members list (#1790)
closes https://github.com/TryGhost/Ghost/issues/12421

- added `emailOpenRate` property to member model
- added open-rate column to the members list
  - hidden when email analytics is disabled
- added `{{feature "flag"}}` helper so feature flags can be checked in templates without injecting the feature service into the backing class
- added `order` query param to the members controller/route and wired it into the data fetching routine
- added order dropdown to the filter bar with "Newest" (default) and "Open rate" as the two options
  - whole dropdown is hidden if email analytics is disabled

Co-authored-by: Kevin Ansfield <kevin@lookingsideways.co.uk>
2020-12-08 19:23:57 +00:00
Fabien 'egg' O'Carroll
6ecb38eaa5 Added support for filtering the exported Members CSV (#1716)
no-issue

Co-authored-by: Peter Zimon <zimo@ghost.org>
2020-09-23 14:29:47 +01:00
Kevin Ansfield
3b78973a21 Removed bulk member edit dev experiment
no issue

- we're moving forward with a simplified bulk delete and the UI would conflict if both approaches are behind the dev experiments flag
2020-07-23 15:03:18 +01:00
Kevin Ansfield
eee84ab5f7 Added first pass bulk members delete confirmation and results display
no issue

- display a confirmation modal when bulk deleting members
- hit the `DELETE /members/?all=true` endpoint when confirming
- show counts of members deleted/skipped
- fix selection reset when leaving edit mode
2020-06-19 18:14:41 +01:00
Kevin Ansfield
d8270a110c Moved members bulk delete confirmation into a modal 2020-06-19 14:14:39 +01:00
Kevin Ansfield
34c28dcc0e Added rough "edit mode" for members table behind dev flag
no issue

- initial UI for bulk-selection, focusing for now on first stage which is limited to select-all and delete actions
- adds "Edit" button to the members table that shows the "selection" toolbar in place of the table header and shows a checkbox next to each member
2020-06-18 11:08:53 +01:00
Kevin Ansfield
16f4b1c9af Added all/free/paid filter to members admin screen (#1600)
requires https://github.com/TryGhost/Ghost/pull/11892

- adds `?paid` query parameter to members route that is tied to the `?paid` query param in the API request
- added all/free/paid members dropdown to members filter component
2020-06-12 12:12:27 +01:00
Kevin Ansfield
8f5ccfe401 Fixed missing rename of <GhMembersFilter> in members.hbs 2020-06-09 23:22:43 +01:00
Kevin Ansfield
7ac7e73a05 🐛 Fixed members list not refreshing after adding yourself
no issue

- passed in the `refreshData` action to the `<GhMembersNoMembers>` component and called it after creating the member
- converted `<GhMembersNoMembers>` to a glimmer component
2020-06-05 08:50:20 +01:00
Kevin Ansfield
a76465b5ee Fixed columns resizing whilst scrolling members list
no issue

- the members list uses occluded rendering to keep scrolling performance high but this will cause constant reflows of the table contents whilst scrolling because contents are swapped in and out causing the browser to adjust the column widths to match longest/shortest content in the currently rendered set of rows
- applying `table-layout: fixed` to the table means that columns will always match the sizes defined by the first row of the table (in this case the header) ensuring that there is no dynamic resizing whilst scrolling
2020-05-28 12:59:34 +01:00
Kevin Ansfield
ff33eb978b Added server-side search to new members screen (#1582)
requires https://github.com/TryGhost/Ghost/pull/11854

- ties the search input on the members screen to a `?search` query param, debounced at 250ms to avoid unnecessary API requests and UI churn
- updated the members route's `model` hook to pass through the search param in the API request query parameters
2020-05-28 10:15:17 +01:00
Kevin Ansfield
8c19ea9cf9 Updated <GhMembersChart> to fetch stats from the API
no issue

- added mocked API for `/admin/members/stats/` that generates random data for the chart
- re-architected `<GhMembersChart>` to fetch data from the API rather than calculating stats from all members loaded in memory
- enabled mirage in development so that the chart can be tested before the live API is ready
2020-05-22 17:58:45 +01:00
Kevin Ansfield
3a6550b7c4 Linked label dropdown in members screen to paginated list loading
no issue

- moved model loading back into the route
- updated model loading to refresh correctly when `label` query param changes
- fixed infinite loading/"no members" display in members list by using the `members.loading` property that `ella-sparse` gives us (previously we'd never leave the loading display because `this.members.length` would be 0)
- changed the members nav link to reset query params only if it's clicked whilst on the members screen - matches posts/pages behaviour and lets you navigate without having to re-enter your filter/search
2020-05-22 17:58:45 +01:00
Kevin Ansfield
7e7bca7ff0 Added loading state for member list rows
no issue

- with the sparsely loaded list you can scroll to an area which is being loaded in the background
- if a list row is being loaded, display a "loading" version of the row so it doesn't look like you're stuck on a blank screen
2020-05-22 09:31:17 +01:00
Kevin Ansfield
5a1b3d90fb Updated members list to use paginated loading
no issue

- disabled members search/filter/chart as they won't work without all members loaded into memory (they will be added back later)
- added `ember-ella-sparse` to handle a sparse array of members
- updated `fetchMembersTask` to return a sparse array instance
- updated components that work on a `member` instance to use `.get` because all items in a sparse array are proxy objects
- changed list loading behaviour to not refresh the list from the API unless the client-side list is more than a minute old - allows for much snappier nav between list and details screens
2020-05-20 16:39:32 +01:00
Kevin Ansfield
3cc10bfa83 Updated members routes/controllers with Octane idioms
no issue

- ran [`ember-native-class-codemod`](https://github.com/ember-codemods/ember-native-class-codemod) on members-related files
- updated files to remove need for `@classic` decorator where possible
    - switched to tracked properties
    - removed usage of `this.get/set/toggleProperty` etc
- swapped usage of `{{action 'foo'}}` for `{{this.foo}}`
2020-05-20 16:39:31 +01:00
Kevin Ansfield
76cbdbaee7 🐛 Improved scrolling of members screen in Firefox
refs https://github.com/TryGhost/Ghost/issues/11755

- adjusted estimated height to match actual rendered size and enabled `staticHeight` to switch to a simpler algorithm inside vertical-collection
- prevents some jank seen when scrolling where rows jump
2020-05-01 18:17:47 +01:00
Rish
cd832a15bb Fixed members loading spinner alignment
refs https://github.com/TryGhost/Ghost/issues/11755

Loading spinner on members screen was not vertically centered, this updates the spinner position.
2020-04-21 13:42:34 +05:30
Kevin Ansfield
13a9a2802b Added member's geographic location to admin
no issue

- added `geolocation` attribute to member model with json-string transform
- prevent geolocation from being sent back to the API in member serializer
- add "Location" column to members list
  - if country is "US" then display "{State}, US" otherwise show full country name such as "United Kingdom"
  - displays "-" if no geolocation data has been collected for the member
2020-02-27 12:56:26 +00:00
Peter Zimon
64e4ea16e4 🐛 Fixed visual bug for members label dropdowns
no refs.
- fixed spacing issue for member label dropdown edit icon
- added max width to member label dropdown
2020-02-14 12:39:36 +01:00
Rishabh Garg
d115204d9f Added labels for Members (#1477)
no issue

refs TryGhost/Ghost#11538

* Added members label handling v1

* Added members label dropdown in list screen

* Updated selected labels and member list UI refactor

* Added v1 label add/delete modal

* Added add label modal v1

* Fixed disabled check for new label save

* First stab at member filters layout

* Updated member detail screen design

* Member detail refinements

* Added basic editing for member labels

* Fixed label deletion from members list

* Updated filtered list header

* Refinements for dropdown and empty filter state

* Refined label modal

* Updated member labels fetch logic

* Added custom dropdown component for labels

* Refined style for dropdown

* Refined dropdown button

* Restructure and refine members dropdown styles

* Added selected indication to dropdown

* Fixed dropdown footer style

* Removed member label placeholder

* Removed add label from member list actions

* New label refinements

* Added confirmation modal for label delete

* Added duplicate validation check for labels

* Updated validation check with slug

* Updated copy

* Updated actions dropdown copy

* Fixed visual glitch of dropdown on FF

* Hide scrollbar for labels dropdown

Co-authored-by: Peter Zimon <peter.zimon@gmail.com>
2020-02-14 15:04:01 +05:30
Kevin Ansfield
2231dd84c2 Migrated to <AngleBracketSyntax /> (#1460)
no issue

Ember is migrating to `<AngleBracketSyntax />` for component invocation, see https://github.com/emberjs/rfcs/blob/master/text/0311-angle-bracket-invocation.md

We were in a half-way situation where some templates used angle bracket syntax in some places, this PR updates templates to use the syntax everywhere.

This simplifies the rules for what template code is referring to...

`<Component>` = a component
`{{helper}}` = a helper (or locally assigned handlebars variable)
`{{this.foo}}` = data on the template backing context (a component/controller)
`{{@foo}}` = a named argument passed into the component that the component backing class has not modified (note: this commit does not introduce any named arguments)

- ran codemod https://github.com/ember-codemods/ember-angle-brackets-codemod on the following directories:
  - `app/templates`
  - `lib/koenig-editor/addon/templates`
- removed positional params from components as angle bracket syntax does not support them
  - `gh-feature-flag`
  - `gh-tour-item`
  - `gh-cm-editor`
  - `gh-fullscreen-modal`
  - `gh-task-button`
- updates some code that was missed in 3c851293c1 to use explicit this
2020-01-16 15:14:03 +00:00
Rishabh Garg
6a1edceded Added members growth chart (#1424)
no issue

Adds new members growth chart in members list screen to highlight growth of members over different date ranges
2019-12-17 15:59:26 +05:30
Kevin Ansfield
7d997d5c2d Fixed member count after deleting a member
no issue

- the member count is automatically calculated via the length of the live members array so there's no need to manually decrement it - if we do manually decrement then the count is off by one because the auto calculation runs to get the new value before the manual decrement
2019-12-13 11:38:37 +00:00
Kevin Ansfield
5585a781b9 Unified tag and member screen code
no issue

The tag and member screens share the same underlying UI/UX patterns but were using different code patterns. This brings both in line so that we have consistent code patterns that can be re-used for other screens.

- fixed cleanup of new tags by adding the `deactivate` hook to the `tag` route
- updated `member` and `member.new` route/controller setup to match tag route/controller setup
  - added `save` action to member controller so that Ctrl/Cmd+S works on member screen
  - updated tag route/controller to utilise the same instant display w/background refresh when accessing the tag details screen
- completed transition of non-component tag/members templates over to angle bracket component syntax
2019-12-12 13:59:46 +00:00
Naz Gargol
4bd4825902 Improved adding first members on no-members screen (#1416)
no issue

- There was a need to make the experience of adding a first member(s) as frictionless as possible, which lead to adding some actionable controls to the "no-members" screen.
- Adds the ability to make yourself a member
- Adds the ability to import CSV member
- Link to add a member manually
2019-12-03 12:04:04 +07:00
Naz Gargol
c41c184762 Added member "add" screen (#1411)
no issue

- We have a need to create a member manually, this changeset solves this problem.
- Added new member button to the member's screen
- Needed to be able to perform add member action
- Fixed inconsistent `createAt` naming. All models use consistent `createdAtUTC`, fixed it up so that members model follows the same pattern. If we want to change this pattern should probably happen for all models at once
- Fixed member avatar when creating a new member. If the values are completely empty the screen ends up being filled with empty space. Added some dummy initials which are recalculated once the member enters the name or an email
- Refactored DS naming for consistency. Nowhere else in the codebase 'DS' name is ever used, made this consistent
- Added missing validations in members form
- Simplified if conditions in the member list template. When using the if/esle statements unnecessary new-line symbols were inserted which made it hard to test. Also by using computed property view is much cleaner
- Updated member's model default value for `subscribed` to "true". It is turned on by default in the model layer  on the backend (ref: https://github.com/TryGhost/Ghost/blob/3.1.0/core/server/data/schema/schema.js#L330), this behavior is intended and should be the same on the frontend
2019-11-28 18:30:21 +07:00
Peter Zimon
5bfe1c2095 V3 css fixes (#1377)
* Fixed Firefox bug for input groups
* Moved from `rem` based responsive styles to `px` based
* Fixed invisible clickable menus for member/user list
* Added responsive CSS for meembers list header
* Updated member list responsive styles
* Fix list header responsive style
2019-10-21 13:09:56 +02:00
Rishabh Garg
9926ea8173 🐛 Fixed members count on list page (#1369)
no issue

Members calculation was breaking when viewed on admin without refresh after adding/deleting new members, updated to more robust calculation logic.
2019-10-19 18:06:38 +05:30
Peter Zimon
b7f83fad2c Refined member list
no issue
- added list headings
- added active state to search field when it has value
- set position of actions dropdown
- refined avatar typography
2019-10-15 16:11:43 +02:00
Peter Zimon
9c21f1b60c Refined members import/export button design
no issue
2019-10-04 13:28:10 +02:00
Rish
c3a496fe9f Added csv import/export for members
no issue

- Adds action view with import/export csv options
2019-10-04 15:14:20 +05:30
Peter Zimon
495663c3c4 Udpated members list design
no issue.
2019-10-03 12:56:31 +02:00
Rish
4a3fd90017 Updated members list/detail screens base structure
no issue
2019-10-02 17:05:57 +05:30
Rish
204e10c114 Updated members list screen design 2019-10-02 09:30:21 +05:30
Peter Zimon
c51bce7358 🎨 Updated admin area design and usability (#1232)
refs. https://github.com/TryGhost/Team/issues/205

Major update to Ghost Admin UI including:
- improved general consistency (typography, colors and contrast, UI components, icons)
- new design for post and pages lists, improved discoverability of filters 
- search moved to modal
- account menu is decoupled from ghost logo
- further usability fixes
2019-06-18 11:47:20 +01:00
Zimo
d3b50275e0 Added hover to member cells in member list 2019-04-16 14:27:55 +02:00
Zimo
39b16fb3d4 Updated member list search design 2019-02-23 18:57:15 +07:00
Kevin Ansfield
49942f5604 Added basic search to members list 2019-02-23 17:14:22 +07:00
Zimo
46124ed6ee Refined members list and detail design 2019-02-23 16:31:18 +07:00
Kevin Ansfield
6ac2569f24 Implemented first pass of member details screen 2019-02-22 18:32:09 +07:00
Kevin Ansfield
82fbbe9442 Show loading spinner on first load of members screen 2019-01-31 16:47:31 +00:00
Zimo
ea2b89ab1c Visual tweaks on Members list
- tune list style
- tweak generated avatar background-colors
- type and color refinements
2019-01-31 17:41:55 +01:00
Kevin Ansfield
e57bb177b7 Load all members on members screen, use occlusion scrolling for perf 2019-01-31 12:58:15 +00:00
Kevin Ansfield
a7e9796101 Renamed <MemberAvatar/> to <GhMemberAvatar/> for naming consistency 2019-01-25 13:51:18 +00:00
Kevin Ansfield
7ec48b36e0 First pass at members list
no issue
- don't nest details route as it's not nested UI
- implement styled list of members
- add `<MemberAvatar>` component that generates random background colour and initials based on member name
- fixed generation of fake member details in mirage
2019-01-24 19:34:32 +00:00
Kevin Ansfield
bea2d8c871 Added empty member management routes 2019-01-22 16:23:26 +00:00