Skip to content

Commit 0c3875d

Browse files
portikMafrzhussainvaibhavrajsingh2001
authored
fix: collapsible section chevron bug, misc refactors [TDX-6738] (#738)
* fix: collapsible section chevron bug [TDX-6738] * refactor: use usetemplateref for template refs [TDX-6738] * refactor: use useeventlistener [TDX-6738] * fix: minor fix * fix: apply pr feedback Co-authored-by: Afroz Hussain <[email protected]> Co-authored-by: Vaibhav Raj Singh <[email protected]> * fix: address pr feedback * fix: lint:fix --------- Co-authored-by: Afroz Hussain <[email protected]> Co-authored-by: Vaibhav Raj Singh <[email protected]>
1 parent d3a75d7 commit 0c3875d

File tree

16 files changed

+72
-98
lines changed

16 files changed

+72
-98
lines changed

sandbox/components/SampleSpecSelector.vue

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,15 @@
4545
</select>
4646

4747
<button
48-
ref="dropZoneRef"
48+
ref="dropZone"
4949
class="dropzone"
5050
@click="dropzoneClick()"
5151
>
5252
{{ fName }}
5353
</button>
5454

5555
<input
56-
ref="fileInputRef"
56+
ref="fileInput"
5757
style="position: absolute; visibility: hidden;"
5858
type="file"
5959
@change="finputChange"
@@ -62,7 +62,7 @@
6262
</template>
6363

6464
<script setup lang="ts">
65-
import { ref, onMounted } from 'vue'
65+
import { ref, onMounted, useTemplateRef } from 'vue'
6666
import type { PropType } from 'vue'
6767
import { useDropZone } from '@vueuse/core'
6868
@@ -83,8 +83,8 @@ const emit = defineEmits<{
8383
}>()
8484
8585
const specSelector = ref<HTMLSelectElement | null>(null)
86-
const dropZoneRef = ref<HTMLDivElement>()
87-
const fileInputRef = ref<HTMLInputElement>()
86+
const dropZoneRef = useTemplateRef('dropZone')
87+
const fileInputRef = useTemplateRef('fileInput')
8888
const savedSpec = ref()
8989
9090
const fName = ref<string>('Drop your own spec file')

src/components/SpecRenderer.vue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
>
1111
<SpecRendererToc
1212
v-if="slideoutTocVisible"
13-
ref="specRendererSlideoutTocRef"
1413
:base-path="basePath"
1514
class="spec-renderer-toc"
1615
:control-address-bar="controlAddressBar"
@@ -25,7 +24,6 @@
2524
<aside>
2625
<SpecRendererToc
2726
v-if="tableOfContents && !slideoutTocVisible"
28-
ref="specRendererTocRef"
2927
:base-path="basePath"
3028
class="spec-renderer-toc"
3129
:control-address-bar="controlAddressBar"

src/components/common/CopyButton.vue

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<template>
22
<button
3-
ref="copyButton"
43
class="copy-button"
54
:title="copied ? 'Copied!' : 'Copy'"
65
@click.stop="copyCode"
@@ -14,7 +13,6 @@
1413
</template>
1514

1615
<script setup lang="ts">
17-
import { ref } from 'vue'
1816
import { CopyIcon, CheckIcon } from '@kong/icons'
1917
import { useClipboard } from '@vueuse/core'
2018
@@ -33,7 +31,6 @@ const props = defineProps({
3331
},
3432
})
3533
36-
const copyButton = ref<HTMLButtonElement>()
3734
const { copy, copied } = useClipboard({ source: props.content, legacy: true })
3835
3936
async function copyCode(): Promise<void> {

src/components/common/EditableCodeBlock.vue

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424

2525
<script setup lang="ts">
2626
27-
import { ref, watch } from 'vue'
27+
import { ref, useTemplateRef, watch } from 'vue'
2828
import CodeBlock from './CodeBlock.vue'
2929
import { CODE_INDENT_SPACES } from '@/constants'
3030
@@ -59,7 +59,7 @@ const formatCode = (codeToFormat: string, codeLang: string): string => {
5959
}
6060
6161
// ref to contentEditable element
62-
const editableInput = ref<HTMLDivElement | null>()
62+
const editableInputRef = useTemplateRef('editableInput')
6363
6464
// to hold editable code content
6565
const editableCode = ref<string>(formatCode(props.code, props.lang))
@@ -77,7 +77,7 @@ const cursorPosition = ref<number>(0)
7777
* @param eol (boolean, when true cursor is set to the end of the line)
7878
*/
7979
const setCursorPosition = (customPosition: number, eol: boolean) => {
80-
if (typeof window === 'undefined' || !editableInput.value || !editableInput.value.childNodes[0]) {
80+
if (typeof window === 'undefined' || !editableInputRef.value || !editableInputRef.value.childNodes[0]) {
8181
return
8282
}
8383
// select text from a window
@@ -87,24 +87,24 @@ const setCursorPosition = (customPosition: number, eol: boolean) => {
8787
const selectedRange = document.createRange()
8888
let rangeNode = 0
8989
let rangePos = customPosition
90-
for (let i = 0; i < editableInput.value.childNodes.length; i++) {
91-
const contentLen = (editableInput.value.childNodes[i]?.textContent || '').length
90+
for (let i = 0; i < editableInputRef.value.childNodes.length; i++) {
91+
const contentLen = (editableInputRef.value.childNodes[i]?.textContent || '').length
9292
if (rangePos - contentLen <= 0) {
9393
break
9494
}
9595
rangeNode++
9696
rangePos -= contentLen
97-
if (editableInput.value.childNodes[i]?.nodeName === 'BR') {
97+
if (editableInputRef.value.childNodes[i]?.nodeName === 'BR') {
9898
rangePos--
9999
}
100100
}
101101
102-
if (!editableInput.value.childNodes[rangeNode]) return
102+
if (!editableInputRef.value.childNodes[rangeNode]) return
103103
104104
if (eol) {
105-
rangePos = editableInput.value.childNodes[rangeNode].textContent?.length || 0
105+
rangePos = editableInputRef.value.childNodes[rangeNode].textContent?.length || 0
106106
}
107-
selectedRange.setStart(editableInput.value.childNodes[rangeNode], rangePos)
107+
selectedRange.setStart(editableInputRef.value.childNodes[rangeNode], rangePos)
108108
// collapse the range at boundaries
109109
selectedRange.collapse(true)
110110
@@ -115,7 +115,7 @@ const setCursorPosition = (customPosition: number, eol: boolean) => {
115115
selection?.addRange(selectedRange)
116116
117117
// focus the cursor
118-
editableInput.value.focus()
118+
editableInputRef.value.focus()
119119
}
120120
121121
@@ -124,19 +124,19 @@ const setCursorPosition = (customPosition: number, eol: boolean) => {
124124
* get cursor position
125125
*/
126126
const getCursorPosition = () => {
127-
if (typeof window === 'undefined' || !editableInput.value) {
127+
if (typeof window === 'undefined' || !editableInputRef.value) {
128128
return 0
129129
}
130130
const selection = window.getSelection()
131131
if (!selection) {
132132
return 0
133133
}
134-
const currentArray = editableInput.value.innerText.split('')
134+
const currentArray = editableInputRef.value.innerText.split('')
135135
136136
const range = selection.rangeCount > 0 ? selection?.getRangeAt(0) : null
137137
if (range) {
138138
const clonedRange = range?.cloneRange()
139-
clonedRange?.selectNodeContents(editableInput.value)
139+
clonedRange?.selectNodeContents(editableInputRef.value)
140140
clonedRange?.setEnd(range.endContainer, range?.endOffset)
141141
142142
// here we have a string but no \n -s , so we would need to count number of \n in this fragment
@@ -202,8 +202,8 @@ const handleInput = (e: Event) => {
202202
// inject indentations
203203
204204
cText = cText.substring(0, cursorPosition.value) + Array(paddings + 1).join(' ') + cText.substring(cursorPosition.value)
205-
if (editableInput.value) {
206-
editableInput.value.innerText = cText
205+
if (editableInputRef.value) {
206+
editableInputRef.value.innerText = cText
207207
}
208208
// force presented code to the resulting one
209209
presentedCode.value = cText
@@ -242,15 +242,15 @@ const handleFocusOut = (e: Event) => {
242242
const cText = (e.target as HTMLElement).innerText
243243
let resText = formatCode(cText, props.lang)
244244
editableCode.value = resText
245-
if (editableInput.value) {
246-
editableInput.value.innerText = editableCode.value
245+
if (editableInputRef.value) {
246+
editableInputRef.value.innerText = editableCode.value
247247
}
248248
presentedCode.value = resText
249249
emit('request-body-changed', resText)
250250
}
251251
252252
253-
watch(() => ({ code: props.code, lang: props.lang, editableInput: editableInput.value }),
253+
watch(() => ({ code: props.code, lang: props.lang, editableInput: editableInputRef.value }),
254254
({ code: newCode, lang: newLang, editableInput: newEditableInput }) => {
255255
if (newCode !== newEditableInput?.innerText) {
256256
editableCode.value = formatCode(newCode, newLang)

src/components/common/HeadlessPopover.vue

Lines changed: 11 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<template>
22
<div
3-
ref="popoverWrapperRef"
3+
ref="popoverWrapper"
44
class="popover"
55
data-testid="popover"
66
v-bind="sanitizedAttrs"
77
>
88
<div
9-
ref="triggerWrapperRef"
9+
ref="triggerWrapper"
1010
class="popover-trigger-wrapper"
1111
>
1212
<slot />
@@ -38,11 +38,12 @@
3838
</template>
3939

4040
<script setup lang="ts">
41-
import { ref, onMounted, onBeforeUnmount, computed, watch, useAttrs } from 'vue'
41+
import { ref, onMounted, computed, watch, useAttrs, useTemplateRef } from 'vue'
4242
import type { PropType } from 'vue'
4343
import { useFloating, autoUpdate, offset, flip } from '@floating-ui/vue'
4444
import type { Placement } from '@floating-ui/vue'
4545
import { PopoverPlacementVariants } from '@/types'
46+
import { useEventListener } from '@vueuse/core'
4647
4748
defineOptions({
4849
inheritAttrs: false,
@@ -109,8 +110,8 @@ const sanitizedAttrs = computed(() => {
109110
return strippedAttrs
110111
})
111112
112-
const popoverWrapperRef = ref<HTMLElement | null>(null)
113-
const triggerWrapperRef = ref<HTMLElement | null>(null)
113+
const popoverWrapperRef = useTemplateRef('popoverWrapper')
114+
const triggerWrapperRef = useTemplateRef('triggerWrapper')
114115
const popoverRef = ref<HTMLElement | null>(null)
115116
const isVisible = ref<boolean>(false)
116117
@@ -186,40 +187,16 @@ onMounted(() => {
186187
if (document) {
187188
// handle various click events to determine how to handle the click event in a generic clickHandler function
188189
// we don't set any other click event listeners on purpose to avoid conflict of event listeners
189-
document?.addEventListener('click', clickHandler)
190+
useEventListener(document, 'click', clickHandler)
190191
191192
if (popoverTrigger.value && props.openOnMouseover) {
192-
popoverTrigger.value.addEventListener('mouseenter', showPopover)
193-
popoverTrigger.value.addEventListener('focus', showPopover)
194-
popoverTrigger.value.addEventListener('mouseleave', hidePopover)
195-
popoverTrigger.value.addEventListener('blur', hidePopover)
193+
useEventListener(popoverTrigger.value, ['mouseenter', 'focus'], showPopover)
194+
useEventListener(popoverTrigger.value, ['mouseleave', 'blur'], hidePopover)
196195
}
197196
198197
if (popoverRef.value && props.openOnMouseover) {
199-
popoverRef.value.addEventListener('mouseenter', showPopover)
200-
popoverRef.value.addEventListener('focusin', showPopover)
201-
popoverRef.value.addEventListener('mouseleave', hidePopover)
202-
popoverRef.value.addEventListener('focusout', hidePopover)
203-
}
204-
}
205-
})
206-
207-
onBeforeUnmount(() => {
208-
if (document) {
209-
document?.removeEventListener('click', clickHandler)
210-
211-
if (popoverTrigger.value && props.openOnMouseover) {
212-
popoverTrigger.value.removeEventListener('mouseenter', showPopover)
213-
popoverTrigger.value.removeEventListener('focus', showPopover)
214-
popoverTrigger.value.removeEventListener('mouseleave', hidePopover)
215-
popoverTrigger.value.removeEventListener('blur', hidePopover)
216-
}
217-
218-
if (popoverRef.value && props.openOnMouseover) {
219-
popoverRef.value.removeEventListener('mouseenter', showPopover)
220-
popoverRef.value.removeEventListener('focusin', showPopover)
221-
popoverRef.value.removeEventListener('mouseleave', hidePopover)
222-
popoverRef.value.removeEventListener('focusout', hidePopover)
198+
useEventListener(popoverRef.value, ['mouseenter', 'focusin'], showPopover)
199+
useEventListener(popoverRef.value, ['mouseleave', 'focusout'], hidePopover)
223200
}
224201
}
225202
})

src/components/common/SelectDropdown.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<Popover
3-
ref="selectPopoverRef"
3+
ref="selectPopover"
44
:aria-activedescendant="selectedItem ? `${selectedItem.key ? selectedItem.key : selectedItem.value}-item` : undefined"
55
:aria-labelledby="attrs.id ? String(attrs.id) : undefined"
66
class="select-dropdown"
@@ -77,14 +77,13 @@ defineOptions({
7777
inheritAttrs: false,
7878
})
7979
80-
import { computed, useAttrs, watch } from 'vue'
80+
import { computed, useAttrs, useTemplateRef, watch } from 'vue'
8181
import type { PropType } from 'vue'
8282
import Popover from './HeadlessPopover.vue'
8383
import { ChevronDownIcon } from '@kong/icons'
8484
import type { SelectItem } from '@/types'
8585
import type { Placement } from '@floating-ui/vue'
8686
import { PopoverPlacementVariants } from '@/types'
87-
import { ref } from 'vue'
8887
8988
const props = defineProps({
9089
triggerButton: {
@@ -129,7 +128,7 @@ const sanitizedAttrs = computed(() => {
129128
130129
const selectValue = defineModel<string>({ default: '' })
131130
132-
const selectPopoverRef = ref<InstanceType<typeof Popover> | null>(null)
131+
const selectPopoverRef = useTemplateRef('selectPopover')
133132
134133
const selectItem = (value: string) => {
135134
selectValue.value = value

src/components/common/SlideOut.vue

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
<Transition name="spec-renderer-slide-in">
1515
<div
1616
v-show="visible"
17-
ref="slideoutContainerRef"
1817
class="slideout-container"
1918
data-testid="slideout-container"
2019
>
@@ -48,7 +47,7 @@
4847
</template>
4948

5049
<script lang="ts" setup>
51-
import { ref, onUnmounted, watch, useAttrs } from 'vue'
50+
import { onUnmounted, watch, useAttrs } from 'vue'
5251
import { CloseIcon } from '@kong/icons'
5352
5453
defineOptions({
@@ -80,8 +79,6 @@ const emit = defineEmits<{
8079
(e: 'close'): void
8180
}>()
8281
83-
const slideoutContainerRef = ref<HTMLElement | null>(null)
84-
8582
const handleClose = (e: any): void => {
8683
// close on escape key
8784
if ((props.visible && e.keyCode === 27)) {

src/components/common/ToggleSwitch.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
v-bind="sanitizedAttrs"
66
>
77
<input
8-
ref="switchInputRef"
8+
ref="switchInput"
99
hidden
1010
tabindex="-1"
1111
type="checkbox"
@@ -39,7 +39,7 @@
3939
</template>
4040

4141
<script lang="ts" setup>
42-
import { ref, useAttrs, computed } from 'vue'
42+
import { useAttrs, computed, useTemplateRef } from 'vue'
4343
import InputLabel from '@/components/common/InputLabel.vue'
4444
4545
defineOptions({
@@ -97,7 +97,7 @@ const switchControlElAttrs = computed((): Record<string, any> => {
9797
9898
const toggleValue = defineModel<boolean>({ required: true })
9999
100-
const switchInputRef = ref<HTMLInputElement | null>(null)
100+
const switchInputRef = useTemplateRef('switchInput')
101101
102102
const propagateInputEvent = (event: Event): void => {
103103
if (props.disabled) {

src/components/spec-document/SpecDocument.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
</div>
2121
<div
2222
v-else-if="serviceNode"
23-
ref="wrapperRef"
23+
ref="wrapper"
2424
class="nodes-wrapper"
2525
:class="{ 'reset-margin': markdownStyles }"
2626
>
@@ -52,7 +52,7 @@
5252
</template>
5353

5454
<script setup lang="ts">
55-
import { watch, ref, provide, computed, nextTick, onBeforeMount } from 'vue'
55+
import { watch, ref, provide, computed, nextTick, onBeforeMount, useTemplateRef } from 'vue'
5656
import { useMagicKeys, useWindowScroll, useWindowSize, useElementSize, useScroll, until, whenever } from '@vueuse/core'
5757
import composables from '@/composables'
5858
import type { PropType, ComputedRef } from 'vue'
@@ -226,7 +226,7 @@ const toRenderer = ref<Array<'true' | 'false' | 'forced'>>([])
226226
const lastY = ref<number>()
227227
const processScrolling = ref<boolean>(false)
228228
const lastPath = ref<string>()
229-
const wrapperRef = ref<HTMLElement | null>(null)
229+
const wrapperRef = useTemplateRef('wrapper')
230230
const renderPlain = ref<boolean>(false)
231231
232232
const specDocument = computed((): ServiceNode => {

0 commit comments

Comments
 (0)