Ghost-Admin/app/templates/components/gh-nav-menu.hbs

180 lines
10 KiB
Handlebars
Raw Normal View History

<header class="gh-nav-menu">
<div class="gh-nav-menu-details">
<div class="gh-nav-menu-icon" style={{this.iconStyle}}></div>
<div class="gh-nav-menu-details-blog">{{this.config.blogTitle}}</div>
</div>
<div class="gh-nav-menu-search">
<button class="gh-nav-btn-search" {{action "toggleSearchModal"}} title="Search site (Ctrl/⌘ + K)"><span>{{svg-jar "search" class="w4 h4 fill-midgrey"}}</span></button>
</div>
</header>
{{#if this.showSearchModal}}
{{gh-fullscreen-modal "search"
close=(action "toggleSearchModal")
modifier="action wide"}}
{{/if}}
2015-05-24 07:47:23 +02:00
<section class="gh-nav-body">
<div class="gh-nav-top">
<ul class="gh-nav-list gh-nav-main">
<li class="relative">
<span {{action "transitionToOrRefreshSite" on="click"}}>
{{#link-to "site" data-test-nav="site" current-when=this.isOnSite preventDefault=false}}
{{svg-jar "house"}} View site
{{/link-to}}
</span>
<a href="{{this.config.blogUrl}}/" class="gh-secondary-action" title="Open site in new tab" target="_blank">
<span>{{svg-jar "expand"}}</span>
</a>
</li>
</ul>
<ul class="gh-nav-list gh-nav-manage">
<li class="gh-nav-list-h">Manage</li>
<li class="gh-nav-list-new relative">
{{!-- clicking the Content link whilst on the content screen should reset the filter --}}
{{#if (eq this.router.currentRouteName "posts")}}
{{#link-to "posts" (query-params type=null author=null tag=null order=null) classNames="active" data-test-nav="posts"}}{{svg-jar "content"}}Posts{{/link-to}}
{{else}}
{{#link-to "posts" data-test-nav="posts"}}{{svg-jar "content"}}Posts{{/link-to}}
{{/if}}
{{#link-to "editor.new" "post" classNames="gh-secondary-action gh-nav-new-post" alt="New story" data-test-nav="new-story"}}<span>{{svg-jar "add-stroke"}}</span>{{/link-to}}
</li>
<li>
{{!-- clicking the Content link whilst on the content screen should reset the filter --}}
{{#if (eq this.router.currentRouteName "pages")}}
{{#link-to "pages" (query-params type=null author=null tag=null order=null) classNames="active" data-test-nav="pages"}}{{svg-jar "page"}}Pages{{/link-to}}
{{else}}
{{#link-to "pages" data-test-nav="pages"}}{{svg-jar "page"}}Pages{{/link-to}}
{{/if}}
</li>
{{#if (gh-user-can-admin this.session.user)}}
<li>{{#link-to "tags" data-test-nav="tags"}}{{svg-jar "tag"}}Tags{{/link-to}}</li>
{{/if}}
{{#if (and this.feature.members (gh-user-can-admin this.session.user))}}
<li>
{{#link-to "members" current-when="members member" data-test-nav="members"}}{{svg-jar "members"}}Members{{/link-to}}
</li>
{{/if}}
<li>{{#link-to "staff" data-test-nav="staff"}}{{svg-jar "staff"}}Staff{{/link-to}}</li>
</ul>
{{#if (gh-user-can-admin this.session.user)}}
<ul class="gh-nav-list gh-nav-settings">
<li class="gh-nav-list-h">Settings</li>
<li>{{#link-to "settings.general" data-test-nav="settings"}}{{svg-jar "settings"}}General{{/link-to}}</li>
<li>{{#link-to "settings.design" data-test-nav="design"}}{{svg-jar "paintbrush"}}Design{{/link-to}}</li>
<li>{{#link-to "settings.code-injection" data-test-nav="code-injection"}}{{svg-jar "brackets"}}Code injection{{/link-to}}</li>
<li>{{#link-to "settings.integrations" current-when=this.isIntegrationRoute data-test-nav="integrations"}}{{svg-jar "modules"}}Integrations{{/link-to}}</li>
<li class="relative">
<button class="gh-secondary-action" title="Toggle Night shift" {{action (toggle "nightShift" this.feature)}}>
<span>{{svg-jar "nightshift"}}</span>
</button>
{{#link-to "settings.labs" data-test-nav="labs"}}{{svg-jar "labs"}}Labs{{/link-to}}
</li>
</ul>
2019-01-22 17:23:26 +01:00
{{/if}}
{{#if this.showMenuExtension}}
<ul class="gh-nav-list gh-nav-settings">
{{#if this.config.clientExtensions.menu.title}}
<li class="gh-nav-list-h">{{this.config.clientExtensions.menu.title}}</li>
{{/if}}
{{#each this.config.clientExtensions.menu.items as |menuItem| }}
<li>
<a href="{{menuItem.href}}" target="_blank">{{svg-jar menuItem.icon}}{{menuItem.text}}</a>
</li>
{{/each}}
</ul>
Subscribers: Admin User Interface v1 Initial Subscribers screen - set up mocked api endpoints - basic subscribers screen with data loading, infinite scroll "Add Subscriber" screen - uses modal to display a new subscriber form - validates subscriber e-mail address - moves pagination from route into controller to use filtered/sorted CPs on top of a live-query so that new subscribers are added to the list and the total can be properly managed TODO: - there is currently a pretty serious performance issue where the whole table is re-rendered when the live-query is updated. `ember-light-table` doesn't allow for live-binding and has no options to easily manipulate it's rows using an external interface - it's possible to move the page loading into the component so we only render new rows but that leaves it difficult to react to new subscribers being added through the UI. I believe the number of components used within the table is also adding to the performance problems. - most likely solution is to drop `ember-light-table` in favour of rendering the table directly - glimmer should do a good job of fast updates even though the underlying array will be completely swapped out "Import subscribers" screen - uses modal to display an import subscribers CSV file upload form - displays upload progress - displays import stats and reloads subscribers table once import has completed - adds `gh-file-uploader` component (NB. pared down copy of `gh-image-uploader`, ripe for some refactoring) - fixes subscribers acceptance test failing because fixtures did not have the labs flag enabled Unfortunately this doesn't have 100% test coverage as we're limited in how we can simulate file uploads 😞 Fix performance issues with subscribers table - moves the table definition from the component up to the controller - switches back to manually manipulating table rows instead of using a live-query This is a quick-fix in that it allows us to continue using the `ember-light-table` component but it does mean that we lose some flexibility that the live-query gave us. For now it's not much of an issue and it allows us to defer deeper performance/flexibility work until we have a concrete need and requirements. Hook up Export CSV button - use a hidden iFrame to trigger the browser to hit the CSV export endpoint and download the file Re-order subscribers table by clicking column headers - displays currently sorted column and sort direction - clicking a column header re-fetches the data from the server with the appropriate query params Fix scroll triggers for infinite pagination + icon change - adds a debounce as well as the throttle so that we always get a final scroll trigger once scrolling has stopped - changes the subscribers icon from the temporary team icon to the mail icon
2016-04-15 16:45:50 +02:00
{{/if}}
{{#if this.showScriptExtension}}
{{{this.config.clientExtensions.script.container}}}
<script src="{{this.config.clientExtensions.script.src}}"></script>
{{/if}}
</div>
<div class="gh-nav-bottom">
<GhBasicDropdown @horizontalPosition="left" @verticalPosition="top" @calculatePosition={{this.userDropdownPosition}} as |dropdown|>
<dropdown.Trigger class="flex items-center outline-0 pointer space-between pa2 pl4 pr3">
<div class="flex-auto flex items-center">
<div class="gh-user-avatar relative" style={{background-image-style this.session.user.profileImageUrl}}>
{{#if this.whatsNew.hasNew}}<span class="absolute dib bg-blue ba b--white br-100 gh-whats-new-badge-account"></span>{{/if}}
</div>
<div class="flex flex-column items-start justify-center">
<span class="gh-user-name {{if this.session.user.name "mb1"}}" title="{{this.session.user.name}}">{{this.session.user.name}}</span>
<span class="gh-user-email" title="{{this.session.user.email}}">{{this.session.user.email}}</span>
</div>
</div>
{{svg-jar "arrow-down" class="w3 mr1 fill-darkgrey"}}
</dropdown.Trigger>
<dropdown.Content class="gh-nav-menu-dropdown">
<ul class="dropdown-menu dropdown-triangle-top" role="menu" {{action dropdown.actions.close on="click" preventDefault=false}}>
<li role="presentation">
{{#link-to "about" classNames="dropdown-item" role="menuitem" tabindex="-1" data-test-nav="about"}}
{{svg-jar "store"}} About Ghost
{{/link-to}}
</li>
<li role="presentation">
<button class="dropdown-item" role="menuitem" tabindex="-1" {{on "click" this.whatsNew.showModal}}>
{{svg-jar "gift"}} What's new?
{{#if this.whatsNew.hasNew}}
<div class="flex-grow-1 flex justify-end"><span class="dib w2 h2 top-0 right-0 bg-blue br-100"></span></div>
{{/if}}
</button>
</li>
<li class="divider"></li>
<li role="presentation">
{{#link-to "staff.user" this.session.user.slug classNames="dropdown-item" role="menuitem" tabindex="-1" data-test-nav="user-profile"}}
{{svg-jar "user-circle"}} Your Profile
{{/link-to}}
</li>
<li role="presentation">
2019-07-22 10:53:24 +02:00
<a class="dropdown-item" role="menuitem" tabindex="-1" href="https://ghost.org/docs/" target="_blank">
{{svg-jar "ambulance"}} Support Center
</a>
</li>
<li role="presentation">
<a class="dropdown-item" role="menuitem" tabindex="-1" target="_blank"
2019-07-02 14:13:01 +02:00
href="https://twitter.com/intent/tweet?text=%40Ghost+Hi%21+Can+you+help+me+with+&related=Ghost"
onclick="window.open(this.href, 'twitter-share', 'width=550,height=235');return false;"
>
2019-07-02 14:13:01 +02:00
{{svg-jar "twitter"}} Tweet @Ghost!
</a>
</li>
<li role="presentation">
2019-07-22 10:53:24 +02:00
<a class="dropdown-item" role="menuitem" tabindex="-1" href="https://ghost.org/faq/using-ghost/" target="_blank">
{{svg-jar "book-open"}} How to Use Ghost
</a>
</li>
<li class="divider"></li>
{{#if this.showDropdownExtension}}
{{#each this.config.clientExtensions.dropdown.items as |menuItem| }}
{{#if menuItem.divider}}
<li class="divider"></li>
{{else}}
<li role="presentation">
<a href="{{menuItem.href}}" target="_blank" class="dropdown-item {{menuItem.classes}}" role="menuitem" tabindex="-1">
{{svg-jar menuItem.icon}} {{menuItem.text}}
</a>
</li>
{{/if}}
{{/each}}
{{/if}}
<li role="presentation">
{{#link-to "signout" classNames="dropdown-item user-menu-signout" role="menuitem" tabindex="-1"}}
{{svg-jar "signout"}} Sign Out
{{/link-to}}
</li>
</ul>
</dropdown.Content>
</GhBasicDropdown>
</div>
2015-05-24 07:47:23 +02:00
</section>
{{gh-tour-item "getting-started"
target=".gh-nav-main"
throbberAttachment="middle right"
popoverTriangleClass="left-top"
throbberOffset="0px 0px"
}}