search.vue (5624B)
- <template>
- <div class="Search panel panel-default">
- <div class="panel-heading">
- <div class="title">
- {{ $t('nav.search') }}
- </div>
- </div>
- <div class="panel-body search-input-container">
- <input
- ref="searchInput"
- v-model="searchTerm"
- class="input search-input"
- :placeholder="$t('nav.search')"
- @keyup.enter="newQuery(searchTerm)"
- >
- <button
- class="btn button-default search-button"
- type="submit"
- @click="newQuery(searchTerm)"
- >
- <FAIcon icon="search" />
- </button>
- </div>
- <div
- v-if="loading && statusesOffset == 0"
- class="panel-body text-center loading-icon"
- >
- <FAIcon
- icon="circle-notch"
- spin
- size="lg"
- />
- </div>
- <div v-else-if="loaded">
- <div class="search-nav-heading">
- <tab-switcher
- ref="tabSwitcher"
- :on-switch="onResultTabSwitch"
- :active-tab="currenResultTab"
- >
- <span
- key="statuses"
- :label="$t('user_card.statuses') + resultCount('visibleStatuses')"
- />
- <span
- key="people"
- :label="$t('search.people') + resultCount('users')"
- />
- <span
- key="hashtags"
- :label="$t('search.hashtags') + resultCount('hashtags')"
- />
- </tab-switcher>
- </div>
- </div>
- <div class="panel-body">
- <div v-if="currenResultTab === 'statuses'">
- <Status
- v-for="status in visibleStatuses"
- :key="status.id"
- :collapsable="false"
- :expandable="false"
- :compact="false"
- class="search-result"
- :statusoid="status"
- :no-heading="false"
- />
- <button
- v-if="!loading && loaded && lastStatusFetchCount > 0"
- class="more-statuses-button button-unstyled -link"
- @click.prevent="search(searchTerm, 'statuses')"
- >
- <div class="new-status-notification text-center">
- {{ $t('search.load_more') }}
- </div>
- </button>
- <div
- v-else-if="loading && statusesOffset > 0"
- class="text-center loading-icon"
- >
- <FAIcon
- icon="circle-notch"
- spin
- size="lg"
- />
- </div>
- <div
- v-if="(visibleStatuses.length === 0 || lastStatusFetchCount === 0) && !loading && loaded"
- class="search-result-heading"
- >
- <h4>
- {{ visibleStatuses.length === 0 ? $t('search.no_results') : $t('search.no_more_results') }}
- </h4>
- </div>
- </div>
- <div v-else-if="currenResultTab === 'people'">
- <div
- v-if="users.length === 0 && !loading && loaded"
- class="search-result-heading"
- >
- <h4>{{ $t('search.no_results') }}</h4>
- </div>
- <FollowCard
- v-for="user in users"
- :key="user.id"
- :user="user"
- class="list-item search-result"
- />
- </div>
- <div v-else-if="currenResultTab === 'hashtags'">
- <div
- v-if="hashtags.length === 0 && !loading && loaded"
- class="search-result-heading"
- >
- <h4>{{ $t('search.no_results') }}</h4>
- </div>
- <div
- v-for="hashtag in hashtags"
- :key="hashtag.url"
- class="status trend search-result"
- >
- <div class="hashtag">
- <router-link :to="{ name: 'tag-timeline', params: { tag: hashtag.name } }">
- #{{ hashtag.name }}
- </router-link>
- <div v-if="lastHistoryRecord(hashtag)">
- <span v-if="lastHistoryRecord(hashtag).accounts == 1">
- {{ $t('search.person_talking', { count: lastHistoryRecord(hashtag).accounts }) }}
- </span>
- <span v-else>
- {{ $t('search.people_talking', { count: lastHistoryRecord(hashtag).accounts }) }}
- </span>
- </div>
- </div>
- <div
- v-if="lastHistoryRecord(hashtag)"
- class="count"
- >
- {{ lastHistoryRecord(hashtag).uses }}
- </div>
- </div>
- </div>
- </div>
- <div class="search-result-footer text-center panel-footer faint" />
- </div>
- </template>
- <script src="./search.js"></script>
- <style lang="scss">
- .search-result-heading {
- color: var(--faint);
- padding: 0.75rem;
- text-align: center;
- }
- @media all and (max-width: 800px) {
- .search-nav-heading {
- .tab-switcher .tabs .tab-wrapper {
- display: block;
- justify-content: center;
- flex: 1 1 auto;
- text-align: center;
- }
- }
- }
- .search-result {
- box-sizing: border-box;
- border-bottom: 1px solid;
- border-color: var(--border);
- }
- .search-input-container {
- padding: 0.8rem;
- display: flex;
- justify-content: center;
- .search-input {
- width: 100%;
- line-height: 1.125rem;
- font-size: 1rem;
- padding: 0.5rem;
- box-sizing: border-box;
- }
- .search-button {
- margin-left: 0.5em;
- }
- }
- .loading-icon {
- padding: 1em;
- }
- .trend {
- display: flex;
- align-items: center;
- .hashtag {
- flex: 1 1 auto;
- color: var(--text);
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
- }
- .count {
- flex: 0 0 auto;
- width: 2rem;
- font-size: 1.5rem;
- line-height: 2.25rem;
- font-weight: 500;
- text-align: center;
- color: var(--text);
- }
- }
- .more-statuses-button {
- height: 3.5em;
- line-height: 3.5em;
- width: 100%;
- }
- </style>