Skip to main content
Glama
NavbarPanelLeft.vue3.46 kB
<template> <div class="flex flex-row flex-1 basis-1/2 items-center min-w-[340px] h-full overflow-hidden" > <SiLogo class="block h-[44px] w-[44px] ml-[12px] mr-[12px] flex-none" /> <label class="flex flex-col flex-1 min-w-0 max-w-fit"> <div class="text-[11px] mt-[1px] mb-[5px] capsize font-medium text-neutral-300" > WORKSPACE: </div> <DropdownMenuButton ref="dropdownMenuRef" v-model="selectedWorkspacePk" :options="searchFilteredWorkspaceDropdownOptions" :search=" workspaceDropdownOptions.length > DEFAULT_DROPDOWN_SEARCH_THRESHOLD " placeholder="-- select a workspace --" checkable variant="navbar" @select="updateRoute" > <DropdownMenuItem v-if="searchFilteredWorkspaceDropdownOptions.length === 0" label="No Workspaces Match Your Search" header /> </DropdownMenuButton> </label> <template v-if="!invalidWorkspace"> <Icon name="chevron--right" size="xs" tone="neutral" class="mt-[14px] flex-none" /> <ChangeSetPanel ref="changeSetPanelRef" /> </template> <StatusPanel v-if="useNewUI" /> </div> </template> <script lang="ts" setup> import * as _ from "lodash-es"; import SiLogo from "@si/vue-lib/brand-assets/si-logo-symbol.svg?component"; import { DEFAULT_DROPDOWN_SEARCH_THRESHOLD, DropdownMenuButton, DropdownMenuItem, Icon, } from "@si/vue-lib/design-system"; import { computed, ref, watch } from "vue"; import { useRoute } from "vue-router"; import { useWorkspacesStore } from "@/store/workspaces.store"; import StatusPanel from "@/newhotness/StatusPanel.vue"; import ChangeSetPanel from "./ChangeSetPanel.vue"; defineProps({ invalidWorkspace: { type: Boolean }, }); // Determine if we're in the new experience const route = useRoute(); const useNewUI = computed(() => { return route.name?.toString().startsWith("new-hotness"); }); const workspacesStore = useWorkspacesStore(); const dropdownMenuRef = ref<InstanceType<typeof DropdownMenuButton>>(); const changeSetPanelRef = ref<InstanceType<typeof ChangeSetPanel>>(); const selectedWorkspacePk = ref<string | null>(null); watch( () => workspacesStore.selectedWorkspacePk, () => { selectedWorkspacePk.value = workspacesStore.selectedWorkspacePk; }, { immediate: true }, ); const updateRoute = (newWorkspacePk: string) => { if (selectedWorkspacePk.value === newWorkspacePk) return; selectedWorkspacePk.value = newWorkspacePk; window.location.href = `${import.meta.env.VITE_AUTH_API_URL}/workspaces/${ selectedWorkspacePk.value }/go`; }; const workspaceDropdownOptions = computed(() => _.map( _.filter(workspacesStore.allWorkspaces ?? [], (w) => !w.isHidden), (w) => ({ value: w.pk, label: w.displayName, }), ), ); const searchFilteredWorkspaceDropdownOptions = computed(() => { const searchString = dropdownMenuRef.value?.searchString; if (!searchString || searchString === "") { return workspaceDropdownOptions.value; } return workspaceDropdownOptions.value.filter( (option) => option.label.toLocaleLowerCase().includes(searchString) || option.value.toLocaleLowerCase().includes(searchString), ); }); const openCreateModal = () => { changeSetPanelRef.value?.openCreateModal(); }; defineExpose({ openCreateModal }); </script>

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/systeminit/si'

If you have feedback or need assistance with the MCP directory API, please join our Discord server