Skip to content

Commit 04b30a8

Browse files
committed
fix(ui): disable QuickConnection button when user has no namespaces
1 parent 9e5afff commit 04b30a8

File tree

5 files changed

+49
-42
lines changed

5 files changed

+49
-42
lines changed

ui/src/components/QuickConnection/QuickConnection.vue

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,27 @@
44
color="primary"
55
variant="flat"
66
tabindex="0"
7-
aria-label="Dialog Quick Connection"
87
data-test="quick-connection-open-btn"
98
prepend-icon="mdi-console"
109
block
10+
text="Quick Connect"
11+
:disabled
1112
@click="showDialog = true"
12-
>
13-
Quick Connect
14-
</v-btn>
13+
/>
1514

16-
<div>
17-
<p
18-
class="text-caption text-md font-weight-bold text-grey-darken-1 ma-1"
19-
data-test="quick-connect-instructions"
15+
<p
16+
v-if="!disabled"
17+
class="text-caption text-md font-weight-bold text-grey-darken-1 ma-1"
18+
data-test="quick-connect-instructions"
19+
>
20+
Press <v-chip
21+
density="compact"
22+
size="small"
23+
label
2024
>
21-
Press <v-chip
22-
density="compact"
23-
size="small"
24-
label
25-
>
26-
Ctrl+K
27-
</v-chip> to Quick Connect!
28-
</p>
29-
</div>
25+
Ctrl+K
26+
</v-chip> to Quick Connect!
27+
</p>
3028

3129
<WindowDialog
3230
v-model="showDialog"
@@ -130,6 +128,8 @@ import { useMagicKeys } from "@vueuse/core";
130128
import QuickConnectionList from "./QuickConnectionList.vue";
131129
import WindowDialog from "@/components/Dialogs/WindowDialog.vue";
132130
131+
const props = defineProps<{ disabled: boolean }>();
132+
133133
const showDialog = ref(false);
134134
const filter = ref("");
135135
const listRef = ref<InstanceType<typeof QuickConnectionList> & { rootEl?: HTMLElement }>();
@@ -146,6 +146,7 @@ const normalizeLabel = (label: string) => label.toLowerCase().replace(/\s+/g, "-
146146
useMagicKeys({
147147
passive: false,
148148
onEventFired(event) {
149+
if (props.disabled) return;
149150
if (event.ctrlKey && event.key.toLowerCase() === "k" && event.type === "keydown") {
150151
event.preventDefault();
151152
showDialog.value = !showDialog.value;
@@ -155,6 +156,8 @@ useMagicKeys({
155156
}
156157
},
157158
});
159+
160+
defineExpose({ showDialog });
158161
</script>
159162

160163
<style scoped lang="scss">

ui/src/layouts/AppLayout.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
</template>
128128

129129
<v-col class="d-flex align-end justify-center">
130-
<QuickConnection />
130+
<QuickConnection :disabled="!hasNamespaces" />
131131
</v-col>
132132
</v-list>
133133
</v-navigation-drawer>

ui/tests/components/QuickConnection/QuickConnection.spec.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@ describe("Quick Connection", () => {
6969
.reply(200, devices);
7070

7171
wrapper = mount(QuickConnection, {
72-
global: {
73-
plugins: [vuetify, router, SnackbarPlugin],
74-
},
72+
global: { plugins: [vuetify, router, SnackbarPlugin] },
73+
props: { disabled: false },
7574
});
7675
});
7776

@@ -108,6 +107,20 @@ describe("Quick Connection", () => {
108107

109108
dispatchEvent(event);
110109

111-
expect(wrapper.find('[data-test="quick-connection-open-btn"]').exists()).toBe(true);
110+
expect(wrapper.vm.showDialog).toBe(true);
111+
});
112+
113+
it("Disables the button when disabled prop is true", async () => {
114+
await wrapper.setProps({ disabled: true });
115+
expect(wrapper.find('[data-test="quick-connection-open-btn"]').attributes("disabled")).toBeDefined();
116+
});
117+
118+
it("Ignores Ctrl + K keydown when disabled prop is true", async () => {
119+
await wrapper.setProps({ disabled: true });
120+
const event = new KeyboardEvent("keydown", { ctrlKey: true, key: "k" });
121+
122+
dispatchEvent(event);
123+
124+
expect(wrapper.vm.showDialog).toBe(false);
112125
});
113126
});

ui/tests/components/QuickConnection/__snapshots__/QuickConnection.spec.ts.snap

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
22

33
exports[`Quick Connection > Renders the component 1`] = `
4-
"<div data-v-136d2a2f=""><button data-v-136d2a2f="" tabindex="0" type="button" class="v-btn v-btn--block v-theme--light bg-primary v-btn--density-default v-btn--size-default v-btn--variant-flat" aria-label="Dialog Quick Connection" data-test="quick-connection-open-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i class="mdi-console mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator=""> Quick Connect </span>
4+
"<div data-v-136d2a2f=""><button data-v-136d2a2f="" tabindex="0" type="button" class="v-btn v-btn--block v-theme--light bg-primary v-btn--density-default v-btn--size-default v-btn--variant-flat" data-test="quick-connection-open-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i class="mdi-console mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator="">Quick Connect</span>
55
<!---->
66
<!---->
77
</button>
8-
<div data-v-136d2a2f="">
9-
<p data-v-136d2a2f="" class="text-caption text-md font-weight-bold text-grey-darken-1 ma-1" data-test="quick-connect-instructions"> Press <span data-v-136d2a2f="" class="v-chip v-chip--label v-theme--light v-chip--density-compact v-chip--size-small v-chip--variant-tonal" draggable="false"><!----><span class="v-chip__underlay"></span>
10-
<!---->
11-
<!---->
12-
<div class="v-chip__content" data-no-activator=""> Ctrl+K </div>
8+
<p data-v-136d2a2f="" class="text-caption text-md font-weight-bold text-grey-darken-1 ma-1" data-test="quick-connect-instructions"> Press <span data-v-136d2a2f="" class="v-chip v-chip--label v-theme--light v-chip--density-compact v-chip--size-small v-chip--variant-tonal" draggable="false"><!----><span class="v-chip__underlay"></span>
139
<!---->
14-
<!----></span> to Quick Connect! </p>
15-
</div>
10+
<!---->
11+
<div class="v-chip__content" data-no-activator=""> Ctrl+K </div>
12+
<!---->
13+
<!----></span> to Quick Connect! </p>
1614
<!---->
1715
<!---->
1816
</div>"

ui/tests/layouts/__snapshots__/AppLayout.spec.ts.snap

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -247,18 +247,11 @@ exports[`App Layout Component > Renders the component 1`] = `
247247
</transition-stub>
248248
</div>
249249
<div data-v-e7291ef4="" class="v-col d-flex align-end justify-center">
250-
<div data-v-136d2a2f="" data-v-e7291ef4=""><button data-v-136d2a2f="" tabindex="0" type="button" class="v-btn v-btn--block v-theme--dark bg-primary v-btn--density-default v-btn--size-default v-btn--variant-flat" aria-label="Dialog Quick Connection" data-test="quick-connection-open-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i class="mdi-console mdi v-icon notranslate v-theme--dark v-icon--size-default" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator=""> Quick Connect </span>
250+
<div data-v-136d2a2f="" data-v-e7291ef4=""><button data-v-136d2a2f="" tabindex="0" type="button" class="v-btn v-btn--block v-btn--disabled v-theme--dark bg-primary v-btn--density-default v-btn--size-default v-btn--variant-flat" disabled="" data-test="quick-connection-open-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span><span class="v-btn__prepend"><i class="mdi-console mdi v-icon notranslate v-theme--dark v-icon--size-default" aria-hidden="true"></i></span><span class="v-btn__content" data-no-activator="">Quick Connect</span>
251251
<!---->
252252
<!---->
253253
</button>
254-
<div data-v-136d2a2f="">
255-
<p data-v-136d2a2f="" class="text-caption text-md font-weight-bold text-grey-darken-1 ma-1" data-test="quick-connect-instructions"> Press <span data-v-136d2a2f="" class="v-chip v-chip--label v-theme--dark v-chip--density-compact v-chip--size-small v-chip--variant-tonal" draggable="false"><!----><span class="v-chip__underlay"></span>
256-
<!---->
257-
<!---->
258-
<div class="v-chip__content" data-no-activator=""> Ctrl+K </div>
259-
<!---->
260-
<!----></span> to Quick Connect! </p>
261-
</div>
254+
<!--v-if-->
262255
<!---->
263256
<!---->
264257
</div>
@@ -288,7 +281,7 @@ exports[`App Layout Component > Renders the component 1`] = `
288281
<!---->
289282
<!---->
290283
<!--teleport start-->
291-
<!--teleport end--><button type="button" class="v-btn v-btn--stacked v-theme--light v-btn--density-comfortable v-btn--size-x-large v-btn--variant-text text-none p-2 border-e-thin border-s-thin" aria-haspopup="menu" aria-expanded="false" aria-controls="v-menu-v-9" aria-owns="v-menu-v-9"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
284+
<!--teleport end--><button type="button" class="v-btn v-btn--stacked v-theme--light v-btn--density-comfortable v-btn--size-x-large v-btn--variant-text text-none p-2 border-e-thin border-s-thin" aria-haspopup="menu" aria-expanded="false" aria-controls="v-menu-v-7" aria-owns="v-menu-v-7"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
292285
<!----><span class="v-btn__content" data-no-activator=""><div class="d-flex align-center ga-2"><span class="v-chip v-chip--label v-theme--light text-primary v-chip--density-default v-chip--size-default v-chip--variant-tonal text-uppercase" draggable="false"><!----><span class="v-chip__underlay"></span>
293286
<!---->
294287
<!---->
@@ -309,7 +302,7 @@ exports[`App Layout Component > Renders the component 1`] = `
309302
</ul>
310303
</div>
311304
<div class="v-spacer"></div>
312-
<div class="d-flex align-center ga-4 mr-4"><button type="button" class="v-btn v-btn--icon v-theme--light text-primary v-btn--density-default v-btn--variant-text" aria-describedby="v-tooltip-v-13" aria-label="community-help-icon" data-test="support-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
305+
<div class="d-flex align-center ga-4 mr-4"><button type="button" class="v-btn v-btn--icon v-theme--light text-primary v-btn--density-default v-btn--variant-text" aria-describedby="v-tooltip-v-11" aria-label="community-help-icon" data-test="support-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
313306
<!----><span class="v-btn__content" data-no-activator=""><i class="mdi-help-circle mdi v-icon notranslate v-theme--light v-icon--size-default" aria-hidden="true"></i></span>
314307
<!---->
315308
<!---->
@@ -322,7 +315,7 @@ exports[`App Layout Component > Renders the component 1`] = `
322315
</div>
323316
</div>
324317
<!--teleport start-->
325-
<!--teleport end--><button type="button" class="v-btn v-btn--icon v-theme--light text-primary v-btn--density-default v-btn--variant-text" aria-haspopup="menu" aria-expanded="false" aria-controls="v-menu-v-21" aria-owns="v-menu-v-21" data-test="user-menu-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
318+
<!--teleport end--><button type="button" class="v-btn v-btn--icon v-theme--light text-primary v-btn--density-default v-btn--variant-text" aria-haspopup="menu" aria-expanded="false" aria-controls="v-menu-v-19" aria-owns="v-menu-v-19" data-test="user-menu-btn"><span class="v-btn__overlay"></span><span class="v-btn__underlay"></span>
326319
<!----><span class="v-btn__content" data-no-activator=""><div data-v-09753bb1="" class="v-avatar v-theme--light bg-primary v-avatar--density-default v-avatar--variant-flat border" style="width: 1.5rem; height: 1.5rem;" email="" data-test="user-icon"><i data-v-09753bb1="" class="mdi-account mdi v-icon notranslate v-theme--light v-icon--size-default text-surface" aria-hidden="true" data-test="gravatar-placeholder"></i><!----><span class="v-avatar__underlay"></span>
327320
</div></span>
328321
<!---->

0 commit comments

Comments
 (0)