mirror of
https://github.com/TryGhost/Ghost.git
synced 2024-12-01 13:54:35 +03:00
eee84ab5f7
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
148 lines
7.1 KiB
Handlebars
148 lines
7.1 KiB
Handlebars
<section class="gh-canvas">
|
|
<GhCanvasHeader class="gh-canvas-header members-header">
|
|
<h2 class="gh-canvas-title" data-test-screen-title>Members</h2>
|
|
<section class="view-actions">
|
|
<GhMembersFilter
|
|
@selectedLabel={{this.selectedLabel}}
|
|
@availableLabels={{this.availableLabels}}
|
|
@onLabelChange={{this.changeLabel}}
|
|
@onLabelAdd={{this.addLabel}}
|
|
@onLabelEdit={{this.editLabel}}
|
|
@selectedPaidParam={{this.selectedPaidParam}}
|
|
@availablePaidParams={{this.paidParams}}
|
|
@onPaidParamChange={{this.changePaidParam}}
|
|
/>
|
|
<div class="relative gh-members-header-search">
|
|
{{svg-jar "search" class="gh-input-search-icon"}}
|
|
<GhTextInput
|
|
placeholder="Search members..."
|
|
@value={{this.searchText}}
|
|
@input={{this.search}}
|
|
class="gh-members-list-searchfield {{if this.searchText "active"}}" />
|
|
</div>
|
|
|
|
<span class="dropdown">
|
|
<GhDropdownButton @dropdownName="members-actions-menu"
|
|
@classNames="gh-btn gh-btn-white gh-btn-icon only-has-icon gh-actions-cog" @title="Members Actions"
|
|
@data-test-user-actions="true">
|
|
<span>
|
|
{{svg-jar "settings"}}
|
|
<span class="hidden">Actions</span>
|
|
</span>
|
|
</GhDropdownButton>
|
|
<GhDropdown @name="members-actions-menu" @tagName="ul"
|
|
@classNames="gh-member-actions-menu dropdown-menu dropdown-triangle-top-right">
|
|
<li>
|
|
<LinkTo @route="members.import" class="mr2" data-test-link="import-csv">
|
|
<span>Import members</span>
|
|
</LinkTo>
|
|
</li>
|
|
<li>
|
|
<button class="mr2" {{on "click" this.exportData}}>
|
|
<span>Export all members</span>
|
|
</button>
|
|
</li>
|
|
</GhDropdown>
|
|
</span>
|
|
<LinkTo @route="member.new" class="gh-btn gh-btn-green" data-test-new-member-button="true"><span>New member</span></LinkTo>
|
|
</section>
|
|
</GhCanvasHeader>
|
|
|
|
{{#unless this.members.loading}}
|
|
<section class="view-container">
|
|
{{#if (and this.members this.showingAll)}}
|
|
<section>
|
|
<GhMembersChart nightShift={{this.feature.nightShift}} />
|
|
</section>
|
|
{{/if}}
|
|
|
|
<section class="content-list">
|
|
{{!-- overlaid on header to keep table column sizing --}}
|
|
{{#if this.isEditing}}
|
|
<div class="members-list-header-overlay" data-test-edit-overlay>
|
|
<div class="flex flex-row">
|
|
<div>
|
|
<input type="checkbox" id="select-all-members" name="select-all-members" {{on "input" this.toggleSelectAll}} data-test-checkbox="select-all">
|
|
<label for="select-all-members" data-test-label="selection">{{this.selectAllLabel}}</label>
|
|
</div>
|
|
<button class="gh-btn" {{on "click" this.toggleDeleteMembersModal}} disabled={{not this.selectedCount}} data-test-button="delete">
|
|
<span>Delete</span>
|
|
</button>
|
|
</div>
|
|
|
|
<button class="gh-btn" {{on "click" this.toggleEditMode}} data-test-button="done">
|
|
<span>Done</span>
|
|
</button>
|
|
</div>
|
|
{{/if}}
|
|
|
|
<ol class="members-list gh-list {{unless this.members "no-posts"}}">
|
|
{{#if this.members}}
|
|
<li class="gh-list-row header relative">
|
|
{{#if this.isEditing}}
|
|
{{!-- necessary because we add an extra column in the list items --}}
|
|
<div class="gh-list-header gh-members-list-checkbox"></div>
|
|
{{/if}}
|
|
<div class="gh-list-header" data-test-list-header>{{this.listHeader}}</div>
|
|
<div class="gh-list-header gh-members-list-geolocation gh-list-cellwidth-20 nowrap">Location</div>
|
|
<div class="gh-list-header gh-members-list-subscribed-at gh-list-cellwidth-20 nowrap">Created</div>
|
|
<div class="gh-list-header gh-members-list-chevron gh-list-cellwidth-chevron">
|
|
{{!-- TODO: 🍆🖌 --}}
|
|
{{#if this.config.enableDeveloperExperiments}}
|
|
<button class="gh-btn" style="position: absolute; top: 2px; right: 3px" {{on "click" this.toggleEditMode}} data-test-button="edit">
|
|
<span>Edit</span>
|
|
</button>
|
|
{{/if}}
|
|
</div>
|
|
</li>
|
|
<VerticalCollection @items={{this.members}} @key="id" @containerSelector=".gh-main" @estimateHeight={{69}} @staticHeight={{true}} @bufferSize={{20}} as |member|>
|
|
<GhMembersListItem
|
|
@member={{member}}
|
|
@isEditing={{this.isEditing}}
|
|
@isSelected={{this.allSelected}}
|
|
@data-test-member={{member.id}}
|
|
/>
|
|
</VerticalCollection>
|
|
{{else}}
|
|
<li class="no-posts-box" data-test-no-members>
|
|
<div class="no-posts">
|
|
{{svg-jar "members-placeholder" class="gh-members-placeholder"}}
|
|
{{#if this.showingAll}}
|
|
<h3>No members yet</h3>
|
|
<GhMembersNoMembers @afterCreate={{this.refreshData}} />
|
|
{{else}}
|
|
<h3>No members match the current filter</h3>
|
|
{{/if}}
|
|
</div>
|
|
</li>
|
|
{{/if}}
|
|
</ol>
|
|
</section>
|
|
</section>
|
|
{{else}}
|
|
<div class="gh-content">
|
|
<GhLoadingSpinner />
|
|
</div>
|
|
{{/unless}}
|
|
</section>
|
|
|
|
{{outlet}}
|
|
|
|
{{#if this.showDeleteMembersModal}}
|
|
<GhFullscreenModal
|
|
@modal="delete-members"
|
|
@model={{hash memberCount=this.selectedCount}}
|
|
@confirm={{this.deleteMembers}}
|
|
@close={{this.toggleDeleteMembersModal}}
|
|
@modifier="action wide"
|
|
/>
|
|
{{/if}}
|
|
|
|
{{#if this.showLabelModal}}
|
|
<GhFullscreenModal
|
|
@modal="members-label-form"
|
|
@model={{this.labelModalData}}
|
|
@close={{this.toggleLabelModal}}
|
|
@modifier="action wide"
|
|
/>
|
|
{{/if}} |