@scalar/api-client 2.38.2 → 2.38.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/{AddressBar-B4xnl66I.js → AddressBar-CX8xiYoe.js} +4 -4
- package/dist/{AddressBar-B4xnl66I.js.map → AddressBar-CX8xiYoe.js.map} +1 -1
- package/dist/{App-BVH4lIe8.js → App-BpNPKHmM.js} +4 -4
- package/dist/{App-BVH4lIe8.js.map → App-BpNPKHmM.js.map} +1 -1
- package/dist/{App-CvClwSlM.js → App-Ckirvnv1.js} +2 -2
- package/dist/{App-CvClwSlM.js.map → App-Ckirvnv1.js.map} +1 -1
- package/dist/{CodeInput-C-igR77V.js → CodeInput-BN7uw3Bh.js} +2 -2
- package/dist/{CodeInput-C-igR77V.js.map → CodeInput-BN7uw3Bh.js.map} +1 -1
- package/dist/{Collection-4MT9WmDD.js → Collection-ChAxs3rz.js} +2 -2
- package/dist/{Collection-4MT9WmDD.js.map → Collection-ChAxs3rz.js.map} +1 -1
- package/dist/{CollectionAuthentication-MHWQpw74.js → CollectionAuthentication-BDpvv8cA.js} +5 -5
- package/dist/{CollectionAuthentication-MHWQpw74.js.map → CollectionAuthentication-BDpvv8cA.js.map} +1 -1
- package/dist/{CollectionEnvironment-Dw35vIqo.js → CollectionEnvironment-dwisJ-h5.js} +4 -4
- package/dist/{CollectionEnvironment-Dw35vIqo.js.map → CollectionEnvironment-dwisJ-h5.js.map} +1 -1
- package/dist/{CollectionOverview-TUdDIu5f.js → CollectionOverview-CJ9-Vmei.js} +3 -3
- package/dist/{CollectionOverview-TUdDIu5f.js.map → CollectionOverview-CJ9-Vmei.js.map} +1 -1
- package/dist/{CollectionServers-BrjTCfDe.js → CollectionServers-BWkIGwz4.js} +5 -5
- package/dist/{CollectionServers-BrjTCfDe.js.map → CollectionServers-BWkIGwz4.js.map} +1 -1
- package/dist/{CollectionSettings-HVSlp2Gv.js → CollectionSettings-CqUUYOym.js} +2 -2
- package/dist/{CollectionSettings-HVSlp2Gv.js.map → CollectionSettings-CqUUYOym.js.map} +1 -1
- package/dist/{CommandPalette-CL8k4CoN.js → CommandPalette-BiA0IgO8.js} +2 -2
- package/dist/{CommandPalette-CL8k4CoN.js.map → CommandPalette-BiA0IgO8.js.map} +1 -1
- package/dist/{Cookies-DbOKTi1f.js → Cookies-CNRSxP8J.js} +8 -8
- package/dist/{Cookies-DbOKTi1f.js.map → Cookies-CNRSxP8J.js.map} +1 -1
- package/dist/{DataTableInput-yaU5g-kP.js → DataTableInput-SkIUPlrB.js} +2 -2
- package/dist/{DataTableInput-yaU5g-kP.js.map → DataTableInput-SkIUPlrB.js.map} +1 -1
- package/dist/{Environment-DJatRQIg.js → Environment-D_CbZk0A.js} +5 -5
- package/dist/{Environment-DJatRQIg.js.map → Environment-D_CbZk0A.js.map} +1 -1
- package/dist/{EnvironmentModal-DBEJ4Kzj.js → EnvironmentModal-CcyqnPc2.js} +2 -2
- package/dist/{EnvironmentModal-DBEJ4Kzj.js.map → EnvironmentModal-CcyqnPc2.js.map} +1 -1
- package/dist/{Form-CSKzyHGO.js → Form-bA4bV_oA.js} +3 -3
- package/dist/{Form-CSKzyHGO.js.map → Form-bA4bV_oA.js.map} +1 -1
- package/dist/{ImportCollection-DfX1UQ5u.js → ImportCollection-BIYMxB9Q.js} +2 -2
- package/dist/{ImportCollection-DfX1UQ5u.js.map → ImportCollection-BIYMxB9Q.js.map} +1 -1
- package/dist/{MainLayout-BEFMl1ud.js → MainLayout-oMIJ5QXF.js} +3 -3
- package/dist/{MainLayout-BEFMl1ud.js.map → MainLayout-oMIJ5QXF.js.map} +1 -1
- package/dist/{Modal-sQ9vH6MN.js → Modal-DkOa_KK0.js} +2 -2
- package/dist/{Modal-sQ9vH6MN.js.map → Modal-DkOa_KK0.js.map} +1 -1
- package/dist/{Request-gscRsGQ8.js → Request-BWfYWyBa.js} +10 -10
- package/dist/{Request-gscRsGQ8.js.map → Request-BWfYWyBa.js.map} +1 -1
- package/dist/{RequestAuth-BzBfIysT.js → RequestAuth-BU6ubH-c.js} +3 -3
- package/dist/{RequestAuth-BzBfIysT.js.map → RequestAuth-BU6ubH-c.js.map} +1 -1
- package/dist/{RequestRoot-3Bj8JZD-.js → RequestRoot-7xhK5_qr.js} +7 -7
- package/dist/{RequestRoot-3Bj8JZD-.js.map → RequestRoot-7xhK5_qr.js.map} +1 -1
- package/dist/{RequestSection-HhdJj9hW.js → RequestSection-Bx8UHW-k.js} +4 -4
- package/dist/{RequestSection-HhdJj9hW.js.map → RequestSection-Bx8UHW-k.js.map} +1 -1
- package/dist/{ResponseSection-DMJ0tw8E.js → ResponseSection-CLrgLMN_.js} +3 -3
- package/dist/{ResponseSection-DMJ0tw8E.js.map → ResponseSection-CLrgLMN_.js.map} +1 -1
- package/dist/{Server-DnA_BzPS.js → Server-BS4zjUdO.js} +2 -2
- package/dist/{Server-DnA_BzPS.js.map → Server-BS4zjUdO.js.map} +1 -1
- package/dist/{Settings-CYZzdJPO.js → Settings-BuLKHzRY.js} +2 -2
- package/dist/{Settings-CYZzdJPO.js.map → Settings-BuLKHzRY.js.map} +1 -1
- package/dist/{Sidebar-C6AdX6-N.js → Sidebar-Xl9_nFXX.js} +2 -2
- package/dist/{Sidebar-C6AdX6-N.js.map → Sidebar-Xl9_nFXX.js.map} +1 -1
- package/dist/components/AddressBar/index.js +3 -3
- package/dist/components/CodeInput/index.js +1 -1
- package/dist/components/CommandPalette/index.js +1 -1
- package/dist/components/DataTable/index.js +2 -2
- package/dist/components/ImportCollection/index.js +1 -1
- package/dist/components/Server/index.js +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/index.js +4 -4
- package/dist/{components-CSxJTn6F.js → components-DfJHvSLM.js} +2 -2
- package/dist/{components-CSxJTn6F.js.map → components-DfJHvSLM.js.map} +1 -1
- package/dist/get-resolved-url-SybDPV0U.js +85 -0
- package/dist/get-resolved-url-SybDPV0U.js.map +1 -0
- package/dist/{get-server-url-o3On8CEr.js → get-server-url-UVN-dx79.js} +1 -1
- package/dist/{get-server-url-o3On8CEr.js.map → get-server-url-UVN-dx79.js.map} +1 -1
- package/dist/index.js +5 -5
- package/dist/layouts/App/index.js +3 -3
- package/dist/layouts/Modal/index.js +1 -1
- package/dist/layouts/Web/index.js +4 -4
- package/dist/libs/index.js +1 -1
- package/dist/{operation-block-BnMIKAOh.js → operation-block-DE-hoO03.js} +67 -17
- package/dist/operation-block-DE-hoO03.js.map +1 -0
- package/dist/{operation-code-sample-ZUTueV3v.js → operation-code-sample-xgx4qi2H.js} +22 -10
- package/dist/operation-code-sample-xgx4qi2H.js.map +1 -0
- package/dist/{request-block-DwsGy64Q.js → request-block-N7dPFyrG.js} +4 -4
- package/dist/{request-block-DwsGy64Q.js.map → request-block-N7dPFyrG.js.map} +1 -1
- package/dist/{scalar-address-bar-block--Vs6IBU1.js → scalar-address-bar-block-BbysOhkE.js} +2 -2
- package/dist/{scalar-address-bar-block--Vs6IBU1.js.map → scalar-address-bar-block-BbysOhkE.js.map} +1 -1
- package/dist/{scalar-auth-selector-block-DI3DLag9.js → scalar-auth-selector-block-Bs79QOMA.js} +12 -9
- package/dist/scalar-auth-selector-block-Bs79QOMA.js.map +1 -0
- package/dist/store/index.js +1 -1
- package/dist/{store-DpSUVhjp.js → store-DaPoVtIS.js} +15 -15
- package/dist/{store-DpSUVhjp.js.map → store-DaPoVtIS.js.map} +1 -1
- package/dist/style.css +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts +6 -0
- package/dist/v2/blocks/operation-block/helpers/apply-allow-reserved-to-url.d.ts.map +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-body.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts +1 -0
- package/dist/v2/blocks/operation-block/helpers/build-request-parameters.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/build-request.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts +2 -1
- package/dist/v2/blocks/operation-block/helpers/get-resolved-url.d.ts.map +1 -1
- package/dist/v2/blocks/operation-block/index.js +11 -11
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-body.d.ts.map +1 -1
- package/dist/v2/blocks/operation-code-sample/index.js +1 -1
- package/dist/v2/blocks/request-block/helpers/get-default-headers.d.ts.map +1 -1
- package/dist/v2/blocks/request-block/index.js +5 -5
- package/dist/v2/blocks/response-block/index.js +2 -2
- package/dist/v2/blocks/scalar-address-bar-block/index.js +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/extract-security-scheme-secrets.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/security-scheme.d.ts.map +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/index.js +3 -3
- package/dist/v2/constants.d.ts +3 -0
- package/dist/v2/constants.d.ts.map +1 -0
- package/dist/v2/features/app/components/index.js +4 -4
- package/dist/v2/features/app/index.js +14 -14
- package/dist/v2/features/app/index.js.map +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.d.ts.map +1 -1
- package/dist/v2/features/modal/index.js +10 -10
- package/dist/v2/features/operation/Operation.vue.d.ts.map +1 -1
- package/dist/v2/features/operation/helpers/get-selected-security.d.ts +6 -1
- package/dist/v2/features/operation/helpers/get-selected-security.d.ts.map +1 -1
- package/dist/v2/features/operation/index.js +10 -10
- package/dist/views/Request/RequestSection/RequestAuth/index.js +3 -3
- package/dist/views/Request/RequestSection/index.js +4 -4
- package/dist/views/Request/ResponseSection/index.js +3 -3
- package/dist/views/Request/components/index.js +1 -1
- package/package.json +13 -13
- package/dist/get-resolved-url-BUCwrBzc.js +0 -30
- package/dist/get-resolved-url-BUCwrBzc.js.map +0 -1
- package/dist/operation-block-BnMIKAOh.js.map +0 -1
- package/dist/operation-code-sample-ZUTueV3v.js.map +0 -1
- package/dist/scalar-auth-selector-block-DI3DLag9.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cookies-DbOKTi1f.js","names":[],"sources":["../src/views/Cookies/CookieForm.vue","../src/views/Cookies/CookieForm.vue","../src/views/Cookies/CookieModal.vue","../src/views/Cookies/CookieModal.vue","../src/views/Cookies/Cookies.vue","../src/views/Cookies/Cookies.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport type { Path, PathValue } from '@scalar/object-utils/nested'\nimport { computed } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst { activeCookieId } = useActiveEntities()\nconst { cookies, cookieMutators } = useWorkspace()\n\nconst fields = [\n { label: 'Name', key: 'name', placeholder: 'session_id' },\n { label: 'Value', key: 'value', placeholder: 'my-cookie-session-id' },\n { label: 'Domain', key: 'domain', placeholder: 'example.com' },\n // TODO: We don't check the path (yet), so we don't need to show it.\n // { label: 'Path', key: 'path', placeholder: '/' },\n]\n\nconst activeCookie = computed<Cookie>(\n () =>\n cookies[activeCookieId.value] ||\n cookieSchema.parse({\n name: '',\n value: '',\n domain: '',\n path: '',\n }),\n)\nconst updateCookie = <P extends Path<Cookie>>(\n key: P,\n value: NonNullable<PathValue<Cookie, P>>,\n) => {\n cookieMutators.edit(activeCookieId.value, key, value)\n}\n</script>\n<template>\n <Form\n :data=\"activeCookie\"\n :onUpdate=\"updateCookie\"\n :options=\"fields\">\n </Form>\n</template>\n","<script setup lang=\"ts\">\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport type { Path, PathValue } from '@scalar/object-utils/nested'\nimport { computed } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst { activeCookieId } = useActiveEntities()\nconst { cookies, cookieMutators } = useWorkspace()\n\nconst fields = [\n { label: 'Name', key: 'name', placeholder: 'session_id' },\n { label: 'Value', key: 'value', placeholder: 'my-cookie-session-id' },\n { label: 'Domain', key: 'domain', placeholder: 'example.com' },\n // TODO: We don't check the path (yet), so we don't need to show it.\n // { label: 'Path', key: 'path', placeholder: '/' },\n]\n\nconst activeCookie = computed<Cookie>(\n () =>\n cookies[activeCookieId.value] ||\n cookieSchema.parse({\n name: '',\n value: '',\n domain: '',\n path: '',\n }),\n)\nconst updateCookie = <P extends Path<Cookie>>(\n key: P,\n value: NonNullable<PathValue<Cookie, P>>,\n) => {\n cookieMutators.edit(activeCookieId.value, key, value)\n}\n</script>\n<template>\n <Form\n :data=\"activeCookie\"\n :onUpdate=\"updateCookie\"\n :options=\"fields\">\n </Form>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarModal, type ModalState } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref, watch } from 'vue'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport CommandActionInput from '@/components/CommandPalette/CommandActionInput.vue'\n\nconst props = defineProps<{\n state: ModalState\n}>()\n\nconst emit = defineEmits<{\n (event: 'cancel'): void\n (\n event: 'submit',\n cookieData: {\n name: string\n value: string\n domain: string\n },\n ): void\n}>()\n\nconst cookieData = ref({\n name: '',\n value: '',\n domain: '',\n})\n\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!cookieData.value.name || !cookieData.value.value) {\n toast('Please fill in all fields before adding a cookie.', 'error')\n return\n }\n\n emit('submit', cookieData.value)\n props.state.hide()\n}\n\n// Reset cookie data\nwatch(\n () => props.state.open,\n (isOpen) => {\n if (isOpen) {\n cookieData.value = {\n name: '',\n value: '',\n domain: '',\n }\n }\n },\n)\n</script>\n\n<template>\n <ScalarModal\n size=\"xs\"\n :state=\"state\"\n title=\"Add Cookie\">\n <CommandActionForm\n :disabled=\"!cookieData.name || !cookieData.value\"\n @cancel=\"emit('cancel')\"\n @submit=\"handleSubmit\">\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Name:\n <CommandActionInput\n v-model=\"cookieData.name\"\n autofocus\n class=\"!p-0\"\n placeholder=\"session_id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Value:\n <CommandActionInput\n v-model=\"cookieData.value\"\n autofocus\n class=\"!p-0\"\n placeholder=\"my-cookie-session-id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Domain:\n <CommandActionInput\n v-model=\"cookieData.domain\"\n autofocus\n class=\"!p-0\"\n placeholder=\"example.com\" />\n </div>\n <template #submit>Add Cookie</template>\n </CommandActionForm>\n </ScalarModal>\n</template>\n\n<style scoped>\n.form-group {\n margin-bottom: 1rem;\n}\n.modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarModal, type ModalState } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref, watch } from 'vue'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport CommandActionInput from '@/components/CommandPalette/CommandActionInput.vue'\n\nconst props = defineProps<{\n state: ModalState\n}>()\n\nconst emit = defineEmits<{\n (event: 'cancel'): void\n (\n event: 'submit',\n cookieData: {\n name: string\n value: string\n domain: string\n },\n ): void\n}>()\n\nconst cookieData = ref({\n name: '',\n value: '',\n domain: '',\n})\n\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!cookieData.value.name || !cookieData.value.value) {\n toast('Please fill in all fields before adding a cookie.', 'error')\n return\n }\n\n emit('submit', cookieData.value)\n props.state.hide()\n}\n\n// Reset cookie data\nwatch(\n () => props.state.open,\n (isOpen) => {\n if (isOpen) {\n cookieData.value = {\n name: '',\n value: '',\n domain: '',\n }\n }\n },\n)\n</script>\n\n<template>\n <ScalarModal\n size=\"xs\"\n :state=\"state\"\n title=\"Add Cookie\">\n <CommandActionForm\n :disabled=\"!cookieData.name || !cookieData.value\"\n @cancel=\"emit('cancel')\"\n @submit=\"handleSubmit\">\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Name:\n <CommandActionInput\n v-model=\"cookieData.name\"\n autofocus\n class=\"!p-0\"\n placeholder=\"session_id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Value:\n <CommandActionInput\n v-model=\"cookieData.value\"\n autofocus\n class=\"!p-0\"\n placeholder=\"my-cookie-session-id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Domain:\n <CommandActionInput\n v-model=\"cookieData.domain\"\n autofocus\n class=\"!p-0\"\n placeholder=\"example.com\" />\n </div>\n <template #submit>Add Cookie</template>\n </CommandActionForm>\n </ScalarModal>\n</template>\n\n<style scoped>\n.form-group {\n margin-bottom: 1rem;\n}\n.modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useModal } from '@scalar/components'\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport { computed, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport { Sidebar } from '@/components'\nimport EmptyState from '@/components/EmptyState.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { HotKeyEvent } from '@/libs'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nimport CookieForm from './CookieForm.vue'\nimport CookieModal from './CookieModal.vue'\n\n// import CookieRaw from './CookieRaw.vue'\n\nconst { cookies, cookieMutators, events, workspaceMutators } = useWorkspace()\nconst { activeWorkspace, activeCookieId } = useActiveEntities()\nconst router = useRouter()\nconst route = useRoute()\nconst cookieModal = useModal()\n\nconst addCookieHandler = (cookieData: {\n name: string\n value: string\n domain: string\n}) => {\n const cookie = cookieSchema.parse({\n name: cookieData.name,\n value: cookieData.value,\n domain: cookieData.domain,\n path: '/',\n })\n\n // Store cookie\n cookieMutators.add(cookie)\n\n // Attach cookie to workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []),\n cookie.uid,\n ])\n\n // Redirect to the new cookie\n router.push({\n name: 'cookies',\n params: {\n cookies: cookie.uid,\n },\n })\n}\n\nconst removeCookie = (uid: Cookie['uid']) => {\n cookieMutators.delete(uid)\n\n // Delete cookie from workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []).filter((c) => c !== uid),\n ])\n\n // Navigate to the last cookie\n const remainingCookies: Cookie[] = Object.values(cookies).filter(\n (cookie) => (cookie as Cookie).uid !== uid,\n ) as Cookie[]\n\n if (remainingCookies.length > 0) {\n const lastCookie = remainingCookies[remainingCookies.length - 1]\n\n if (lastCookie) {\n router.push(lastCookie.uid)\n }\n } else {\n router.push({\n name: 'cookies',\n params: {\n [PathId.Cookies]: 'default',\n },\n })\n }\n}\n\nconst openCookieModal = () => {\n cookieModal.show()\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'cookies') {\n openCookieModal()\n }\n}\n\n/**\n * Navigate to specific cookies\n */\nconst handleNavigation = (event: MouseEvent, uid: string) => {\n const to = {\n name: 'cookies',\n params: {\n workspace: activeWorkspace.value?.uid ?? 'default',\n cookies: uid,\n },\n }\n\n // Open in new tab if meta key is pressed\n if (event.metaKey) {\n const path = router.resolve(to).href\n\n window.open(path, '_blank')\n\n return\n }\n\n router.push(to)\n}\n\n/** Bind keyboard shortcuts */\nonMounted(() => events.hotKeys.on(handleHotKey))\n/** Unbind keyboard shortcuts */\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst activeCookie = computed<Cookie | undefined>(\n () => cookies[activeCookieId.value],\n)\n\nconst hasCookies = computed(\n () => Object.keys(cookies).length > 0 && activeCookie.value,\n)\n\nwatch(\n () => route.query.openCookieModal,\n (newVal) => {\n if (newVal === 'true') {\n openCookieModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Cookies\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <li\n v-for=\"cookie in Object.values(cookies)\"\n :key=\"cookie.uid\"\n class=\"gap-1/2 flex flex-col\">\n <div class=\"relative mb-[.5px] last:mb-0\">\n <SidebarListElement\n :key=\"cookie.uid\"\n class=\"text-xs\"\n isDeletable\n :to=\"{\n name: 'cookies',\n params: {\n [PathId.Cookies]: cookie.uid,\n },\n }\"\n type=\"cookies\"\n :variable=\"{ name: cookie.name, uid: cookie.uid }\"\n :warningMessage=\"`Are you sure you want to delete this cookie?`\"\n @click.prevent=\"handleNavigation($event, cookie.uid)\"\n @delete=\"removeCookie(cookie.uid)\" />\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openCookieModal\"\n hotkey=\"N\">\n <template #title> Add Cookie </template>\n </SidebarButton>\n </template>\n </Sidebar>\n\n <ViewLayoutContent class=\"flex-1\">\n <template v-if=\"hasCookies\">\n <ViewLayoutSection class=\"*:border-b-0\">\n <template #title>Edit Cookie</template>\n <CookieForm />\n <!-- Untested and disabled for now. -->\n <!-- <CookieRaw /> -->\n </ViewLayoutSection>\n </template>\n <EmptyState v-else />\n </ViewLayoutContent>\n\n <CookieModal\n :state=\"cookieModal\"\n @cancel=\"cookieModal.hide()\"\n @submit=\"addCookieHandler\" />\n </ViewLayout>\n</template>\n","<script setup lang=\"ts\">\nimport { useModal } from '@scalar/components'\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport { computed, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport { Sidebar } from '@/components'\nimport EmptyState from '@/components/EmptyState.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { HotKeyEvent } from '@/libs'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nimport CookieForm from './CookieForm.vue'\nimport CookieModal from './CookieModal.vue'\n\n// import CookieRaw from './CookieRaw.vue'\n\nconst { cookies, cookieMutators, events, workspaceMutators } = useWorkspace()\nconst { activeWorkspace, activeCookieId } = useActiveEntities()\nconst router = useRouter()\nconst route = useRoute()\nconst cookieModal = useModal()\n\nconst addCookieHandler = (cookieData: {\n name: string\n value: string\n domain: string\n}) => {\n const cookie = cookieSchema.parse({\n name: cookieData.name,\n value: cookieData.value,\n domain: cookieData.domain,\n path: '/',\n })\n\n // Store cookie\n cookieMutators.add(cookie)\n\n // Attach cookie to workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []),\n cookie.uid,\n ])\n\n // Redirect to the new cookie\n router.push({\n name: 'cookies',\n params: {\n cookies: cookie.uid,\n },\n })\n}\n\nconst removeCookie = (uid: Cookie['uid']) => {\n cookieMutators.delete(uid)\n\n // Delete cookie from workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []).filter((c) => c !== uid),\n ])\n\n // Navigate to the last cookie\n const remainingCookies: Cookie[] = Object.values(cookies).filter(\n (cookie) => (cookie as Cookie).uid !== uid,\n ) as Cookie[]\n\n if (remainingCookies.length > 0) {\n const lastCookie = remainingCookies[remainingCookies.length - 1]\n\n if (lastCookie) {\n router.push(lastCookie.uid)\n }\n } else {\n router.push({\n name: 'cookies',\n params: {\n [PathId.Cookies]: 'default',\n },\n })\n }\n}\n\nconst openCookieModal = () => {\n cookieModal.show()\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'cookies') {\n openCookieModal()\n }\n}\n\n/**\n * Navigate to specific cookies\n */\nconst handleNavigation = (event: MouseEvent, uid: string) => {\n const to = {\n name: 'cookies',\n params: {\n workspace: activeWorkspace.value?.uid ?? 'default',\n cookies: uid,\n },\n }\n\n // Open in new tab if meta key is pressed\n if (event.metaKey) {\n const path = router.resolve(to).href\n\n window.open(path, '_blank')\n\n return\n }\n\n router.push(to)\n}\n\n/** Bind keyboard shortcuts */\nonMounted(() => events.hotKeys.on(handleHotKey))\n/** Unbind keyboard shortcuts */\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst activeCookie = computed<Cookie | undefined>(\n () => cookies[activeCookieId.value],\n)\n\nconst hasCookies = computed(\n () => Object.keys(cookies).length > 0 && activeCookie.value,\n)\n\nwatch(\n () => route.query.openCookieModal,\n (newVal) => {\n if (newVal === 'true') {\n openCookieModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Cookies\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <li\n v-for=\"cookie in Object.values(cookies)\"\n :key=\"cookie.uid\"\n class=\"gap-1/2 flex flex-col\">\n <div class=\"relative mb-[.5px] last:mb-0\">\n <SidebarListElement\n :key=\"cookie.uid\"\n class=\"text-xs\"\n isDeletable\n :to=\"{\n name: 'cookies',\n params: {\n [PathId.Cookies]: cookie.uid,\n },\n }\"\n type=\"cookies\"\n :variable=\"{ name: cookie.name, uid: cookie.uid }\"\n :warningMessage=\"`Are you sure you want to delete this cookie?`\"\n @click.prevent=\"handleNavigation($event, cookie.uid)\"\n @delete=\"removeCookie(cookie.uid)\" />\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openCookieModal\"\n hotkey=\"N\">\n <template #title> Add Cookie </template>\n </SidebarButton>\n </template>\n </Sidebar>\n\n <ViewLayoutContent class=\"flex-1\">\n <template v-if=\"hasCookies\">\n <ViewLayoutSection class=\"*:border-b-0\">\n <template #title>Edit Cookie</template>\n <CookieForm />\n <!-- Untested and disabled for now. -->\n <!-- <CookieRaw /> -->\n </ViewLayoutSection>\n </template>\n <EmptyState v-else />\n </ViewLayoutContent>\n\n <CookieModal\n :state=\"cookieModal\"\n @cancel=\"cookieModal.hide()\"\n @submit=\"addCookieHandler\" />\n </ViewLayout>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Cookies-CNRSxP8J.js","names":[],"sources":["../src/views/Cookies/CookieForm.vue","../src/views/Cookies/CookieForm.vue","../src/views/Cookies/CookieModal.vue","../src/views/Cookies/CookieModal.vue","../src/views/Cookies/Cookies.vue","../src/views/Cookies/Cookies.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport type { Path, PathValue } from '@scalar/object-utils/nested'\nimport { computed } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst { activeCookieId } = useActiveEntities()\nconst { cookies, cookieMutators } = useWorkspace()\n\nconst fields = [\n { label: 'Name', key: 'name', placeholder: 'session_id' },\n { label: 'Value', key: 'value', placeholder: 'my-cookie-session-id' },\n { label: 'Domain', key: 'domain', placeholder: 'example.com' },\n // TODO: We don't check the path (yet), so we don't need to show it.\n // { label: 'Path', key: 'path', placeholder: '/' },\n]\n\nconst activeCookie = computed<Cookie>(\n () =>\n cookies[activeCookieId.value] ||\n cookieSchema.parse({\n name: '',\n value: '',\n domain: '',\n path: '',\n }),\n)\nconst updateCookie = <P extends Path<Cookie>>(\n key: P,\n value: NonNullable<PathValue<Cookie, P>>,\n) => {\n cookieMutators.edit(activeCookieId.value, key, value)\n}\n</script>\n<template>\n <Form\n :data=\"activeCookie\"\n :onUpdate=\"updateCookie\"\n :options=\"fields\">\n </Form>\n</template>\n","<script setup lang=\"ts\">\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport type { Path, PathValue } from '@scalar/object-utils/nested'\nimport { computed } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst { activeCookieId } = useActiveEntities()\nconst { cookies, cookieMutators } = useWorkspace()\n\nconst fields = [\n { label: 'Name', key: 'name', placeholder: 'session_id' },\n { label: 'Value', key: 'value', placeholder: 'my-cookie-session-id' },\n { label: 'Domain', key: 'domain', placeholder: 'example.com' },\n // TODO: We don't check the path (yet), so we don't need to show it.\n // { label: 'Path', key: 'path', placeholder: '/' },\n]\n\nconst activeCookie = computed<Cookie>(\n () =>\n cookies[activeCookieId.value] ||\n cookieSchema.parse({\n name: '',\n value: '',\n domain: '',\n path: '',\n }),\n)\nconst updateCookie = <P extends Path<Cookie>>(\n key: P,\n value: NonNullable<PathValue<Cookie, P>>,\n) => {\n cookieMutators.edit(activeCookieId.value, key, value)\n}\n</script>\n<template>\n <Form\n :data=\"activeCookie\"\n :onUpdate=\"updateCookie\"\n :options=\"fields\">\n </Form>\n</template>\n","<script setup lang=\"ts\">\nimport { ScalarModal, type ModalState } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref, watch } from 'vue'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport CommandActionInput from '@/components/CommandPalette/CommandActionInput.vue'\n\nconst props = defineProps<{\n state: ModalState\n}>()\n\nconst emit = defineEmits<{\n (event: 'cancel'): void\n (\n event: 'submit',\n cookieData: {\n name: string\n value: string\n domain: string\n },\n ): void\n}>()\n\nconst cookieData = ref({\n name: '',\n value: '',\n domain: '',\n})\n\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!cookieData.value.name || !cookieData.value.value) {\n toast('Please fill in all fields before adding a cookie.', 'error')\n return\n }\n\n emit('submit', cookieData.value)\n props.state.hide()\n}\n\n// Reset cookie data\nwatch(\n () => props.state.open,\n (isOpen) => {\n if (isOpen) {\n cookieData.value = {\n name: '',\n value: '',\n domain: '',\n }\n }\n },\n)\n</script>\n\n<template>\n <ScalarModal\n size=\"xs\"\n :state=\"state\"\n title=\"Add Cookie\">\n <CommandActionForm\n :disabled=\"!cookieData.name || !cookieData.value\"\n @cancel=\"emit('cancel')\"\n @submit=\"handleSubmit\">\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Name:\n <CommandActionInput\n v-model=\"cookieData.name\"\n autofocus\n class=\"!p-0\"\n placeholder=\"session_id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Value:\n <CommandActionInput\n v-model=\"cookieData.value\"\n autofocus\n class=\"!p-0\"\n placeholder=\"my-cookie-session-id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Domain:\n <CommandActionInput\n v-model=\"cookieData.domain\"\n autofocus\n class=\"!p-0\"\n placeholder=\"example.com\" />\n </div>\n <template #submit>Add Cookie</template>\n </CommandActionForm>\n </ScalarModal>\n</template>\n\n<style scoped>\n.form-group {\n margin-bottom: 1rem;\n}\n.modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarModal, type ModalState } from '@scalar/components'\nimport { useToasts } from '@scalar/use-toasts'\nimport { ref, watch } from 'vue'\n\nimport CommandActionForm from '@/components/CommandPalette/CommandActionForm.vue'\nimport CommandActionInput from '@/components/CommandPalette/CommandActionInput.vue'\n\nconst props = defineProps<{\n state: ModalState\n}>()\n\nconst emit = defineEmits<{\n (event: 'cancel'): void\n (\n event: 'submit',\n cookieData: {\n name: string\n value: string\n domain: string\n },\n ): void\n}>()\n\nconst cookieData = ref({\n name: '',\n value: '',\n domain: '',\n})\n\nconst { toast } = useToasts()\n\nconst handleSubmit = () => {\n if (!cookieData.value.name || !cookieData.value.value) {\n toast('Please fill in all fields before adding a cookie.', 'error')\n return\n }\n\n emit('submit', cookieData.value)\n props.state.hide()\n}\n\n// Reset cookie data\nwatch(\n () => props.state.open,\n (isOpen) => {\n if (isOpen) {\n cookieData.value = {\n name: '',\n value: '',\n domain: '',\n }\n }\n },\n)\n</script>\n\n<template>\n <ScalarModal\n size=\"xs\"\n :state=\"state\"\n title=\"Add Cookie\">\n <CommandActionForm\n :disabled=\"!cookieData.name || !cookieData.value\"\n @cancel=\"emit('cancel')\"\n @submit=\"handleSubmit\">\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Name:\n <CommandActionInput\n v-model=\"cookieData.name\"\n autofocus\n class=\"!p-0\"\n placeholder=\"session_id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Value:\n <CommandActionInput\n v-model=\"cookieData.value\"\n autofocus\n class=\"!p-0\"\n placeholder=\"my-cookie-session-id\" />\n </div>\n <div class=\"flex h-8 items-start gap-2 text-sm\">\n Domain:\n <CommandActionInput\n v-model=\"cookieData.domain\"\n autofocus\n class=\"!p-0\"\n placeholder=\"example.com\" />\n </div>\n <template #submit>Add Cookie</template>\n </CommandActionForm>\n </ScalarModal>\n</template>\n\n<style scoped>\n.form-group {\n margin-bottom: 1rem;\n}\n.modal-actions {\n display: flex;\n justify-content: flex-end;\n gap: 1rem;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { useModal } from '@scalar/components'\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport { computed, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport { Sidebar } from '@/components'\nimport EmptyState from '@/components/EmptyState.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { HotKeyEvent } from '@/libs'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nimport CookieForm from './CookieForm.vue'\nimport CookieModal from './CookieModal.vue'\n\n// import CookieRaw from './CookieRaw.vue'\n\nconst { cookies, cookieMutators, events, workspaceMutators } = useWorkspace()\nconst { activeWorkspace, activeCookieId } = useActiveEntities()\nconst router = useRouter()\nconst route = useRoute()\nconst cookieModal = useModal()\n\nconst addCookieHandler = (cookieData: {\n name: string\n value: string\n domain: string\n}) => {\n const cookie = cookieSchema.parse({\n name: cookieData.name,\n value: cookieData.value,\n domain: cookieData.domain,\n path: '/',\n })\n\n // Store cookie\n cookieMutators.add(cookie)\n\n // Attach cookie to workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []),\n cookie.uid,\n ])\n\n // Redirect to the new cookie\n router.push({\n name: 'cookies',\n params: {\n cookies: cookie.uid,\n },\n })\n}\n\nconst removeCookie = (uid: Cookie['uid']) => {\n cookieMutators.delete(uid)\n\n // Delete cookie from workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []).filter((c) => c !== uid),\n ])\n\n // Navigate to the last cookie\n const remainingCookies: Cookie[] = Object.values(cookies).filter(\n (cookie) => (cookie as Cookie).uid !== uid,\n ) as Cookie[]\n\n if (remainingCookies.length > 0) {\n const lastCookie = remainingCookies[remainingCookies.length - 1]\n\n if (lastCookie) {\n router.push(lastCookie.uid)\n }\n } else {\n router.push({\n name: 'cookies',\n params: {\n [PathId.Cookies]: 'default',\n },\n })\n }\n}\n\nconst openCookieModal = () => {\n cookieModal.show()\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'cookies') {\n openCookieModal()\n }\n}\n\n/**\n * Navigate to specific cookies\n */\nconst handleNavigation = (event: MouseEvent, uid: string) => {\n const to = {\n name: 'cookies',\n params: {\n workspace: activeWorkspace.value?.uid ?? 'default',\n cookies: uid,\n },\n }\n\n // Open in new tab if meta key is pressed\n if (event.metaKey) {\n const path = router.resolve(to).href\n\n window.open(path, '_blank')\n\n return\n }\n\n router.push(to)\n}\n\n/** Bind keyboard shortcuts */\nonMounted(() => events.hotKeys.on(handleHotKey))\n/** Unbind keyboard shortcuts */\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst activeCookie = computed<Cookie | undefined>(\n () => cookies[activeCookieId.value],\n)\n\nconst hasCookies = computed(\n () => Object.keys(cookies).length > 0 && activeCookie.value,\n)\n\nwatch(\n () => route.query.openCookieModal,\n (newVal) => {\n if (newVal === 'true') {\n openCookieModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Cookies\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <li\n v-for=\"cookie in Object.values(cookies)\"\n :key=\"cookie.uid\"\n class=\"gap-1/2 flex flex-col\">\n <div class=\"relative mb-[.5px] last:mb-0\">\n <SidebarListElement\n :key=\"cookie.uid\"\n class=\"text-xs\"\n isDeletable\n :to=\"{\n name: 'cookies',\n params: {\n [PathId.Cookies]: cookie.uid,\n },\n }\"\n type=\"cookies\"\n :variable=\"{ name: cookie.name, uid: cookie.uid }\"\n :warningMessage=\"`Are you sure you want to delete this cookie?`\"\n @click.prevent=\"handleNavigation($event, cookie.uid)\"\n @delete=\"removeCookie(cookie.uid)\" />\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openCookieModal\"\n hotkey=\"N\">\n <template #title> Add Cookie </template>\n </SidebarButton>\n </template>\n </Sidebar>\n\n <ViewLayoutContent class=\"flex-1\">\n <template v-if=\"hasCookies\">\n <ViewLayoutSection class=\"*:border-b-0\">\n <template #title>Edit Cookie</template>\n <CookieForm />\n <!-- Untested and disabled for now. -->\n <!-- <CookieRaw /> -->\n </ViewLayoutSection>\n </template>\n <EmptyState v-else />\n </ViewLayoutContent>\n\n <CookieModal\n :state=\"cookieModal\"\n @cancel=\"cookieModal.hide()\"\n @submit=\"addCookieHandler\" />\n </ViewLayout>\n</template>\n","<script setup lang=\"ts\">\nimport { useModal } from '@scalar/components'\nimport { cookieSchema, type Cookie } from '@scalar/oas-utils/entities/cookie'\nimport { computed, onBeforeUnmount, onMounted, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport { Sidebar } from '@/components'\nimport EmptyState from '@/components/EmptyState.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport type { HotKeyEvent } from '@/libs'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nimport CookieForm from './CookieForm.vue'\nimport CookieModal from './CookieModal.vue'\n\n// import CookieRaw from './CookieRaw.vue'\n\nconst { cookies, cookieMutators, events, workspaceMutators } = useWorkspace()\nconst { activeWorkspace, activeCookieId } = useActiveEntities()\nconst router = useRouter()\nconst route = useRoute()\nconst cookieModal = useModal()\n\nconst addCookieHandler = (cookieData: {\n name: string\n value: string\n domain: string\n}) => {\n const cookie = cookieSchema.parse({\n name: cookieData.name,\n value: cookieData.value,\n domain: cookieData.domain,\n path: '/',\n })\n\n // Store cookie\n cookieMutators.add(cookie)\n\n // Attach cookie to workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []),\n cookie.uid,\n ])\n\n // Redirect to the new cookie\n router.push({\n name: 'cookies',\n params: {\n cookies: cookie.uid,\n },\n })\n}\n\nconst removeCookie = (uid: Cookie['uid']) => {\n cookieMutators.delete(uid)\n\n // Delete cookie from workspace\n workspaceMutators.edit(activeWorkspace.value?.uid, 'cookies', [\n ...(activeWorkspace.value?.cookies ?? []).filter((c) => c !== uid),\n ])\n\n // Navigate to the last cookie\n const remainingCookies: Cookie[] = Object.values(cookies).filter(\n (cookie) => (cookie as Cookie).uid !== uid,\n ) as Cookie[]\n\n if (remainingCookies.length > 0) {\n const lastCookie = remainingCookies[remainingCookies.length - 1]\n\n if (lastCookie) {\n router.push(lastCookie.uid)\n }\n } else {\n router.push({\n name: 'cookies',\n params: {\n [PathId.Cookies]: 'default',\n },\n })\n }\n}\n\nconst openCookieModal = () => {\n cookieModal.show()\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'cookies') {\n openCookieModal()\n }\n}\n\n/**\n * Navigate to specific cookies\n */\nconst handleNavigation = (event: MouseEvent, uid: string) => {\n const to = {\n name: 'cookies',\n params: {\n workspace: activeWorkspace.value?.uid ?? 'default',\n cookies: uid,\n },\n }\n\n // Open in new tab if meta key is pressed\n if (event.metaKey) {\n const path = router.resolve(to).href\n\n window.open(path, '_blank')\n\n return\n }\n\n router.push(to)\n}\n\n/** Bind keyboard shortcuts */\nonMounted(() => events.hotKeys.on(handleHotKey))\n/** Unbind keyboard shortcuts */\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst activeCookie = computed<Cookie | undefined>(\n () => cookies[activeCookieId.value],\n)\n\nconst hasCookies = computed(\n () => Object.keys(cookies).length > 0 && activeCookie.value,\n)\n\nwatch(\n () => route.query.openCookieModal,\n (newVal) => {\n if (newVal === 'true') {\n openCookieModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Cookies\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <li\n v-for=\"cookie in Object.values(cookies)\"\n :key=\"cookie.uid\"\n class=\"gap-1/2 flex flex-col\">\n <div class=\"relative mb-[.5px] last:mb-0\">\n <SidebarListElement\n :key=\"cookie.uid\"\n class=\"text-xs\"\n isDeletable\n :to=\"{\n name: 'cookies',\n params: {\n [PathId.Cookies]: cookie.uid,\n },\n }\"\n type=\"cookies\"\n :variable=\"{ name: cookie.name, uid: cookie.uid }\"\n :warningMessage=\"`Are you sure you want to delete this cookie?`\"\n @click.prevent=\"handleNavigation($event, cookie.uid)\"\n @delete=\"removeCookie(cookie.uid)\" />\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openCookieModal\"\n hotkey=\"N\">\n <template #title> Add Cookie </template>\n </SidebarButton>\n </template>\n </Sidebar>\n\n <ViewLayoutContent class=\"flex-1\">\n <template v-if=\"hasCookies\">\n <ViewLayoutSection class=\"*:border-b-0\">\n <template #title>Edit Cookie</template>\n <CookieForm />\n <!-- Untested and disabled for now. -->\n <!-- <CookieRaw /> -->\n </ViewLayoutSection>\n </template>\n <EmptyState v-else />\n </ViewLayoutContent>\n\n <CookieModal\n :state=\"cookieModal\"\n @cancel=\"cookieModal.hide()\"\n @submit=\"addCookieHandler\" />\n </ViewLayout>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BmmBcIzD.js";
|
|
2
|
-
import { n as DataTableInputSelect_default, t as CodeInput_default } from "./CodeInput-
|
|
2
|
+
import { n as DataTableInputSelect_default, t as CodeInput_default } from "./CodeInput-BN7uw3Bh.js";
|
|
3
3
|
import { n as DataTableCell_default } from "./DataTableRow-c3XveEUO.js";
|
|
4
4
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, defineComponent, mergeProps, normalizeClass, openBlock, ref, renderSlot, unref, withCtx } from "vue";
|
|
5
5
|
import { ScalarIconButton } from "@scalar/components";
|
|
@@ -163,4 +163,4 @@ var DataTableInput_default = /* @__PURE__ */ _plugin_vue_export_helper_default(/
|
|
|
163
163
|
//#endregion
|
|
164
164
|
export { DataTableInput_default as t };
|
|
165
165
|
|
|
166
|
-
//# sourceMappingURL=DataTableInput-
|
|
166
|
+
//# sourceMappingURL=DataTableInput-SkIUPlrB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTableInput-yaU5g-kP.js","names":["$slots","$attrs"],"sources":["../src/components/DataTable/DataTableInput.vue","../src/components/DataTable/DataTableInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components'\nimport { ScalarIconEye, ScalarIconEyeSlash, ScalarIconX } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\nimport type { VueClassProp } from '@/types/vue'\n\nimport DataTableCell from './DataTableCell.vue'\nimport DataTableInputSelect from './DataTableInputSelect.vue'\n\nconst props = withDefaults(\n defineProps<{\n id?: string\n type?: string | undefined\n /** Class for the wrapping cell because attrs is bound to the input */\n containerClass?: VueClassProp | undefined\n required?: boolean\n modelValue: string | number\n /** Allows adding a custom value to the enum dropdown, defaults to true */\n canAddCustomEnumValue?: boolean\n readOnly?: boolean\n enum?: string[]\n min?: number\n max?: number\n environment: Environment\n envVariables: EnvVariable[]\n description?: string | undefined\n lineWrapping?: boolean\n }>(),\n {\n canAddCustomEnumValue: true,\n required: false,\n readOnly: false,\n lineWrapping: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'selectVariable', value: string): void\n}>()\n\ndefineOptions({ inheritAttrs: false })\n\nconst mask = ref(true)\nconst interactingWithDropdown = ref(false)\nconst codeInput = ref<InstanceType<typeof CodeInput> | null>(null)\n\nconst handleBlur = () => {\n if (!interactingWithDropdown.value) {\n emit('inputBlur')\n }\n}\n\nconst inputType = computed(() =>\n props.type === 'password' ? 'text' : (props.type ?? 'text'),\n)\n\n// If not an enum nor read only, focus the code input\nconst handleLabelClick = () => {\n if (!props.enum?.length && !props.readOnly) {\n codeInput.value?.focus()\n }\n}\n</script>\n<template>\n <DataTableCell\n class=\"relative flex\"\n :class=\"containerClass\">\n <div\n v-if=\"$slots.default\"\n class=\"text-c-1 flex items-center pr-0 pl-3\"\n :for=\"id ?? ''\"\n @click=\"handleLabelClick\">\n <slot />:\n </div>\n <div class=\"relative flex min-w-0 flex-1\">\n <template v-if=\"props.enum && props.enum.length\">\n <DataTableInputSelect\n :canAddCustomValue=\"props.canAddCustomEnumValue\"\n :modelValue=\"props.modelValue\"\n :value=\"props.enum\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n <template v-else>\n <input\n v-if=\"mask && type === 'password'\"\n v-bind=\"id ? { ...$attrs, id: id } : $attrs\"\n autocomplete=\"off\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none px-2 py-1.25 -outline-offset-1\"\n :class=\"{ 'scalar-password-input': type === 'password' }\"\n data-1p-ignore\n :readOnly=\"readOnly\"\n spellcheck=\"false\"\n :type=\"inputType\"\n :value=\"modelValue\"\n @input=\"\n emit(\n 'update:modelValue',\n ($event.target as HTMLInputElement).value ?? '',\n )\n \" />\n <CodeInput\n v-else\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"codeInput\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none -outline-offset-1\"\n :class=\"[\n type === 'password' && description && 'pr-12',\n description && 'pr-8',\n type === 'password' && 'scalar-password-input',\n ]\"\n :description=\"description\"\n disableCloseBrackets\n disableTabIndent\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :lineWrapping=\"Boolean(lineWrapping)\"\n :max=\"max\"\n :min=\"min\"\n :modelValue=\"modelValue ?? ''\"\n :readOnly=\"readOnly\"\n :required=\"Boolean(required)\"\n spellcheck=\"false\"\n :type=\"inputType\"\n @blur=\"handleBlur\"\n @focus=\"emit('inputFocus')\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n <slot name=\"icon\" />\n <!-- Clear -->\n <ScalarIconButton\n v-if=\"modelValue\"\n class=\"-ml-.25 h-6 w-6 self-center p-1.25\"\n :icon=\"ScalarIconX\"\n label=\"Clear Value\"\n @click=\"emit('update:modelValue', '')\" />\n <!-- Toggle Visibility -->\n <ScalarIconButton\n v-if=\"type === 'password'\"\n class=\"-ml-.5 mr-1.25 h-6 w-6 self-center p-1.25\"\n :icon=\"mask ? ScalarIconEye : ScalarIconEyeSlash\"\n :label=\"mask ? 'Show Password' : 'Hide Password'\"\n @click=\"mask = !mask\" />\n </DataTableCell>\n</template>\n\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n.required::after {\n content: 'Required';\n}\n/* Tailwind placeholder is busted */\ninput::placeholder {\n color: var(--scalar-color-3);\n}\n/* we want our inputs to look like a password input but not be one */\n.scalar-password-input {\n text-security: disc;\n -webkit-text-security: disc;\n -moz-text-security: disc;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components'\nimport { ScalarIconEye, ScalarIconEyeSlash, ScalarIconX } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\nimport type { VueClassProp } from '@/types/vue'\n\nimport DataTableCell from './DataTableCell.vue'\nimport DataTableInputSelect from './DataTableInputSelect.vue'\n\nconst props = withDefaults(\n defineProps<{\n id?: string\n type?: string | undefined\n /** Class for the wrapping cell because attrs is bound to the input */\n containerClass?: VueClassProp | undefined\n required?: boolean\n modelValue: string | number\n /** Allows adding a custom value to the enum dropdown, defaults to true */\n canAddCustomEnumValue?: boolean\n readOnly?: boolean\n enum?: string[]\n min?: number\n max?: number\n environment: Environment\n envVariables: EnvVariable[]\n description?: string | undefined\n lineWrapping?: boolean\n }>(),\n {\n canAddCustomEnumValue: true,\n required: false,\n readOnly: false,\n lineWrapping: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'selectVariable', value: string): void\n}>()\n\ndefineOptions({ inheritAttrs: false })\n\nconst mask = ref(true)\nconst interactingWithDropdown = ref(false)\nconst codeInput = ref<InstanceType<typeof CodeInput> | null>(null)\n\nconst handleBlur = () => {\n if (!interactingWithDropdown.value) {\n emit('inputBlur')\n }\n}\n\nconst inputType = computed(() =>\n props.type === 'password' ? 'text' : (props.type ?? 'text'),\n)\n\n// If not an enum nor read only, focus the code input\nconst handleLabelClick = () => {\n if (!props.enum?.length && !props.readOnly) {\n codeInput.value?.focus()\n }\n}\n</script>\n<template>\n <DataTableCell\n class=\"relative flex\"\n :class=\"containerClass\">\n <div\n v-if=\"$slots.default\"\n class=\"text-c-1 flex items-center pr-0 pl-3\"\n :for=\"id ?? ''\"\n @click=\"handleLabelClick\">\n <slot />:\n </div>\n <div class=\"relative flex min-w-0 flex-1\">\n <template v-if=\"props.enum && props.enum.length\">\n <DataTableInputSelect\n :canAddCustomValue=\"props.canAddCustomEnumValue\"\n :modelValue=\"props.modelValue\"\n :value=\"props.enum\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n <template v-else>\n <input\n v-if=\"mask && type === 'password'\"\n v-bind=\"id ? { ...$attrs, id: id } : $attrs\"\n autocomplete=\"off\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none px-2 py-1.25 -outline-offset-1\"\n :class=\"{ 'scalar-password-input': type === 'password' }\"\n data-1p-ignore\n :readOnly=\"readOnly\"\n spellcheck=\"false\"\n :type=\"inputType\"\n :value=\"modelValue\"\n @input=\"\n emit(\n 'update:modelValue',\n ($event.target as HTMLInputElement).value ?? '',\n )\n \" />\n <CodeInput\n v-else\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"codeInput\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none -outline-offset-1\"\n :class=\"[\n type === 'password' && description && 'pr-12',\n description && 'pr-8',\n type === 'password' && 'scalar-password-input',\n ]\"\n :description=\"description\"\n disableCloseBrackets\n disableTabIndent\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :lineWrapping=\"Boolean(lineWrapping)\"\n :max=\"max\"\n :min=\"min\"\n :modelValue=\"modelValue ?? ''\"\n :readOnly=\"readOnly\"\n :required=\"Boolean(required)\"\n spellcheck=\"false\"\n :type=\"inputType\"\n @blur=\"handleBlur\"\n @focus=\"emit('inputFocus')\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n <slot name=\"icon\" />\n <!-- Clear -->\n <ScalarIconButton\n v-if=\"modelValue\"\n class=\"-ml-.25 h-6 w-6 self-center p-1.25\"\n :icon=\"ScalarIconX\"\n label=\"Clear Value\"\n @click=\"emit('update:modelValue', '')\" />\n <!-- Toggle Visibility -->\n <ScalarIconButton\n v-if=\"type === 'password'\"\n class=\"-ml-.5 mr-1.25 h-6 w-6 self-center p-1.25\"\n :icon=\"mask ? ScalarIconEye : ScalarIconEyeSlash\"\n :label=\"mask ? 'Show Password' : 'Hide Password'\"\n @click=\"mask = !mask\" />\n </DataTableCell>\n</template>\n\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n.required::after {\n content: 'Required';\n}\n/* Tailwind placeholder is busted */\ninput::placeholder {\n color: var(--scalar-color-3);\n}\n/* we want our inputs to look like a password input but not be one */\n.scalar-password-input {\n text-security: disc;\n -webkit-text-security: disc;\n -moz-text-security: disc;\n}\n</style>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataTableInput-SkIUPlrB.js","names":["$slots","$attrs"],"sources":["../src/components/DataTable/DataTableInput.vue","../src/components/DataTable/DataTableInput.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components'\nimport { ScalarIconEye, ScalarIconEyeSlash, ScalarIconX } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\nimport type { VueClassProp } from '@/types/vue'\n\nimport DataTableCell from './DataTableCell.vue'\nimport DataTableInputSelect from './DataTableInputSelect.vue'\n\nconst props = withDefaults(\n defineProps<{\n id?: string\n type?: string | undefined\n /** Class for the wrapping cell because attrs is bound to the input */\n containerClass?: VueClassProp | undefined\n required?: boolean\n modelValue: string | number\n /** Allows adding a custom value to the enum dropdown, defaults to true */\n canAddCustomEnumValue?: boolean\n readOnly?: boolean\n enum?: string[]\n min?: number\n max?: number\n environment: Environment\n envVariables: EnvVariable[]\n description?: string | undefined\n lineWrapping?: boolean\n }>(),\n {\n canAddCustomEnumValue: true,\n required: false,\n readOnly: false,\n lineWrapping: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'selectVariable', value: string): void\n}>()\n\ndefineOptions({ inheritAttrs: false })\n\nconst mask = ref(true)\nconst interactingWithDropdown = ref(false)\nconst codeInput = ref<InstanceType<typeof CodeInput> | null>(null)\n\nconst handleBlur = () => {\n if (!interactingWithDropdown.value) {\n emit('inputBlur')\n }\n}\n\nconst inputType = computed(() =>\n props.type === 'password' ? 'text' : (props.type ?? 'text'),\n)\n\n// If not an enum nor read only, focus the code input\nconst handleLabelClick = () => {\n if (!props.enum?.length && !props.readOnly) {\n codeInput.value?.focus()\n }\n}\n</script>\n<template>\n <DataTableCell\n class=\"relative flex\"\n :class=\"containerClass\">\n <div\n v-if=\"$slots.default\"\n class=\"text-c-1 flex items-center pr-0 pl-3\"\n :for=\"id ?? ''\"\n @click=\"handleLabelClick\">\n <slot />:\n </div>\n <div class=\"relative flex min-w-0 flex-1\">\n <template v-if=\"props.enum && props.enum.length\">\n <DataTableInputSelect\n :canAddCustomValue=\"props.canAddCustomEnumValue\"\n :modelValue=\"props.modelValue\"\n :value=\"props.enum\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n <template v-else>\n <input\n v-if=\"mask && type === 'password'\"\n v-bind=\"id ? { ...$attrs, id: id } : $attrs\"\n autocomplete=\"off\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none px-2 py-1.25 -outline-offset-1\"\n :class=\"{ 'scalar-password-input': type === 'password' }\"\n data-1p-ignore\n :readOnly=\"readOnly\"\n spellcheck=\"false\"\n :type=\"inputType\"\n :value=\"modelValue\"\n @input=\"\n emit(\n 'update:modelValue',\n ($event.target as HTMLInputElement).value ?? '',\n )\n \" />\n <CodeInput\n v-else\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"codeInput\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none -outline-offset-1\"\n :class=\"[\n type === 'password' && description && 'pr-12',\n description && 'pr-8',\n type === 'password' && 'scalar-password-input',\n ]\"\n :description=\"description\"\n disableCloseBrackets\n disableTabIndent\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :lineWrapping=\"Boolean(lineWrapping)\"\n :max=\"max\"\n :min=\"min\"\n :modelValue=\"modelValue ?? ''\"\n :readOnly=\"readOnly\"\n :required=\"Boolean(required)\"\n spellcheck=\"false\"\n :type=\"inputType\"\n @blur=\"handleBlur\"\n @focus=\"emit('inputFocus')\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n <slot name=\"icon\" />\n <!-- Clear -->\n <ScalarIconButton\n v-if=\"modelValue\"\n class=\"-ml-.25 h-6 w-6 self-center p-1.25\"\n :icon=\"ScalarIconX\"\n label=\"Clear Value\"\n @click=\"emit('update:modelValue', '')\" />\n <!-- Toggle Visibility -->\n <ScalarIconButton\n v-if=\"type === 'password'\"\n class=\"-ml-.5 mr-1.25 h-6 w-6 self-center p-1.25\"\n :icon=\"mask ? ScalarIconEye : ScalarIconEyeSlash\"\n :label=\"mask ? 'Show Password' : 'Hide Password'\"\n @click=\"mask = !mask\" />\n </DataTableCell>\n</template>\n\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n.required::after {\n content: 'Required';\n}\n/* Tailwind placeholder is busted */\ninput::placeholder {\n color: var(--scalar-color-3);\n}\n/* we want our inputs to look like a password input but not be one */\n.scalar-password-input {\n text-security: disc;\n -webkit-text-security: disc;\n -moz-text-security: disc;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarIconButton } from '@scalar/components'\nimport { ScalarIconEye, ScalarIconEyeSlash, ScalarIconX } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\nimport type { VueClassProp } from '@/types/vue'\n\nimport DataTableCell from './DataTableCell.vue'\nimport DataTableInputSelect from './DataTableInputSelect.vue'\n\nconst props = withDefaults(\n defineProps<{\n id?: string\n type?: string | undefined\n /** Class for the wrapping cell because attrs is bound to the input */\n containerClass?: VueClassProp | undefined\n required?: boolean\n modelValue: string | number\n /** Allows adding a custom value to the enum dropdown, defaults to true */\n canAddCustomEnumValue?: boolean\n readOnly?: boolean\n enum?: string[]\n min?: number\n max?: number\n environment: Environment\n envVariables: EnvVariable[]\n description?: string | undefined\n lineWrapping?: boolean\n }>(),\n {\n canAddCustomEnumValue: true,\n required: false,\n readOnly: false,\n lineWrapping: false,\n },\n)\n\nconst emit = defineEmits<{\n (e: 'update:modelValue', v: string): void\n (e: 'inputFocus'): void\n (e: 'inputBlur'): void\n (e: 'selectVariable', value: string): void\n}>()\n\ndefineOptions({ inheritAttrs: false })\n\nconst mask = ref(true)\nconst interactingWithDropdown = ref(false)\nconst codeInput = ref<InstanceType<typeof CodeInput> | null>(null)\n\nconst handleBlur = () => {\n if (!interactingWithDropdown.value) {\n emit('inputBlur')\n }\n}\n\nconst inputType = computed(() =>\n props.type === 'password' ? 'text' : (props.type ?? 'text'),\n)\n\n// If not an enum nor read only, focus the code input\nconst handleLabelClick = () => {\n if (!props.enum?.length && !props.readOnly) {\n codeInput.value?.focus()\n }\n}\n</script>\n<template>\n <DataTableCell\n class=\"relative flex\"\n :class=\"containerClass\">\n <div\n v-if=\"$slots.default\"\n class=\"text-c-1 flex items-center pr-0 pl-3\"\n :for=\"id ?? ''\"\n @click=\"handleLabelClick\">\n <slot />:\n </div>\n <div class=\"relative flex min-w-0 flex-1\">\n <template v-if=\"props.enum && props.enum.length\">\n <DataTableInputSelect\n :canAddCustomValue=\"props.canAddCustomEnumValue\"\n :modelValue=\"props.modelValue\"\n :value=\"props.enum\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n <template v-else>\n <input\n v-if=\"mask && type === 'password'\"\n v-bind=\"id ? { ...$attrs, id: id } : $attrs\"\n autocomplete=\"off\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none px-2 py-1.25 -outline-offset-1\"\n :class=\"{ 'scalar-password-input': type === 'password' }\"\n data-1p-ignore\n :readOnly=\"readOnly\"\n spellcheck=\"false\"\n :type=\"inputType\"\n :value=\"modelValue\"\n @input=\"\n emit(\n 'update:modelValue',\n ($event.target as HTMLInputElement).value ?? '',\n )\n \" />\n <CodeInput\n v-else\n v-bind=\"$attrs\"\n :id=\"id\"\n ref=\"codeInput\"\n class=\"text-c-1 disabled:text-c-2 peer w-full min-w-0 border-none -outline-offset-1\"\n :class=\"[\n type === 'password' && description && 'pr-12',\n description && 'pr-8',\n type === 'password' && 'scalar-password-input',\n ]\"\n :description=\"description\"\n disableCloseBrackets\n disableTabIndent\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :lineWrapping=\"Boolean(lineWrapping)\"\n :max=\"max\"\n :min=\"min\"\n :modelValue=\"modelValue ?? ''\"\n :readOnly=\"readOnly\"\n :required=\"Boolean(required)\"\n spellcheck=\"false\"\n :type=\"inputType\"\n @blur=\"handleBlur\"\n @focus=\"emit('inputFocus')\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n <div\n v-if=\"$slots.warning\"\n class=\"centered-y text-orange absolute right-7 text-xs\">\n <slot name=\"warning\" />\n </div>\n <slot name=\"icon\" />\n <!-- Clear -->\n <ScalarIconButton\n v-if=\"modelValue\"\n class=\"-ml-.25 h-6 w-6 self-center p-1.25\"\n :icon=\"ScalarIconX\"\n label=\"Clear Value\"\n @click=\"emit('update:modelValue', '')\" />\n <!-- Toggle Visibility -->\n <ScalarIconButton\n v-if=\"type === 'password'\"\n class=\"-ml-.5 mr-1.25 h-6 w-6 self-center p-1.25\"\n :icon=\"mask ? ScalarIconEye : ScalarIconEyeSlash\"\n :label=\"mask ? 'Show Password' : 'Hide Password'\"\n @click=\"mask = !mask\" />\n </DataTableCell>\n</template>\n\n<style scoped>\n:deep(.cm-editor) {\n padding: 0;\n}\n:deep(.cm-content) {\n align-items: center;\n background-color: transparent;\n display: flex;\n font-family: var(--scalar-font);\n font-size: var(--scalar-small);\n padding: 5px 8px;\n width: 100%;\n}\n:deep(.cm-content):has(.cm-pill) {\n padding: 5px 8px;\n}\n:deep(.cm-content .cm-pill:not(:last-of-type)) {\n margin-right: 0.5px;\n}\n:deep(.cm-content .cm-pill:not(:first-of-type)) {\n margin-left: 0.5px;\n}\n:deep(.cm-line) {\n overflow: hidden;\n padding: 0;\n text-overflow: ellipsis;\n word-break: break-word;\n}\n.required::after {\n content: 'Required';\n}\n/* Tailwind placeholder is busted */\ninput::placeholder {\n color: var(--scalar-color-3);\n}\n/* we want our inputs to look like a password input but not be one */\n.scalar-password-input {\n text-security: disc;\n -webkit-text-security: disc;\n -moz-text-security: disc;\n}\n</style>\n"],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { T as PathId, r as useWorkspace, w as useActiveEntities } from "./store-
|
|
1
|
+
import { T as PathId, r as useWorkspace, w as useActiveEntities } from "./store-DaPoVtIS.js";
|
|
2
2
|
import { r as useSidebar } from "./useSidebar-DLTwHDI-.js";
|
|
3
|
-
import { t as CodeInput_default } from "./CodeInput-
|
|
4
|
-
import { t as Sidebar_default } from "./Sidebar-
|
|
3
|
+
import { t as CodeInput_default } from "./CodeInput-BN7uw3Bh.js";
|
|
4
|
+
import { t as Sidebar_default } from "./Sidebar-Xl9_nFXX.js";
|
|
5
5
|
import { t as ViewLayout_default } from "./ViewLayout-BOXN0IYo.js";
|
|
6
6
|
import { t as ViewLayoutContent_default } from "./ViewLayoutContent-CvMoJYPF.js";
|
|
7
7
|
import { t as ViewLayoutSection_default } from "./ViewLayoutSection-mUqKbQry.js";
|
|
8
8
|
import { t as EditSidebarListElement_default } from "./EditSidebarListElement-CodWPnM6.js";
|
|
9
|
-
import { n as EnvironmentColorModal_default, t as EnvironmentModal_default } from "./EnvironmentModal-
|
|
9
|
+
import { n as EnvironmentColorModal_default, t as EnvironmentModal_default } from "./EnvironmentModal-CcyqnPc2.js";
|
|
10
10
|
import { t as SidebarButton_default } from "./SidebarButton-BAagdMDe.js";
|
|
11
11
|
import { n as SidebarList_default, t as SidebarListElement_default } from "./SidebarListElement-BfTPiihc.js";
|
|
12
12
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, normalizeClass, onBeforeUnmount, onMounted, openBlock, ref, renderList, toDisplayString, unref, vShow, watch, withCtx, withDirectives, withModifiers } from "vue";
|
|
@@ -413,4 +413,4 @@ var Environment_default = /* @__PURE__ */ defineComponent({
|
|
|
413
413
|
//#endregion
|
|
414
414
|
export { Environment_default as default };
|
|
415
415
|
|
|
416
|
-
//# sourceMappingURL=Environment-
|
|
416
|
+
//# sourceMappingURL=Environment-D_CbZk0A.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Environment-DJatRQIg.js","names":[],"sources":["../src/views/Environment/handle-drag.ts","../src/views/Environment/Environment.vue","../src/views/Environment/Environment.vue"],"sourcesContent":["import type { DraggingItem, HoveredItem } from '@scalar/draggable'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport type { ActiveEntitiesStore } from '@/store/active-entities'\n\ntype CollectionMutator = {\n edit: (uid: Collection['uid'], path: 'x-scalar-environments', value: Collection['x-scalar-environments']) => void\n}\n\n/** Create environment DnD handlers */\nexport function environmentDragHandlerFactory(\n activeWorkspaceCollections: ActiveEntitiesStore['activeWorkspaceCollections'],\n collectionMutator: CollectionMutator,\n) {\n /** Drag handler that mutates the collection's environments order */\n const handleDragEnd = (draggingItem: DraggingItem, hoveredItem: HoveredItem) => {\n if (!draggingItem || !hoveredItem) {\n return\n }\n\n const { id: draggingUid, parentId: draggingParentUid } = draggingItem\n const { id: hoveredUid, parentId: hoveredParentUid, offset } = hoveredItem\n\n // Only allow reordering within the same collection\n if (draggingParentUid !== hoveredParentUid) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find((c) => c.uid === draggingParentUid)\n\n if (!collection || !collection['x-scalar-environments']) {\n return\n }\n\n const environments = collection['x-scalar-environments']\n const envKeys = Object.keys(environments)\n const orderedEnvs = { ...environments }\n\n // Remove dragged item from its position\n const draggedIndex = envKeys.findIndex((key) => key === draggingUid)\n envKeys.splice(draggedIndex, 1)\n\n // Insert at new position\n const hoveredIndex = envKeys.findIndex((key) => key === hoveredUid)\n const targetIndex = hoveredIndex + (offset === 1 ? 1 : 0)\n envKeys.splice(targetIndex, 0, draggingUid)\n\n // Rebuild ordered environments object\n const reorderedEnvs = envKeys.reduce(\n (acc, key) => {\n const env = environments[key]\n if (env) {\n acc[key] = env\n }\n return acc\n },\n {} as typeof orderedEnvs,\n )\n\n collection['x-scalar-environments'] = reorderedEnvs\n collectionMutator.edit(collection.uid, 'x-scalar-environments', collection['x-scalar-environments'])\n }\n\n /** Ensure only environments within the same collection can be dropped */\n const isDroppable = (draggingItem: DraggingItem, hoveredItem: HoveredItem) => {\n return draggingItem.parentId === hoveredItem.parentId\n }\n\n return {\n handleDragEnd,\n isDroppable,\n }\n}\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport Sidebar from '@/components/Sidebar/Sidebar.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useSidebar } from '@/hooks/useSidebar'\nimport type { HotKeyEvent } from '@/libs'\nimport type { EnvConfig } from '@/libs/env-helpers'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport EnvironmentColorModal from './EnvironmentColorModal.vue'\nimport EnvironmentModal from './EnvironmentModal.vue'\nimport { environmentDragHandlerFactory } from './handle-drag'\n\nconst router = useRouter()\nconst route = useRoute()\nconst {\n activeWorkspace,\n activeEnvironment,\n activeWorkspaceCollections,\n activeEnvVariables,\n} = useActiveEntities()\nconst { events, workspaceMutators, collectionMutators } = useWorkspace()\nconst { collapsedSidebarFolders, toggleSidebarFolder } = useSidebar()\nconst colorModal = useModal()\nconst environmentModal = useModal()\n\nconst editModal = useModal()\n\nconst colorModalEnvironment = ref<string | null>(null)\nconst currentEnvironmentId = ref('default')\nconst selectedColor = ref('')\nconst selectedCollectionId = ref<string | undefined>(undefined)\nconst selectedEnvironmentId = ref<string | undefined>(undefined)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst { toast } = useToasts()\n\nconst parseEnvironmentValue = (value: string): Record<string, string> =>\n JSON.parse(value)\n\nfunction environmentNameToast(\n environmentNameUsed: boolean,\n collection: any,\n collectionId: string | undefined,\n) {\n if (environmentNameUsed) {\n if (collection.uid === collectionId) {\n toast(\n `Environment name already used in ${collection.info?.title}`,\n 'error',\n )\n } else {\n toast('Environment name already used in another collection', 'error')\n }\n }\n}\n\n// Returns non-draft collections only\nconst nonDraftWorkspaceCollections = computed(() => {\n return activeWorkspaceCollections.value.filter(\n (collection) => collection.info?.title !== 'Drafts',\n )\n})\n\nfunction addEnvironment(environment: {\n name: string\n color: string\n collectionId: Collection['uid'] | undefined\n}) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(environment.name)\n environmentNameToast(enviromentName, collection, environment.collectionId)\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (environment.collectionId) {\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n environment.collectionId,\n )\n if (!collapsedSidebarFolders[environment.collectionId]) {\n toggleSidebarFolder(environment.collectionId)\n }\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: environment.collectionId,\n [PathId.Environment]: environment.name,\n },\n })\n }\n\n environmentModal.hide()\n}\n\nfunction handleEnvironmentUpdate(raw: string) {\n if (!activeEnvironment) {\n return\n }\n\n const updatedValue = parseEnvironmentValue(raw)\n\n if (currentEnvironmentId.value === 'default') {\n workspaceMutators.edit(\n activeWorkspace.value?.uid,\n 'environments',\n updatedValue,\n )\n } else {\n const collection = activeWorkspaceCollections.value.find(\n (c) => c['x-scalar-environments']?.[currentEnvironmentId.value ?? ''],\n )\n if (\n collection?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ) {\n const environment =\n collection['x-scalar-environments'][currentEnvironmentId.value ?? '']\n if (environment) {\n environment.variables = updatedValue\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n }\n }\n}\n\nconst openEnvironmentModal = (collectionId?: string) => {\n selectedCollectionId.value = collectionId\n environmentModal.show()\n}\n\nconst openRenameModal = (environmentId: string, collectionId: string) => {\n selectedEnvironmentId.value = environmentId\n selectedCollectionId.value = collectionId\n tempEnvironmentName.value = environmentId\n editModal.show()\n}\n\nconst handleOpenColorModal = (uid: string) => {\n colorModalEnvironment.value = uid\n selectedColor.value =\n activeWorkspaceCollections.value.find(\n (collection) => collection['x-scalar-environments']?.[uid],\n )?.['x-scalar-environments']?.[uid]?.color ?? ''\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n const environmentId = colorModalEnvironment.value\n if (typeof environmentId === 'string') {\n const isCollection = activeWorkspaceCollections.value.some(\n (collection) => collection['x-scalar-environments']?.[environmentId],\n )\n if (isCollection) {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (collection['x-scalar-environments']?.[environmentId]) {\n collection['x-scalar-environments'][environmentId].color = color\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n colorModal.hide()\n }\n}\n\nfunction removeCollectionEnvironment(environmentName: string) {\n nonDraftWorkspaceCollections.value.forEach((collection) => {\n collectionMutators.removeEnvironment(environmentName, collection.uid)\n })\n\n // Redirect to last available environment\n const remainingCollectionEnvironments =\n nonDraftWorkspaceCollections.value.flatMap((collection) =>\n Object.keys(collection['x-scalar-environments'] || {}),\n )\n\n if (remainingCollectionEnvironments.length > 0) {\n const lastCollectionEnvironment =\n remainingCollectionEnvironments[\n remainingCollectionEnvironments.length - 1\n ]\n\n if (!lastCollectionEnvironment) {\n return\n }\n\n const currentCollection = activeWorkspaceCollections.value.find(\n (collection) =>\n Object.keys(collection['x-scalar-environments'] || {}).includes(\n lastCollectionEnvironment,\n ),\n )\n currentEnvironmentId.value = lastCollectionEnvironment\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: currentCollection?.uid,\n [PathId.Environment]: lastCollectionEnvironment,\n },\n })\n if (currentCollection && !collapsedSidebarFolders[currentCollection.uid]) {\n toggleSidebarFolder(currentCollection.uid)\n }\n } else {\n currentEnvironmentId.value = 'default'\n router.push({\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n },\n })\n }\n}\n\nconst getEnvironmentName = () => {\n return currentEnvironmentId.value === 'default'\n ? 'Global Environment'\n : currentEnvironmentId.value\n}\n\nconst getEnvironmentValue = () => {\n return currentEnvironmentId.value === 'default'\n ? JSON.stringify(activeWorkspace.value?.environments, null, 2)\n : JSON.stringify(\n activeWorkspaceCollections.value.find(\n (collection) =>\n collection['x-scalar-environments']?.[\n currentEnvironmentId.value ?? ''\n ],\n )?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ?.variables,\n null,\n 2,\n )\n}\n\nconst showChildren = (key: string) => {\n return collapsedSidebarFolders[key]\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'environment') {\n openEnvironmentModal()\n }\n}\n\nwatch(\n () => [route.params[PathId.Collection], route.params[PathId.Environment]],\n ([newCollectionId, newEnvironmentId]) => {\n if (newCollectionId) {\n // Collection environment\n currentEnvironmentId.value = newEnvironmentId as string\n } else {\n // Global environment\n currentEnvironmentId.value = 'default'\n }\n },\n)\n\nonMounted(() => {\n currentEnvironmentId.value =\n (route.params[PathId.Environment] as string) || 'default'\n events.hotKeys.on(handleHotKey)\n const collectionId = route.params[PathId.Collection]\n if (collectionId && !collapsedSidebarFolders[collectionId as string]) {\n toggleSidebarFolder(collectionId as string)\n }\n})\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst handleNavigation = (\n event: MouseEvent,\n uid: string,\n collectionId?: string,\n) => {\n const to = collectionId\n ? {\n name: 'environment.collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collectionId,\n [PathId.Environment]: uid,\n },\n }\n : {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Environment]: uid,\n },\n }\n if (event.metaKey) {\n window.open(router.resolve(to).href, '_blank')\n } else {\n router.push(to)\n }\n}\n\nfunction handleCancelRename() {\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nfunction handleRename(newName: string) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(newName)\n environmentNameToast(\n enviromentName,\n collection,\n selectedCollectionId.value,\n )\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (newName && selectedEnvironmentId.value !== 'default') {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (\n collection['x-scalar-environments']?.[selectedEnvironmentId.value ?? '']\n ) {\n const environments = collection['x-scalar-environments']\n // Maintains order of environments in the sidebar as we use uid as the name\n const orderedEnvs: Record<string, EnvConfig> = {}\n\n // Preserve order by rebuilding the environments object\n Object.keys(environments).forEach((key) => {\n const environment = environments[key]\n\n if (!environment) {\n return\n }\n\n if (key === selectedEnvironmentId.value) {\n orderedEnvs[newName] = environment\n } else {\n orderedEnvs[key] = environment\n }\n })\n\n collection['x-scalar-environments'] = orderedEnvs\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n\n if (newName && currentEnvironmentId.value === selectedEnvironmentId.value) {\n currentEnvironmentId.value = newName\n }\n\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\n// Replace handleEnvironmentDragEnd with the factory\nconst { handleDragEnd, isDroppable } = environmentDragHandlerFactory(\n activeWorkspaceCollections,\n collectionMutators,\n)\n\nwatch(\n () => route.query.openEnvironmentModal,\n (newVal) => {\n if (newVal === 'true') {\n openEnvironmentModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Collections\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <SidebarListElement\n :key=\"'default'\"\n class=\"text-xs\"\n :isCopyable=\"false\"\n :to=\"{\n name: 'environment',\n params: {\n [PathId.Environment]: 'default',\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: 'Global Environment',\n uid: 'default',\n icon: 'Globe',\n isDefault: true,\n }\" />\n <li\n v-for=\"collection in nonDraftWorkspaceCollections\"\n :key=\"collection.uid\"\n class=\"gap-1/2 flex flex-col\">\n <button\n class=\"hover:bg-b-2 group flex w-full items-center gap-1.5 rounded p-1.5 text-left text-sm font-medium break-words\"\n type=\"button\"\n @click=\"toggleSidebarFolder(collection.uid)\">\n <span class=\"flex h-5 max-w-[14px] items-center justify-center\">\n <LibraryIcon\n class=\"text-sidebar-c-2 size-3.5 min-w-3.5 stroke-2 group-hover:hidden\"\n :src=\"\n collection['x-scalar-icon'] || 'interface-content-folder'\n \" />\n <div\n :class=\"{\n 'rotate-90': collapsedSidebarFolders[collection.uid],\n }\">\n <ScalarIcon\n class=\"text-c-3 hover:text-c-1 hidden text-sm group-hover:block\"\n icon=\"ChevronRight\"\n size=\"md\" />\n </div>\n </span>\n {{ collection.info?.title ?? '' }}\n </button>\n <div\n v-show=\"showChildren(collection.uid)\"\n :class=\"{\n 'before:bg-border relative mb-[.5px] before:pointer-events-none before:absolute before:top-0 before:left-3 before:z-1 before:h-[calc(100%_+_.5px)] before:w-[.5px] last:mb-0 last:before:h-full':\n Object.keys(collection['x-scalar-environments'] || {})\n .length > 0,\n }\">\n <SidebarListElement\n v-for=\"(environment, environmentName) in collection[\n 'x-scalar-environments'\n ]\"\n :key=\"environmentName\"\n class=\"text-xs\"\n :collectionId=\"collection.uid\"\n :isCopyable=\"false\"\n :isDeletable=\"true\"\n :isRenameable=\"true\"\n :isDraggable=\"true\"\n :isDroppable=\"isDroppable\"\n :to=\"{\n name: 'environment.collection',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Environment]: environmentName,\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: environmentName,\n uid: environmentName,\n color: environment.color ?? '#FFFFFF',\n isDefault: false,\n }\"\n :warningMessage=\"`Are you sure you want to delete this environment?`\"\n @click.prevent=\"\n handleNavigation($event, environmentName, collection.uid)\n \"\n @colorModal=\"handleOpenColorModal(environmentName)\"\n @delete=\"removeCollectionEnvironment(environmentName)\"\n @rename=\"openRenameModal(environmentName, collection.uid)\"\n @onDragEnd=\"handleDragEnd\" />\n <ScalarButton\n v-if=\"\n Object.keys(collection['x-scalar-environments'] || {})\n .length === 0\n \"\n class=\"text-c-1 hover:bg-b-2 flex h-8 w-full justify-start gap-1.5 py-0 pl-6 text-xs\"\n variant=\"ghost\"\n @click=\"openEnvironmentModal(collection.uid)\">\n <ScalarIcon\n icon=\"Add\"\n size=\"sm\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openEnvironmentModal\"\n hotkey=\"N\">\n <template #title> Add Environment </template>\n </SidebarButton>\n </template>\n </Sidebar>\n <ViewLayoutContent class=\"flex-1\">\n <ViewLayoutSection>\n <template\n v-if=\"currentEnvironmentId\"\n #title>\n <span>\n {{ getEnvironmentName() }}\n </span>\n </template>\n <CodeInput\n v-if=\"currentEnvironmentId && activeWorkspace\"\n class=\"py-2 pr-2 pl-px md:px-4\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n language=\"json\"\n lineNumbers\n lint\n :modelValue=\"getEnvironmentValue()\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"handleEnvironmentUpdate\" />\n </ViewLayoutSection>\n </ViewLayoutContent>\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <EnvironmentModal\n :activeWorkspaceCollections=\"nonDraftWorkspaceCollections\"\n :collectionId=\"selectedCollectionId\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"addEnvironment\" />\n\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentId}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"handleCancelRename\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </ViewLayout>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport Sidebar from '@/components/Sidebar/Sidebar.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useSidebar } from '@/hooks/useSidebar'\nimport type { HotKeyEvent } from '@/libs'\nimport type { EnvConfig } from '@/libs/env-helpers'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport EnvironmentColorModal from './EnvironmentColorModal.vue'\nimport EnvironmentModal from './EnvironmentModal.vue'\nimport { environmentDragHandlerFactory } from './handle-drag'\n\nconst router = useRouter()\nconst route = useRoute()\nconst {\n activeWorkspace,\n activeEnvironment,\n activeWorkspaceCollections,\n activeEnvVariables,\n} = useActiveEntities()\nconst { events, workspaceMutators, collectionMutators } = useWorkspace()\nconst { collapsedSidebarFolders, toggleSidebarFolder } = useSidebar()\nconst colorModal = useModal()\nconst environmentModal = useModal()\n\nconst editModal = useModal()\n\nconst colorModalEnvironment = ref<string | null>(null)\nconst currentEnvironmentId = ref('default')\nconst selectedColor = ref('')\nconst selectedCollectionId = ref<string | undefined>(undefined)\nconst selectedEnvironmentId = ref<string | undefined>(undefined)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst { toast } = useToasts()\n\nconst parseEnvironmentValue = (value: string): Record<string, string> =>\n JSON.parse(value)\n\nfunction environmentNameToast(\n environmentNameUsed: boolean,\n collection: any,\n collectionId: string | undefined,\n) {\n if (environmentNameUsed) {\n if (collection.uid === collectionId) {\n toast(\n `Environment name already used in ${collection.info?.title}`,\n 'error',\n )\n } else {\n toast('Environment name already used in another collection', 'error')\n }\n }\n}\n\n// Returns non-draft collections only\nconst nonDraftWorkspaceCollections = computed(() => {\n return activeWorkspaceCollections.value.filter(\n (collection) => collection.info?.title !== 'Drafts',\n )\n})\n\nfunction addEnvironment(environment: {\n name: string\n color: string\n collectionId: Collection['uid'] | undefined\n}) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(environment.name)\n environmentNameToast(enviromentName, collection, environment.collectionId)\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (environment.collectionId) {\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n environment.collectionId,\n )\n if (!collapsedSidebarFolders[environment.collectionId]) {\n toggleSidebarFolder(environment.collectionId)\n }\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: environment.collectionId,\n [PathId.Environment]: environment.name,\n },\n })\n }\n\n environmentModal.hide()\n}\n\nfunction handleEnvironmentUpdate(raw: string) {\n if (!activeEnvironment) {\n return\n }\n\n const updatedValue = parseEnvironmentValue(raw)\n\n if (currentEnvironmentId.value === 'default') {\n workspaceMutators.edit(\n activeWorkspace.value?.uid,\n 'environments',\n updatedValue,\n )\n } else {\n const collection = activeWorkspaceCollections.value.find(\n (c) => c['x-scalar-environments']?.[currentEnvironmentId.value ?? ''],\n )\n if (\n collection?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ) {\n const environment =\n collection['x-scalar-environments'][currentEnvironmentId.value ?? '']\n if (environment) {\n environment.variables = updatedValue\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n }\n }\n}\n\nconst openEnvironmentModal = (collectionId?: string) => {\n selectedCollectionId.value = collectionId\n environmentModal.show()\n}\n\nconst openRenameModal = (environmentId: string, collectionId: string) => {\n selectedEnvironmentId.value = environmentId\n selectedCollectionId.value = collectionId\n tempEnvironmentName.value = environmentId\n editModal.show()\n}\n\nconst handleOpenColorModal = (uid: string) => {\n colorModalEnvironment.value = uid\n selectedColor.value =\n activeWorkspaceCollections.value.find(\n (collection) => collection['x-scalar-environments']?.[uid],\n )?.['x-scalar-environments']?.[uid]?.color ?? ''\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n const environmentId = colorModalEnvironment.value\n if (typeof environmentId === 'string') {\n const isCollection = activeWorkspaceCollections.value.some(\n (collection) => collection['x-scalar-environments']?.[environmentId],\n )\n if (isCollection) {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (collection['x-scalar-environments']?.[environmentId]) {\n collection['x-scalar-environments'][environmentId].color = color\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n colorModal.hide()\n }\n}\n\nfunction removeCollectionEnvironment(environmentName: string) {\n nonDraftWorkspaceCollections.value.forEach((collection) => {\n collectionMutators.removeEnvironment(environmentName, collection.uid)\n })\n\n // Redirect to last available environment\n const remainingCollectionEnvironments =\n nonDraftWorkspaceCollections.value.flatMap((collection) =>\n Object.keys(collection['x-scalar-environments'] || {}),\n )\n\n if (remainingCollectionEnvironments.length > 0) {\n const lastCollectionEnvironment =\n remainingCollectionEnvironments[\n remainingCollectionEnvironments.length - 1\n ]\n\n if (!lastCollectionEnvironment) {\n return\n }\n\n const currentCollection = activeWorkspaceCollections.value.find(\n (collection) =>\n Object.keys(collection['x-scalar-environments'] || {}).includes(\n lastCollectionEnvironment,\n ),\n )\n currentEnvironmentId.value = lastCollectionEnvironment\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: currentCollection?.uid,\n [PathId.Environment]: lastCollectionEnvironment,\n },\n })\n if (currentCollection && !collapsedSidebarFolders[currentCollection.uid]) {\n toggleSidebarFolder(currentCollection.uid)\n }\n } else {\n currentEnvironmentId.value = 'default'\n router.push({\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n },\n })\n }\n}\n\nconst getEnvironmentName = () => {\n return currentEnvironmentId.value === 'default'\n ? 'Global Environment'\n : currentEnvironmentId.value\n}\n\nconst getEnvironmentValue = () => {\n return currentEnvironmentId.value === 'default'\n ? JSON.stringify(activeWorkspace.value?.environments, null, 2)\n : JSON.stringify(\n activeWorkspaceCollections.value.find(\n (collection) =>\n collection['x-scalar-environments']?.[\n currentEnvironmentId.value ?? ''\n ],\n )?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ?.variables,\n null,\n 2,\n )\n}\n\nconst showChildren = (key: string) => {\n return collapsedSidebarFolders[key]\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'environment') {\n openEnvironmentModal()\n }\n}\n\nwatch(\n () => [route.params[PathId.Collection], route.params[PathId.Environment]],\n ([newCollectionId, newEnvironmentId]) => {\n if (newCollectionId) {\n // Collection environment\n currentEnvironmentId.value = newEnvironmentId as string\n } else {\n // Global environment\n currentEnvironmentId.value = 'default'\n }\n },\n)\n\nonMounted(() => {\n currentEnvironmentId.value =\n (route.params[PathId.Environment] as string) || 'default'\n events.hotKeys.on(handleHotKey)\n const collectionId = route.params[PathId.Collection]\n if (collectionId && !collapsedSidebarFolders[collectionId as string]) {\n toggleSidebarFolder(collectionId as string)\n }\n})\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst handleNavigation = (\n event: MouseEvent,\n uid: string,\n collectionId?: string,\n) => {\n const to = collectionId\n ? {\n name: 'environment.collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collectionId,\n [PathId.Environment]: uid,\n },\n }\n : {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Environment]: uid,\n },\n }\n if (event.metaKey) {\n window.open(router.resolve(to).href, '_blank')\n } else {\n router.push(to)\n }\n}\n\nfunction handleCancelRename() {\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nfunction handleRename(newName: string) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(newName)\n environmentNameToast(\n enviromentName,\n collection,\n selectedCollectionId.value,\n )\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (newName && selectedEnvironmentId.value !== 'default') {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (\n collection['x-scalar-environments']?.[selectedEnvironmentId.value ?? '']\n ) {\n const environments = collection['x-scalar-environments']\n // Maintains order of environments in the sidebar as we use uid as the name\n const orderedEnvs: Record<string, EnvConfig> = {}\n\n // Preserve order by rebuilding the environments object\n Object.keys(environments).forEach((key) => {\n const environment = environments[key]\n\n if (!environment) {\n return\n }\n\n if (key === selectedEnvironmentId.value) {\n orderedEnvs[newName] = environment\n } else {\n orderedEnvs[key] = environment\n }\n })\n\n collection['x-scalar-environments'] = orderedEnvs\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n\n if (newName && currentEnvironmentId.value === selectedEnvironmentId.value) {\n currentEnvironmentId.value = newName\n }\n\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\n// Replace handleEnvironmentDragEnd with the factory\nconst { handleDragEnd, isDroppable } = environmentDragHandlerFactory(\n activeWorkspaceCollections,\n collectionMutators,\n)\n\nwatch(\n () => route.query.openEnvironmentModal,\n (newVal) => {\n if (newVal === 'true') {\n openEnvironmentModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Collections\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <SidebarListElement\n :key=\"'default'\"\n class=\"text-xs\"\n :isCopyable=\"false\"\n :to=\"{\n name: 'environment',\n params: {\n [PathId.Environment]: 'default',\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: 'Global Environment',\n uid: 'default',\n icon: 'Globe',\n isDefault: true,\n }\" />\n <li\n v-for=\"collection in nonDraftWorkspaceCollections\"\n :key=\"collection.uid\"\n class=\"gap-1/2 flex flex-col\">\n <button\n class=\"hover:bg-b-2 group flex w-full items-center gap-1.5 rounded p-1.5 text-left text-sm font-medium break-words\"\n type=\"button\"\n @click=\"toggleSidebarFolder(collection.uid)\">\n <span class=\"flex h-5 max-w-[14px] items-center justify-center\">\n <LibraryIcon\n class=\"text-sidebar-c-2 size-3.5 min-w-3.5 stroke-2 group-hover:hidden\"\n :src=\"\n collection['x-scalar-icon'] || 'interface-content-folder'\n \" />\n <div\n :class=\"{\n 'rotate-90': collapsedSidebarFolders[collection.uid],\n }\">\n <ScalarIcon\n class=\"text-c-3 hover:text-c-1 hidden text-sm group-hover:block\"\n icon=\"ChevronRight\"\n size=\"md\" />\n </div>\n </span>\n {{ collection.info?.title ?? '' }}\n </button>\n <div\n v-show=\"showChildren(collection.uid)\"\n :class=\"{\n 'before:bg-border relative mb-[.5px] before:pointer-events-none before:absolute before:top-0 before:left-3 before:z-1 before:h-[calc(100%_+_.5px)] before:w-[.5px] last:mb-0 last:before:h-full':\n Object.keys(collection['x-scalar-environments'] || {})\n .length > 0,\n }\">\n <SidebarListElement\n v-for=\"(environment, environmentName) in collection[\n 'x-scalar-environments'\n ]\"\n :key=\"environmentName\"\n class=\"text-xs\"\n :collectionId=\"collection.uid\"\n :isCopyable=\"false\"\n :isDeletable=\"true\"\n :isRenameable=\"true\"\n :isDraggable=\"true\"\n :isDroppable=\"isDroppable\"\n :to=\"{\n name: 'environment.collection',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Environment]: environmentName,\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: environmentName,\n uid: environmentName,\n color: environment.color ?? '#FFFFFF',\n isDefault: false,\n }\"\n :warningMessage=\"`Are you sure you want to delete this environment?`\"\n @click.prevent=\"\n handleNavigation($event, environmentName, collection.uid)\n \"\n @colorModal=\"handleOpenColorModal(environmentName)\"\n @delete=\"removeCollectionEnvironment(environmentName)\"\n @rename=\"openRenameModal(environmentName, collection.uid)\"\n @onDragEnd=\"handleDragEnd\" />\n <ScalarButton\n v-if=\"\n Object.keys(collection['x-scalar-environments'] || {})\n .length === 0\n \"\n class=\"text-c-1 hover:bg-b-2 flex h-8 w-full justify-start gap-1.5 py-0 pl-6 text-xs\"\n variant=\"ghost\"\n @click=\"openEnvironmentModal(collection.uid)\">\n <ScalarIcon\n icon=\"Add\"\n size=\"sm\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openEnvironmentModal\"\n hotkey=\"N\">\n <template #title> Add Environment </template>\n </SidebarButton>\n </template>\n </Sidebar>\n <ViewLayoutContent class=\"flex-1\">\n <ViewLayoutSection>\n <template\n v-if=\"currentEnvironmentId\"\n #title>\n <span>\n {{ getEnvironmentName() }}\n </span>\n </template>\n <CodeInput\n v-if=\"currentEnvironmentId && activeWorkspace\"\n class=\"py-2 pr-2 pl-px md:px-4\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n language=\"json\"\n lineNumbers\n lint\n :modelValue=\"getEnvironmentValue()\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"handleEnvironmentUpdate\" />\n </ViewLayoutSection>\n </ViewLayoutContent>\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <EnvironmentModal\n :activeWorkspaceCollections=\"nonDraftWorkspaceCollections\"\n :collectionId=\"selectedCollectionId\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"addEnvironment\" />\n\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentId}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"handleCancelRename\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </ViewLayout>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Environment-D_CbZk0A.js","names":[],"sources":["../src/views/Environment/handle-drag.ts","../src/views/Environment/Environment.vue","../src/views/Environment/Environment.vue"],"sourcesContent":["import type { DraggingItem, HoveredItem } from '@scalar/draggable'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\n\nimport type { ActiveEntitiesStore } from '@/store/active-entities'\n\ntype CollectionMutator = {\n edit: (uid: Collection['uid'], path: 'x-scalar-environments', value: Collection['x-scalar-environments']) => void\n}\n\n/** Create environment DnD handlers */\nexport function environmentDragHandlerFactory(\n activeWorkspaceCollections: ActiveEntitiesStore['activeWorkspaceCollections'],\n collectionMutator: CollectionMutator,\n) {\n /** Drag handler that mutates the collection's environments order */\n const handleDragEnd = (draggingItem: DraggingItem, hoveredItem: HoveredItem) => {\n if (!draggingItem || !hoveredItem) {\n return\n }\n\n const { id: draggingUid, parentId: draggingParentUid } = draggingItem\n const { id: hoveredUid, parentId: hoveredParentUid, offset } = hoveredItem\n\n // Only allow reordering within the same collection\n if (draggingParentUid !== hoveredParentUid) {\n return\n }\n\n const collection = activeWorkspaceCollections.value.find((c) => c.uid === draggingParentUid)\n\n if (!collection || !collection['x-scalar-environments']) {\n return\n }\n\n const environments = collection['x-scalar-environments']\n const envKeys = Object.keys(environments)\n const orderedEnvs = { ...environments }\n\n // Remove dragged item from its position\n const draggedIndex = envKeys.findIndex((key) => key === draggingUid)\n envKeys.splice(draggedIndex, 1)\n\n // Insert at new position\n const hoveredIndex = envKeys.findIndex((key) => key === hoveredUid)\n const targetIndex = hoveredIndex + (offset === 1 ? 1 : 0)\n envKeys.splice(targetIndex, 0, draggingUid)\n\n // Rebuild ordered environments object\n const reorderedEnvs = envKeys.reduce(\n (acc, key) => {\n const env = environments[key]\n if (env) {\n acc[key] = env\n }\n return acc\n },\n {} as typeof orderedEnvs,\n )\n\n collection['x-scalar-environments'] = reorderedEnvs\n collectionMutator.edit(collection.uid, 'x-scalar-environments', collection['x-scalar-environments'])\n }\n\n /** Ensure only environments within the same collection can be dropped */\n const isDroppable = (draggingItem: DraggingItem, hoveredItem: HoveredItem) => {\n return draggingItem.parentId === hoveredItem.parentId\n }\n\n return {\n handleDragEnd,\n isDroppable,\n }\n}\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport Sidebar from '@/components/Sidebar/Sidebar.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useSidebar } from '@/hooks/useSidebar'\nimport type { HotKeyEvent } from '@/libs'\nimport type { EnvConfig } from '@/libs/env-helpers'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport EnvironmentColorModal from './EnvironmentColorModal.vue'\nimport EnvironmentModal from './EnvironmentModal.vue'\nimport { environmentDragHandlerFactory } from './handle-drag'\n\nconst router = useRouter()\nconst route = useRoute()\nconst {\n activeWorkspace,\n activeEnvironment,\n activeWorkspaceCollections,\n activeEnvVariables,\n} = useActiveEntities()\nconst { events, workspaceMutators, collectionMutators } = useWorkspace()\nconst { collapsedSidebarFolders, toggleSidebarFolder } = useSidebar()\nconst colorModal = useModal()\nconst environmentModal = useModal()\n\nconst editModal = useModal()\n\nconst colorModalEnvironment = ref<string | null>(null)\nconst currentEnvironmentId = ref('default')\nconst selectedColor = ref('')\nconst selectedCollectionId = ref<string | undefined>(undefined)\nconst selectedEnvironmentId = ref<string | undefined>(undefined)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst { toast } = useToasts()\n\nconst parseEnvironmentValue = (value: string): Record<string, string> =>\n JSON.parse(value)\n\nfunction environmentNameToast(\n environmentNameUsed: boolean,\n collection: any,\n collectionId: string | undefined,\n) {\n if (environmentNameUsed) {\n if (collection.uid === collectionId) {\n toast(\n `Environment name already used in ${collection.info?.title}`,\n 'error',\n )\n } else {\n toast('Environment name already used in another collection', 'error')\n }\n }\n}\n\n// Returns non-draft collections only\nconst nonDraftWorkspaceCollections = computed(() => {\n return activeWorkspaceCollections.value.filter(\n (collection) => collection.info?.title !== 'Drafts',\n )\n})\n\nfunction addEnvironment(environment: {\n name: string\n color: string\n collectionId: Collection['uid'] | undefined\n}) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(environment.name)\n environmentNameToast(enviromentName, collection, environment.collectionId)\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (environment.collectionId) {\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n environment.collectionId,\n )\n if (!collapsedSidebarFolders[environment.collectionId]) {\n toggleSidebarFolder(environment.collectionId)\n }\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: environment.collectionId,\n [PathId.Environment]: environment.name,\n },\n })\n }\n\n environmentModal.hide()\n}\n\nfunction handleEnvironmentUpdate(raw: string) {\n if (!activeEnvironment) {\n return\n }\n\n const updatedValue = parseEnvironmentValue(raw)\n\n if (currentEnvironmentId.value === 'default') {\n workspaceMutators.edit(\n activeWorkspace.value?.uid,\n 'environments',\n updatedValue,\n )\n } else {\n const collection = activeWorkspaceCollections.value.find(\n (c) => c['x-scalar-environments']?.[currentEnvironmentId.value ?? ''],\n )\n if (\n collection?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ) {\n const environment =\n collection['x-scalar-environments'][currentEnvironmentId.value ?? '']\n if (environment) {\n environment.variables = updatedValue\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n }\n }\n}\n\nconst openEnvironmentModal = (collectionId?: string) => {\n selectedCollectionId.value = collectionId\n environmentModal.show()\n}\n\nconst openRenameModal = (environmentId: string, collectionId: string) => {\n selectedEnvironmentId.value = environmentId\n selectedCollectionId.value = collectionId\n tempEnvironmentName.value = environmentId\n editModal.show()\n}\n\nconst handleOpenColorModal = (uid: string) => {\n colorModalEnvironment.value = uid\n selectedColor.value =\n activeWorkspaceCollections.value.find(\n (collection) => collection['x-scalar-environments']?.[uid],\n )?.['x-scalar-environments']?.[uid]?.color ?? ''\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n const environmentId = colorModalEnvironment.value\n if (typeof environmentId === 'string') {\n const isCollection = activeWorkspaceCollections.value.some(\n (collection) => collection['x-scalar-environments']?.[environmentId],\n )\n if (isCollection) {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (collection['x-scalar-environments']?.[environmentId]) {\n collection['x-scalar-environments'][environmentId].color = color\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n colorModal.hide()\n }\n}\n\nfunction removeCollectionEnvironment(environmentName: string) {\n nonDraftWorkspaceCollections.value.forEach((collection) => {\n collectionMutators.removeEnvironment(environmentName, collection.uid)\n })\n\n // Redirect to last available environment\n const remainingCollectionEnvironments =\n nonDraftWorkspaceCollections.value.flatMap((collection) =>\n Object.keys(collection['x-scalar-environments'] || {}),\n )\n\n if (remainingCollectionEnvironments.length > 0) {\n const lastCollectionEnvironment =\n remainingCollectionEnvironments[\n remainingCollectionEnvironments.length - 1\n ]\n\n if (!lastCollectionEnvironment) {\n return\n }\n\n const currentCollection = activeWorkspaceCollections.value.find(\n (collection) =>\n Object.keys(collection['x-scalar-environments'] || {}).includes(\n lastCollectionEnvironment,\n ),\n )\n currentEnvironmentId.value = lastCollectionEnvironment\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: currentCollection?.uid,\n [PathId.Environment]: lastCollectionEnvironment,\n },\n })\n if (currentCollection && !collapsedSidebarFolders[currentCollection.uid]) {\n toggleSidebarFolder(currentCollection.uid)\n }\n } else {\n currentEnvironmentId.value = 'default'\n router.push({\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n },\n })\n }\n}\n\nconst getEnvironmentName = () => {\n return currentEnvironmentId.value === 'default'\n ? 'Global Environment'\n : currentEnvironmentId.value\n}\n\nconst getEnvironmentValue = () => {\n return currentEnvironmentId.value === 'default'\n ? JSON.stringify(activeWorkspace.value?.environments, null, 2)\n : JSON.stringify(\n activeWorkspaceCollections.value.find(\n (collection) =>\n collection['x-scalar-environments']?.[\n currentEnvironmentId.value ?? ''\n ],\n )?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ?.variables,\n null,\n 2,\n )\n}\n\nconst showChildren = (key: string) => {\n return collapsedSidebarFolders[key]\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'environment') {\n openEnvironmentModal()\n }\n}\n\nwatch(\n () => [route.params[PathId.Collection], route.params[PathId.Environment]],\n ([newCollectionId, newEnvironmentId]) => {\n if (newCollectionId) {\n // Collection environment\n currentEnvironmentId.value = newEnvironmentId as string\n } else {\n // Global environment\n currentEnvironmentId.value = 'default'\n }\n },\n)\n\nonMounted(() => {\n currentEnvironmentId.value =\n (route.params[PathId.Environment] as string) || 'default'\n events.hotKeys.on(handleHotKey)\n const collectionId = route.params[PathId.Collection]\n if (collectionId && !collapsedSidebarFolders[collectionId as string]) {\n toggleSidebarFolder(collectionId as string)\n }\n})\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst handleNavigation = (\n event: MouseEvent,\n uid: string,\n collectionId?: string,\n) => {\n const to = collectionId\n ? {\n name: 'environment.collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collectionId,\n [PathId.Environment]: uid,\n },\n }\n : {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Environment]: uid,\n },\n }\n if (event.metaKey) {\n window.open(router.resolve(to).href, '_blank')\n } else {\n router.push(to)\n }\n}\n\nfunction handleCancelRename() {\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nfunction handleRename(newName: string) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(newName)\n environmentNameToast(\n enviromentName,\n collection,\n selectedCollectionId.value,\n )\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (newName && selectedEnvironmentId.value !== 'default') {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (\n collection['x-scalar-environments']?.[selectedEnvironmentId.value ?? '']\n ) {\n const environments = collection['x-scalar-environments']\n // Maintains order of environments in the sidebar as we use uid as the name\n const orderedEnvs: Record<string, EnvConfig> = {}\n\n // Preserve order by rebuilding the environments object\n Object.keys(environments).forEach((key) => {\n const environment = environments[key]\n\n if (!environment) {\n return\n }\n\n if (key === selectedEnvironmentId.value) {\n orderedEnvs[newName] = environment\n } else {\n orderedEnvs[key] = environment\n }\n })\n\n collection['x-scalar-environments'] = orderedEnvs\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n\n if (newName && currentEnvironmentId.value === selectedEnvironmentId.value) {\n currentEnvironmentId.value = newName\n }\n\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\n// Replace handleEnvironmentDragEnd with the factory\nconst { handleDragEnd, isDroppable } = environmentDragHandlerFactory(\n activeWorkspaceCollections,\n collectionMutators,\n)\n\nwatch(\n () => route.query.openEnvironmentModal,\n (newVal) => {\n if (newVal === 'true') {\n openEnvironmentModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Collections\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <SidebarListElement\n :key=\"'default'\"\n class=\"text-xs\"\n :isCopyable=\"false\"\n :to=\"{\n name: 'environment',\n params: {\n [PathId.Environment]: 'default',\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: 'Global Environment',\n uid: 'default',\n icon: 'Globe',\n isDefault: true,\n }\" />\n <li\n v-for=\"collection in nonDraftWorkspaceCollections\"\n :key=\"collection.uid\"\n class=\"gap-1/2 flex flex-col\">\n <button\n class=\"hover:bg-b-2 group flex w-full items-center gap-1.5 rounded p-1.5 text-left text-sm font-medium break-words\"\n type=\"button\"\n @click=\"toggleSidebarFolder(collection.uid)\">\n <span class=\"flex h-5 max-w-[14px] items-center justify-center\">\n <LibraryIcon\n class=\"text-sidebar-c-2 size-3.5 min-w-3.5 stroke-2 group-hover:hidden\"\n :src=\"\n collection['x-scalar-icon'] || 'interface-content-folder'\n \" />\n <div\n :class=\"{\n 'rotate-90': collapsedSidebarFolders[collection.uid],\n }\">\n <ScalarIcon\n class=\"text-c-3 hover:text-c-1 hidden text-sm group-hover:block\"\n icon=\"ChevronRight\"\n size=\"md\" />\n </div>\n </span>\n {{ collection.info?.title ?? '' }}\n </button>\n <div\n v-show=\"showChildren(collection.uid)\"\n :class=\"{\n 'before:bg-border relative mb-[.5px] before:pointer-events-none before:absolute before:top-0 before:left-3 before:z-1 before:h-[calc(100%_+_.5px)] before:w-[.5px] last:mb-0 last:before:h-full':\n Object.keys(collection['x-scalar-environments'] || {})\n .length > 0,\n }\">\n <SidebarListElement\n v-for=\"(environment, environmentName) in collection[\n 'x-scalar-environments'\n ]\"\n :key=\"environmentName\"\n class=\"text-xs\"\n :collectionId=\"collection.uid\"\n :isCopyable=\"false\"\n :isDeletable=\"true\"\n :isRenameable=\"true\"\n :isDraggable=\"true\"\n :isDroppable=\"isDroppable\"\n :to=\"{\n name: 'environment.collection',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Environment]: environmentName,\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: environmentName,\n uid: environmentName,\n color: environment.color ?? '#FFFFFF',\n isDefault: false,\n }\"\n :warningMessage=\"`Are you sure you want to delete this environment?`\"\n @click.prevent=\"\n handleNavigation($event, environmentName, collection.uid)\n \"\n @colorModal=\"handleOpenColorModal(environmentName)\"\n @delete=\"removeCollectionEnvironment(environmentName)\"\n @rename=\"openRenameModal(environmentName, collection.uid)\"\n @onDragEnd=\"handleDragEnd\" />\n <ScalarButton\n v-if=\"\n Object.keys(collection['x-scalar-environments'] || {})\n .length === 0\n \"\n class=\"text-c-1 hover:bg-b-2 flex h-8 w-full justify-start gap-1.5 py-0 pl-6 text-xs\"\n variant=\"ghost\"\n @click=\"openEnvironmentModal(collection.uid)\">\n <ScalarIcon\n icon=\"Add\"\n size=\"sm\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openEnvironmentModal\"\n hotkey=\"N\">\n <template #title> Add Environment </template>\n </SidebarButton>\n </template>\n </Sidebar>\n <ViewLayoutContent class=\"flex-1\">\n <ViewLayoutSection>\n <template\n v-if=\"currentEnvironmentId\"\n #title>\n <span>\n {{ getEnvironmentName() }}\n </span>\n </template>\n <CodeInput\n v-if=\"currentEnvironmentId && activeWorkspace\"\n class=\"py-2 pr-2 pl-px md:px-4\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n language=\"json\"\n lineNumbers\n lint\n :modelValue=\"getEnvironmentValue()\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"handleEnvironmentUpdate\" />\n </ViewLayoutSection>\n </ViewLayoutContent>\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <EnvironmentModal\n :activeWorkspaceCollections=\"nonDraftWorkspaceCollections\"\n :collectionId=\"selectedCollectionId\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"addEnvironment\" />\n\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentId}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"handleCancelRename\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </ViewLayout>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { LibraryIcon } from '@scalar/icons/library'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport { useToasts } from '@scalar/use-toasts'\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useRoute, useRouter } from 'vue-router'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport Sidebar from '@/components/Sidebar/Sidebar.vue'\nimport SidebarButton from '@/components/Sidebar/SidebarButton.vue'\nimport SidebarList from '@/components/Sidebar/SidebarList.vue'\nimport SidebarListElement from '@/components/Sidebar/SidebarListElement.vue'\nimport ViewLayout from '@/components/ViewLayout/ViewLayout.vue'\nimport ViewLayoutContent from '@/components/ViewLayout/ViewLayoutContent.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useSidebar } from '@/hooks/useSidebar'\nimport type { HotKeyEvent } from '@/libs'\nimport type { EnvConfig } from '@/libs/env-helpers'\nimport { PathId } from '@/routes'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport EnvironmentColorModal from './EnvironmentColorModal.vue'\nimport EnvironmentModal from './EnvironmentModal.vue'\nimport { environmentDragHandlerFactory } from './handle-drag'\n\nconst router = useRouter()\nconst route = useRoute()\nconst {\n activeWorkspace,\n activeEnvironment,\n activeWorkspaceCollections,\n activeEnvVariables,\n} = useActiveEntities()\nconst { events, workspaceMutators, collectionMutators } = useWorkspace()\nconst { collapsedSidebarFolders, toggleSidebarFolder } = useSidebar()\nconst colorModal = useModal()\nconst environmentModal = useModal()\n\nconst editModal = useModal()\n\nconst colorModalEnvironment = ref<string | null>(null)\nconst currentEnvironmentId = ref('default')\nconst selectedColor = ref('')\nconst selectedCollectionId = ref<string | undefined>(undefined)\nconst selectedEnvironmentId = ref<string | undefined>(undefined)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst { toast } = useToasts()\n\nconst parseEnvironmentValue = (value: string): Record<string, string> =>\n JSON.parse(value)\n\nfunction environmentNameToast(\n environmentNameUsed: boolean,\n collection: any,\n collectionId: string | undefined,\n) {\n if (environmentNameUsed) {\n if (collection.uid === collectionId) {\n toast(\n `Environment name already used in ${collection.info?.title}`,\n 'error',\n )\n } else {\n toast('Environment name already used in another collection', 'error')\n }\n }\n}\n\n// Returns non-draft collections only\nconst nonDraftWorkspaceCollections = computed(() => {\n return activeWorkspaceCollections.value.filter(\n (collection) => collection.info?.title !== 'Drafts',\n )\n})\n\nfunction addEnvironment(environment: {\n name: string\n color: string\n collectionId: Collection['uid'] | undefined\n}) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(environment.name)\n environmentNameToast(enviromentName, collection, environment.collectionId)\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (environment.collectionId) {\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n environment.collectionId,\n )\n if (!collapsedSidebarFolders[environment.collectionId]) {\n toggleSidebarFolder(environment.collectionId)\n }\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: environment.collectionId,\n [PathId.Environment]: environment.name,\n },\n })\n }\n\n environmentModal.hide()\n}\n\nfunction handleEnvironmentUpdate(raw: string) {\n if (!activeEnvironment) {\n return\n }\n\n const updatedValue = parseEnvironmentValue(raw)\n\n if (currentEnvironmentId.value === 'default') {\n workspaceMutators.edit(\n activeWorkspace.value?.uid,\n 'environments',\n updatedValue,\n )\n } else {\n const collection = activeWorkspaceCollections.value.find(\n (c) => c['x-scalar-environments']?.[currentEnvironmentId.value ?? ''],\n )\n if (\n collection?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ) {\n const environment =\n collection['x-scalar-environments'][currentEnvironmentId.value ?? '']\n if (environment) {\n environment.variables = updatedValue\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n }\n }\n}\n\nconst openEnvironmentModal = (collectionId?: string) => {\n selectedCollectionId.value = collectionId\n environmentModal.show()\n}\n\nconst openRenameModal = (environmentId: string, collectionId: string) => {\n selectedEnvironmentId.value = environmentId\n selectedCollectionId.value = collectionId\n tempEnvironmentName.value = environmentId\n editModal.show()\n}\n\nconst handleOpenColorModal = (uid: string) => {\n colorModalEnvironment.value = uid\n selectedColor.value =\n activeWorkspaceCollections.value.find(\n (collection) => collection['x-scalar-environments']?.[uid],\n )?.['x-scalar-environments']?.[uid]?.color ?? ''\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n const environmentId = colorModalEnvironment.value\n if (typeof environmentId === 'string') {\n const isCollection = activeWorkspaceCollections.value.some(\n (collection) => collection['x-scalar-environments']?.[environmentId],\n )\n if (isCollection) {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (collection['x-scalar-environments']?.[environmentId]) {\n collection['x-scalar-environments'][environmentId].color = color\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n colorModal.hide()\n }\n}\n\nfunction removeCollectionEnvironment(environmentName: string) {\n nonDraftWorkspaceCollections.value.forEach((collection) => {\n collectionMutators.removeEnvironment(environmentName, collection.uid)\n })\n\n // Redirect to last available environment\n const remainingCollectionEnvironments =\n nonDraftWorkspaceCollections.value.flatMap((collection) =>\n Object.keys(collection['x-scalar-environments'] || {}),\n )\n\n if (remainingCollectionEnvironments.length > 0) {\n const lastCollectionEnvironment =\n remainingCollectionEnvironments[\n remainingCollectionEnvironments.length - 1\n ]\n\n if (!lastCollectionEnvironment) {\n return\n }\n\n const currentCollection = activeWorkspaceCollections.value.find(\n (collection) =>\n Object.keys(collection['x-scalar-environments'] || {}).includes(\n lastCollectionEnvironment,\n ),\n )\n currentEnvironmentId.value = lastCollectionEnvironment\n router.push({\n name: 'environment.collection',\n params: {\n [PathId.Collection]: currentCollection?.uid,\n [PathId.Environment]: lastCollectionEnvironment,\n },\n })\n if (currentCollection && !collapsedSidebarFolders[currentCollection.uid]) {\n toggleSidebarFolder(currentCollection.uid)\n }\n } else {\n currentEnvironmentId.value = 'default'\n router.push({\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n },\n })\n }\n}\n\nconst getEnvironmentName = () => {\n return currentEnvironmentId.value === 'default'\n ? 'Global Environment'\n : currentEnvironmentId.value\n}\n\nconst getEnvironmentValue = () => {\n return currentEnvironmentId.value === 'default'\n ? JSON.stringify(activeWorkspace.value?.environments, null, 2)\n : JSON.stringify(\n activeWorkspaceCollections.value.find(\n (collection) =>\n collection['x-scalar-environments']?.[\n currentEnvironmentId.value ?? ''\n ],\n )?.['x-scalar-environments']?.[currentEnvironmentId.value ?? '']\n ?.variables,\n null,\n 2,\n )\n}\n\nconst showChildren = (key: string) => {\n return collapsedSidebarFolders[key]\n}\n\nconst handleHotKey = (event?: HotKeyEvent) => {\n if (event?.createNew && route.name === 'environment') {\n openEnvironmentModal()\n }\n}\n\nwatch(\n () => [route.params[PathId.Collection], route.params[PathId.Environment]],\n ([newCollectionId, newEnvironmentId]) => {\n if (newCollectionId) {\n // Collection environment\n currentEnvironmentId.value = newEnvironmentId as string\n } else {\n // Global environment\n currentEnvironmentId.value = 'default'\n }\n },\n)\n\nonMounted(() => {\n currentEnvironmentId.value =\n (route.params[PathId.Environment] as string) || 'default'\n events.hotKeys.on(handleHotKey)\n const collectionId = route.params[PathId.Collection]\n if (collectionId && !collapsedSidebarFolders[collectionId as string]) {\n toggleSidebarFolder(collectionId as string)\n }\n})\nonBeforeUnmount(() => events.hotKeys.off(handleHotKey))\n\nconst handleNavigation = (\n event: MouseEvent,\n uid: string,\n collectionId?: string,\n) => {\n const to = collectionId\n ? {\n name: 'environment.collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Collection]: collectionId,\n [PathId.Environment]: uid,\n },\n }\n : {\n name: 'environment.default',\n params: {\n [PathId.Workspace]: activeWorkspace.value?.uid,\n [PathId.Environment]: uid,\n },\n }\n if (event.metaKey) {\n window.open(router.resolve(to).href, '_blank')\n } else {\n router.push(to)\n }\n}\n\nfunction handleCancelRename() {\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nfunction handleRename(newName: string) {\n const environmentNameUsed = nonDraftWorkspaceCollections.value.some(\n (collection) => {\n const enviromentName = Object.keys(\n collection['x-scalar-environments'] || {},\n ).includes(newName)\n environmentNameToast(\n enviromentName,\n collection,\n selectedCollectionId.value,\n )\n return enviromentName\n },\n )\n if (environmentNameUsed) {\n return\n }\n if (newName && selectedEnvironmentId.value !== 'default') {\n activeWorkspaceCollections.value.forEach((collection) => {\n if (\n collection['x-scalar-environments']?.[selectedEnvironmentId.value ?? '']\n ) {\n const environments = collection['x-scalar-environments']\n // Maintains order of environments in the sidebar as we use uid as the name\n const orderedEnvs: Record<string, EnvConfig> = {}\n\n // Preserve order by rebuilding the environments object\n Object.keys(environments).forEach((key) => {\n const environment = environments[key]\n\n if (!environment) {\n return\n }\n\n if (key === selectedEnvironmentId.value) {\n orderedEnvs[newName] = environment\n } else {\n orderedEnvs[key] = environment\n }\n })\n\n collection['x-scalar-environments'] = orderedEnvs\n collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n collection['x-scalar-environments'],\n )\n }\n })\n }\n\n if (newName && currentEnvironmentId.value === selectedEnvironmentId.value) {\n currentEnvironmentId.value = newName\n }\n\n selectedEnvironmentId.value = undefined\n selectedCollectionId.value = undefined\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\n// Replace handleEnvironmentDragEnd with the factory\nconst { handleDragEnd, isDroppable } = environmentDragHandlerFactory(\n activeWorkspaceCollections,\n collectionMutators,\n)\n\nwatch(\n () => route.query.openEnvironmentModal,\n (newVal) => {\n if (newVal === 'true') {\n openEnvironmentModal()\n }\n },\n { immediate: true },\n)\n</script>\n<template>\n <ViewLayout>\n <Sidebar title=\"Collections\">\n <template #content>\n <div class=\"flex-1\">\n <SidebarList>\n <SidebarListElement\n :key=\"'default'\"\n class=\"text-xs\"\n :isCopyable=\"false\"\n :to=\"{\n name: 'environment',\n params: {\n [PathId.Environment]: 'default',\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: 'Global Environment',\n uid: 'default',\n icon: 'Globe',\n isDefault: true,\n }\" />\n <li\n v-for=\"collection in nonDraftWorkspaceCollections\"\n :key=\"collection.uid\"\n class=\"gap-1/2 flex flex-col\">\n <button\n class=\"hover:bg-b-2 group flex w-full items-center gap-1.5 rounded p-1.5 text-left text-sm font-medium break-words\"\n type=\"button\"\n @click=\"toggleSidebarFolder(collection.uid)\">\n <span class=\"flex h-5 max-w-[14px] items-center justify-center\">\n <LibraryIcon\n class=\"text-sidebar-c-2 size-3.5 min-w-3.5 stroke-2 group-hover:hidden\"\n :src=\"\n collection['x-scalar-icon'] || 'interface-content-folder'\n \" />\n <div\n :class=\"{\n 'rotate-90': collapsedSidebarFolders[collection.uid],\n }\">\n <ScalarIcon\n class=\"text-c-3 hover:text-c-1 hidden text-sm group-hover:block\"\n icon=\"ChevronRight\"\n size=\"md\" />\n </div>\n </span>\n {{ collection.info?.title ?? '' }}\n </button>\n <div\n v-show=\"showChildren(collection.uid)\"\n :class=\"{\n 'before:bg-border relative mb-[.5px] before:pointer-events-none before:absolute before:top-0 before:left-3 before:z-1 before:h-[calc(100%_+_.5px)] before:w-[.5px] last:mb-0 last:before:h-full':\n Object.keys(collection['x-scalar-environments'] || {})\n .length > 0,\n }\">\n <SidebarListElement\n v-for=\"(environment, environmentName) in collection[\n 'x-scalar-environments'\n ]\"\n :key=\"environmentName\"\n class=\"text-xs\"\n :collectionId=\"collection.uid\"\n :isCopyable=\"false\"\n :isDeletable=\"true\"\n :isRenameable=\"true\"\n :isDraggable=\"true\"\n :isDroppable=\"isDroppable\"\n :to=\"{\n name: 'environment.collection',\n params: {\n [PathId.Collection]: collection.uid,\n [PathId.Environment]: environmentName,\n },\n }\"\n type=\"environment\"\n :variable=\"{\n name: environmentName,\n uid: environmentName,\n color: environment.color ?? '#FFFFFF',\n isDefault: false,\n }\"\n :warningMessage=\"`Are you sure you want to delete this environment?`\"\n @click.prevent=\"\n handleNavigation($event, environmentName, collection.uid)\n \"\n @colorModal=\"handleOpenColorModal(environmentName)\"\n @delete=\"removeCollectionEnvironment(environmentName)\"\n @rename=\"openRenameModal(environmentName, collection.uid)\"\n @onDragEnd=\"handleDragEnd\" />\n <ScalarButton\n v-if=\"\n Object.keys(collection['x-scalar-environments'] || {})\n .length === 0\n \"\n class=\"text-c-1 hover:bg-b-2 flex h-8 w-full justify-start gap-1.5 py-0 pl-6 text-xs\"\n variant=\"ghost\"\n @click=\"openEnvironmentModal(collection.uid)\">\n <ScalarIcon\n icon=\"Add\"\n size=\"sm\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </li>\n </SidebarList>\n </div>\n </template>\n <template #button>\n <SidebarButton\n :click=\"openEnvironmentModal\"\n hotkey=\"N\">\n <template #title> Add Environment </template>\n </SidebarButton>\n </template>\n </Sidebar>\n <ViewLayoutContent class=\"flex-1\">\n <ViewLayoutSection>\n <template\n v-if=\"currentEnvironmentId\"\n #title>\n <span>\n {{ getEnvironmentName() }}\n </span>\n </template>\n <CodeInput\n v-if=\"currentEnvironmentId && activeWorkspace\"\n class=\"py-2 pr-2 pl-px md:px-4\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n language=\"json\"\n lineNumbers\n lint\n :modelValue=\"getEnvironmentValue()\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"handleEnvironmentUpdate\" />\n </ViewLayoutSection>\n </ViewLayoutContent>\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <EnvironmentModal\n :activeWorkspaceCollections=\"nonDraftWorkspaceCollections\"\n :collectionId=\"selectedCollectionId\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"addEnvironment\" />\n\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentId}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"handleCancelRename\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </ViewLayout>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as useWorkspace } from "./store-
|
|
1
|
+
import { r as useWorkspace } from "./store-DaPoVtIS.js";
|
|
2
2
|
import { n as CommandActionForm_default, t as CommandActionInput_default } from "./CommandActionInput-TkcAx6E8.js";
|
|
3
3
|
import { n as SidebarListElementForm_default } from "./DeleteSidebarListElement-C-p87d03.js";
|
|
4
4
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, openBlock, ref, renderList, toDisplayString, unref, vModelText, watch, withCtx, withDirectives } from "vue";
|
|
@@ -285,4 +285,4 @@ var EnvironmentModal_default = /* @__PURE__ */ defineComponent({
|
|
|
285
285
|
//#endregion
|
|
286
286
|
export { EnvironmentColorModal_default as n, EnvironmentModal_default as t };
|
|
287
287
|
|
|
288
|
-
//# sourceMappingURL=EnvironmentModal-
|
|
288
|
+
//# sourceMappingURL=EnvironmentModal-CcyqnPc2.js.map
|