refactor: move global environment selector to top (#2848)
* refactor: moved global env to top * fix: change to my collection and env when logedout * fix: merge fix * refactor: change v-show to v-if * chore: minor type change * chore: pass variable name to edit * chore: improve logic Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com> * chore: minor ui improvements Co-authored-by: Liyas Thomas <liyascthomas@gmail.com> Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
This commit is contained in:
3
packages/hoppscotch-app/src/components.d.ts
vendored
3
packages/hoppscotch-app/src/components.d.ts
vendored
@@ -55,6 +55,7 @@ declare module '@vue/runtime-core' {
|
|||||||
CollectionsTeamsRequest: typeof import('./components/collections/teams/Request.vue')['default']
|
CollectionsTeamsRequest: typeof import('./components/collections/teams/Request.vue')['default']
|
||||||
Environments: typeof import('./components/environments/index.vue')['default']
|
Environments: typeof import('./components/environments/index.vue')['default']
|
||||||
EnvironmentsChooseType: typeof import('./components/environments/ChooseType.vue')['default']
|
EnvironmentsChooseType: typeof import('./components/environments/ChooseType.vue')['default']
|
||||||
|
EnvironmentsDetail: typeof import('./components/environments/Detail.vue')['default']
|
||||||
EnvironmentsImportExport: typeof import('./components/environments/ImportExport.vue')['default']
|
EnvironmentsImportExport: typeof import('./components/environments/ImportExport.vue')['default']
|
||||||
EnvironmentsMy: typeof import('./components/environments/my/index.vue')['default']
|
EnvironmentsMy: typeof import('./components/environments/my/index.vue')['default']
|
||||||
EnvironmentsMyDetails: typeof import('./components/environments/my/Details.vue')['default']
|
EnvironmentsMyDetails: typeof import('./components/environments/my/Details.vue')['default']
|
||||||
@@ -100,6 +101,7 @@ declare module '@vue/runtime-core' {
|
|||||||
IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default']
|
IconLucideArrowLeft: typeof import('~icons/lucide/arrow-left')['default']
|
||||||
IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default']
|
IconLucideCheckCircle: typeof import('~icons/lucide/check-circle')['default']
|
||||||
IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default']
|
IconLucideChevronRight: typeof import('~icons/lucide/chevron-right')['default']
|
||||||
|
IconLucideGlobe: typeof import('~icons/lucide/globe')['default']
|
||||||
IconLucideInbox: typeof import('~icons/lucide/inbox')['default']
|
IconLucideInbox: typeof import('~icons/lucide/inbox')['default']
|
||||||
IconLucideInfo: typeof import('~icons/lucide/info')['default']
|
IconLucideInfo: typeof import('~icons/lucide/info')['default']
|
||||||
IconLucideLayers: typeof import('~icons/lucide/layers')['default']
|
IconLucideLayers: typeof import('~icons/lucide/layers')['default']
|
||||||
@@ -108,7 +110,6 @@ declare module '@vue/runtime-core' {
|
|||||||
IconLucideSearch: typeof import('~icons/lucide/search')['default']
|
IconLucideSearch: typeof import('~icons/lucide/search')['default']
|
||||||
IconLucideUser: typeof import('~icons/lucide/user')['default']
|
IconLucideUser: typeof import('~icons/lucide/user')['default']
|
||||||
IconLucideUsers: typeof import('~icons/lucide/users')['default']
|
IconLucideUsers: typeof import('~icons/lucide/users')['default']
|
||||||
IconLucideVerified: typeof import('~icons/lucide/verified')['default']
|
|
||||||
LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default']
|
LensesHeadersRenderer: typeof import('./components/lenses/HeadersRenderer.vue')['default']
|
||||||
LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default']
|
LensesHeadersRendererEntry: typeof import('./components/lenses/HeadersRendererEntry.vue')['default']
|
||||||
LensesRenderersHTMLLensRenderer: typeof import('./components/lenses/renderers/HTMLLensRenderer.vue')['default']
|
LensesRenderersHTMLLensRenderer: typeof import('./components/lenses/renderers/HTMLLensRenderer.vue')['default']
|
||||||
|
|||||||
@@ -130,6 +130,15 @@ onLoggedIn(() => {
|
|||||||
adapter.initialize()
|
adapter.initialize()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => currentUser.value,
|
||||||
|
(user) => {
|
||||||
|
if (!user) {
|
||||||
|
selectedCollectionTab.value = "my-collections"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
const onTeamSelectIntersect = () => {
|
const onTeamSelectIntersect = () => {
|
||||||
// Load team data as soon as intersection
|
// Load team data as soon as intersection
|
||||||
adapter.fetchList()
|
adapter.fetchList()
|
||||||
|
|||||||
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, watch } from "vue"
|
import { ref, watch } from "vue"
|
||||||
import { Team } from "~/helpers/backend/graphql"
|
import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
|
||||||
import { onLoggedIn } from "@composables/auth"
|
import { onLoggedIn } from "@composables/auth"
|
||||||
import { currentUserInfo$ } from "~/helpers/teams/BackendUserInfo"
|
import { currentUserInfo$ } from "~/helpers/teams/BackendUserInfo"
|
||||||
import TeamListAdapter from "~/helpers/teams/TeamListAdapter"
|
import TeamListAdapter from "~/helpers/teams/TeamListAdapter"
|
||||||
@@ -89,7 +89,9 @@ import IconUsers from "~icons/lucide/users"
|
|||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
type SelectedTeam = Team | undefined
|
type TeamData = GetMyTeamsQuery["myTeams"][number]
|
||||||
|
|
||||||
|
type SelectedTeam = TeamData | undefined
|
||||||
|
|
||||||
type EnvironmentTabs = "my-environments" | "team-environments"
|
type EnvironmentTabs = "my-environments" | "team-environments"
|
||||||
|
|
||||||
@@ -126,6 +128,15 @@ watch(myTeams, (teams) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(
|
||||||
|
() => currentUser.value,
|
||||||
|
(user) => {
|
||||||
|
if (!user) {
|
||||||
|
selectedEnvironmentTab.value = "my-environments"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
onLoggedIn(() => {
|
onLoggedIn(() => {
|
||||||
adapter.initialize()
|
adapter.initialize()
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -149,20 +149,33 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</tippy>
|
</tippy>
|
||||||
|
<EnvironmentsMyEnvironment
|
||||||
|
environment-index="Global"
|
||||||
|
:environment="globalEnvironment"
|
||||||
|
class="border-b border-dividerLight"
|
||||||
|
@edit-environment="editEnvironment('Global')"
|
||||||
|
/>
|
||||||
<EnvironmentsChooseType
|
<EnvironmentsChooseType
|
||||||
:environment-type="environmentType"
|
:environment-type="environmentType"
|
||||||
@update-environment-type="updateEnvironmentType"
|
@update-environment-type="updateEnvironmentType"
|
||||||
@update-selected-team="updateSelectedTeam"
|
@update-selected-team="updateSelectedTeam"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<EnvironmentsMy v-show="environmentType.type === 'my-environments'" />
|
<EnvironmentsMy v-if="environmentType.type === 'my-environments'" />
|
||||||
<EnvironmentsTeams
|
<EnvironmentsTeams
|
||||||
v-show="environmentType.type === 'team-environments'"
|
v-if="environmentType.type === 'team-environments'"
|
||||||
:team="environmentType.selectedTeam"
|
:team="environmentType.selectedTeam"
|
||||||
:team-environments="teamEnvironmentList"
|
:team-environments="teamEnvironmentList"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
:adapter-error="adapterError"
|
:adapter-error="adapterError"
|
||||||
/>
|
/>
|
||||||
|
<EnvironmentsMyDetails
|
||||||
|
:show="showModalDetails"
|
||||||
|
:action="action"
|
||||||
|
:editing-environment-index="editingEnvironmentIndex"
|
||||||
|
:editing-variable-name="editingVariableName"
|
||||||
|
@hide-modal="displayModalEdit(false)"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -175,6 +188,7 @@ import { useReadonlyStream, useStream } from "@composables/stream"
|
|||||||
import { useI18n } from "~/composables/i18n"
|
import { useI18n } from "~/composables/i18n"
|
||||||
import {
|
import {
|
||||||
environments$,
|
environments$,
|
||||||
|
globalEnv$,
|
||||||
selectedEnvironmentIndex$,
|
selectedEnvironmentIndex$,
|
||||||
setSelectedEnvironmentIndex,
|
setSelectedEnvironmentIndex,
|
||||||
} from "~/newstore/environments"
|
} from "~/newstore/environments"
|
||||||
@@ -182,6 +196,7 @@ import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter"
|
|||||||
import { GQLError } from "~/helpers/backend/GQLClient"
|
import { GQLError } from "~/helpers/backend/GQLClient"
|
||||||
import IconCheck from "~icons/lucide/check"
|
import IconCheck from "~icons/lucide/check"
|
||||||
import { TippyComponent } from "vue-tippy"
|
import { TippyComponent } from "vue-tippy"
|
||||||
|
import { defineActionHandler } from "~/helpers/actions"
|
||||||
|
|
||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
|
|
||||||
@@ -199,6 +214,13 @@ const environmentType = ref<EnvironmentsChooseType>({
|
|||||||
selectedTeam: undefined,
|
selectedTeam: undefined,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const globalEnv = useReadonlyStream(globalEnv$, [])
|
||||||
|
|
||||||
|
const globalEnvironment = computed(() => ({
|
||||||
|
name: "Global",
|
||||||
|
variables: globalEnv.value,
|
||||||
|
}))
|
||||||
|
|
||||||
const currentUser = useReadonlyStream(currentUser$, null)
|
const currentUser = useReadonlyStream(currentUser$, null)
|
||||||
|
|
||||||
const updateSelectedTeam = (newSelectedTeam: SelectedTeam) => {
|
const updateSelectedTeam = (newSelectedTeam: SelectedTeam) => {
|
||||||
@@ -233,6 +255,36 @@ watch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const showModalDetails = ref(false)
|
||||||
|
const action = ref<"new" | "edit">("edit")
|
||||||
|
const editingEnvironmentIndex = ref<"Global" | null>(null)
|
||||||
|
const editingVariableName = ref("")
|
||||||
|
|
||||||
|
const displayModalEdit = (shouldDisplay: boolean) => {
|
||||||
|
action.value = "edit"
|
||||||
|
showModalDetails.value = shouldDisplay
|
||||||
|
|
||||||
|
if (!shouldDisplay) resetSelectedData()
|
||||||
|
}
|
||||||
|
|
||||||
|
const editEnvironment = (environmentIndex: "Global") => {
|
||||||
|
editingEnvironmentIndex.value = environmentIndex
|
||||||
|
action.value = "edit"
|
||||||
|
displayModalEdit(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetSelectedData = () => {
|
||||||
|
editingEnvironmentIndex.value = null
|
||||||
|
}
|
||||||
|
|
||||||
|
defineActionHandler(
|
||||||
|
"modals.my.environment.edit",
|
||||||
|
({ envName, variableName }) => {
|
||||||
|
editingVariableName.value = variableName
|
||||||
|
envName === "Global" && editEnvironment("Global")
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
const myEnvironments = useReadonlyStream(environments$, [])
|
const myEnvironments = useReadonlyStream(environments$, [])
|
||||||
|
|
||||||
const selectedEnvironmentIndex = useStream(
|
const selectedEnvironmentIndex = useStream(
|
||||||
|
|||||||
@@ -172,6 +172,7 @@ const props = withDefaults(
|
|||||||
show: false,
|
show: false,
|
||||||
action: "edit",
|
action: "edit",
|
||||||
editingEnvironmentIndex: null,
|
editingEnvironmentIndex: null,
|
||||||
|
editingVariableName: null,
|
||||||
envVars: () => [],
|
envVars: () => [],
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -4,6 +4,14 @@
|
|||||||
@contextmenu.prevent="options!.tippy.show()"
|
@contextmenu.prevent="options!.tippy.show()"
|
||||||
>
|
>
|
||||||
<span
|
<span
|
||||||
|
v-if="environmentIndex === 'Global'"
|
||||||
|
class="flex items-center justify-center px-4 cursor-pointer"
|
||||||
|
@click="emit('edit-environment')"
|
||||||
|
>
|
||||||
|
<icon-lucide-globe class="svg-icons" />
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
v-else
|
||||||
class="flex items-center justify-center px-4 cursor-pointer"
|
class="flex items-center justify-center px-4 cursor-pointer"
|
||||||
@click="emit('edit-environment')"
|
@click="emit('edit-environment')"
|
||||||
>
|
>
|
||||||
@@ -70,7 +78,7 @@
|
|||||||
"
|
"
|
||||||
/>
|
/>
|
||||||
<SmartItem
|
<SmartItem
|
||||||
v-if="!(environmentIndex === 'Global')"
|
v-if="environmentIndex !== 'Global'"
|
||||||
ref="deleteAction"
|
ref="deleteAction"
|
||||||
:icon="IconTrash2"
|
:icon="IconTrash2"
|
||||||
:label="`${t('action.delete')}`"
|
:label="`${t('action.delete')}`"
|
||||||
|
|||||||
@@ -25,12 +25,6 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<EnvironmentsMyEnvironment
|
|
||||||
environment-index="Global"
|
|
||||||
:environment="globalEnvironment"
|
|
||||||
class="border-b border-dashed border-dividerLight"
|
|
||||||
@edit-environment="editEnvironment('Global')"
|
|
||||||
/>
|
|
||||||
<EnvironmentsMyEnvironment
|
<EnvironmentsMyEnvironment
|
||||||
v-for="(environment, index) in environments"
|
v-for="(environment, index) in environments"
|
||||||
:key="`environment-${index}`"
|
:key="`environment-${index}`"
|
||||||
@@ -38,7 +32,6 @@
|
|||||||
:environment="environment"
|
:environment="environment"
|
||||||
@edit-environment="editEnvironment(index)"
|
@edit-environment="editEnvironment(index)"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-if="environments.length === 0"
|
v-if="environments.length === 0"
|
||||||
class="flex flex-col items-center justify-center p-4 text-secondaryLight"
|
class="flex flex-col items-center justify-center p-4 text-secondaryLight"
|
||||||
@@ -76,8 +69,8 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { computed, ref } from "vue"
|
import { ref } from "vue"
|
||||||
import { environments$, globalEnv$ } from "~/newstore/environments"
|
import { environments$ } from "~/newstore/environments"
|
||||||
import { useColorMode } from "~/composables/theming"
|
import { useColorMode } from "~/composables/theming"
|
||||||
import { useReadonlyStream } from "@composables/stream"
|
import { useReadonlyStream } from "@composables/stream"
|
||||||
import { useI18n } from "~/composables/i18n"
|
import { useI18n } from "~/composables/i18n"
|
||||||
@@ -90,19 +83,12 @@ import { defineActionHandler } from "~/helpers/actions"
|
|||||||
const t = useI18n()
|
const t = useI18n()
|
||||||
const colorMode = useColorMode()
|
const colorMode = useColorMode()
|
||||||
|
|
||||||
const globalEnv = useReadonlyStream(globalEnv$, [])
|
|
||||||
|
|
||||||
const globalEnvironment = computed(() => ({
|
|
||||||
name: "Global",
|
|
||||||
variables: globalEnv.value,
|
|
||||||
}))
|
|
||||||
|
|
||||||
const environments = useReadonlyStream(environments$, [])
|
const environments = useReadonlyStream(environments$, [])
|
||||||
|
|
||||||
const showModalImportExport = ref(false)
|
const showModalImportExport = ref(false)
|
||||||
const showModalDetails = ref(false)
|
const showModalDetails = ref(false)
|
||||||
const action = ref<"new" | "edit">("edit")
|
const action = ref<"new" | "edit">("edit")
|
||||||
const editingEnvironmentIndex = ref<number | "Global" | null>(null)
|
const editingEnvironmentIndex = ref<number | null>(null)
|
||||||
const editingVariableName = ref("")
|
const editingVariableName = ref("")
|
||||||
|
|
||||||
const displayModalAdd = (shouldDisplay: boolean) => {
|
const displayModalAdd = (shouldDisplay: boolean) => {
|
||||||
@@ -118,7 +104,7 @@ const displayModalEdit = (shouldDisplay: boolean) => {
|
|||||||
const displayModalImportExport = (shouldDisplay: boolean) => {
|
const displayModalImportExport = (shouldDisplay: boolean) => {
|
||||||
showModalImportExport.value = shouldDisplay
|
showModalImportExport.value = shouldDisplay
|
||||||
}
|
}
|
||||||
const editEnvironment = (environmentIndex: number | "Global") => {
|
const editEnvironment = (environmentIndex: number) => {
|
||||||
editingEnvironmentIndex.value = environmentIndex
|
editingEnvironmentIndex.value = environmentIndex
|
||||||
action.value = "edit"
|
action.value = "edit"
|
||||||
displayModalEdit(true)
|
displayModalEdit(true)
|
||||||
@@ -136,7 +122,7 @@ defineActionHandler(
|
|||||||
return environment.name === envName
|
return environment.name === envName
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
editEnvironment(envIndex >= 0 ? envIndex : "Global")
|
if (envName !== "Global") editEnvironment(envIndex)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
Reference in New Issue
Block a user