@scalar/api-client 2.38.3 → 2.38.4
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 +6 -0
- package/dist/{AddressBar-CX8xiYoe.js → AddressBar-BOZGKSoz.js} +4 -4
- package/dist/{AddressBar-CX8xiYoe.js.map → AddressBar-BOZGKSoz.js.map} +1 -1
- package/dist/{App-BpNPKHmM.js → App-DHBmpWJI.js} +4 -4
- package/dist/{App-BpNPKHmM.js.map → App-DHBmpWJI.js.map} +1 -1
- package/dist/{CodeInput-BN7uw3Bh.js → CodeInput-BTN8cC5h.js} +2 -2
- package/dist/{CodeInput-BN7uw3Bh.js.map → CodeInput-BTN8cC5h.js.map} +1 -1
- package/dist/{Collection-ChAxs3rz.js → Collection-BsAG7ms5.js} +2 -2
- package/dist/{Collection-ChAxs3rz.js.map → Collection-BsAG7ms5.js.map} +1 -1
- package/dist/{CollectionAuthentication-BDpvv8cA.js → CollectionAuthentication-BMGhRnpo.js} +5 -5
- package/dist/{CollectionAuthentication-BDpvv8cA.js.map → CollectionAuthentication-BMGhRnpo.js.map} +1 -1
- package/dist/{CollectionEnvironment-dwisJ-h5.js → CollectionEnvironment-BY9Gcnln.js} +4 -4
- package/dist/{CollectionEnvironment-dwisJ-h5.js.map → CollectionEnvironment-BY9Gcnln.js.map} +1 -1
- package/dist/{CollectionOverview-CJ9-Vmei.js → CollectionOverview-C3GvN8GY.js} +3 -3
- package/dist/{CollectionOverview-CJ9-Vmei.js.map → CollectionOverview-C3GvN8GY.js.map} +1 -1
- package/dist/{CollectionServers-BWkIGwz4.js → CollectionServers-DuOLysNB.js} +5 -5
- package/dist/{CollectionServers-BWkIGwz4.js.map → CollectionServers-DuOLysNB.js.map} +1 -1
- package/dist/{CollectionSettings-CqUUYOym.js → CollectionSettings-FtXNetOh.js} +2 -2
- package/dist/{CollectionSettings-CqUUYOym.js.map → CollectionSettings-FtXNetOh.js.map} +1 -1
- package/dist/{CommandPalette-BiA0IgO8.js → CommandPalette-BxoEK8TY.js} +2 -2
- package/dist/{CommandPalette-BiA0IgO8.js.map → CommandPalette-BxoEK8TY.js.map} +1 -1
- package/dist/{Cookies-CNRSxP8J.js → Cookies-BYTv1YIA.js} +8 -8
- package/dist/{Cookies-CNRSxP8J.js.map → Cookies-BYTv1YIA.js.map} +1 -1
- package/dist/{DataTableInput-SkIUPlrB.js → DataTableInput-RydMDjn2.js} +2 -2
- package/dist/{DataTableInput-SkIUPlrB.js.map → DataTableInput-RydMDjn2.js.map} +1 -1
- package/dist/{Environment-D_CbZk0A.js → Environment-BIxG7DaO.js} +5 -5
- package/dist/{Environment-D_CbZk0A.js.map → Environment-BIxG7DaO.js.map} +1 -1
- package/dist/{EnvironmentModal-CcyqnPc2.js → EnvironmentModal-C0lYytkh.js} +2 -2
- package/dist/{EnvironmentModal-CcyqnPc2.js.map → EnvironmentModal-C0lYytkh.js.map} +1 -1
- package/dist/{Form-bA4bV_oA.js → Form-KFcdRQp1.js} +3 -3
- package/dist/{Form-bA4bV_oA.js.map → Form-KFcdRQp1.js.map} +1 -1
- package/dist/{ImportCollection-BIYMxB9Q.js → ImportCollection-CGjySEzP.js} +2 -2
- package/dist/{ImportCollection-BIYMxB9Q.js.map → ImportCollection-CGjySEzP.js.map} +1 -1
- package/dist/{MainLayout-oMIJ5QXF.js → MainLayout-BnLwst16.js} +3 -3
- package/dist/{MainLayout-oMIJ5QXF.js.map → MainLayout-BnLwst16.js.map} +1 -1
- package/dist/{Modal-DkOa_KK0.js → Modal-CTZ8UNds.js} +2 -2
- package/dist/{Modal-DkOa_KK0.js.map → Modal-CTZ8UNds.js.map} +1 -1
- package/dist/{Request-BWfYWyBa.js → Request-d0RY0ZhC.js} +10 -10
- package/dist/{Request-BWfYWyBa.js.map → Request-d0RY0ZhC.js.map} +1 -1
- package/dist/{RequestAuth-BU6ubH-c.js → RequestAuth-1cRH3DDn.js} +3 -3
- package/dist/{RequestAuth-BU6ubH-c.js.map → RequestAuth-1cRH3DDn.js.map} +1 -1
- package/dist/{RequestRoot-7xhK5_qr.js → RequestRoot-pW0yXesG.js} +7 -7
- package/dist/{RequestRoot-7xhK5_qr.js.map → RequestRoot-pW0yXesG.js.map} +1 -1
- package/dist/{RequestSection-Bx8UHW-k.js → RequestSection-D2BLvDTr.js} +4 -4
- package/dist/{RequestSection-Bx8UHW-k.js.map → RequestSection-D2BLvDTr.js.map} +1 -1
- package/dist/{ResponseSection-CLrgLMN_.js → ResponseSection-B_YF7l_E.js} +3 -3
- package/dist/{ResponseSection-CLrgLMN_.js.map → ResponseSection-B_YF7l_E.js.map} +1 -1
- package/dist/{Server-BS4zjUdO.js → Server-CEKGIEfE.js} +2 -2
- package/dist/{Server-BS4zjUdO.js.map → Server-CEKGIEfE.js.map} +1 -1
- package/dist/{Settings-BuLKHzRY.js → Settings-BaPvhJ8Y.js} +2 -2
- package/dist/{Settings-BuLKHzRY.js.map → Settings-BaPvhJ8Y.js.map} +1 -1
- package/dist/{Sidebar-Xl9_nFXX.js → Sidebar-CRxdl38Y.js} +2 -2
- package/dist/{Sidebar-Xl9_nFXX.js.map → Sidebar-CRxdl38Y.js.map} +1 -1
- package/dist/components/AddressBar/AddressBar.vue.d.ts +1 -1
- package/dist/components/AddressBar/index.js +3 -3
- package/dist/components/CodeInput/CodeInput.vue.d.ts +1 -1
- package/dist/components/CodeInput/codeVariableWidget.d.ts +1 -1
- package/dist/components/CodeInput/index.js +1 -1
- package/dist/components/CommandPalette/index.js +1 -1
- package/dist/components/DataTable/DataTableInput.vue.d.ts +2 -2
- package/dist/components/DataTable/index.js +2 -2
- package/dist/components/Form/LabelInput.vue.d.ts +1 -1
- package/dist/components/ImportCollection/index.js +1 -1
- package/dist/components/ImportCollection/utils/import-collection.d.ts +1 -1
- package/dist/components/ImportCollection/utils/workspace-store-is-empty.d.ts +1 -1
- package/dist/components/Server/ServerVariablesForm.vue.d.ts +1 -1
- package/dist/components/Server/index.js +1 -1
- package/dist/components/Sidebar/index.js +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/index.js +4 -4
- package/dist/{components-DfJHvSLM.js → components-B0BwUDFw.js} +2 -2
- package/dist/{components-DfJHvSLM.js.map → components-B0BwUDFw.js.map} +1 -1
- package/dist/hooks/useSidebar.d.ts +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +5 -5
- package/dist/layouts/App/create-api-client-app.d.ts +9 -9
- package/dist/layouts/App/index.js +3 -3
- package/dist/layouts/Modal/create-api-client-modal.d.ts +1 -1
- package/dist/layouts/Modal/index.d.ts +1 -1
- package/dist/layouts/Modal/index.js +1 -1
- package/dist/layouts/Web/create-api-client-web.d.ts +9 -9
- package/dist/layouts/Web/index.js +4 -4
- package/dist/libs/create-client.d.ts +3 -3
- package/dist/libs/environment-parser.d.ts +1 -1
- package/dist/libs/get-request-uid-by-path-method.d.ts +1 -1
- package/dist/libs/hot-keys.d.ts +1 -1
- package/dist/libs/index.d.ts +1 -1
- package/dist/libs/index.js +1 -1
- package/dist/libs/local-storage.d.ts +1 -1
- package/dist/libs/send-request/create-request-operation.d.ts +3 -3
- package/dist/{operation-block-DE-hoO03.js → operation-block-B1B3lJPx.js} +3 -3
- package/dist/{operation-block-DE-hoO03.js.map → operation-block-B1B3lJPx.js.map} +1 -1
- package/dist/{operation-code-sample-xgx4qi2H.js → operation-code-sample-DOzAPxLQ.js} +2 -2
- package/dist/{operation-code-sample-xgx4qi2H.js.map → operation-code-sample-DOzAPxLQ.js.map} +1 -1
- package/dist/plugins/hooks/usePluginManager.d.ts +1 -1
- package/dist/{request-block-N7dPFyrG.js → request-block-C1kLLMEd.js} +2 -2
- package/dist/{request-block-N7dPFyrG.js.map → request-block-C1kLLMEd.js.map} +1 -1
- package/dist/store/collections.d.ts +1 -1
- package/dist/store/environment.d.ts +1 -1
- package/dist/store/events.d.ts +8 -8
- package/dist/store/import-spec.d.ts +2 -2
- package/dist/store/index.js +1 -1
- package/dist/store/request-example.d.ts +1 -1
- package/dist/store/requests.d.ts +1 -1
- package/dist/store/security-schemes.d.ts +1 -1
- package/dist/store/servers.d.ts +1 -1
- package/dist/store/store.d.ts +7 -7
- package/dist/store/tags.d.ts +1 -1
- package/dist/store/workspace.d.ts +1 -1
- package/dist/{store-DaPoVtIS.js → store-DnlAQK5d.js} +15 -15
- package/dist/{store-DaPoVtIS.js.map → store-DnlAQK5d.js.map} +1 -1
- package/dist/v2/blocks/operation-block/OperationBlock.vue.d.ts +3 -3
- package/dist/v2/blocks/operation-block/components/Header.vue.d.ts +2 -2
- package/dist/v2/blocks/operation-block/helpers/build-request-security.d.ts +2 -2
- package/dist/v2/blocks/operation-block/helpers/build-request.d.ts +2 -2
- package/dist/v2/blocks/operation-block/helpers/har-to-fetch-response.d.ts +1 -1
- package/dist/v2/blocks/operation-block/helpers/send-request.d.ts +1 -1
- package/dist/v2/blocks/operation-block/index.js +8 -8
- package/dist/v2/blocks/operation-code-sample/components/OperationCodeSample.vue.d.ts +2 -2
- package/dist/v2/blocks/operation-code-sample/helpers/find-client.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/generate-client-options.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/generate-code-snippet.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/get-clients.d.ts +2 -2
- package/dist/v2/blocks/operation-code-sample/helpers/get-secrets.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/operation-to-har.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/helpers/operation-to-har/process-security-schemes.d.ts +1 -1
- package/dist/v2/blocks/operation-code-sample/index.js +1 -1
- package/dist/v2/blocks/request-block/RequestBlock.vue.d.ts +4 -4
- package/dist/v2/blocks/request-block/components/RequestCodeSnippet.vue.d.ts +1 -1
- package/dist/v2/blocks/request-block/components/RequestTable.vue.d.ts +1 -1
- package/dist/v2/blocks/request-block/helpers/create-parameter-handlers.d.ts +1 -1
- package/dist/v2/blocks/request-block/helpers/get-form-body-rows.d.ts +1 -1
- package/dist/v2/blocks/request-block/index.js +4 -4
- package/dist/v2/blocks/response-block/ResponseBlock.vue.d.ts +1 -1
- package/dist/v2/blocks/response-block/components/ResponseBodyPreview.vue.d.ts +1 -1
- package/dist/v2/blocks/response-block/components/ResponseEmpty.vue.d.ts +1 -1
- package/dist/v2/blocks/response-block/index.js +2 -2
- package/dist/v2/blocks/scalar-address-bar-block/components/AddressBar.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/AuthSelector.vue.d.ts +3 -3
- package/dist/v2/blocks/scalar-auth-selector-block/components/OAuth2.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTable.vue.d.ts +2 -2
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthDataTableInput.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/components/RequestAuthTab.vue.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/fetch-openid-connect-discovery.d.ts +1 -1
- package/dist/v2/blocks/scalar-auth-selector-block/helpers/oauth.d.ts +2 -2
- package/dist/v2/blocks/scalar-auth-selector-block/index.js +2 -2
- package/dist/v2/components/code-input/CodeInput.vue.d.ts +1 -1
- package/dist/v2/components/data-table/DataTableInput.vue.d.ts +1 -1
- package/dist/v2/components/data-table/DataTableInputSelect.vue.d.ts +1 -1
- package/dist/v2/components/server/ServerDropdown.vue.d.ts +1 -1
- package/dist/v2/components/sidebar/Sidebar.vue.d.ts +1 -1
- package/dist/v2/features/app/App.vue.d.ts +3 -3
- package/dist/v2/features/app/components/AppSidebar.vue.d.ts +1 -1
- package/dist/v2/features/app/components/index.js +2 -2
- package/dist/v2/features/app/helpers/create-api-client-app.d.ts +3 -3
- package/dist/v2/features/app/helpers/get-route-param.d.ts +1 -1
- package/dist/v2/features/app/helpers/routes.d.ts +3 -3
- package/dist/v2/features/app/index.d.ts +5 -5
- package/dist/v2/features/app/index.js +8 -8
- package/dist/v2/features/collection/DocumentCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/OperationCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/WorkspaceCollection.vue.d.ts +1 -1
- package/dist/v2/features/collection/components/Authentication.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Cookies.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Editor/Editor.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Environment.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Overview.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Servers.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Settings.vue.d.ts +4 -4
- package/dist/v2/features/collection/components/Tabs.vue.d.ts +1 -1
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts +45 -10
- package/dist/v2/features/command-palette/hooks/use-command-palette-state.d.ts.map +1 -1
- package/dist/v2/features/editor/helpers/json/create-json-model.d.ts +1 -1
- package/dist/v2/features/editor/helpers/yaml/create-yaml-model.d.ts +1 -1
- package/dist/v2/features/editor/helpers/yaml/get-yaml-node-range-from-path.d.ts +1 -1
- package/dist/v2/features/editor/hooks/use-editor.d.ts +1 -1
- package/dist/v2/features/editor/hooks/use-json-pointer-link-support.d.ts +1 -1
- package/dist/v2/features/modal/Modal.vue.d.ts +1 -1
- package/dist/v2/features/modal/helpers/create-api-client-modal.d.ts +2 -2
- package/dist/v2/features/modal/hooks/use-modal-sidebar.d.ts +1 -1
- package/dist/v2/features/modal/index.js +8 -8
- package/dist/v2/features/modal/modal-events.d.ts +1 -1
- package/dist/v2/features/operation/Operation.vue.d.ts +2 -2
- package/dist/v2/features/operation/index.js +8 -8
- package/dist/v2/features/search/helpers/create-fuse-instance.d.ts +1 -1
- package/dist/v2/features/search/helpers/create-search-index.d.ts +1 -1
- package/dist/v2/helpers/get-active-proxy-url.d.ts +1 -1
- package/dist/v2/helpers/get-tab-details.d.ts +1 -1
- package/dist/v2/helpers/handle-hotkeys.d.ts +1 -1
- package/dist/v2/hooks/use-global-hot-keys.d.ts +1 -1
- package/dist/views/Collection/components/EnvironmentForm.vue.d.ts +1 -1
- package/dist/views/Collection/components/MarkdownInput.vue.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/CodeSnippet.vue.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/helpers/get-har-request.d.ts +1 -1
- package/dist/views/Components/CodeSnippet/helpers/get-snippet.d.ts +1 -1
- package/dist/views/Environment/EnvironmentVariableDropdown.vue.d.ts +1 -1
- package/dist/views/Environment/handle-drag.d.ts +1 -1
- package/dist/views/Request/Request.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/OAuth2.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/OAuthScopesInput.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuth.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTable.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthDataTableInput.vue.d.ts +2 -2
- package/dist/views/Request/RequestSection/RequestAuth/RequestAuthTab.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/helpers/restore-auth-from-local-storage.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestAuth/index.js +3 -3
- package/dist/views/Request/RequestSection/RequestBody.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestCodeExample.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestParams.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestPathParams.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestSection.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/RequestTable.vue.d.ts +1 -1
- package/dist/views/Request/RequestSection/helpers/update-scheme.d.ts +1 -1
- package/dist/views/Request/RequestSection/index.js +4 -4
- package/dist/views/Request/RequestSidebarItem.vue.d.ts +1 -1
- package/dist/views/Request/RequestSidebarItemMenu.vue.d.ts +3 -3
- package/dist/views/Request/RequestSubpageHeader.vue.d.ts +1 -1
- package/dist/views/Request/ResponseSection/ResponseBodyPreview.vue.d.ts +1 -1
- package/dist/views/Request/ResponseSection/ResponseSection.vue.d.ts +1 -1
- package/dist/views/Request/ResponseSection/index.js +3 -3
- package/dist/views/Request/components/index.js +1 -1
- package/dist/views/Request/handle-drag.d.ts +2 -2
- package/dist/views/Request/libs/auth.d.ts +1 -1
- package/dist/views/Request/libs/oauth2.d.ts +1 -1
- package/dist/views/Request/libs/watch-mode.d.ts +2 -2
- package/package.json +12 -12
package/dist/{CollectionEnvironment-dwisJ-h5.js.map → CollectionEnvironment-BY9Gcnln.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionEnvironment-dwisJ-h5.js","names":[],"sources":["../src/views/Collection/components/EnvironmentForm.vue","../src/views/Collection/components/EnvironmentForm.vue","../src/views/Collection/CollectionEnvironment.vue","../src/views/Collection/CollectionEnvironment.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconTrash, ScalarIconWarning } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport { useWorkspace } from '@/store'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { collection, environment, workspace, envVariables } = defineProps<{\n collection: Collection\n environment: Environment\n workspace: Workspace\n envVariables: EnvVariable[]\n}>()\n\nconst { collectionMutators } = useWorkspace()\n\n//\nconst localVariables = ref<Array<{ key: string; value: string }>>([])\n\n// Set of existing keys from the collection\nconst collectionKeys = ref<Set<string>>(new Set())\n\n// Map of key typed by the user\nconst tempKeys = ref<Map<number, string>>(new Map())\n\n// Prevent multiple updates to the collection\nconst isUpdating = ref(false)\n\nconst variables = computed(() => {\n if (!environment?.value) {\n return [{ key: '', value: '' }]\n }\n try {\n const parsedObject = JSON.parse(environment.value)\n const entries = Object.entries(parsedObject).map(([key, val]) => ({\n key,\n value: String(val),\n }))\n if (entries.length === 0) {\n return [{ key: '', value: '' }]\n }\n return entries\n } catch (_) {\n return [{ key: '', value: '' }]\n }\n})\n\nconst environmentVariables = computed(() => {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (!lastRow) {\n return [{ key: '', value: '' }]\n }\n if (lastRow.key || lastRow.value) {\n return [...localVariables.value, { key: '', value: '' }]\n }\n return localVariables.value\n})\n\nconst getDuplicateKeyIndexes = computed(() => {\n const keyCounts = new Map<string, number[]>()\n\n // Add existing keys from the collection\n localVariables.value.forEach((v, index) => {\n if (v.key) {\n const indexes = keyCounts.get(v.key) || []\n indexes.push(index)\n keyCounts.set(v.key, indexes)\n }\n })\n\n // Add typed keys that are being edited\n tempKeys.value.forEach((key, index) => {\n if (key) {\n const indexes = keyCounts.get(key) || []\n indexes.push(index)\n keyCounts.set(key, indexes)\n }\n })\n\n return Array.from(keyCounts.values())\n .filter((indexes) => indexes.length > 1)\n .flat()\n})\n\n// Update originalKeys when variables change\nwatch(\n variables,\n (newVars) => {\n localVariables.value = [...newVars]\n collectionKeys.value = new Set(newVars.map((v) => v.key).filter(Boolean))\n },\n { immediate: true },\n)\n\nconst handleUpdateRow = async (\n index: number,\n field: 'key' | 'value',\n value: string,\n) => {\n if (isUpdating.value) {\n return\n }\n\n if (field === 'key') {\n // Store the typed key\n tempKeys.value.set(index, value)\n\n // Check for duplicates\n const otherKeys = new Set(collectionKeys.value)\n const currentItem = localVariables.value[index]\n\n // Remove the current item from the set of original keys\n if (currentItem) {\n otherKeys.delete(currentItem.key)\n }\n\n // If it's a duplicate, don't proceed with mutation\n if (otherKeys.has(value)) {\n return\n }\n }\n\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n const currentItem = newVariables[index]\n if (!currentItem) {\n return\n }\n\n newVariables[index] = {\n key: field === 'key' ? value : currentItem.key,\n value: field === 'value' ? value : currentItem.value,\n }\n\n if (\n !newVariables[index].key &&\n !newVariables[index].value &&\n index !== newVariables.length - 1\n ) {\n newVariables.splice(index, 1)\n }\n\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n if (index === localVariables.value.length - 1) {\n const lastRow = newVariables[newVariables.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n\n await nextTick()\n localVariables.value = newVariables\n\n // Update collection keys after successful update\n if (field === 'key') {\n collectionKeys.value = new Set(\n newVariables.map((v) => v.key).filter(Boolean),\n )\n // Clear the typed key after successful update\n tempKeys.value.delete(index)\n }\n } finally {\n isUpdating.value = false\n }\n}\n\nconst addRow = async () => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value, { key: '', value: '' }]\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\nconst handleDeleteRow = async (index: number) => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n newVariables.splice(index, 1)\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\n// Keep an empty row at the end of the table\nconst defaultRow = async () => {\n if (localVariables.value.length === 0) {\n await addRow()\n } else if (localVariables.value.length >= 1) {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n}\n\nonMounted(() => {\n defaultRow()\n})\n\n// Update the collection on local variables changes\nwatch(\n () => localVariables.value,\n () => {\n defaultRow()\n },\n)\n</script>\n\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"['', '']\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Key</DataTableHeader>\n <DataTableHeader>Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(variable, index) in environmentVariables\"\n :key=\"index\"\n :class=\"{\n error: getDuplicateKeyIndexes.includes(index),\n }\">\n <DataTableCell>\n <CodeInput\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.key\"\n placeholder=\"Key\"\n :workspace=\"workspace\"\n @update:modelValue=\"(v: string) => handleUpdateRow(index, 'key', v)\">\n <template\n #icon\n v-if=\"getDuplicateKeyIndexes.includes(index)\">\n <ScalarIconWarning\n class=\"text-red mr-0.75 size-3.5 brightness-[.9]\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n class=\"pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10\"\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.value\"\n placeholder=\"Value\"\n :workspace=\"workspace\"\n @update:modelValue=\"\n (v: string) => handleUpdateRow(index, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"variable.key || variable.value\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click.stop=\"handleDeleteRow(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </template>\n </CodeInput>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\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}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconTrash, ScalarIconWarning } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport { useWorkspace } from '@/store'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { collection, environment, workspace, envVariables } = defineProps<{\n collection: Collection\n environment: Environment\n workspace: Workspace\n envVariables: EnvVariable[]\n}>()\n\nconst { collectionMutators } = useWorkspace()\n\n//\nconst localVariables = ref<Array<{ key: string; value: string }>>([])\n\n// Set of existing keys from the collection\nconst collectionKeys = ref<Set<string>>(new Set())\n\n// Map of key typed by the user\nconst tempKeys = ref<Map<number, string>>(new Map())\n\n// Prevent multiple updates to the collection\nconst isUpdating = ref(false)\n\nconst variables = computed(() => {\n if (!environment?.value) {\n return [{ key: '', value: '' }]\n }\n try {\n const parsedObject = JSON.parse(environment.value)\n const entries = Object.entries(parsedObject).map(([key, val]) => ({\n key,\n value: String(val),\n }))\n if (entries.length === 0) {\n return [{ key: '', value: '' }]\n }\n return entries\n } catch (_) {\n return [{ key: '', value: '' }]\n }\n})\n\nconst environmentVariables = computed(() => {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (!lastRow) {\n return [{ key: '', value: '' }]\n }\n if (lastRow.key || lastRow.value) {\n return [...localVariables.value, { key: '', value: '' }]\n }\n return localVariables.value\n})\n\nconst getDuplicateKeyIndexes = computed(() => {\n const keyCounts = new Map<string, number[]>()\n\n // Add existing keys from the collection\n localVariables.value.forEach((v, index) => {\n if (v.key) {\n const indexes = keyCounts.get(v.key) || []\n indexes.push(index)\n keyCounts.set(v.key, indexes)\n }\n })\n\n // Add typed keys that are being edited\n tempKeys.value.forEach((key, index) => {\n if (key) {\n const indexes = keyCounts.get(key) || []\n indexes.push(index)\n keyCounts.set(key, indexes)\n }\n })\n\n return Array.from(keyCounts.values())\n .filter((indexes) => indexes.length > 1)\n .flat()\n})\n\n// Update originalKeys when variables change\nwatch(\n variables,\n (newVars) => {\n localVariables.value = [...newVars]\n collectionKeys.value = new Set(newVars.map((v) => v.key).filter(Boolean))\n },\n { immediate: true },\n)\n\nconst handleUpdateRow = async (\n index: number,\n field: 'key' | 'value',\n value: string,\n) => {\n if (isUpdating.value) {\n return\n }\n\n if (field === 'key') {\n // Store the typed key\n tempKeys.value.set(index, value)\n\n // Check for duplicates\n const otherKeys = new Set(collectionKeys.value)\n const currentItem = localVariables.value[index]\n\n // Remove the current item from the set of original keys\n if (currentItem) {\n otherKeys.delete(currentItem.key)\n }\n\n // If it's a duplicate, don't proceed with mutation\n if (otherKeys.has(value)) {\n return\n }\n }\n\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n const currentItem = newVariables[index]\n if (!currentItem) {\n return\n }\n\n newVariables[index] = {\n key: field === 'key' ? value : currentItem.key,\n value: field === 'value' ? value : currentItem.value,\n }\n\n if (\n !newVariables[index].key &&\n !newVariables[index].value &&\n index !== newVariables.length - 1\n ) {\n newVariables.splice(index, 1)\n }\n\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n if (index === localVariables.value.length - 1) {\n const lastRow = newVariables[newVariables.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n\n await nextTick()\n localVariables.value = newVariables\n\n // Update collection keys after successful update\n if (field === 'key') {\n collectionKeys.value = new Set(\n newVariables.map((v) => v.key).filter(Boolean),\n )\n // Clear the typed key after successful update\n tempKeys.value.delete(index)\n }\n } finally {\n isUpdating.value = false\n }\n}\n\nconst addRow = async () => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value, { key: '', value: '' }]\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\nconst handleDeleteRow = async (index: number) => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n newVariables.splice(index, 1)\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\n// Keep an empty row at the end of the table\nconst defaultRow = async () => {\n if (localVariables.value.length === 0) {\n await addRow()\n } else if (localVariables.value.length >= 1) {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n}\n\nonMounted(() => {\n defaultRow()\n})\n\n// Update the collection on local variables changes\nwatch(\n () => localVariables.value,\n () => {\n defaultRow()\n },\n)\n</script>\n\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"['', '']\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Key</DataTableHeader>\n <DataTableHeader>Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(variable, index) in environmentVariables\"\n :key=\"index\"\n :class=\"{\n error: getDuplicateKeyIndexes.includes(index),\n }\">\n <DataTableCell>\n <CodeInput\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.key\"\n placeholder=\"Key\"\n :workspace=\"workspace\"\n @update:modelValue=\"(v: string) => handleUpdateRow(index, 'key', v)\">\n <template\n #icon\n v-if=\"getDuplicateKeyIndexes.includes(index)\">\n <ScalarIconWarning\n class=\"text-red mr-0.75 size-3.5 brightness-[.9]\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n class=\"pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10\"\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.value\"\n placeholder=\"Value\"\n :workspace=\"workspace\"\n @update:modelValue=\"\n (v: string) => handleUpdateRow(index, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"variable.key || variable.value\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click.stop=\"handleDeleteRow(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </template>\n </CodeInput>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\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}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { Draggable } from '@scalar/draggable'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useActiveEntities, useWorkspace } from '@/store'\nimport EnvironmentColorModal from '@/views/Environment/EnvironmentColorModal.vue'\nimport EnvironmentModal from '@/views/Environment/EnvironmentModal.vue'\n\nimport EnvironmentForm from './components/EnvironmentForm.vue'\n\nconst { activeCollection, activeWorkspace, activeEnvVariables } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\nconst colorModal = useModal()\nconst deleteModal = useModal()\nconst environmentModal = useModal()\nconst editModal = useModal()\nconst selectedColor = ref('')\nconst selectedEnvironmentName = ref<string | null>(null)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst collectionEnvironments = computed(() => {\n if (!activeCollection.value?.['x-scalar-environments']) {\n return []\n }\n return Object.entries(activeCollection.value['x-scalar-environments']).map(\n ([name, environment]) => ({\n uid: name as Environment['uid'],\n name,\n value: JSON.stringify(environment.variables || {}),\n color: environment.color || '#FFFFFF',\n }),\n )\n})\n\nconst deleteEnvironment = () => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n collectionMutators.removeEnvironment(\n selectedEnvironmentName.value,\n activeCollection.value.uid,\n )\n deleteModal.hide()\n}\n\nconst openDeleteModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n deleteModal.show()\n}\n\nconst handleEnvironmentSubmit = (environment: {\n name: string\n color: string\n collectionId: string | undefined\n}) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n activeCollection.value.uid,\n )\n environmentModal.hide()\n}\n\nconst handleOpenColorModal = (environment: {\n name: string\n color?: string | undefined\n}) => {\n selectedEnvironmentName.value = environment.name\n selectedColor.value = environment.color || '#FFFFFF'\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = {\n ...activeCollection.value['x-scalar-environments'],\n [selectedEnvironmentName.value]: {\n variables:\n activeCollection.value['x-scalar-environments']?.[\n selectedEnvironmentName.value\n ]?.variables || {},\n color,\n },\n }\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n environments,\n )\n colorModal.hide()\n}\n\nconst openRenameModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n tempEnvironmentName.value = environmentName\n editModal.show()\n}\n\nconst closeRenameModal = () => {\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleRename = (newName: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const environment = environments[selectedEnvironmentName.value]\n if (!environment) {\n return\n }\n\n // Create a new ordered environments object\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the index of the environment being renamed\n const envIndex = envEntries.findIndex(\n ([key]) => key === selectedEnvironmentName.value,\n )\n\n // Rebuild the environments object maintaining order\n envEntries.forEach(([key, value], index) => {\n if (index === envIndex) {\n orderedEnvs[newName] = value\n } else {\n orderedEnvs[key] = value\n }\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleDragEnd = (\n draggingItem: { id: string },\n hoveredItem: { id: string },\n) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the indices of the dragged and hovered items\n const dragIndex = envEntries.findIndex(([key]) => key === draggingItem.id)\n const hoverIndex = envEntries.findIndex(([key]) => key === hoveredItem.id)\n\n if (dragIndex === -1 || hoverIndex === -1) {\n return\n }\n\n // Reorder the environments\n const draggedEnv = envEntries[dragIndex]\n if (!draggedEnv) {\n return\n }\n envEntries.splice(dragIndex, 1)\n envEntries.splice(hoverIndex, 0, draggedEnv)\n\n // Rebuild the environments object in the new order\n envEntries.forEach(([key, value]) => {\n orderedEnvs[key] = value\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Environment Variables</h3>\n </div>\n <p class=\"text-sm\">\n Set environment variables at your collection level. Use\n <code\n class=\"font-code text-c-2\"\n v-pre\n >{{ variable }}</code\n >\n to add / search among the selected environment's variables in your\n request inputs.\n </p>\n </div>\n </div>\n <Draggable\n v-for=\"environment in collectionEnvironments\"\n :key=\"environment.name\"\n :id=\"environment.name\"\n :isDraggable=\"true\"\n :isDroppable=\"true\"\n :parentIds=\"[]\"\n @onDragEnd=\"handleDragEnd\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex cursor-grab items-center justify-between rounded-t-lg px-1 py-1 text-sm\">\n <div class=\"flex items-center\">\n <ScalarButton\n class=\"hover:bg-b-3 flex h-6 w-6 p-1\"\n @click=\"handleOpenColorModal(environment)\"\n variant=\"ghost\">\n <span\n :style=\"{ backgroundColor: environment.color || '#FFFFFF' }\"\n class=\"h-2.5 w-2.5 rounded-full\"></span>\n </ScalarButton>\n <button\n class=\"hover:bg-b-3 rounded px-1 py-0.5 text-sm\"\n @click=\"openRenameModal(environment.name)\">\n {{ environment.name }}\n </button>\n </div>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(environment.name)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <EnvironmentForm\n v-if=\"activeCollection && activeWorkspace\"\n :collection=\"activeCollection\"\n :environment=\"environment\"\n :envVariables=\"activeEnvVariables\"\n :workspace=\"activeWorkspace\" />\n </div>\n </Draggable>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"environmentModal.show()\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedEnvironmentName || 'Environment'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Environment'\"\n :warningMessage=\"'Are you sure you want to delete this environment? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"deleteEnvironment\" />\n </ScalarModal>\n <EnvironmentModal\n :activeWorkspaceCollections=\"activeCollection ? [activeCollection] : []\"\n :collectionId=\"activeCollection?.uid\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"handleEnvironmentSubmit\" />\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentName}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"closeRenameModal\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </div>\n </ViewLayoutSection>\n</template>\n\n<style>\n@import '@scalar/draggable/style.css';\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { Draggable } from '@scalar/draggable'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useActiveEntities, useWorkspace } from '@/store'\nimport EnvironmentColorModal from '@/views/Environment/EnvironmentColorModal.vue'\nimport EnvironmentModal from '@/views/Environment/EnvironmentModal.vue'\n\nimport EnvironmentForm from './components/EnvironmentForm.vue'\n\nconst { activeCollection, activeWorkspace, activeEnvVariables } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\nconst colorModal = useModal()\nconst deleteModal = useModal()\nconst environmentModal = useModal()\nconst editModal = useModal()\nconst selectedColor = ref('')\nconst selectedEnvironmentName = ref<string | null>(null)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst collectionEnvironments = computed(() => {\n if (!activeCollection.value?.['x-scalar-environments']) {\n return []\n }\n return Object.entries(activeCollection.value['x-scalar-environments']).map(\n ([name, environment]) => ({\n uid: name as Environment['uid'],\n name,\n value: JSON.stringify(environment.variables || {}),\n color: environment.color || '#FFFFFF',\n }),\n )\n})\n\nconst deleteEnvironment = () => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n collectionMutators.removeEnvironment(\n selectedEnvironmentName.value,\n activeCollection.value.uid,\n )\n deleteModal.hide()\n}\n\nconst openDeleteModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n deleteModal.show()\n}\n\nconst handleEnvironmentSubmit = (environment: {\n name: string\n color: string\n collectionId: string | undefined\n}) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n activeCollection.value.uid,\n )\n environmentModal.hide()\n}\n\nconst handleOpenColorModal = (environment: {\n name: string\n color?: string | undefined\n}) => {\n selectedEnvironmentName.value = environment.name\n selectedColor.value = environment.color || '#FFFFFF'\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = {\n ...activeCollection.value['x-scalar-environments'],\n [selectedEnvironmentName.value]: {\n variables:\n activeCollection.value['x-scalar-environments']?.[\n selectedEnvironmentName.value\n ]?.variables || {},\n color,\n },\n }\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n environments,\n )\n colorModal.hide()\n}\n\nconst openRenameModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n tempEnvironmentName.value = environmentName\n editModal.show()\n}\n\nconst closeRenameModal = () => {\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleRename = (newName: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const environment = environments[selectedEnvironmentName.value]\n if (!environment) {\n return\n }\n\n // Create a new ordered environments object\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the index of the environment being renamed\n const envIndex = envEntries.findIndex(\n ([key]) => key === selectedEnvironmentName.value,\n )\n\n // Rebuild the environments object maintaining order\n envEntries.forEach(([key, value], index) => {\n if (index === envIndex) {\n orderedEnvs[newName] = value\n } else {\n orderedEnvs[key] = value\n }\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleDragEnd = (\n draggingItem: { id: string },\n hoveredItem: { id: string },\n) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the indices of the dragged and hovered items\n const dragIndex = envEntries.findIndex(([key]) => key === draggingItem.id)\n const hoverIndex = envEntries.findIndex(([key]) => key === hoveredItem.id)\n\n if (dragIndex === -1 || hoverIndex === -1) {\n return\n }\n\n // Reorder the environments\n const draggedEnv = envEntries[dragIndex]\n if (!draggedEnv) {\n return\n }\n envEntries.splice(dragIndex, 1)\n envEntries.splice(hoverIndex, 0, draggedEnv)\n\n // Rebuild the environments object in the new order\n envEntries.forEach(([key, value]) => {\n orderedEnvs[key] = value\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Environment Variables</h3>\n </div>\n <p class=\"text-sm\">\n Set environment variables at your collection level. Use\n <code\n class=\"font-code text-c-2\"\n v-pre\n >{{ variable }}</code\n >\n to add / search among the selected environment's variables in your\n request inputs.\n </p>\n </div>\n </div>\n <Draggable\n v-for=\"environment in collectionEnvironments\"\n :key=\"environment.name\"\n :id=\"environment.name\"\n :isDraggable=\"true\"\n :isDroppable=\"true\"\n :parentIds=\"[]\"\n @onDragEnd=\"handleDragEnd\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex cursor-grab items-center justify-between rounded-t-lg px-1 py-1 text-sm\">\n <div class=\"flex items-center\">\n <ScalarButton\n class=\"hover:bg-b-3 flex h-6 w-6 p-1\"\n @click=\"handleOpenColorModal(environment)\"\n variant=\"ghost\">\n <span\n :style=\"{ backgroundColor: environment.color || '#FFFFFF' }\"\n class=\"h-2.5 w-2.5 rounded-full\"></span>\n </ScalarButton>\n <button\n class=\"hover:bg-b-3 rounded px-1 py-0.5 text-sm\"\n @click=\"openRenameModal(environment.name)\">\n {{ environment.name }}\n </button>\n </div>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(environment.name)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <EnvironmentForm\n v-if=\"activeCollection && activeWorkspace\"\n :collection=\"activeCollection\"\n :environment=\"environment\"\n :envVariables=\"activeEnvVariables\"\n :workspace=\"activeWorkspace\" />\n </div>\n </Draggable>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"environmentModal.show()\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedEnvironmentName || 'Environment'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Environment'\"\n :warningMessage=\"'Are you sure you want to delete this environment? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"deleteEnvironment\" />\n </ScalarModal>\n <EnvironmentModal\n :activeWorkspaceCollections=\"activeCollection ? [activeCollection] : []\"\n :collectionId=\"activeCollection?.uid\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"handleEnvironmentSubmit\" />\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentName}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"closeRenameModal\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </div>\n </ViewLayoutSection>\n</template>\n\n<style>\n@import '@scalar/draggable/style.css';\n</style>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;ECuBA,MAAM,EAAE,uBAAuB,cAAa;EAG5C,MAAM,iBAAiB,IAA2C,EAAE,CAAA;EAGpE,MAAM,iBAAiB,oBAAiB,IAAI,KAAK,CAAA;EAGjD,MAAM,WAAW,oBAAyB,IAAI,KAAK,CAAA;EAGnD,MAAM,aAAa,IAAI,MAAK;EAE5B,MAAM,YAAY,eAAe;AAC/B,OAAI,CAAC,QAAA,aAAa,MAChB,QAAO,CAAC;IAAE,KAAK;IAAI,OAAO;IAAI,CAAA;AAEhC,OAAI;IACF,MAAM,eAAe,KAAK,MAAM,QAAA,YAAY,MAAK;IACjD,MAAM,UAAU,OAAO,QAAQ,aAAa,CAAC,KAAK,CAAC,KAAK,UAAU;KAChE;KACA,OAAO,OAAO,IAAI;KACnB,EAAC;AACF,QAAI,QAAQ,WAAW,EACrB,QAAO,CAAC;KAAE,KAAK;KAAI,OAAO;KAAI,CAAA;AAEhC,WAAO;YACA,GAAG;AACV,WAAO,CAAC;KAAE,KAAK;KAAI,OAAO;KAAI,CAAA;;IAEjC;EAED,MAAM,uBAAuB,eAAe;GAC1C,MAAM,UAAU,eAAe,MAAM,eAAe,MAAM,SAAS;AACnE,OAAI,CAAC,QACH,QAAO,CAAC;IAAE,KAAK;IAAI,OAAO;IAAI,CAAA;AAEhC,OAAI,QAAQ,OAAO,QAAQ,MACzB,QAAO,CAAC,GAAG,eAAe,OAAO;IAAE,KAAK;IAAI,OAAO;IAAI,CAAA;AAEzD,UAAO,eAAe;IACvB;EAED,MAAM,yBAAyB,eAAe;GAC5C,MAAM,4BAAY,IAAI,KAAsB;AAG5C,kBAAe,MAAM,SAAS,GAAG,UAAU;AACzC,QAAI,EAAE,KAAK;KACT,MAAM,UAAU,UAAU,IAAI,EAAE,IAAI,IAAI,EAAC;AACzC,aAAQ,KAAK,MAAK;AAClB,eAAU,IAAI,EAAE,KAAK,QAAO;;KAE/B;AAGD,YAAS,MAAM,SAAS,KAAK,UAAU;AACrC,QAAI,KAAK;KACP,MAAM,UAAU,UAAU,IAAI,IAAI,IAAI,EAAC;AACvC,aAAQ,KAAK,MAAK;AAClB,eAAU,IAAI,KAAK,QAAO;;KAE7B;AAED,UAAO,MAAM,KAAK,UAAU,QAAQ,CAAA,CACjC,QAAQ,YAAY,QAAQ,SAAS,EAAC,CACtC,MAAK;IACT;AAGD,QACE,YACC,YAAY;AACX,kBAAe,QAAQ,CAAC,GAAG,QAAO;AAClC,kBAAe,QAAQ,IAAI,IAAI,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,QAAQ,CAAA;KAE1E,EAAE,WAAW,MAAM,CACrB;EAEA,MAAM,kBAAkB,OACtB,OACA,OACA,UACG;AACH,OAAI,WAAW,MACb;AAGF,OAAI,UAAU,OAAO;AAEnB,aAAS,MAAM,IAAI,OAAO,MAAK;IAG/B,MAAM,YAAY,IAAI,IAAI,eAAe,MAAK;IAC9C,MAAM,cAAc,eAAe,MAAM;AAGzC,QAAI,YACF,WAAU,OAAO,YAAY,IAAG;AAIlC,QAAI,UAAU,IAAI,MAAM,CACtB;;AAIJ,cAAW,QAAQ;AAEnB,OAAI;IACF,MAAM,eAAe,CAAC,GAAG,eAAe,MAAK;IAC7C,MAAM,cAAc,aAAa;AACjC,QAAI,CAAC,YACH;AAGF,iBAAa,SAAS;KACpB,KAAK,UAAU,QAAQ,QAAQ,YAAY;KAC3C,OAAO,UAAU,UAAU,QAAQ,YAAY;KACjD;AAEA,QACE,CAAC,aAAa,OAAO,OACrB,CAAC,aAAa,OAAO,SACrB,UAAU,aAAa,SAAS,EAEhC,cAAa,OAAO,OAAO,EAAC;IAG9B,MAAM,eAAe,aAAa,QAC/B,KAAK,EAAE,KAAK,YAAY;AACvB,SAAI,OAAO,MACT,KAAI,OAAO;AAEb,YAAO;OAET,EAAE,CACJ;AAEA,QAAI,QAAA,YAAY;KACd,MAAM,eAAe;MACnB,GAAG,QAAA,WAAW;OACb,QAAA,YAAY,OAAO;OAClB,GAAG,QAAA,WAAW,2BAA2B,QAAA,YAAY;OACrD,WAAW;OACZ;MACH;AACA,WAAM,mBAAmB,KACvB,QAAA,WAAW,KACX,yBACA,aACF;;AAGF,QAAI,UAAU,eAAe,MAAM,SAAS,GAAG;KAC7C,MAAM,UAAU,aAAa,aAAa,SAAS;AACnD,SAAI,YAAY,QAAQ,OAAO,QAAQ,OACrC,OAAM,QAAO;;AAIjB,UAAM,UAAS;AACf,mBAAe,QAAQ;AAGvB,QAAI,UAAU,OAAO;AACnB,oBAAe,QAAQ,IAAI,IACzB,aAAa,KAAK,MAAM,EAAE,IAAI,CAAC,OAAO,QAAQ,CAChD;AAEA,cAAS,MAAM,OAAO,MAAK;;aAErB;AACR,eAAW,QAAQ;;;EAIvB,MAAM,SAAS,YAAY;AACzB,OAAI,WAAW,MACb;AAEF,cAAW,QAAQ;AAEnB,OAAI;IACF,MAAM,eAAe,CAAC,GAAG,eAAe,OAAO;KAAE,KAAK;KAAI,OAAO;KAAI,CAAA;IACrE,MAAM,eAAe,aAAa,QAC/B,KAAK,EAAE,KAAK,YAAY;AACvB,SAAI,OAAO,MACT,KAAI,OAAO;AAEb,YAAO;OAET,EAAE,CACJ;AAEA,QAAI,QAAA,YAAY;KACd,MAAM,eAAe;MACnB,GAAG,QAAA,WAAW;OACb,QAAA,YAAY,OAAO;OAClB,GAAG,QAAA,WAAW,2BAA2B,QAAA,YAAY;OACrD,WAAW;OACZ;MACH;AACA,WAAM,mBAAmB,KACvB,QAAA,WAAW,KACX,yBACA,aACF;;AAGF,UAAM,UAAS;AACf,mBAAe,QAAQ;aACf;AACR,eAAW,QAAQ;;;EAIvB,MAAM,kBAAkB,OAAO,UAAkB;AAC/C,OAAI,WAAW,MACb;AAEF,cAAW,QAAQ;AAEnB,OAAI;IACF,MAAM,eAAe,CAAC,GAAG,eAAe,MAAK;AAC7C,iBAAa,OAAO,OAAO,EAAC;IAC5B,MAAM,eAAe,aAAa,QAC/B,KAAK,EAAE,KAAK,YAAY;AACvB,SAAI,OAAO,MACT,KAAI,OAAO;AAEb,YAAO;OAET,EAAE,CACJ;AAEA,QAAI,QAAA,YAAY;KACd,MAAM,eAAe;MACnB,GAAG,QAAA,WAAW;OACb,QAAA,YAAY,OAAO;OAClB,GAAG,QAAA,WAAW,2BAA2B,QAAA,YAAY;OACrD,WAAW;OACZ;MACH;AACA,WAAM,mBAAmB,KACvB,QAAA,WAAW,KACX,yBACA,aACF;;AAGF,UAAM,UAAS;AACf,mBAAe,QAAQ;aACf;AACR,eAAW,QAAQ;;;EAKvB,MAAM,aAAa,YAAY;AAC7B,OAAI,eAAe,MAAM,WAAW,EAClC,OAAM,QAAO;YACJ,eAAe,MAAM,UAAU,GAAG;IAC3C,MAAM,UAAU,eAAe,MAAM,eAAe,MAAM,SAAS;AACnE,QAAI,YAAY,QAAQ,OAAO,QAAQ,OACrC,OAAM,QAAO;;;AAKnB,kBAAgB;AACd,eAAW;IACZ;AAGD,cACQ,eAAe,aACf;AACJ,eAAW;IAEf;;uBAIE,YA6DY,mBAAA;IA5DV,OAAM;IACL,SAAS,CAAA,IAAA,GAAQ;;2BAIH,CAHf,YAGe,sBAAA,EAHD,OAAM,kBAAgB,EAAA;4BACI,CAAtC,YAAsC,yBAAA,MAAA;6BAAlB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAH,OAAG,GAAA,CAAA,EAAA,CAAA;;SACpB,YAAwC,yBAAA,MAAA;6BAAlB,CAAA,GAAA,OAAA,OAAA,OAAA,KAAA,CAAA,gBAAL,SAAK,GAAA,CAAA,EAAA,CAAA;;;;0BAExB,mBAqDe,UAAA,MAAA,WApDe,qBAAA,QAApB,UAAU,UAAK;yBADzB,YAqDe,sBAAA;MAnDZ,KAAK;MACL,OAAK,eAAA,EAAA,OAAmB,uBAAA,MAAuB,SAAS,MAAK,EAAA,CAAA;;6BAsB9C,CAnBhB,YAmBgB,uBAAA,MAAA;8BADF,CAjBZ,YAiBY,mBAAA;QAhBV,sBAAA;QACA,cAAA;QACA,kBAAA;QACA,cAAA;QACC,aAAa,QAAA;QACb,cAAc,QAAA;QACd,YAAY,SAAS;QACtB,aAAY;QACX,WAAW,QAAA;QACX,wBAAoB,MAAc,gBAAgB,OAAK,OAAS,EAAC;iCAG1D,uBAAA,MAAuB,SAAS,MAAK,GAAA;cAD1C;0BAGqD,CADtD,YACsD,MAAA,kBAAA,EAAA,EAApD,OAAM,6CAA2C,CAAA,CAAA,CAAA;;;;;;;;;;gBAIzD,YA0BgB,uBAAA,MAAA;8BADF,CAxBZ,YAwBY,mBAAA;QAvBV,OAAM;QACN,sBAAA;QACA,cAAA;QACA,kBAAA;QACA,cAAA;QACC,aAAa,QAAA;QACb,cAAc,QAAA;QACd,YAAY,SAAS;QACtB,aAAY;QACX,WAAW,QAAA;QACX,wBAAiC,MAAc,gBAAgB,OAAK,SAAW,EAAC;;QAGtE,MAAI,cAQE,CANP,SAAS,OAAO,SAAS,SAAA,WAAA,EADjC,YAOe,MAAA,aAAA,EAAA;;SALb,OAAM;SACN,MAAK;SACL,SAAQ;SACP,SAAK,eAAA,WAAO,gBAAgB,MAAK,EAAA,CAAA,OAAA,CAAA;;gCACE,CAApC,YAAoC,MAAA,gBAAA,EAAA,EAAnB,OAAM,YAAU,CAAA,CAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEtV/C,MAAM,EAAE,kBAAkB,iBAAiB,uBACzC,mBAAkB;EACpB,MAAM,EAAE,uBAAuB,cAAa;EAE5C,MAAM,aAAa,UAAS;EAC5B,MAAM,cAAc,UAAS;EAC7B,MAAM,mBAAmB,UAAS;EAClC,MAAM,YAAY,UAAS;EAC3B,MAAM,gBAAgB,IAAI,GAAE;EAC5B,MAAM,0BAA0B,IAAmB,KAAI;EACvD,MAAM,sBAAsB,IAAwB,KAAA,EAAS;EAE7D,MAAM,yBAAyB,eAAe;AAC5C,OAAI,CAAC,iBAAiB,QAAQ,yBAC5B,QAAO,EAAC;AAEV,UAAO,OAAO,QAAQ,iBAAiB,MAAM,yBAAyB,CAAC,KACpE,CAAC,MAAM,kBAAkB;IACxB,KAAK;IACL;IACA,OAAO,KAAK,UAAU,YAAY,aAAa,EAAE,CAAC;IAClD,OAAO,YAAY,SAAS;IAC7B,EACH;IACD;EAED,MAAM,0BAA0B;AAC9B,OAAI,CAAC,iBAAiB,OAAO,OAAO,CAAC,wBAAwB,MAC3D;AAGF,sBAAmB,kBACjB,wBAAwB,OACxB,iBAAiB,MAAM,IACzB;AACA,eAAY,MAAK;;EAGnB,MAAM,mBAAmB,oBAA4B;AACnD,2BAAwB,QAAQ;AAChC,eAAY,MAAK;;EAGnB,MAAM,2BAA2B,gBAI3B;AACJ,OAAI,CAAC,iBAAiB,OAAO,IAC3B;AAGF,sBAAmB,eACjB,YAAY,MACZ;IACE,WAAW,EAAE;IACb,OAAO,YAAY;IACpB,EACD,iBAAiB,MAAM,IACzB;AACA,oBAAiB,MAAK;;EAGxB,MAAM,wBAAwB,gBAGxB;AACJ,2BAAwB,QAAQ,YAAY;AAC5C,iBAAc,QAAQ,YAAY,SAAS;AAC3C,cAAW,MAAK;;EAGlB,MAAM,qBAAqB,UAAkB;AAC3C,OAAI,CAAC,iBAAiB,OAAO,OAAO,CAAC,wBAAwB,MAC3D;GAGF,MAAM,eAAe;IACnB,GAAG,iBAAiB,MAAM;KACzB,wBAAwB,QAAQ;KAC/B,WACE,iBAAiB,MAAM,2BACrB,wBAAwB,QACvB,aAAa,EAAE;KACpB;KACD;IACH;AAEA,sBAAmB,KACjB,iBAAiB,MAAM,KACvB,yBACA,aACF;AACA,cAAW,MAAK;;EAGlB,MAAM,mBAAmB,oBAA4B;AACnD,2BAAwB,QAAQ;AAChC,uBAAoB,QAAQ;AAC5B,aAAU,MAAK;;EAGjB,MAAM,yBAAyB;AAC7B,2BAAwB,QAAQ;AAChC,uBAAoB,QAAQ,KAAA;AAC5B,aAAU,MAAK;;EAGjB,MAAM,gBAAgB,YAAoB;AACxC,OAAI,CAAC,iBAAiB,OAAO,OAAO,CAAC,wBAAwB,MAC3D;GAGF,MAAM,eAAe,EAAE,GAAG,iBAAiB,MAAM,0BAAyB;AAE1E,OAAI,CADgB,aAAa,wBAAwB,OAEvD;GAIF,MAAM,cAAmC,EAAC;GAC1C,MAAM,aAAa,OAAO,QAAQ,aAAY;GAG9C,MAAM,WAAW,WAAW,WACzB,CAAC,SAAS,QAAQ,wBAAwB,MAC7C;AAGA,cAAW,SAAS,CAAC,KAAK,QAAQ,UAAU;AAC1C,QAAI,UAAU,SACZ,aAAY,WAAW;QAEvB,aAAY,OAAO;KAEtB;AAED,sBAAmB,KACjB,iBAAiB,MAAM,KACvB,yBACA,YACF;AAEA,2BAAwB,QAAQ;AAChC,uBAAoB,QAAQ,KAAA;AAC5B,aAAU,MAAK;;EAGjB,MAAM,iBACJ,cACA,gBACG;AACH,OAAI,CAAC,iBAAiB,OAAO,IAC3B;GAGF,MAAM,eAAe,EAAE,GAAG,iBAAiB,MAAM,0BAAyB;GAC1E,MAAM,cAAmC,EAAC;GAC1C,MAAM,aAAa,OAAO,QAAQ,aAAY;GAG9C,MAAM,YAAY,WAAW,WAAW,CAAC,SAAS,QAAQ,aAAa,GAAE;GACzE,MAAM,aAAa,WAAW,WAAW,CAAC,SAAS,QAAQ,YAAY,GAAE;AAEzE,OAAI,cAAc,MAAM,eAAe,GACrC;GAIF,MAAM,aAAa,WAAW;AAC9B,OAAI,CAAC,WACH;AAEF,cAAW,OAAO,WAAW,EAAC;AAC9B,cAAW,OAAO,YAAY,GAAG,WAAU;AAG3C,cAAW,SAAS,CAAC,KAAK,WAAW;AACnC,gBAAY,OAAO;KACpB;AAED,sBAAmB,KACjB,iBAAiB,MAAM,KACvB,yBACA,YACF;;;uBAKA,YA4GoB,2BAAA,MAAA;2BADZ,CA1GN,mBA0GM,OA1GN,YA0GM;KAzGJ,mBA0EM,OA1EN,YA0EM;gCAzEJ,mBAgBM,OAAA,EAhBD,OAAM,0CAAwC,EAAA,CACjD,mBAcM,OAAA,EAdD,OAAM,uBAAqB,EAAA,CAC9B,mBAEM,OAAA,EAFD,OAAM,yBAAuB,EAAA,CAChC,mBAAgD,MAAA,EAA5C,OAAM,aAAW,EAAC,wBAAqB,CAAA,CAAA,EAE7C,mBASI,KAAA,EATD,OAAM,WAAS,EAAA;uBAAC,4DAEjB;OAAA,mBAIC,QAAA,EAHC,OAAM,sBAAoB,EAEzB,iBAAc;uBAChB,uFAGH;;wBAGJ,mBAwCY,UAAA,MAAA,WAvCY,uBAAA,QAAf,gBAAW;2BADpB,YAwCY,MAAA,UAAA,EAAA;QAtCT,KAAK,YAAY;QACjB,IAAI,YAAY;QAChB,aAAa;QACb,aAAa;QACb,WAAW,EAAE;QACb,aAAW;;+BAgCN,CA/BN,mBA+BM,OA/BN,YA+BM,CA9BJ,mBAuBM,OAvBN,YAuBM,CArBJ,mBAcM,OAdN,YAcM,CAbJ,YAOe,MAAA,aAAA,EAAA;SANb,OAAM;SACL,UAAK,WAAE,qBAAqB,YAAW;SACxC,SAAQ;;gCAGkC,CAF1C,mBAE0C,QAAA;UADvC,OAAK,eAAA,EAAA,iBAAqB,YAAY,SAAK,WAAA,CAAA;UAC5C,OAAM;;;+BAEV,mBAIS,UAAA;SAHP,OAAM;SACL,UAAK,WAAE,gBAAgB,YAAY,KAAI;2BACrC,YAAY,KAAI,EAAA,GAAA,WAAA,CAAA,CAAA,EAGvB,YAKe,MAAA,aAAA,EAAA;SAJb,OAAM;SACN,SAAQ;SACP,UAAK,WAAE,gBAAgB,YAAY,KAAI;;gCACJ,CAApC,YAAoC,MAAA,gBAAA,EAAA,EAAnB,OAAM,YAAU,CAAA,CAAA,CAAA;;8BAI7B,MAAA,iBAAgB,IAAI,MAAA,gBAAe,IAAA,WAAA,EAD3C,YAKiC,yBAAA;;SAH9B,YAAY,MAAA,iBAAgB;SACf;SACb,cAAc,MAAA,mBAAkB;SAChC,WAAW,MAAA,gBAAe;;;;;;;;;;MAGjC,mBAcM,OAdN,YAcM,CAZJ,YAWe,MAAA,aAAA,EAAA;OAVb,OAAM;OACN,MAAK;OACL,SAAQ;OACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,iBAAgB,CAAC,MAAI;;8BAKT,CAJpB,YAIoB,MAAA,WAAA,EAAA;QAHlB,OAAM;QACN,MAAK;QACL,MAAK;QACL,WAAU;qCACZ,mBAA4B,QAAA,MAAtB,mBAAe,GAAA,EAAA,CAAA;;;;KAI3B,YASc,MAAA,YAAA,EAAA;MARX,MAAM;MACN,OAAO,MAAA,YAAW;MAClB,OAAK,UAAY,wBAAA,SAAuB;;6BAKT,CAJhC,YAIgC,kCAAA;OAH7B,cAAc;OACd,gBAAgB;OAChB,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,YAAW,CAAC,MAAI;OACvB,UAAQ;;;;KAEb,YAKsC,0BAAA;MAJnC,4BAA4B,MAAA,iBAAgB,GAAA,CAAI,MAAA,iBAAgB,CAAA,GAAA,EAAA;MAChE,cAAc,MAAA,iBAAgB,EAAE;MAChC,OAAO,MAAA,iBAAgB;MACvB,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,iBAAgB,CAAC,MAAI;MAC7B,UAAQ;;;;;;KACX,YAIgC,+BAAA;MAH7B,eAAe,cAAA;MACf,OAAO,MAAA,WAAU;MACjB,UAAM,OAAA,OAAA,OAAA,MAAA,WAAE,MAAA,WAAU,CAAC,MAAI;MACvB,UAAQ;;KACX,YAQc,MAAA,YAAA,EAAA;MAPX,MAAM;MACN,OAAO,MAAA,UAAS;MAChB,OAAK,QAAU,wBAAA;;6BAIS,CAHzB,YAGyB,gCAAA;OAFtB,MAAM,oBAAA,SAAmB;OACzB,SAAO;OACP,QAAM"}
|
|
1
|
+
{"version":3,"file":"CollectionEnvironment-BY9Gcnln.js","names":[],"sources":["../src/views/Collection/components/EnvironmentForm.vue","../src/views/Collection/components/EnvironmentForm.vue","../src/views/Collection/CollectionEnvironment.vue","../src/views/Collection/CollectionEnvironment.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconTrash, ScalarIconWarning } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport { useWorkspace } from '@/store'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { collection, environment, workspace, envVariables } = defineProps<{\n collection: Collection\n environment: Environment\n workspace: Workspace\n envVariables: EnvVariable[]\n}>()\n\nconst { collectionMutators } = useWorkspace()\n\n//\nconst localVariables = ref<Array<{ key: string; value: string }>>([])\n\n// Set of existing keys from the collection\nconst collectionKeys = ref<Set<string>>(new Set())\n\n// Map of key typed by the user\nconst tempKeys = ref<Map<number, string>>(new Map())\n\n// Prevent multiple updates to the collection\nconst isUpdating = ref(false)\n\nconst variables = computed(() => {\n if (!environment?.value) {\n return [{ key: '', value: '' }]\n }\n try {\n const parsedObject = JSON.parse(environment.value)\n const entries = Object.entries(parsedObject).map(([key, val]) => ({\n key,\n value: String(val),\n }))\n if (entries.length === 0) {\n return [{ key: '', value: '' }]\n }\n return entries\n } catch (_) {\n return [{ key: '', value: '' }]\n }\n})\n\nconst environmentVariables = computed(() => {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (!lastRow) {\n return [{ key: '', value: '' }]\n }\n if (lastRow.key || lastRow.value) {\n return [...localVariables.value, { key: '', value: '' }]\n }\n return localVariables.value\n})\n\nconst getDuplicateKeyIndexes = computed(() => {\n const keyCounts = new Map<string, number[]>()\n\n // Add existing keys from the collection\n localVariables.value.forEach((v, index) => {\n if (v.key) {\n const indexes = keyCounts.get(v.key) || []\n indexes.push(index)\n keyCounts.set(v.key, indexes)\n }\n })\n\n // Add typed keys that are being edited\n tempKeys.value.forEach((key, index) => {\n if (key) {\n const indexes = keyCounts.get(key) || []\n indexes.push(index)\n keyCounts.set(key, indexes)\n }\n })\n\n return Array.from(keyCounts.values())\n .filter((indexes) => indexes.length > 1)\n .flat()\n})\n\n// Update originalKeys when variables change\nwatch(\n variables,\n (newVars) => {\n localVariables.value = [...newVars]\n collectionKeys.value = new Set(newVars.map((v) => v.key).filter(Boolean))\n },\n { immediate: true },\n)\n\nconst handleUpdateRow = async (\n index: number,\n field: 'key' | 'value',\n value: string,\n) => {\n if (isUpdating.value) {\n return\n }\n\n if (field === 'key') {\n // Store the typed key\n tempKeys.value.set(index, value)\n\n // Check for duplicates\n const otherKeys = new Set(collectionKeys.value)\n const currentItem = localVariables.value[index]\n\n // Remove the current item from the set of original keys\n if (currentItem) {\n otherKeys.delete(currentItem.key)\n }\n\n // If it's a duplicate, don't proceed with mutation\n if (otherKeys.has(value)) {\n return\n }\n }\n\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n const currentItem = newVariables[index]\n if (!currentItem) {\n return\n }\n\n newVariables[index] = {\n key: field === 'key' ? value : currentItem.key,\n value: field === 'value' ? value : currentItem.value,\n }\n\n if (\n !newVariables[index].key &&\n !newVariables[index].value &&\n index !== newVariables.length - 1\n ) {\n newVariables.splice(index, 1)\n }\n\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n if (index === localVariables.value.length - 1) {\n const lastRow = newVariables[newVariables.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n\n await nextTick()\n localVariables.value = newVariables\n\n // Update collection keys after successful update\n if (field === 'key') {\n collectionKeys.value = new Set(\n newVariables.map((v) => v.key).filter(Boolean),\n )\n // Clear the typed key after successful update\n tempKeys.value.delete(index)\n }\n } finally {\n isUpdating.value = false\n }\n}\n\nconst addRow = async () => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value, { key: '', value: '' }]\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\nconst handleDeleteRow = async (index: number) => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n newVariables.splice(index, 1)\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\n// Keep an empty row at the end of the table\nconst defaultRow = async () => {\n if (localVariables.value.length === 0) {\n await addRow()\n } else if (localVariables.value.length >= 1) {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n}\n\nonMounted(() => {\n defaultRow()\n})\n\n// Update the collection on local variables changes\nwatch(\n () => localVariables.value,\n () => {\n defaultRow()\n },\n)\n</script>\n\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"['', '']\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Key</DataTableHeader>\n <DataTableHeader>Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(variable, index) in environmentVariables\"\n :key=\"index\"\n :class=\"{\n error: getDuplicateKeyIndexes.includes(index),\n }\">\n <DataTableCell>\n <CodeInput\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.key\"\n placeholder=\"Key\"\n :workspace=\"workspace\"\n @update:modelValue=\"(v: string) => handleUpdateRow(index, 'key', v)\">\n <template\n #icon\n v-if=\"getDuplicateKeyIndexes.includes(index)\">\n <ScalarIconWarning\n class=\"text-red mr-0.75 size-3.5 brightness-[.9]\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n class=\"pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10\"\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.value\"\n placeholder=\"Value\"\n :workspace=\"workspace\"\n @update:modelValue=\"\n (v: string) => handleUpdateRow(index, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"variable.key || variable.value\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click.stop=\"handleDeleteRow(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </template>\n </CodeInput>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\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}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton } from '@scalar/components'\nimport { ScalarIconTrash, ScalarIconWarning } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Collection } from '@scalar/oas-utils/entities/spec'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { computed, nextTick, onMounted, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport DataTable from '@/components/DataTable/DataTable.vue'\nimport DataTableCell from '@/components/DataTable/DataTableCell.vue'\nimport DataTableHeader from '@/components/DataTable/DataTableHeader.vue'\nimport DataTableRow from '@/components/DataTable/DataTableRow.vue'\nimport { useWorkspace } from '@/store'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { collection, environment, workspace, envVariables } = defineProps<{\n collection: Collection\n environment: Environment\n workspace: Workspace\n envVariables: EnvVariable[]\n}>()\n\nconst { collectionMutators } = useWorkspace()\n\n//\nconst localVariables = ref<Array<{ key: string; value: string }>>([])\n\n// Set of existing keys from the collection\nconst collectionKeys = ref<Set<string>>(new Set())\n\n// Map of key typed by the user\nconst tempKeys = ref<Map<number, string>>(new Map())\n\n// Prevent multiple updates to the collection\nconst isUpdating = ref(false)\n\nconst variables = computed(() => {\n if (!environment?.value) {\n return [{ key: '', value: '' }]\n }\n try {\n const parsedObject = JSON.parse(environment.value)\n const entries = Object.entries(parsedObject).map(([key, val]) => ({\n key,\n value: String(val),\n }))\n if (entries.length === 0) {\n return [{ key: '', value: '' }]\n }\n return entries\n } catch (_) {\n return [{ key: '', value: '' }]\n }\n})\n\nconst environmentVariables = computed(() => {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (!lastRow) {\n return [{ key: '', value: '' }]\n }\n if (lastRow.key || lastRow.value) {\n return [...localVariables.value, { key: '', value: '' }]\n }\n return localVariables.value\n})\n\nconst getDuplicateKeyIndexes = computed(() => {\n const keyCounts = new Map<string, number[]>()\n\n // Add existing keys from the collection\n localVariables.value.forEach((v, index) => {\n if (v.key) {\n const indexes = keyCounts.get(v.key) || []\n indexes.push(index)\n keyCounts.set(v.key, indexes)\n }\n })\n\n // Add typed keys that are being edited\n tempKeys.value.forEach((key, index) => {\n if (key) {\n const indexes = keyCounts.get(key) || []\n indexes.push(index)\n keyCounts.set(key, indexes)\n }\n })\n\n return Array.from(keyCounts.values())\n .filter((indexes) => indexes.length > 1)\n .flat()\n})\n\n// Update originalKeys when variables change\nwatch(\n variables,\n (newVars) => {\n localVariables.value = [...newVars]\n collectionKeys.value = new Set(newVars.map((v) => v.key).filter(Boolean))\n },\n { immediate: true },\n)\n\nconst handleUpdateRow = async (\n index: number,\n field: 'key' | 'value',\n value: string,\n) => {\n if (isUpdating.value) {\n return\n }\n\n if (field === 'key') {\n // Store the typed key\n tempKeys.value.set(index, value)\n\n // Check for duplicates\n const otherKeys = new Set(collectionKeys.value)\n const currentItem = localVariables.value[index]\n\n // Remove the current item from the set of original keys\n if (currentItem) {\n otherKeys.delete(currentItem.key)\n }\n\n // If it's a duplicate, don't proceed with mutation\n if (otherKeys.has(value)) {\n return\n }\n }\n\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n const currentItem = newVariables[index]\n if (!currentItem) {\n return\n }\n\n newVariables[index] = {\n key: field === 'key' ? value : currentItem.key,\n value: field === 'value' ? value : currentItem.value,\n }\n\n if (\n !newVariables[index].key &&\n !newVariables[index].value &&\n index !== newVariables.length - 1\n ) {\n newVariables.splice(index, 1)\n }\n\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n if (index === localVariables.value.length - 1) {\n const lastRow = newVariables[newVariables.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n\n await nextTick()\n localVariables.value = newVariables\n\n // Update collection keys after successful update\n if (field === 'key') {\n collectionKeys.value = new Set(\n newVariables.map((v) => v.key).filter(Boolean),\n )\n // Clear the typed key after successful update\n tempKeys.value.delete(index)\n }\n } finally {\n isUpdating.value = false\n }\n}\n\nconst addRow = async () => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value, { key: '', value: '' }]\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\nconst handleDeleteRow = async (index: number) => {\n if (isUpdating.value) {\n return\n }\n isUpdating.value = true\n\n try {\n const newVariables = [...localVariables.value]\n newVariables.splice(index, 1)\n const updatedValue = newVariables.reduce(\n (acc, { key, value }) => {\n if (key || value) {\n acc[key] = value\n }\n return acc\n },\n {} as Record<string, string>,\n )\n\n if (collection) {\n const environments = {\n ...collection['x-scalar-environments'],\n [environment.name]: {\n ...collection['x-scalar-environments']?.[environment.name],\n variables: updatedValue,\n },\n }\n await collectionMutators.edit(\n collection.uid,\n 'x-scalar-environments',\n environments,\n )\n }\n\n await nextTick()\n localVariables.value = newVariables\n } finally {\n isUpdating.value = false\n }\n}\n\n// Keep an empty row at the end of the table\nconst defaultRow = async () => {\n if (localVariables.value.length === 0) {\n await addRow()\n } else if (localVariables.value.length >= 1) {\n const lastRow = localVariables.value[localVariables.value.length - 1]\n if (lastRow && (lastRow.key || lastRow.value)) {\n await addRow()\n }\n }\n}\n\nonMounted(() => {\n defaultRow()\n})\n\n// Update the collection on local variables changes\nwatch(\n () => localVariables.value,\n () => {\n defaultRow()\n },\n)\n</script>\n\n<template>\n <DataTable\n class=\"group/table flex-1\"\n :columns=\"['', '']\">\n <DataTableRow class=\"sr-only !block\">\n <DataTableHeader>Key</DataTableHeader>\n <DataTableHeader>Value</DataTableHeader>\n </DataTableRow>\n <DataTableRow\n v-for=\"(variable, index) in environmentVariables\"\n :key=\"index\"\n :class=\"{\n error: getDuplicateKeyIndexes.includes(index),\n }\">\n <DataTableCell>\n <CodeInput\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.key\"\n placeholder=\"Key\"\n :workspace=\"workspace\"\n @update:modelValue=\"(v: string) => handleUpdateRow(index, 'key', v)\">\n <template\n #icon\n v-if=\"getDuplicateKeyIndexes.includes(index)\">\n <ScalarIconWarning\n class=\"text-red mr-0.75 size-3.5 brightness-[.9]\" />\n </template>\n </CodeInput>\n </DataTableCell>\n <DataTableCell>\n <CodeInput\n class=\"pr-6 group-hover:pr-10 group-has-[.cm-focused]:pr-10\"\n disableCloseBrackets\n disableEnter\n disableTabIndent\n lineWrapping\n :environment=\"environment\"\n :envVariables=\"envVariables\"\n :modelValue=\"variable.value\"\n placeholder=\"Value\"\n :workspace=\"workspace\"\n @update:modelValue=\"\n (v: string) => handleUpdateRow(index, 'value', v)\n \">\n <template #icon>\n <ScalarButton\n v-if=\"variable.key || variable.value\"\n class=\"text-c-2 hover:text-c-1 hover:bg-b-2 z-context hidden h-fit rounded p-1 group-hover:flex group-has-[.cm-focused]:flex\"\n size=\"sm\"\n variant=\"ghost\"\n @click.stop=\"handleDeleteRow(index)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </template>\n </CodeInput>\n </DataTableCell>\n </DataTableRow>\n </DataTable>\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}\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { Draggable } from '@scalar/draggable'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useActiveEntities, useWorkspace } from '@/store'\nimport EnvironmentColorModal from '@/views/Environment/EnvironmentColorModal.vue'\nimport EnvironmentModal from '@/views/Environment/EnvironmentModal.vue'\n\nimport EnvironmentForm from './components/EnvironmentForm.vue'\n\nconst { activeCollection, activeWorkspace, activeEnvVariables } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\nconst colorModal = useModal()\nconst deleteModal = useModal()\nconst environmentModal = useModal()\nconst editModal = useModal()\nconst selectedColor = ref('')\nconst selectedEnvironmentName = ref<string | null>(null)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst collectionEnvironments = computed(() => {\n if (!activeCollection.value?.['x-scalar-environments']) {\n return []\n }\n return Object.entries(activeCollection.value['x-scalar-environments']).map(\n ([name, environment]) => ({\n uid: name as Environment['uid'],\n name,\n value: JSON.stringify(environment.variables || {}),\n color: environment.color || '#FFFFFF',\n }),\n )\n})\n\nconst deleteEnvironment = () => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n collectionMutators.removeEnvironment(\n selectedEnvironmentName.value,\n activeCollection.value.uid,\n )\n deleteModal.hide()\n}\n\nconst openDeleteModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n deleteModal.show()\n}\n\nconst handleEnvironmentSubmit = (environment: {\n name: string\n color: string\n collectionId: string | undefined\n}) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n activeCollection.value.uid,\n )\n environmentModal.hide()\n}\n\nconst handleOpenColorModal = (environment: {\n name: string\n color?: string | undefined\n}) => {\n selectedEnvironmentName.value = environment.name\n selectedColor.value = environment.color || '#FFFFFF'\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = {\n ...activeCollection.value['x-scalar-environments'],\n [selectedEnvironmentName.value]: {\n variables:\n activeCollection.value['x-scalar-environments']?.[\n selectedEnvironmentName.value\n ]?.variables || {},\n color,\n },\n }\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n environments,\n )\n colorModal.hide()\n}\n\nconst openRenameModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n tempEnvironmentName.value = environmentName\n editModal.show()\n}\n\nconst closeRenameModal = () => {\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleRename = (newName: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const environment = environments[selectedEnvironmentName.value]\n if (!environment) {\n return\n }\n\n // Create a new ordered environments object\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the index of the environment being renamed\n const envIndex = envEntries.findIndex(\n ([key]) => key === selectedEnvironmentName.value,\n )\n\n // Rebuild the environments object maintaining order\n envEntries.forEach(([key, value], index) => {\n if (index === envIndex) {\n orderedEnvs[newName] = value\n } else {\n orderedEnvs[key] = value\n }\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleDragEnd = (\n draggingItem: { id: string },\n hoveredItem: { id: string },\n) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the indices of the dragged and hovered items\n const dragIndex = envEntries.findIndex(([key]) => key === draggingItem.id)\n const hoverIndex = envEntries.findIndex(([key]) => key === hoveredItem.id)\n\n if (dragIndex === -1 || hoverIndex === -1) {\n return\n }\n\n // Reorder the environments\n const draggedEnv = envEntries[dragIndex]\n if (!draggedEnv) {\n return\n }\n envEntries.splice(dragIndex, 1)\n envEntries.splice(hoverIndex, 0, draggedEnv)\n\n // Rebuild the environments object in the new order\n envEntries.forEach(([key, value]) => {\n orderedEnvs[key] = value\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Environment Variables</h3>\n </div>\n <p class=\"text-sm\">\n Set environment variables at your collection level. Use\n <code\n class=\"font-code text-c-2\"\n v-pre\n >{{ variable }}</code\n >\n to add / search among the selected environment's variables in your\n request inputs.\n </p>\n </div>\n </div>\n <Draggable\n v-for=\"environment in collectionEnvironments\"\n :key=\"environment.name\"\n :id=\"environment.name\"\n :isDraggable=\"true\"\n :isDroppable=\"true\"\n :parentIds=\"[]\"\n @onDragEnd=\"handleDragEnd\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex cursor-grab items-center justify-between rounded-t-lg px-1 py-1 text-sm\">\n <div class=\"flex items-center\">\n <ScalarButton\n class=\"hover:bg-b-3 flex h-6 w-6 p-1\"\n @click=\"handleOpenColorModal(environment)\"\n variant=\"ghost\">\n <span\n :style=\"{ backgroundColor: environment.color || '#FFFFFF' }\"\n class=\"h-2.5 w-2.5 rounded-full\"></span>\n </ScalarButton>\n <button\n class=\"hover:bg-b-3 rounded px-1 py-0.5 text-sm\"\n @click=\"openRenameModal(environment.name)\">\n {{ environment.name }}\n </button>\n </div>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(environment.name)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <EnvironmentForm\n v-if=\"activeCollection && activeWorkspace\"\n :collection=\"activeCollection\"\n :environment=\"environment\"\n :envVariables=\"activeEnvVariables\"\n :workspace=\"activeWorkspace\" />\n </div>\n </Draggable>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"environmentModal.show()\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedEnvironmentName || 'Environment'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Environment'\"\n :warningMessage=\"'Are you sure you want to delete this environment? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"deleteEnvironment\" />\n </ScalarModal>\n <EnvironmentModal\n :activeWorkspaceCollections=\"activeCollection ? [activeCollection] : []\"\n :collectionId=\"activeCollection?.uid\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"handleEnvironmentSubmit\" />\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentName}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"closeRenameModal\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </div>\n </ViewLayoutSection>\n</template>\n\n<style>\n@import '@scalar/draggable/style.css';\n</style>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { Draggable } from '@scalar/draggable'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport EditSidebarListElement from '@/components/Sidebar/Actions/EditSidebarListElement.vue'\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useActiveEntities, useWorkspace } from '@/store'\nimport EnvironmentColorModal from '@/views/Environment/EnvironmentColorModal.vue'\nimport EnvironmentModal from '@/views/Environment/EnvironmentModal.vue'\n\nimport EnvironmentForm from './components/EnvironmentForm.vue'\n\nconst { activeCollection, activeWorkspace, activeEnvVariables } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\nconst colorModal = useModal()\nconst deleteModal = useModal()\nconst environmentModal = useModal()\nconst editModal = useModal()\nconst selectedColor = ref('')\nconst selectedEnvironmentName = ref<string | null>(null)\nconst tempEnvironmentName = ref<string | undefined>(undefined)\n\nconst collectionEnvironments = computed(() => {\n if (!activeCollection.value?.['x-scalar-environments']) {\n return []\n }\n return Object.entries(activeCollection.value['x-scalar-environments']).map(\n ([name, environment]) => ({\n uid: name as Environment['uid'],\n name,\n value: JSON.stringify(environment.variables || {}),\n color: environment.color || '#FFFFFF',\n }),\n )\n})\n\nconst deleteEnvironment = () => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n collectionMutators.removeEnvironment(\n selectedEnvironmentName.value,\n activeCollection.value.uid,\n )\n deleteModal.hide()\n}\n\nconst openDeleteModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n deleteModal.show()\n}\n\nconst handleEnvironmentSubmit = (environment: {\n name: string\n color: string\n collectionId: string | undefined\n}) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n collectionMutators.addEnvironment(\n environment.name,\n {\n variables: {},\n color: environment.color,\n },\n activeCollection.value.uid,\n )\n environmentModal.hide()\n}\n\nconst handleOpenColorModal = (environment: {\n name: string\n color?: string | undefined\n}) => {\n selectedEnvironmentName.value = environment.name\n selectedColor.value = environment.color || '#FFFFFF'\n colorModal.show()\n}\n\nconst submitColorChange = (color: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = {\n ...activeCollection.value['x-scalar-environments'],\n [selectedEnvironmentName.value]: {\n variables:\n activeCollection.value['x-scalar-environments']?.[\n selectedEnvironmentName.value\n ]?.variables || {},\n color,\n },\n }\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n environments,\n )\n colorModal.hide()\n}\n\nconst openRenameModal = (environmentName: string) => {\n selectedEnvironmentName.value = environmentName\n tempEnvironmentName.value = environmentName\n editModal.show()\n}\n\nconst closeRenameModal = () => {\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleRename = (newName: string) => {\n if (!activeCollection.value?.uid || !selectedEnvironmentName.value) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const environment = environments[selectedEnvironmentName.value]\n if (!environment) {\n return\n }\n\n // Create a new ordered environments object\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the index of the environment being renamed\n const envIndex = envEntries.findIndex(\n ([key]) => key === selectedEnvironmentName.value,\n )\n\n // Rebuild the environments object maintaining order\n envEntries.forEach(([key, value], index) => {\n if (index === envIndex) {\n orderedEnvs[newName] = value\n } else {\n orderedEnvs[key] = value\n }\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n\n selectedEnvironmentName.value = null\n tempEnvironmentName.value = undefined\n editModal.hide()\n}\n\nconst handleDragEnd = (\n draggingItem: { id: string },\n hoveredItem: { id: string },\n) => {\n if (!activeCollection.value?.uid) {\n return\n }\n\n const environments = { ...activeCollection.value['x-scalar-environments'] }\n const orderedEnvs: Record<string, any> = {}\n const envEntries = Object.entries(environments)\n\n // Find the indices of the dragged and hovered items\n const dragIndex = envEntries.findIndex(([key]) => key === draggingItem.id)\n const hoverIndex = envEntries.findIndex(([key]) => key === hoveredItem.id)\n\n if (dragIndex === -1 || hoverIndex === -1) {\n return\n }\n\n // Reorder the environments\n const draggedEnv = envEntries[dragIndex]\n if (!draggedEnv) {\n return\n }\n envEntries.splice(dragIndex, 1)\n envEntries.splice(hoverIndex, 0, draggedEnv)\n\n // Rebuild the environments object in the new order\n envEntries.forEach(([key, value]) => {\n orderedEnvs[key] = value\n })\n\n collectionMutators.edit(\n activeCollection.value.uid,\n 'x-scalar-environments',\n orderedEnvs,\n )\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Environment Variables</h3>\n </div>\n <p class=\"text-sm\">\n Set environment variables at your collection level. Use\n <code\n class=\"font-code text-c-2\"\n v-pre\n >{{ variable }}</code\n >\n to add / search among the selected environment's variables in your\n request inputs.\n </p>\n </div>\n </div>\n <Draggable\n v-for=\"environment in collectionEnvironments\"\n :key=\"environment.name\"\n :id=\"environment.name\"\n :isDraggable=\"true\"\n :isDroppable=\"true\"\n :parentIds=\"[]\"\n @onDragEnd=\"handleDragEnd\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex cursor-grab items-center justify-between rounded-t-lg px-1 py-1 text-sm\">\n <div class=\"flex items-center\">\n <ScalarButton\n class=\"hover:bg-b-3 flex h-6 w-6 p-1\"\n @click=\"handleOpenColorModal(environment)\"\n variant=\"ghost\">\n <span\n :style=\"{ backgroundColor: environment.color || '#FFFFFF' }\"\n class=\"h-2.5 w-2.5 rounded-full\"></span>\n </ScalarButton>\n <button\n class=\"hover:bg-b-3 rounded px-1 py-0.5 text-sm\"\n @click=\"openRenameModal(environment.name)\">\n {{ environment.name }}\n </button>\n </div>\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(environment.name)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <EnvironmentForm\n v-if=\"activeCollection && activeWorkspace\"\n :collection=\"activeCollection\"\n :environment=\"environment\"\n :envVariables=\"activeEnvVariables\"\n :workspace=\"activeWorkspace\" />\n </div>\n </Draggable>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"environmentModal.show()\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Environment</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedEnvironmentName || 'Environment'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Environment'\"\n :warningMessage=\"'Are you sure you want to delete this environment? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"deleteEnvironment\" />\n </ScalarModal>\n <EnvironmentModal\n :activeWorkspaceCollections=\"activeCollection ? [activeCollection] : []\"\n :collectionId=\"activeCollection?.uid\"\n :state=\"environmentModal\"\n @cancel=\"environmentModal.hide()\"\n @submit=\"handleEnvironmentSubmit\" />\n <EnvironmentColorModal\n :selectedColor=\"selectedColor\"\n :state=\"colorModal\"\n @cancel=\"colorModal.hide()\"\n @submit=\"submitColorChange\" />\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"editModal\"\n :title=\"`Edit ${selectedEnvironmentName}`\">\n <EditSidebarListElement\n :name=\"tempEnvironmentName ?? ''\"\n @close=\"closeRenameModal\"\n @edit=\"handleRename\" />\n </ScalarModal>\n </div>\n </ViewLayoutSection>\n</template>\n\n<style>\n@import '@scalar/draggable/style.css';\n</style>\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { r as useWorkspace, w as useActiveEntities } from "./store-
|
|
1
|
+
import { r as useWorkspace, w as useActiveEntities } from "./store-DnlAQK5d.js";
|
|
2
2
|
import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BmmBcIzD.js";
|
|
3
|
-
import { t as CodeInput_default } from "./CodeInput-
|
|
3
|
+
import { t as CodeInput_default } from "./CodeInput-BTN8cC5h.js";
|
|
4
4
|
import { t as ViewLayoutSection_default } from "./ViewLayoutSection-mUqKbQry.js";
|
|
5
5
|
import { Fragment, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, nextTick, openBlock, ref, unref, watch, withCtx } from "vue";
|
|
6
6
|
import { ScalarButton, ScalarIcon, ScalarMarkdown } from "@scalar/components";
|
|
@@ -128,4 +128,4 @@ var CollectionOverview_default = /* @__PURE__ */ defineComponent({
|
|
|
128
128
|
//#endregion
|
|
129
129
|
export { CollectionOverview_default as default };
|
|
130
130
|
|
|
131
|
-
//# sourceMappingURL=CollectionOverview-
|
|
131
|
+
//# sourceMappingURL=CollectionOverview-C3GvN8GY.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionOverview-CJ9-Vmei.js","names":[],"sources":["../src/views/Collection/components/MarkdownInput.vue","../src/views/Collection/components/MarkdownInput.vue","../src/views/Collection/CollectionOverview.vue","../src/views/Collection/CollectionOverview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarMarkdown } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { nextTick, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { modelValue, environment, envVariables, workspace } = defineProps<{\n modelValue: string\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n}>()\n\nconst emit = defineEmits<(e: 'update:modelValue', value: string) => void>()\n\nconst mode = ref<'edit' | 'preview'>('preview')\n\nconst codeInputRef = ref<InstanceType<typeof CodeInput> | null>(null)\n\nwatch(mode, (newMode) => {\n if (newMode === 'edit') {\n nextTick(() => {\n codeInputRef.value?.focus()\n })\n }\n})\n\nconst handleBlur = () => {\n // Delay mode switch until after DOM updates to avoid input typing issue\n requestAnimationFrame(() => {\n mode.value = 'preview'\n })\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-2 pt-8\">\n <div class=\"flex min-h-8 items-center justify-between gap-2 pl-1.5\">\n <h3 class=\"font-bold\">Description</h3>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </div>\n <div\n class=\"has-[:focus-visible]:bg-b-1 group relative z-1 flex flex-col rounded-lg\">\n <div class=\"flex h-full min-h-[calc(1rem*4)] flex-col\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"modelValue && modelValue.trim().length\">\n <ScalarMarkdown\n v-if=\"modelValue\"\n class=\"h-full flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"modelValue\"\n withImages\n @dblclick=\"mode = 'edit'\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-[:focus-visible]:hidden\" />\n </template>\n <div\n v-else\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-if=\"mode === 'edit'\">\n <CodeInput\n ref=\"codeInputRef\"\n class=\"h-full flex-1 border px-0.5 py-0\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"modelValue\"\n :workspace=\"workspace\"\n @blur=\"handleBlur\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarMarkdown } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { nextTick, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { modelValue, environment, envVariables, workspace } = defineProps<{\n modelValue: string\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n}>()\n\nconst emit = defineEmits<(e: 'update:modelValue', value: string) => void>()\n\nconst mode = ref<'edit' | 'preview'>('preview')\n\nconst codeInputRef = ref<InstanceType<typeof CodeInput> | null>(null)\n\nwatch(mode, (newMode) => {\n if (newMode === 'edit') {\n nextTick(() => {\n codeInputRef.value?.focus()\n })\n }\n})\n\nconst handleBlur = () => {\n // Delay mode switch until after DOM updates to avoid input typing issue\n requestAnimationFrame(() => {\n mode.value = 'preview'\n })\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-2 pt-8\">\n <div class=\"flex min-h-8 items-center justify-between gap-2 pl-1.5\">\n <h3 class=\"font-bold\">Description</h3>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </div>\n <div\n class=\"has-[:focus-visible]:bg-b-1 group relative z-1 flex flex-col rounded-lg\">\n <div class=\"flex h-full min-h-[calc(1rem*4)] flex-col\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"modelValue && modelValue.trim().length\">\n <ScalarMarkdown\n v-if=\"modelValue\"\n class=\"h-full flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"modelValue\"\n withImages\n @dblclick=\"mode = 'edit'\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-[:focus-visible]:hidden\" />\n </template>\n <div\n v-else\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-if=\"mode === 'edit'\">\n <CodeInput\n ref=\"codeInputRef\"\n class=\"h-full flex-1 border px-0.5 py-0\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"modelValue\"\n :workspace=\"workspace\"\n @blur=\"handleBlur\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\nimport MarkdownInput from '@/views/Collection/components/MarkdownInput.vue'\n\nconst {\n activeCollection,\n activeEnvironment,\n activeEnvVariables,\n activeWorkspace,\n} = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\n/**\n * Update info.description\n */\nconst updateCollectionDescription = (value: string) => {\n if (!activeCollection.value) {\n return\n }\n\n collectionMutators.edit(activeCollection.value.uid, 'info.description', value)\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <MarkdownInput\n v-if=\"activeEnvironment && activeWorkspace\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n :modelValue=\"activeCollection?.info?.description ?? ''\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"updateCollectionDescription\" />\n </ViewLayoutSection>\n</template>\n","<script setup lang=\"ts\">\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\nimport MarkdownInput from '@/views/Collection/components/MarkdownInput.vue'\n\nconst {\n activeCollection,\n activeEnvironment,\n activeEnvVariables,\n activeWorkspace,\n} = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\n/**\n * Update info.description\n */\nconst updateCollectionDescription = (value: string) => {\n if (!activeCollection.value) {\n return\n }\n\n collectionMutators.edit(activeCollection.value.uid, 'info.description', value)\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <MarkdownInput\n v-if=\"activeEnvironment && activeWorkspace\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n :modelValue=\"activeCollection?.info?.description ?? ''\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"updateCollectionDescription\" />\n </ViewLayoutSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;ECgBA,MAAM,OAAO;EAEb,MAAM,OAAO,IAAwB,UAAS;EAE9C,MAAM,eAAe,IAA2C,KAAI;AAEpE,QAAM,OAAO,YAAY;AACvB,OAAI,YAAY,OACd,gBAAe;AACb,iBAAa,OAAO,OAAM;KAC3B;IAEJ;EAED,MAAM,mBAAmB;AAEvB,+BAA4B;AAC1B,SAAK,QAAQ;KACd;;;uBAKD,mBA+DM,OA/DN,YA+DM,CA9DJ,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAAsC,MAAA,EAAlC,OAAM,aAAW,EAAC,eAAW,GAAA,GAEzB,KAAA,UAAI,aAAA,WAAA,EADZ,YAYe,MAAA,aAAA,EAAA;;IAVb,OAAM;IACN,MAAK;IACL,MAAK;IACL,SAAQ;IACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;;2BAIQ,CAHpB,YAGoB,MAAA,WAAA,EAAA;KAFlB,MAAK;KACL,MAAK;KACL,WAAU;kCACZ,mBAAiB,QAAA,MAAX,QAAI,GAAA,EAAA,CAAA;;yCAGd,mBA6CM,OA7CN,YA6CM,CA3CJ,mBA0CM,OA1CN,YA0CM,CAxCY,KAAA,UAAI,aAAA,WAAA,EAApB,mBA0BW,UAAA,EAAA,KAAA,GAAA,EAAA,CAzBO,QAAA,cAAc,QAAA,WAAW,MAAI,CAAG,UAAA,WAAA,EAAhD,mBASW,UAAA,EAAA,KAAA,GAAA,EAAA,CAPD,QAAA,cAAA,WAAA,EADR,YAK8B,MAAA,eAAA,EAAA;;IAH5B,OAAM;IACL,OAAO,QAAA;IACR,YAAA;IACC,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;qFACjB,mBAC8H,OAAA,EAA5H,OAAM,qHAAmH,EAAA,MAAA,GAAA,EAAA,EAAA,GAAA,KAAA,WAAA,EAE7H,mBAcM,OAdN,YAcM,CAXJ,YAUe,MAAA,aAAA,EAAA;IATb,OAAM;IACN,MAAK;IACL,SAAQ;IACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;;2BAIQ,CAHpB,YAGoB,MAAA,WAAA,EAAA;KAFlB,MAAK;KACL,MAAK;KACL,WAAU;kCACZ,mBAAgC,QAAA,MAA1B,uBAAmB,GAAA,EAAA,CAAA;;gDAMf,KAAA,UAAI,UAAA,WAAA,EAClB,YAQ2D,mBAAA;;aAPrD;IAAJ,KAAI;IACJ,OAAM;IACL,cAAc,QAAA;IACd,aAAa,QAAA;IACb,YAAY,QAAA;IACZ,WAAW,QAAA;IACX,QAAM;IACN,uBAAiB,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,qBAAsB,OAAM;;;;;;;;;;;;;;;EE5FhE,MAAM,EACJ,kBACA,mBACA,oBACA,oBACE,mBAAkB;EACtB,MAAM,EAAE,uBAAuB,cAAa;;;;EAK5C,MAAM,+BAA+B,UAAkB;AACrD,OAAI,CAAC,iBAAiB,MACpB;AAGF,sBAAmB,KAAK,iBAAiB,MAAM,KAAK,oBAAoB,MAAK;;;uBAK7E,YAQoB,2BAAA,MAAA;2BADmC,CAL7C,MAAA,kBAAiB,IAAI,MAAA,gBAAe,IAAA,WAAA,EAD5C,YAMqD,uBAAA;;KAJlD,cAAc,MAAA,mBAAkB;KAChC,aAAa,MAAA,kBAAiB;KAC9B,YAAY,MAAA,iBAAgB,EAAE,MAAM,eAAW;KAC/C,WAAW,MAAA,gBAAe;KAC1B,uBAAmB"}
|
|
1
|
+
{"version":3,"file":"CollectionOverview-C3GvN8GY.js","names":[],"sources":["../src/views/Collection/components/MarkdownInput.vue","../src/views/Collection/components/MarkdownInput.vue","../src/views/Collection/CollectionOverview.vue","../src/views/Collection/CollectionOverview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarMarkdown } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { nextTick, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { modelValue, environment, envVariables, workspace } = defineProps<{\n modelValue: string\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n}>()\n\nconst emit = defineEmits<(e: 'update:modelValue', value: string) => void>()\n\nconst mode = ref<'edit' | 'preview'>('preview')\n\nconst codeInputRef = ref<InstanceType<typeof CodeInput> | null>(null)\n\nwatch(mode, (newMode) => {\n if (newMode === 'edit') {\n nextTick(() => {\n codeInputRef.value?.focus()\n })\n }\n})\n\nconst handleBlur = () => {\n // Delay mode switch until after DOM updates to avoid input typing issue\n requestAnimationFrame(() => {\n mode.value = 'preview'\n })\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-2 pt-8\">\n <div class=\"flex min-h-8 items-center justify-between gap-2 pl-1.5\">\n <h3 class=\"font-bold\">Description</h3>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </div>\n <div\n class=\"has-[:focus-visible]:bg-b-1 group relative z-1 flex flex-col rounded-lg\">\n <div class=\"flex h-full min-h-[calc(1rem*4)] flex-col\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"modelValue && modelValue.trim().length\">\n <ScalarMarkdown\n v-if=\"modelValue\"\n class=\"h-full flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"modelValue\"\n withImages\n @dblclick=\"mode = 'edit'\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-[:focus-visible]:hidden\" />\n </template>\n <div\n v-else\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-if=\"mode === 'edit'\">\n <CodeInput\n ref=\"codeInputRef\"\n class=\"h-full flex-1 border px-0.5 py-0\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"modelValue\"\n :workspace=\"workspace\"\n @blur=\"handleBlur\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport { ScalarButton, ScalarIcon, ScalarMarkdown } from '@scalar/components'\nimport type { Environment } from '@scalar/oas-utils/entities/environment'\nimport type { Workspace } from '@scalar/oas-utils/entities/workspace'\nimport { nextTick, ref, watch } from 'vue'\n\nimport CodeInput from '@/components/CodeInput/CodeInput.vue'\nimport type { EnvVariable } from '@/store/active-entities'\n\nconst { modelValue, environment, envVariables, workspace } = defineProps<{\n modelValue: string\n environment: Environment\n envVariables: EnvVariable[]\n workspace: Workspace\n}>()\n\nconst emit = defineEmits<(e: 'update:modelValue', value: string) => void>()\n\nconst mode = ref<'edit' | 'preview'>('preview')\n\nconst codeInputRef = ref<InstanceType<typeof CodeInput> | null>(null)\n\nwatch(mode, (newMode) => {\n if (newMode === 'edit') {\n nextTick(() => {\n codeInputRef.value?.focus()\n })\n }\n})\n\nconst handleBlur = () => {\n // Delay mode switch until after DOM updates to avoid input typing issue\n requestAnimationFrame(() => {\n mode.value = 'preview'\n })\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-2 pt-8\">\n <div class=\"flex min-h-8 items-center justify-between gap-2 pl-1.5\">\n <h3 class=\"font-bold\">Description</h3>\n <ScalarButton\n v-if=\"mode === 'preview'\"\n class=\"text-c-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n type=\"button\"\n variant=\"outlined\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Edit</span>\n </ScalarButton>\n </div>\n <div\n class=\"has-[:focus-visible]:bg-b-1 group relative z-1 flex flex-col rounded-lg\">\n <div class=\"flex h-full min-h-[calc(1rem*4)] flex-col\">\n <!-- Preview -->\n <template v-if=\"mode === 'preview'\">\n <template v-if=\"modelValue && modelValue.trim().length\">\n <ScalarMarkdown\n v-if=\"modelValue\"\n class=\"h-full flex-1 rounded border border-transparent p-1.5 hover:border-(--scalar-background-3)\"\n :value=\"modelValue\"\n withImages\n @dblclick=\"mode = 'edit'\" />\n <div\n class=\"brightness-lifted bg-b-1 absolute inset-0 -z-1 hidden rounded group-hover:block group-has-[:focus-visible]:hidden\" />\n </template>\n <div\n v-else\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 text-c-2 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"mode = 'edit'\">\n <ScalarIcon\n icon=\"Pencil\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Write a description</span>\n </ScalarButton>\n </div>\n </template>\n\n <!-- Edit -->\n <template v-if=\"mode === 'edit'\">\n <CodeInput\n ref=\"codeInputRef\"\n class=\"h-full flex-1 border px-0.5 py-0\"\n :envVariables=\"envVariables\"\n :environment=\"environment\"\n :modelValue=\"modelValue\"\n :workspace=\"workspace\"\n @blur=\"handleBlur\"\n @update:modelValue=\"emit('update:modelValue', $event)\" />\n </template>\n </div>\n </div>\n </div>\n</template>\n<style scoped>\n:deep(.cm-content) {\n min-height: fit-content;\n}\n:deep(.cm-scroller) {\n max-width: 100%;\n overflow-x: auto;\n overflow-y: hidden;\n}\n</style>\n","<script setup lang=\"ts\">\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\nimport MarkdownInput from '@/views/Collection/components/MarkdownInput.vue'\n\nconst {\n activeCollection,\n activeEnvironment,\n activeEnvVariables,\n activeWorkspace,\n} = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\n/**\n * Update info.description\n */\nconst updateCollectionDescription = (value: string) => {\n if (!activeCollection.value) {\n return\n }\n\n collectionMutators.edit(activeCollection.value.uid, 'info.description', value)\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <MarkdownInput\n v-if=\"activeEnvironment && activeWorkspace\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n :modelValue=\"activeCollection?.info?.description ?? ''\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"updateCollectionDescription\" />\n </ViewLayoutSection>\n</template>\n","<script setup lang=\"ts\">\nimport ViewLayoutSection from '@/components/ViewLayout/ViewLayoutSection.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\nimport MarkdownInput from '@/views/Collection/components/MarkdownInput.vue'\n\nconst {\n activeCollection,\n activeEnvironment,\n activeEnvVariables,\n activeWorkspace,\n} = useActiveEntities()\nconst { collectionMutators } = useWorkspace()\n\n/**\n * Update info.description\n */\nconst updateCollectionDescription = (value: string) => {\n if (!activeCollection.value) {\n return\n }\n\n collectionMutators.edit(activeCollection.value.uid, 'info.description', value)\n}\n</script>\n\n<template>\n <ViewLayoutSection>\n <MarkdownInput\n v-if=\"activeEnvironment && activeWorkspace\"\n :envVariables=\"activeEnvVariables\"\n :environment=\"activeEnvironment\"\n :modelValue=\"activeCollection?.info?.description ?? ''\"\n :workspace=\"activeWorkspace\"\n @update:modelValue=\"updateCollectionDescription\" />\n </ViewLayoutSection>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;ECgBA,MAAM,OAAO;EAEb,MAAM,OAAO,IAAwB,UAAS;EAE9C,MAAM,eAAe,IAA2C,KAAI;AAEpE,QAAM,OAAO,YAAY;AACvB,OAAI,YAAY,OACd,gBAAe;AACb,iBAAa,OAAO,OAAM;KAC3B;IAEJ;EAED,MAAM,mBAAmB;AAEvB,+BAA4B;AAC1B,SAAK,QAAQ;KACd;;;uBAKD,mBA+DM,OA/DN,YA+DM,CA9DJ,mBAeM,OAfN,YAeM,CAAA,OAAA,OAAA,OAAA,KAdJ,mBAAsC,MAAA,EAAlC,OAAM,aAAW,EAAC,eAAW,GAAA,GAEzB,KAAA,UAAI,aAAA,WAAA,EADZ,YAYe,MAAA,aAAA,EAAA;;IAVb,OAAM;IACN,MAAK;IACL,MAAK;IACL,SAAQ;IACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;;2BAIQ,CAHpB,YAGoB,MAAA,WAAA,EAAA;KAFlB,MAAK;KACL,MAAK;KACL,WAAU;kCACZ,mBAAiB,QAAA,MAAX,QAAI,GAAA,EAAA,CAAA;;yCAGd,mBA6CM,OA7CN,YA6CM,CA3CJ,mBA0CM,OA1CN,YA0CM,CAxCY,KAAA,UAAI,aAAA,WAAA,EAApB,mBA0BW,UAAA,EAAA,KAAA,GAAA,EAAA,CAzBO,QAAA,cAAc,QAAA,WAAW,MAAI,CAAG,UAAA,WAAA,EAAhD,mBASW,UAAA,EAAA,KAAA,GAAA,EAAA,CAPD,QAAA,cAAA,WAAA,EADR,YAK8B,MAAA,eAAA,EAAA;;IAH5B,OAAM;IACL,OAAO,QAAA;IACR,YAAA;IACC,YAAQ,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;qFACjB,mBAC8H,OAAA,EAA5H,OAAM,qHAAmH,EAAA,MAAA,GAAA,EAAA,EAAA,GAAA,KAAA,WAAA,EAE7H,mBAcM,OAdN,YAcM,CAXJ,YAUe,MAAA,aAAA,EAAA;IATb,OAAM;IACN,MAAK;IACL,SAAQ;IACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,KAAA,QAAI;;2BAIQ,CAHpB,YAGoB,MAAA,WAAA,EAAA;KAFlB,MAAK;KACL,MAAK;KACL,WAAU;kCACZ,mBAAgC,QAAA,MAA1B,uBAAmB,GAAA,EAAA,CAAA;;gDAMf,KAAA,UAAI,UAAA,WAAA,EAClB,YAQ2D,mBAAA;;aAPrD;IAAJ,KAAI;IACJ,OAAM;IACL,cAAc,QAAA;IACd,aAAa,QAAA;IACb,YAAY,QAAA;IACZ,WAAW,QAAA;IACX,QAAM;IACN,uBAAiB,OAAA,OAAA,OAAA,MAAA,WAAE,KAAI,qBAAsB,OAAM;;;;;;;;;;;;;;;EE5FhE,MAAM,EACJ,kBACA,mBACA,oBACA,oBACE,mBAAkB;EACtB,MAAM,EAAE,uBAAuB,cAAa;;;;EAK5C,MAAM,+BAA+B,UAAkB;AACrD,OAAI,CAAC,iBAAiB,MACpB;AAGF,sBAAmB,KAAK,iBAAiB,MAAM,KAAK,oBAAoB,MAAK;;;uBAK7E,YAQoB,2BAAA,MAAA;2BADmC,CAL7C,MAAA,kBAAiB,IAAI,MAAA,gBAAe,IAAA,WAAA,EAD5C,YAMqD,uBAAA;;KAJlD,cAAc,MAAA,mBAAkB;KAChC,aAAa,MAAA,kBAAiB;KAC9B,YAAY,MAAA,iBAAgB,EAAE,MAAM,eAAW;KAC/C,WAAW,MAAA,gBAAe;KAC1B,uBAAmB"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { r as useWorkspace, w as useActiveEntities } from "./store-
|
|
2
|
-
import "./CodeInput-
|
|
1
|
+
import { r as useWorkspace, w as useActiveEntities } from "./store-DnlAQK5d.js";
|
|
2
|
+
import "./CodeInput-BTN8cC5h.js";
|
|
3
3
|
import { t as ServerVariablesForm_default } from "./ServerVariablesForm-BRZ9XC8o.js";
|
|
4
|
-
import "./DataTableInput-
|
|
4
|
+
import "./DataTableInput-RydMDjn2.js";
|
|
5
5
|
import { t as DeleteSidebarListElement_default } from "./DeleteSidebarListElement-C-p87d03.js";
|
|
6
|
-
import { t as Form_default } from "./Form-
|
|
6
|
+
import { t as Form_default } from "./Form-KFcdRQp1.js";
|
|
7
7
|
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createStaticVNode, createVNode, defineComponent, normalizeClass, openBlock, ref, renderList, toDisplayString, unref, watch, withCtx } from "vue";
|
|
8
8
|
import { ScalarButton, ScalarIcon, ScalarMarkdown, ScalarModal, useModal } from "@scalar/components";
|
|
9
9
|
import { REGEX } from "@scalar/oas-utils/helpers";
|
|
@@ -165,4 +165,4 @@ var CollectionServers_default = /* @__PURE__ */ defineComponent({
|
|
|
165
165
|
//#endregion
|
|
166
166
|
export { CollectionServers_default as default };
|
|
167
167
|
|
|
168
|
-
//# sourceMappingURL=CollectionServers-
|
|
168
|
+
//# sourceMappingURL=CollectionServers-DuOLysNB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionServers-BWkIGwz4.js","names":[],"sources":["../src/views/Collection/CollectionServerForm.vue","../src/views/Collection/CollectionServerForm.vue","../src/views/Collection/CollectionServers.vue","../src/views/Collection/CollectionServers.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { computed, watch } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport ServerVariablesForm from '@/components/Server/ServerVariablesForm.vue'\nimport type { ServerVariables } from '@/components/Server/types'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst props = withDefaults(\n defineProps<{\n collectionId: string | string[]\n serverUid: string | string[]\n }>(),\n {\n collectionId: '',\n serverUid: '',\n },\n)\n\nconst { activeWorkspaceCollections } = useActiveEntities()\nconst { servers, serverMutators } = useWorkspace()\n\nconst options = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n type: 'text',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n type: 'text',\n },\n]\n\nconst activeServer = computed(() => {\n const activeCollection = activeWorkspaceCollections.value.find(\n (collection) => collection.uid === props.collectionId,\n )\n return servers[\n activeCollection &&\n typeof props.serverUid === 'string' &&\n props.serverUid === 'default'\n ? (activeCollection.servers[0] ?? '')\n : (activeCollection?.servers.find((uid) => uid === props.serverUid) ?? '')\n ]\n})\n\nconst pathVariables = computed(() => {\n if (!activeServer.value?.url) {\n return []\n }\n return (\n activeServer.value.url.match(REGEX.PATH)?.map((m) => m.slice(1, -1)) ?? []\n )\n})\n\nwatch(\n pathVariables,\n (newPathVariables) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables\n ? { ...activeServer.value.variables }\n : {}\n\n // Removes variables no longer in the server path\n Object.keys(variables).forEach((key) => {\n if (!newPathVariables.includes(key)) {\n delete variables[key]\n }\n })\n\n // Adds path variables\n newPathVariables.forEach((variable) => {\n if (!variables[variable]) {\n variables[variable] = { default: '' }\n }\n })\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n },\n { immediate: true },\n)\n\nconst updateServer = (key: string, value: string) => {\n if (!activeWorkspaceCollections.value || !activeServer.value) {\n return\n }\n serverMutators.edit(activeServer.value.uid, key as keyof Server, value)\n\n // if (key === 'url' || key === 'description') {\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: key,\n // value: value,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n // }\n}\n\nconst updateServerVariable = (key: string, value: string) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables || {}\n variables[key] = { ...variables[key], default: value }\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n}\n</script>\n\n<template>\n <div\n class=\"divide-0.5 flex w-full flex-col divide-y rounded-b-lg text-sm\"\n :class=\"activeServer?.variables && 'bg-b-1'\">\n <template v-if=\"activeServer\">\n <Form\n :data=\"activeServer\"\n :onUpdate=\"updateServer\"\n :options=\"options\" />\n <ServerVariablesForm\n v-if=\"activeServer.variables\"\n :variables=\"activeServer.variables as ServerVariables\"\n @update:variable=\"updateServerVariable\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { computed, watch } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport ServerVariablesForm from '@/components/Server/ServerVariablesForm.vue'\nimport type { ServerVariables } from '@/components/Server/types'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst props = withDefaults(\n defineProps<{\n collectionId: string | string[]\n serverUid: string | string[]\n }>(),\n {\n collectionId: '',\n serverUid: '',\n },\n)\n\nconst { activeWorkspaceCollections } = useActiveEntities()\nconst { servers, serverMutators } = useWorkspace()\n\nconst options = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n type: 'text',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n type: 'text',\n },\n]\n\nconst activeServer = computed(() => {\n const activeCollection = activeWorkspaceCollections.value.find(\n (collection) => collection.uid === props.collectionId,\n )\n return servers[\n activeCollection &&\n typeof props.serverUid === 'string' &&\n props.serverUid === 'default'\n ? (activeCollection.servers[0] ?? '')\n : (activeCollection?.servers.find((uid) => uid === props.serverUid) ?? '')\n ]\n})\n\nconst pathVariables = computed(() => {\n if (!activeServer.value?.url) {\n return []\n }\n return (\n activeServer.value.url.match(REGEX.PATH)?.map((m) => m.slice(1, -1)) ?? []\n )\n})\n\nwatch(\n pathVariables,\n (newPathVariables) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables\n ? { ...activeServer.value.variables }\n : {}\n\n // Removes variables no longer in the server path\n Object.keys(variables).forEach((key) => {\n if (!newPathVariables.includes(key)) {\n delete variables[key]\n }\n })\n\n // Adds path variables\n newPathVariables.forEach((variable) => {\n if (!variables[variable]) {\n variables[variable] = { default: '' }\n }\n })\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n },\n { immediate: true },\n)\n\nconst updateServer = (key: string, value: string) => {\n if (!activeWorkspaceCollections.value || !activeServer.value) {\n return\n }\n serverMutators.edit(activeServer.value.uid, key as keyof Server, value)\n\n // if (key === 'url' || key === 'description') {\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: key,\n // value: value,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n // }\n}\n\nconst updateServerVariable = (key: string, value: string) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables || {}\n variables[key] = { ...variables[key], default: value }\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n}\n</script>\n\n<template>\n <div\n class=\"divide-0.5 flex w-full flex-col divide-y rounded-b-lg text-sm\"\n :class=\"activeServer?.variables && 'bg-b-1'\">\n <template v-if=\"activeServer\">\n <Form\n :data=\"activeServer\"\n :onUpdate=\"updateServer\"\n :options=\"options\" />\n <ServerVariablesForm\n v-if=\"activeServer.variables\"\n :variables=\"activeServer.variables as ServerVariables\"\n @update:variable=\"updateServerVariable\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarMarkdown,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CollectionServerForm from './CollectionServerForm.vue'\n\nconst { activeCollection } = useActiveEntities()\nconst { servers, events, serverMutators } = useWorkspace()\n\nconst deleteModal = useModal()\nconst selectedServerUid = ref<Server['uid'] | null>(null)\n\nconst collectionServers = computed(() => {\n if (!servers || !activeCollection.value?.servers) {\n return []\n }\n return Object.values(servers).filter((server) =>\n activeCollection.value?.servers.includes(server.uid),\n )\n})\n\n/** Add server */\nconst handleAddServer = () =>\n events.commandPalette.emit({\n commandName: 'Add Server',\n })\n\n/** Delete server */\nconst handleDeleteServer = () => {\n if (!activeCollection.value?.uid || !selectedServerUid.value) {\n return\n }\n\n serverMutators.delete(selectedServerUid.value, activeCollection.value.uid)\n // emitCustomEvent(wrapper.value, 'scalar-delete-server', {\n // url: servers[selectedServerUid.value]?.url ?? '',\n // })\n deleteModal.hide()\n}\n\nconst openDeleteModal = (serverUid: Server['uid']) => {\n selectedServerUid.value = serverUid\n deleteModal.show()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Servers</h3>\n </div>\n <p class=\"text-sm\">\n Add different base URLs for your API. You can use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n parts.\n </p>\n </div>\n </div>\n <div\n v-for=\"(server, index) in collectionServers\"\n :key=\"server.uid\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex items-start justify-between rounded-t-lg py-1 pr-1 pl-3 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\"\n >Server {{ index + 1 }}</span\n >\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(server.uid)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <CollectionServerForm\n v-if=\"activeCollection\"\n :collectionId=\"activeCollection.uid\"\n :serverUid=\"server.uid\" />\n </div>\n </div>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedServerUid ? servers[selectedServerUid]?.url : 'Server'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Server'\"\n :warningMessage=\"'Are you sure you want to delete this server? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarMarkdown,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CollectionServerForm from './CollectionServerForm.vue'\n\nconst { activeCollection } = useActiveEntities()\nconst { servers, events, serverMutators } = useWorkspace()\n\nconst deleteModal = useModal()\nconst selectedServerUid = ref<Server['uid'] | null>(null)\n\nconst collectionServers = computed(() => {\n if (!servers || !activeCollection.value?.servers) {\n return []\n }\n return Object.values(servers).filter((server) =>\n activeCollection.value?.servers.includes(server.uid),\n )\n})\n\n/** Add server */\nconst handleAddServer = () =>\n events.commandPalette.emit({\n commandName: 'Add Server',\n })\n\n/** Delete server */\nconst handleDeleteServer = () => {\n if (!activeCollection.value?.uid || !selectedServerUid.value) {\n return\n }\n\n serverMutators.delete(selectedServerUid.value, activeCollection.value.uid)\n // emitCustomEvent(wrapper.value, 'scalar-delete-server', {\n // url: servers[selectedServerUid.value]?.url ?? '',\n // })\n deleteModal.hide()\n}\n\nconst openDeleteModal = (serverUid: Server['uid']) => {\n selectedServerUid.value = serverUid\n deleteModal.show()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Servers</h3>\n </div>\n <p class=\"text-sm\">\n Add different base URLs for your API. You can use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n parts.\n </p>\n </div>\n </div>\n <div\n v-for=\"(server, index) in collectionServers\"\n :key=\"server.uid\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex items-start justify-between rounded-t-lg py-1 pr-1 pl-3 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\"\n >Server {{ index + 1 }}</span\n >\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(server.uid)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <CollectionServerForm\n v-if=\"activeCollection\"\n :collectionId=\"activeCollection.uid\"\n :serverUid=\"server.uid\" />\n </div>\n </div>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedServerUid ? servers[selectedServerUid]?.url : 'Server'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Server'\"\n :warningMessage=\"'Are you sure you want to delete this server? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n </div>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionServers-DuOLysNB.js","names":[],"sources":["../src/views/Collection/CollectionServerForm.vue","../src/views/Collection/CollectionServerForm.vue","../src/views/Collection/CollectionServers.vue","../src/views/Collection/CollectionServers.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { computed, watch } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport ServerVariablesForm from '@/components/Server/ServerVariablesForm.vue'\nimport type { ServerVariables } from '@/components/Server/types'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst props = withDefaults(\n defineProps<{\n collectionId: string | string[]\n serverUid: string | string[]\n }>(),\n {\n collectionId: '',\n serverUid: '',\n },\n)\n\nconst { activeWorkspaceCollections } = useActiveEntities()\nconst { servers, serverMutators } = useWorkspace()\n\nconst options = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n type: 'text',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n type: 'text',\n },\n]\n\nconst activeServer = computed(() => {\n const activeCollection = activeWorkspaceCollections.value.find(\n (collection) => collection.uid === props.collectionId,\n )\n return servers[\n activeCollection &&\n typeof props.serverUid === 'string' &&\n props.serverUid === 'default'\n ? (activeCollection.servers[0] ?? '')\n : (activeCollection?.servers.find((uid) => uid === props.serverUid) ?? '')\n ]\n})\n\nconst pathVariables = computed(() => {\n if (!activeServer.value?.url) {\n return []\n }\n return (\n activeServer.value.url.match(REGEX.PATH)?.map((m) => m.slice(1, -1)) ?? []\n )\n})\n\nwatch(\n pathVariables,\n (newPathVariables) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables\n ? { ...activeServer.value.variables }\n : {}\n\n // Removes variables no longer in the server path\n Object.keys(variables).forEach((key) => {\n if (!newPathVariables.includes(key)) {\n delete variables[key]\n }\n })\n\n // Adds path variables\n newPathVariables.forEach((variable) => {\n if (!variables[variable]) {\n variables[variable] = { default: '' }\n }\n })\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n },\n { immediate: true },\n)\n\nconst updateServer = (key: string, value: string) => {\n if (!activeWorkspaceCollections.value || !activeServer.value) {\n return\n }\n serverMutators.edit(activeServer.value.uid, key as keyof Server, value)\n\n // if (key === 'url' || key === 'description') {\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: key,\n // value: value,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n // }\n}\n\nconst updateServerVariable = (key: string, value: string) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables || {}\n variables[key] = { ...variables[key], default: value }\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n}\n</script>\n\n<template>\n <div\n class=\"divide-0.5 flex w-full flex-col divide-y rounded-b-lg text-sm\"\n :class=\"activeServer?.variables && 'bg-b-1'\">\n <template v-if=\"activeServer\">\n <Form\n :data=\"activeServer\"\n :onUpdate=\"updateServer\"\n :options=\"options\" />\n <ServerVariablesForm\n v-if=\"activeServer.variables\"\n :variables=\"activeServer.variables as ServerVariables\"\n @update:variable=\"updateServerVariable\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { REGEX } from '@scalar/oas-utils/helpers'\nimport { computed, watch } from 'vue'\n\nimport Form from '@/components/Form/Form.vue'\nimport ServerVariablesForm from '@/components/Server/ServerVariablesForm.vue'\nimport type { ServerVariables } from '@/components/Server/types'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nconst props = withDefaults(\n defineProps<{\n collectionId: string | string[]\n serverUid: string | string[]\n }>(),\n {\n collectionId: '',\n serverUid: '',\n },\n)\n\nconst { activeWorkspaceCollections } = useActiveEntities()\nconst { servers, serverMutators } = useWorkspace()\n\nconst options = [\n {\n label: 'URL',\n key: 'url',\n placeholder: 'https://void.scalar.com',\n type: 'text',\n },\n {\n label: 'Description',\n key: 'description',\n placeholder: 'Production',\n type: 'text',\n },\n]\n\nconst activeServer = computed(() => {\n const activeCollection = activeWorkspaceCollections.value.find(\n (collection) => collection.uid === props.collectionId,\n )\n return servers[\n activeCollection &&\n typeof props.serverUid === 'string' &&\n props.serverUid === 'default'\n ? (activeCollection.servers[0] ?? '')\n : (activeCollection?.servers.find((uid) => uid === props.serverUid) ?? '')\n ]\n})\n\nconst pathVariables = computed(() => {\n if (!activeServer.value?.url) {\n return []\n }\n return (\n activeServer.value.url.match(REGEX.PATH)?.map((m) => m.slice(1, -1)) ?? []\n )\n})\n\nwatch(\n pathVariables,\n (newPathVariables) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables\n ? { ...activeServer.value.variables }\n : {}\n\n // Removes variables no longer in the server path\n Object.keys(variables).forEach((key) => {\n if (!newPathVariables.includes(key)) {\n delete variables[key]\n }\n })\n\n // Adds path variables\n newPathVariables.forEach((variable) => {\n if (!variables[variable]) {\n variables[variable] = { default: '' }\n }\n })\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n },\n { immediate: true },\n)\n\nconst updateServer = (key: string, value: string) => {\n if (!activeWorkspaceCollections.value || !activeServer.value) {\n return\n }\n serverMutators.edit(activeServer.value.uid, key as keyof Server, value)\n\n // if (key === 'url' || key === 'description') {\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: key,\n // value: value,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n // }\n}\n\nconst updateServerVariable = (key: string, value: string) => {\n if (!activeServer.value) {\n return\n }\n\n const variables = activeServer.value.variables || {}\n variables[key] = { ...variables[key], default: value }\n\n serverMutators.edit(activeServer.value.uid, 'variables', variables)\n\n // emitCustomEvent(wrapper.value, 'store-update-selected-server-properties', {\n // key: 'variables',\n // value: variables,\n // options: {\n // disableOldStoreUpdate: true,\n // },\n // })\n}\n</script>\n\n<template>\n <div\n class=\"divide-0.5 flex w-full flex-col divide-y rounded-b-lg text-sm\"\n :class=\"activeServer?.variables && 'bg-b-1'\">\n <template v-if=\"activeServer\">\n <Form\n :data=\"activeServer\"\n :onUpdate=\"updateServer\"\n :options=\"options\" />\n <ServerVariablesForm\n v-if=\"activeServer.variables\"\n :variables=\"activeServer.variables as ServerVariables\"\n @update:variable=\"updateServerVariable\" />\n </template>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarMarkdown,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CollectionServerForm from './CollectionServerForm.vue'\n\nconst { activeCollection } = useActiveEntities()\nconst { servers, events, serverMutators } = useWorkspace()\n\nconst deleteModal = useModal()\nconst selectedServerUid = ref<Server['uid'] | null>(null)\n\nconst collectionServers = computed(() => {\n if (!servers || !activeCollection.value?.servers) {\n return []\n }\n return Object.values(servers).filter((server) =>\n activeCollection.value?.servers.includes(server.uid),\n )\n})\n\n/** Add server */\nconst handleAddServer = () =>\n events.commandPalette.emit({\n commandName: 'Add Server',\n })\n\n/** Delete server */\nconst handleDeleteServer = () => {\n if (!activeCollection.value?.uid || !selectedServerUid.value) {\n return\n }\n\n serverMutators.delete(selectedServerUid.value, activeCollection.value.uid)\n // emitCustomEvent(wrapper.value, 'scalar-delete-server', {\n // url: servers[selectedServerUid.value]?.url ?? '',\n // })\n deleteModal.hide()\n}\n\nconst openDeleteModal = (serverUid: Server['uid']) => {\n selectedServerUid.value = serverUid\n deleteModal.show()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Servers</h3>\n </div>\n <p class=\"text-sm\">\n Add different base URLs for your API. You can use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n parts.\n </p>\n </div>\n </div>\n <div\n v-for=\"(server, index) in collectionServers\"\n :key=\"server.uid\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex items-start justify-between rounded-t-lg py-1 pr-1 pl-3 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\"\n >Server {{ index + 1 }}</span\n >\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(server.uid)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <CollectionServerForm\n v-if=\"activeCollection\"\n :collectionId=\"activeCollection.uid\"\n :serverUid=\"server.uid\" />\n </div>\n </div>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedServerUid ? servers[selectedServerUid]?.url : 'Server'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Server'\"\n :warningMessage=\"'Are you sure you want to delete this server? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarMarkdown,\n ScalarModal,\n useModal,\n} from '@scalar/components'\nimport { ScalarIconTrash } from '@scalar/icons'\nimport type { Server } from '@scalar/oas-utils/entities/spec'\nimport { computed, ref } from 'vue'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { useWorkspace } from '@/store'\nimport { useActiveEntities } from '@/store/active-entities'\n\nimport CollectionServerForm from './CollectionServerForm.vue'\n\nconst { activeCollection } = useActiveEntities()\nconst { servers, events, serverMutators } = useWorkspace()\n\nconst deleteModal = useModal()\nconst selectedServerUid = ref<Server['uid'] | null>(null)\n\nconst collectionServers = computed(() => {\n if (!servers || !activeCollection.value?.servers) {\n return []\n }\n return Object.values(servers).filter((server) =>\n activeCollection.value?.servers.includes(server.uid),\n )\n})\n\n/** Add server */\nconst handleAddServer = () =>\n events.commandPalette.emit({\n commandName: 'Add Server',\n })\n\n/** Delete server */\nconst handleDeleteServer = () => {\n if (!activeCollection.value?.uid || !selectedServerUid.value) {\n return\n }\n\n serverMutators.delete(selectedServerUid.value, activeCollection.value.uid)\n // emitCustomEvent(wrapper.value, 'scalar-delete-server', {\n // url: servers[selectedServerUid.value]?.url ?? '',\n // })\n deleteModal.hide()\n}\n\nconst openDeleteModal = (serverUid: Server['uid']) => {\n selectedServerUid.value = serverUid\n deleteModal.show()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-start justify-between gap-2\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Servers</h3>\n </div>\n <p class=\"text-sm\">\n Add different base URLs for your API. You can use\n <code class=\"font-code text-c-2\">{variables}</code> for dynamic\n parts.\n </p>\n </div>\n </div>\n <div\n v-for=\"(server, index) in collectionServers\"\n :key=\"server.uid\">\n <div class=\"rounded-lg border\">\n <div\n class=\"bg-b-2 flex items-start justify-between rounded-t-lg py-1 pr-1 pl-3 text-sm\">\n <ScalarMarkdown\n v-if=\"server.description\"\n class=\"self-center\"\n :value=\"server.description\" />\n <span\n v-else\n class=\"self-center\"\n >Server {{ index + 1 }}</span\n >\n <ScalarButton\n class=\"hover:bg-b-3 hover:text-c-1 h-fit p-1.25\"\n variant=\"ghost\"\n @click=\"openDeleteModal(server.uid)\">\n <ScalarIconTrash class=\"size-3.5\" />\n </ScalarButton>\n </div>\n <CollectionServerForm\n v-if=\"activeCollection\"\n :collectionId=\"activeCollection.uid\"\n :serverUid=\"server.uid\" />\n </div>\n </div>\n <div\n class=\"text-c-3 flex h-full items-center justify-center rounded-lg border p-4\">\n <ScalarButton\n class=\"hover:bg-b-2 hover:text-c-1 flex items-center gap-2\"\n size=\"sm\"\n variant=\"ghost\"\n @click=\"handleAddServer\">\n <ScalarIcon\n class=\"inline-flex\"\n icon=\"Add\"\n size=\"sm\"\n thickness=\"1.5\" />\n <span>Add Server</span>\n </ScalarButton>\n </div>\n </div>\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${selectedServerUid ? servers[selectedServerUid]?.url : 'Server'}`\">\n <DeleteSidebarListElement\n :variableName=\"'Server'\"\n :warningMessage=\"'Are you sure you want to delete this server? This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteServer\" />\n </ScalarModal>\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
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-DnlAQK5d.js";
|
|
2
2
|
import { t as DeleteSidebarListElement_default } from "./DeleteSidebarListElement-C-p87d03.js";
|
|
3
3
|
import { Fragment, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, openBlock, toDisplayString, unref, withCtx } from "vue";
|
|
4
4
|
import { ScalarButton, ScalarIcon, ScalarModal, ScalarToggle, useModal } from "@scalar/components";
|
|
@@ -84,4 +84,4 @@ var CollectionSettings_default = /* @__PURE__ */ defineComponent({
|
|
|
84
84
|
//#endregion
|
|
85
85
|
export { CollectionSettings_default as default };
|
|
86
86
|
|
|
87
|
-
//# sourceMappingURL=CollectionSettings-
|
|
87
|
+
//# sourceMappingURL=CollectionSettings-FtXNetOh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollectionSettings-CqUUYOym.js","names":[],"sources":["../src/views/Collection/CollectionSettings.vue","../src/views/Collection/CollectionSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { useRouter } from 'vue-router'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nconst { activeCollection, activeWorkspace, activeWorkspaceCollections } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst { replace } = useRouter()\nconst deleteModal = useModal()\n\nfunction handleToggleWatchMode() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeCollection.value?.documentUrl) {\n return\n }\n collectionMutators.edit(\n activeCollection.value.uid,\n 'watchMode',\n !activeCollection.value?.watchMode,\n )\n}\n\nfunction handleDeleteCollection() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeWorkspace.value) {\n return\n }\n\n collectionMutators.delete(activeCollection.value, activeWorkspace.value)\n\n const firstCollection = activeWorkspaceCollections.value[0]\n\n // Redirect to the first collection\n if (firstCollection) {\n replace({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: firstCollection.uid,\n },\n })\n }\n\n deleteModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Features</h3>\n </div>\n <!-- Watch Mode -->\n <div class=\"bg-b-2 rounded-lg border text-sm\">\n <div\n class=\"bg-b-1 flex items-center justify-between gap-4 rounded-t-lg p-3\">\n <div>\n <h4>Watch Mode</h4>\n <p class=\"text-c-2 mt-1\">\n When enabled, the OpenAPI document will be polled for changes. The\n collection will be updated automatically.\n </p>\n </div>\n <ScalarToggle\n class=\"w-4\"\n :disabled=\"!activeCollection?.documentUrl\"\n :modelValue=\"activeCollection?.watchMode ?? false\"\n @update:modelValue=\"handleToggleWatchMode\" />\n </div>\n <div\n class=\"text-c-1 flex items-center overflow-x-auto border-t py-1.5 whitespace-nowrap\">\n <div class=\"flex items-center\">\n <template v-if=\"activeCollection?.documentUrl\">\n <span class=\"bg-b-2 sticky left-0 pr-2 pl-3\">Source</span>\n <a\n class=\"text-c-2 group rounded pr-3 no-underline hover:underline\"\n :href=\"activeCollection.documentUrl\"\n target=\"_blank\">\n {{ activeCollection.documentUrl }}\n <ScalarIcon\n class=\"ml-1 hidden w-2.5 group-hover:inline\"\n icon=\"ExternalLink\" />\n </a>\n </template>\n <template v-else>\n <ScalarIcon\n class=\"text-c-2 mr-2 ml-3 w-4\"\n icon=\"NotAllowed\"\n size=\"sm\" />\n <span class=\"text-c-2 pr-3\">\n No URL configured. Try importing an OpenAPI document from an\n URL.\n </span>\n </template>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Danger Zone -->\n <div class=\"flex flex-col gap-4\">\n <h3 class=\"font-bold\">Danger Zone</h3>\n <div\n class=\"flex items-center justify-between rounded-lg border p-3 text-sm\">\n <div>\n <h4>Delete Collection</h4>\n <p class=\"text-c-2 mt-1\">\n Be careful, my friend. Once deleted, there is no way to recover the\n collection.\n </p>\n </div>\n <ScalarButton\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteModal.show()\">\n Delete Collection\n </ScalarButton>\n </div>\n </div>\n </div>\n <!-- Delete Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${activeCollection?.info?.title}`\">\n <DeleteSidebarListElement\n :variableName=\"activeCollection?.info?.title ?? ''\"\n :warningMessage=\"'This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteCollection\" />\n </ScalarModal>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { useRouter } from 'vue-router'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nconst { activeCollection, activeWorkspace, activeWorkspaceCollections } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst { replace } = useRouter()\nconst deleteModal = useModal()\n\nfunction handleToggleWatchMode() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeCollection.value?.documentUrl) {\n return\n }\n collectionMutators.edit(\n activeCollection.value.uid,\n 'watchMode',\n !activeCollection.value?.watchMode,\n )\n}\n\nfunction handleDeleteCollection() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeWorkspace.value) {\n return\n }\n\n collectionMutators.delete(activeCollection.value, activeWorkspace.value)\n\n const firstCollection = activeWorkspaceCollections.value[0]\n\n // Redirect to the first collection\n if (firstCollection) {\n replace({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: firstCollection.uid,\n },\n })\n }\n\n deleteModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Features</h3>\n </div>\n <!-- Watch Mode -->\n <div class=\"bg-b-2 rounded-lg border text-sm\">\n <div\n class=\"bg-b-1 flex items-center justify-between gap-4 rounded-t-lg p-3\">\n <div>\n <h4>Watch Mode</h4>\n <p class=\"text-c-2 mt-1\">\n When enabled, the OpenAPI document will be polled for changes. The\n collection will be updated automatically.\n </p>\n </div>\n <ScalarToggle\n class=\"w-4\"\n :disabled=\"!activeCollection?.documentUrl\"\n :modelValue=\"activeCollection?.watchMode ?? false\"\n @update:modelValue=\"handleToggleWatchMode\" />\n </div>\n <div\n class=\"text-c-1 flex items-center overflow-x-auto border-t py-1.5 whitespace-nowrap\">\n <div class=\"flex items-center\">\n <template v-if=\"activeCollection?.documentUrl\">\n <span class=\"bg-b-2 sticky left-0 pr-2 pl-3\">Source</span>\n <a\n class=\"text-c-2 group rounded pr-3 no-underline hover:underline\"\n :href=\"activeCollection.documentUrl\"\n target=\"_blank\">\n {{ activeCollection.documentUrl }}\n <ScalarIcon\n class=\"ml-1 hidden w-2.5 group-hover:inline\"\n icon=\"ExternalLink\" />\n </a>\n </template>\n <template v-else>\n <ScalarIcon\n class=\"text-c-2 mr-2 ml-3 w-4\"\n icon=\"NotAllowed\"\n size=\"sm\" />\n <span class=\"text-c-2 pr-3\">\n No URL configured. Try importing an OpenAPI document from an\n URL.\n </span>\n </template>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Danger Zone -->\n <div class=\"flex flex-col gap-4\">\n <h3 class=\"font-bold\">Danger Zone</h3>\n <div\n class=\"flex items-center justify-between rounded-lg border p-3 text-sm\">\n <div>\n <h4>Delete Collection</h4>\n <p class=\"text-c-2 mt-1\">\n Be careful, my friend. Once deleted, there is no way to recover the\n collection.\n </p>\n </div>\n <ScalarButton\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteModal.show()\">\n Delete Collection\n </ScalarButton>\n </div>\n </div>\n </div>\n <!-- Delete Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${activeCollection?.info?.title}`\">\n <DeleteSidebarListElement\n :variableName=\"activeCollection?.info?.title ?? ''\"\n :warningMessage=\"'This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteCollection\" />\n </ScalarModal>\n</template>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CollectionSettings-FtXNetOh.js","names":[],"sources":["../src/views/Collection/CollectionSettings.vue","../src/views/Collection/CollectionSettings.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { useRouter } from 'vue-router'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nconst { activeCollection, activeWorkspace, activeWorkspaceCollections } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst { replace } = useRouter()\nconst deleteModal = useModal()\n\nfunction handleToggleWatchMode() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeCollection.value?.documentUrl) {\n return\n }\n collectionMutators.edit(\n activeCollection.value.uid,\n 'watchMode',\n !activeCollection.value?.watchMode,\n )\n}\n\nfunction handleDeleteCollection() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeWorkspace.value) {\n return\n }\n\n collectionMutators.delete(activeCollection.value, activeWorkspace.value)\n\n const firstCollection = activeWorkspaceCollections.value[0]\n\n // Redirect to the first collection\n if (firstCollection) {\n replace({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: firstCollection.uid,\n },\n })\n }\n\n deleteModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Features</h3>\n </div>\n <!-- Watch Mode -->\n <div class=\"bg-b-2 rounded-lg border text-sm\">\n <div\n class=\"bg-b-1 flex items-center justify-between gap-4 rounded-t-lg p-3\">\n <div>\n <h4>Watch Mode</h4>\n <p class=\"text-c-2 mt-1\">\n When enabled, the OpenAPI document will be polled for changes. The\n collection will be updated automatically.\n </p>\n </div>\n <ScalarToggle\n class=\"w-4\"\n :disabled=\"!activeCollection?.documentUrl\"\n :modelValue=\"activeCollection?.watchMode ?? false\"\n @update:modelValue=\"handleToggleWatchMode\" />\n </div>\n <div\n class=\"text-c-1 flex items-center overflow-x-auto border-t py-1.5 whitespace-nowrap\">\n <div class=\"flex items-center\">\n <template v-if=\"activeCollection?.documentUrl\">\n <span class=\"bg-b-2 sticky left-0 pr-2 pl-3\">Source</span>\n <a\n class=\"text-c-2 group rounded pr-3 no-underline hover:underline\"\n :href=\"activeCollection.documentUrl\"\n target=\"_blank\">\n {{ activeCollection.documentUrl }}\n <ScalarIcon\n class=\"ml-1 hidden w-2.5 group-hover:inline\"\n icon=\"ExternalLink\" />\n </a>\n </template>\n <template v-else>\n <ScalarIcon\n class=\"text-c-2 mr-2 ml-3 w-4\"\n icon=\"NotAllowed\"\n size=\"sm\" />\n <span class=\"text-c-2 pr-3\">\n No URL configured. Try importing an OpenAPI document from an\n URL.\n </span>\n </template>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Danger Zone -->\n <div class=\"flex flex-col gap-4\">\n <h3 class=\"font-bold\">Danger Zone</h3>\n <div\n class=\"flex items-center justify-between rounded-lg border p-3 text-sm\">\n <div>\n <h4>Delete Collection</h4>\n <p class=\"text-c-2 mt-1\">\n Be careful, my friend. Once deleted, there is no way to recover the\n collection.\n </p>\n </div>\n <ScalarButton\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteModal.show()\">\n Delete Collection\n </ScalarButton>\n </div>\n </div>\n </div>\n <!-- Delete Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${activeCollection?.info?.title}`\">\n <DeleteSidebarListElement\n :variableName=\"activeCollection?.info?.title ?? ''\"\n :warningMessage=\"'This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteCollection\" />\n </ScalarModal>\n</template>\n","<script setup lang=\"ts\">\nimport {\n ScalarButton,\n ScalarIcon,\n ScalarModal,\n ScalarToggle,\n useModal,\n} from '@scalar/components'\nimport { useRouter } from 'vue-router'\n\nimport DeleteSidebarListElement from '@/components/Sidebar/Actions/DeleteSidebarListElement.vue'\nimport { PathId } from '@/routes'\nimport { useActiveEntities, useWorkspace } from '@/store'\n\nconst { activeCollection, activeWorkspace, activeWorkspaceCollections } =\n useActiveEntities()\nconst { collectionMutators } = useWorkspace()\nconst { replace } = useRouter()\nconst deleteModal = useModal()\n\nfunction handleToggleWatchMode() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeCollection.value?.documentUrl) {\n return\n }\n collectionMutators.edit(\n activeCollection.value.uid,\n 'watchMode',\n !activeCollection.value?.watchMode,\n )\n}\n\nfunction handleDeleteCollection() {\n if (!activeCollection.value) {\n return\n }\n\n if (!activeWorkspace.value) {\n return\n }\n\n collectionMutators.delete(activeCollection.value, activeWorkspace.value)\n\n const firstCollection = activeWorkspaceCollections.value[0]\n\n // Redirect to the first collection\n if (firstCollection) {\n replace({\n name: 'collection',\n params: {\n [PathId.Workspace]: activeWorkspace.value.uid,\n [PathId.Collection]: firstCollection.uid,\n },\n })\n }\n\n deleteModal.hide()\n}\n</script>\n\n<template>\n <div class=\"flex h-full w-full flex-col gap-12 px-1.5 pt-8\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex h-8 items-center\">\n <h3 class=\"font-bold\">Features</h3>\n </div>\n <!-- Watch Mode -->\n <div class=\"bg-b-2 rounded-lg border text-sm\">\n <div\n class=\"bg-b-1 flex items-center justify-between gap-4 rounded-t-lg p-3\">\n <div>\n <h4>Watch Mode</h4>\n <p class=\"text-c-2 mt-1\">\n When enabled, the OpenAPI document will be polled for changes. The\n collection will be updated automatically.\n </p>\n </div>\n <ScalarToggle\n class=\"w-4\"\n :disabled=\"!activeCollection?.documentUrl\"\n :modelValue=\"activeCollection?.watchMode ?? false\"\n @update:modelValue=\"handleToggleWatchMode\" />\n </div>\n <div\n class=\"text-c-1 flex items-center overflow-x-auto border-t py-1.5 whitespace-nowrap\">\n <div class=\"flex items-center\">\n <template v-if=\"activeCollection?.documentUrl\">\n <span class=\"bg-b-2 sticky left-0 pr-2 pl-3\">Source</span>\n <a\n class=\"text-c-2 group rounded pr-3 no-underline hover:underline\"\n :href=\"activeCollection.documentUrl\"\n target=\"_blank\">\n {{ activeCollection.documentUrl }}\n <ScalarIcon\n class=\"ml-1 hidden w-2.5 group-hover:inline\"\n icon=\"ExternalLink\" />\n </a>\n </template>\n <template v-else>\n <ScalarIcon\n class=\"text-c-2 mr-2 ml-3 w-4\"\n icon=\"NotAllowed\"\n size=\"sm\" />\n <span class=\"text-c-2 pr-3\">\n No URL configured. Try importing an OpenAPI document from an\n URL.\n </span>\n </template>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Danger Zone -->\n <div class=\"flex flex-col gap-4\">\n <h3 class=\"font-bold\">Danger Zone</h3>\n <div\n class=\"flex items-center justify-between rounded-lg border p-3 text-sm\">\n <div>\n <h4>Delete Collection</h4>\n <p class=\"text-c-2 mt-1\">\n Be careful, my friend. Once deleted, there is no way to recover the\n collection.\n </p>\n </div>\n <ScalarButton\n size=\"sm\"\n variant=\"danger\"\n @click=\"deleteModal.show()\">\n Delete Collection\n </ScalarButton>\n </div>\n </div>\n </div>\n <!-- Delete Modal -->\n <ScalarModal\n :size=\"'xxs'\"\n :state=\"deleteModal\"\n :title=\"`Delete ${activeCollection?.info?.title}`\">\n <DeleteSidebarListElement\n :variableName=\"activeCollection?.info?.title ?? ''\"\n :warningMessage=\"'This action cannot be undone.'\"\n @close=\"deleteModal.hide()\"\n @delete=\"handleDeleteCollection\" />\n </ScalarModal>\n</template>\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { T as PathId, c as isPostmanCollection, m as isUrl, o as convertPostmanToOpenApi, p as getOpenApiDocumentDetails, r as useWorkspace, s as getPostmanDocumentDetails, w as useActiveEntities } from "./store-
|
|
1
|
+
import { T as PathId, c as isPostmanCollection, m as isUrl, o as convertPostmanToOpenApi, p as getOpenApiDocumentDetails, r as useWorkspace, s as getPostmanDocumentDetails, w as useActiveEntities } from "./store-DnlAQK5d.js";
|
|
2
2
|
import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BmmBcIzD.js";
|
|
3
3
|
import { t as importCurlCommand } from "./curl-nbw1OxbV.js";
|
|
4
4
|
import { t as IconSelector_default } from "./IconSelector-BDC_GQXv.js";
|
|
@@ -961,4 +961,4 @@ var TheCommandPalette_default = /* @__PURE__ */ _plugin_vue_export_helper_defaul
|
|
|
961
961
|
//#endregion
|
|
962
962
|
export { ROUTES as n, TheCommandPalette_default as t };
|
|
963
963
|
|
|
964
|
-
//# sourceMappingURL=CommandPalette-
|
|
964
|
+
//# sourceMappingURL=CommandPalette-BxoEK8TY.js.map
|