|
1 | 1 | <script setup> |
| 2 | +import PluginSortControl from "@/components/extension/PluginSortControl.vue"; |
2 | 3 | import ExtensionCard from "@/components/shared/ExtensionCard.vue"; |
3 | 4 | import StyledMenu from "@/components/shared/StyledMenu.vue"; |
4 | 5 | import defaultPluginIcon from "@/assets/images/plugin_icon.png"; |
@@ -48,6 +49,9 @@ const { |
48 | 49 | getInitialListViewMode, |
49 | 50 | isListView, |
50 | 51 | pluginSearch, |
| 52 | + installedStatusFilter, |
| 53 | + installedSortBy, |
| 54 | + installedSortOrder, |
51 | 55 | loading_, |
52 | 56 | currentPage, |
53 | 57 | dangerConfirmDialog, |
@@ -82,6 +86,8 @@ const { |
82 | 86 | toPinyinText, |
83 | 87 | toInitials, |
84 | 88 | plugin_handler_info_headers, |
| 89 | + installedSortItems, |
| 90 | + installedSortUsesOrder, |
85 | 91 | pluginHeaders, |
86 | 92 | filteredExtensions, |
87 | 93 | filteredPlugins, |
@@ -185,30 +191,64 @@ const { |
185 | 191 | </div> |
186 | 192 |
|
187 | 193 | <v-row class="mb-4"> |
188 | | - <v-col cols="12" class="d-flex align-center flex-wrap ga-2"> |
189 | | - <v-btn variant="tonal" @click="toggleShowReserved"> |
190 | | - <v-icon>{{ |
191 | | - showReserved ? "mdi-eye-off" : "mdi-eye" |
192 | | - }}</v-icon> |
193 | | - {{ |
194 | | - showReserved |
195 | | - ? tm("buttons.hideSystemPlugins") |
196 | | - : tm("buttons.showSystemPlugins") |
197 | | - }} |
198 | | - </v-btn> |
199 | | - |
200 | | - <v-btn |
201 | | - class="ml-2" |
202 | | - color="warning" |
203 | | - variant="tonal" |
204 | | - :disabled="updatableExtensions.length === 0" |
205 | | - :loading="updatingAll" |
206 | | - @click="showUpdateAllConfirm" |
207 | | - > |
208 | | - <v-icon>mdi-update</v-icon> |
209 | | - {{ tm("buttons.updateAll") }} |
210 | | - </v-btn> |
211 | | - |
| 194 | + <v-col cols="12"> |
| 195 | + <div class="installed-toolbar"> |
| 196 | + <div class="installed-toolbar__actions"> |
| 197 | + <v-btn variant="tonal" @click="toggleShowReserved"> |
| 198 | + <v-icon>{{ |
| 199 | + showReserved ? "mdi-eye-off" : "mdi-eye" |
| 200 | + }}</v-icon> |
| 201 | + {{ |
| 202 | + showReserved |
| 203 | + ? tm("buttons.hideSystemPlugins") |
| 204 | + : tm("buttons.showSystemPlugins") |
| 205 | + }} |
| 206 | + </v-btn> |
| 207 | + |
| 208 | + <v-btn |
| 209 | + color="warning" |
| 210 | + variant="tonal" |
| 211 | + :disabled="updatableExtensions.length === 0" |
| 212 | + :loading="updatingAll" |
| 213 | + @click="showUpdateAllConfirm" |
| 214 | + > |
| 215 | + <v-icon>mdi-update</v-icon> |
| 216 | + {{ tm("buttons.updateAll") }} |
| 217 | + </v-btn> |
| 218 | + </div> |
| 219 | + |
| 220 | + <div class="installed-toolbar__controls"> |
| 221 | + <v-btn-toggle |
| 222 | + v-model="installedStatusFilter" |
| 223 | + mandatory |
| 224 | + divided |
| 225 | + density="compact" |
| 226 | + color="primary" |
| 227 | + class="installed-status-toggle" |
| 228 | + > |
| 229 | + <v-btn value="all" prepend-icon="mdi-filter-variant"> |
| 230 | + {{ tm("filters.all") }} |
| 231 | + </v-btn> |
| 232 | + <v-btn value="enabled" prepend-icon="mdi-play-circle-outline"> |
| 233 | + {{ tm("status.enabled") }} |
| 234 | + </v-btn> |
| 235 | + <v-btn value="disabled" prepend-icon="mdi-pause-circle-outline"> |
| 236 | + {{ tm("status.disabled") }} |
| 237 | + </v-btn> |
| 238 | + </v-btn-toggle> |
| 239 | + |
| 240 | + <PluginSortControl |
| 241 | + v-model="installedSortBy" |
| 242 | + :items="installedSortItems" |
| 243 | + :label="tm('sort.by')" |
| 244 | + :order="installedSortOrder" |
| 245 | + :ascending-label="tm('sort.ascending')" |
| 246 | + :descending-label="tm('sort.descending')" |
| 247 | + :show-order="installedSortUsesOrder" |
| 248 | + @update:order="installedSortOrder = $event" |
| 249 | + /> |
| 250 | + </div> |
| 251 | + </div> |
212 | 252 | </v-col> |
213 | 253 | </v-row> |
214 | 254 |
|
@@ -654,6 +694,32 @@ const { |
654 | 694 | </template> |
655 | 695 |
|
656 | 696 | <style scoped> |
| 697 | +.installed-toolbar { |
| 698 | + display: flex; |
| 699 | + align-items: center; |
| 700 | + justify-content: space-between; |
| 701 | + gap: 12px; |
| 702 | + flex-wrap: wrap; |
| 703 | +} |
| 704 | +
|
| 705 | +.installed-toolbar__actions, |
| 706 | +.installed-toolbar__controls { |
| 707 | + display: flex; |
| 708 | + align-items: center; |
| 709 | + gap: 8px; |
| 710 | + flex-wrap: wrap; |
| 711 | +} |
| 712 | +
|
| 713 | +.installed-toolbar__controls { |
| 714 | + margin-left: auto; |
| 715 | + justify-content: flex-end; |
| 716 | +} |
| 717 | +
|
| 718 | +.installed-status-toggle :deep(.v-btn) { |
| 719 | + min-height: 34px; |
| 720 | + text-transform: none; |
| 721 | +} |
| 722 | +
|
657 | 723 | .view-mode-toggle :deep(.v-btn) { |
658 | 724 | min-width: 30px; |
659 | 725 | height: 28px; |
@@ -684,6 +750,14 @@ const { |
684 | 750 | } |
685 | 751 | } |
686 | 752 |
|
| 753 | +@media (max-width: 960px) { |
| 754 | + .installed-toolbar__controls { |
| 755 | + margin-left: 0; |
| 756 | + width: 100%; |
| 757 | + justify-content: flex-start; |
| 758 | + } |
| 759 | +} |
| 760 | +
|
687 | 761 | .fab-button { |
688 | 762 | transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1); |
689 | 763 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); |
|
0 commit comments