Skip to content

Commit 48fe16b

Browse files
BC-11012 - Room Bug-fixes (#3979)
- fix: boardtitle - enter-key ends edit mode - add top padding to the three-dot menu - fix breadcrumbs - reset room store after dialog - fix bullet points cut off on mobile - remove tooltip from board draft chip - fix some i18n values - fix ghost effect on changeRole dialog
1 parent 5774efa commit 48fe16b

19 files changed

+231
-85
lines changed

src/locales/de.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1820,7 +1820,7 @@ export default {
18201820
"pages.rooms.members.handOverAlert.confirm.label":
18211821
"Bei Übertragung dieser Berechtigung an {memberFullName} verliert {roomOwner} das Recht, den Raum zu löschen.",
18221822
"pages.rooms.members.handOverAlert.confirm.label.subText":
1823-
"Diese Aktion kann nur von {memberFullName} rückgängig gemacht werden.",
1823+
"Diese Aktion kann nur von {memberFullName} oder der schuladministrierenden Person rückgängig gemacht werden.",
18241824
"pages.rooms.members.inviteMember.step.prepare.title": "Einladungslink erstellen",
18251825
"pages.rooms.members.inviteMember.firstStep.subTitle":
18261826
"Im nächsten Schritt wird ein Link erstellt, mit dem der Raum betreten werden kann.",

src/locales/en.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1791,7 +1791,8 @@ export default {
17911791
"{roomOwner} loses the “Own” permissions and receives the “Administer” permission.",
17921792
"pages.rooms.members.handOverAlert.confirm.label":
17931793
"If this permission is transferred to {memberFullName}, {roomOwner} loses the right to delete the room.",
1794-
"pages.rooms.members.handOverAlert.confirm.label.subText": "This action can only be undone by {memberFullName}.",
1794+
"pages.rooms.members.handOverAlert.confirm.label.subText":
1795+
"This action can only be undone by {memberFullName} or a school administrator.",
17951796
"pages.rooms.members.inviteMember.step.prepare.title": "Create invitation link",
17961797
"pages.rooms.members.inviteMember.firstStep.subTitle":
17971798
"The next step is to create a link, which can be used to enter the room.",

src/locales/es.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1833,7 +1833,7 @@ export default {
18331833
"pages.rooms.members.handOverAlert.confirm.label":
18341834
"Si esta autorización se transfiere a {memberFullName}, {roomOwner} pierde el derecho a eliminar la sala.",
18351835
"pages.rooms.members.handOverAlert.confirm.label.subText":
1836-
"Esta acción sólo puede ser deshecha por {memberFullName}.",
1836+
"Esta acción sólo puede ser deshecha por {memberFullName} o el administrador de la escuela.",
18371837
"pages.rooms.members.inviteMember.step.prepare.title": "Crear enlace de invitación",
18381838
"pages.rooms.members.inviteMember.firstStep.subTitle":
18391839
"El siguiente paso es crear un enlace, que se puede utilizar para entrar en la sala.",

src/locales/uk.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1806,7 +1806,8 @@ export default {
18061806
"{roomOwner} втрачає права «Власник» і отримує права «Адміністратор».",
18071807
"pages.rooms.members.handOverAlert.confirm.label":
18081808
"Якщо цей дозвіл буде передано {memberFullName}, {roomOwner} втратить право видаляти кімнату.",
1809-
"pages.rooms.members.handOverAlert.confirm.label.subText": "Ця дія може бути скасована лише {memberFullName}.",
1809+
"pages.rooms.members.handOverAlert.confirm.label.subText":
1810+
"Ця дія може бути скасована лише {memberFullName} або адміністратор школи.",
18101811
"pages.rooms.members.inviteMember.step.prepare.title": "Створити посилання для запрошення",
18111812
"pages.rooms.members.inviteMember.firstStep.subTitle":
18121813
"Наступним кроком буде створення посилання, за яким можна буде увійти в кімнату.",

src/modules/feature/board/board/BoardColumnHeader.unit.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
} from "@ui-kebab-menu";
1515
import { useCourseBoardEditMode } from "@util-board";
1616
import { shallowMount } from "@vue/test-utils";
17+
import { flatten } from "lodash";
1718
import { computed, nextTick, ref } from "vue";
1819

1920
vi.mock("@data-board/BoardPermissions.composable");
@@ -79,14 +80,28 @@ describe("BoardColumnHeader", () => {
7980
});
8081

8182
describe("when the title updated", () => {
82-
it("should emit 'update:title'", () => {
83+
it("should not emit 'update:title' immediatly", async () => {
8384
const wrapper = setup();
8485

86+
const newTitle = "New column title";
8587
const titleInput = wrapper.findComponent(BoardAnyTitleInput);
86-
titleInput.vm.$emit("update:value");
88+
titleInput.vm.$emit("update:value", newTitle);
8789

88-
const emitted = wrapper.emitted();
89-
expect(emitted["update:title"]).toBeDefined();
90+
const emittedUpdateTitle = wrapper.emitted("update:title");
91+
expect(emittedUpdateTitle).toBeUndefined();
92+
});
93+
94+
it("should emit 'update:title' after debounce time", async () => {
95+
vi.useFakeTimers();
96+
const wrapper = setup();
97+
98+
const newTitle = "New column title";
99+
const titleInput = wrapper.findComponent(BoardAnyTitleInput);
100+
titleInput.vm.$emit("update:value", newTitle);
101+
await vi.advanceTimersByTimeAsync(3000);
102+
103+
const emittedUpdateTitle = wrapper.emitted("update:title");
104+
expect(flatten(emittedUpdateTitle)).toStrictEqual([newTitle]);
90105
});
91106
});
92107

src/modules/feature/board/board/BoardColumnHeader.vue

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
@move:column-keyboard="onMoveColumnKeyboard"
1111
>
1212
<BoardAnyTitleInput
13-
:value="title"
13+
:value="updatedTitle"
1414
:empty-value-fallback="t('components.board.column.defaultTitle')"
1515
:data-testid="`column-title-${index}`"
1616
scope="column"
@@ -58,7 +58,8 @@ import {
5858
KebabMenuActionMoveUp,
5959
KebabMenuActionRename,
6060
} from "@ui-kebab-menu";
61-
import { ref, toRef } from "vue";
61+
import { watchDebounced } from "@vueuse/core";
62+
import { ref, toRef, watch } from "vue";
6263
import { useI18n } from "vue-i18n";
6364
6465
const props = defineProps({
@@ -81,6 +82,9 @@ const emit = defineEmits([
8182
const { t } = useI18n();
8283
8384
const columnId = toRef(props, "columnId");
85+
const columnTitle = toRef(props, "title");
86+
const updatedTitle = ref(columnTitle.value);
87+
const lastEmittedTitle = ref(columnTitle.value);
8488
const { hasEditPermission, hasDeletePermission } = useBoardPermissions();
8589
const { isEditMode, startEditMode, stopEditMode } = useCourseBoardEditMode(columnId.value);
8690
@@ -94,6 +98,7 @@ const onStartEditMode = () => {
9498
9599
const onEndEditMode = () => {
96100
if (!hasEditPermission.value) return;
101+
emitTitleUpdate();
97102
stopEditMode();
98103
};
99104
@@ -130,5 +135,18 @@ const onMoveColumnRight = () => emitIfNotListBoard("move:column-right");
130135
const onMoveColumnDown = () => emit("move:column-down");
131136
const onMoveColumnUp = () => emit("move:column-up");
132137
133-
const onUpdateTitle = (newTitle: string) => emit("update:title", newTitle);
138+
const onUpdateTitle = (newTitle: string) => (updatedTitle.value = newTitle);
139+
140+
const emitTitleUpdate = () => {
141+
if (lastEmittedTitle.value !== updatedTitle.value) {
142+
emit("update:title", updatedTitle.value);
143+
lastEmittedTitle.value = updatedTitle.value;
144+
}
145+
};
146+
147+
watchDebounced(updatedTitle, emitTitleUpdate, { debounce: 500, maxWait: 2000 });
148+
watch(columnTitle, (newVal) => {
149+
updatedTitle.value = newVal;
150+
lastEmittedTitle.value = newVal;
151+
});
134152
</script>

src/modules/feature/board/board/BoardColumnInteractionHandler.unit.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ describe("BoardColumnInteractionHandler", () => {
66
const setup = (props: { isEditMode: boolean }) => {
77
document.body.setAttribute("data-app", "true");
88
const wrapper = shallowMount(BoardColumnInteractionHandler, {
9+
slots: {
10+
default: `<button data-testid="button">Menu representative</button>`,
11+
},
912
global: {
1013
plugins: [createTestingI18n()],
1114
},
@@ -22,7 +25,6 @@ describe("BoardColumnInteractionHandler", () => {
2225
});
2326

2427
describe("keyboard events", () => {
25-
// TODO: add more keypress events
2628
describe("when arrow keys pressed", () => {
2729
it.each(["left", "right"])(
2830
"should emit 'move:column-keyboard' event with '%s' key stroke when it is not in edit mode",
@@ -38,5 +40,54 @@ describe("BoardColumnInteractionHandler", () => {
3840
}
3941
);
4042
});
43+
44+
describe("when enter key is pressed", () => {
45+
describe("when being in edit mode", () => {
46+
it("should end edit mode", async () => {
47+
const wrapper = setup({ isEditMode: true });
48+
const element = wrapper.find("[data-testid=inline-edit-interaction-handler]");
49+
50+
await element.trigger("keydown.enter");
51+
52+
const emitted = wrapper.emitted("end-edit-mode");
53+
expect(emitted?.length).toBe(1);
54+
});
55+
});
56+
57+
describe("when being not in edit mode", () => {
58+
it("should start edit mode", async () => {
59+
const wrapper = setup({ isEditMode: false });
60+
const element = wrapper.find("[data-testid=inline-edit-interaction-handler]");
61+
62+
await element.trigger("keydown.enter");
63+
64+
const emitted = wrapper.emitted("start-edit-mode");
65+
expect(emitted?.length).toBe(1);
66+
});
67+
68+
describe("when focus is on a button", () => {
69+
it("should not start edit mode", async () => {
70+
const wrapper = setup({ isEditMode: false });
71+
const element = wrapper.find("[data-testid=button]");
72+
await element.trigger("keydown.enter");
73+
74+
const emitted = wrapper.emitted("start-edit-mode");
75+
expect(emitted).toBeUndefined();
76+
});
77+
});
78+
});
79+
});
80+
81+
describe("when tab key is pressed", () => {
82+
it("should end edit mode", async () => {
83+
const wrapper = setup({ isEditMode: true });
84+
const element = wrapper.find("[data-testid=event-handle]");
85+
86+
await element.trigger("keydown.tab");
87+
88+
const emitted = wrapper.emitted("end-edit-mode");
89+
expect(emitted?.length).toBe(1);
90+
});
91+
});
4192
});
4293
});

src/modules/feature/board/board/BoardColumnInteractionHandler.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<template>
22
<InlineEditInteractionHandler
3+
data-testid="inline-edit-interaction-handler"
34
:is-edit-mode="isEditMode"
45
:tabindex="0"
56
@start-edit-mode="onStartEditMode"
67
@end-edit-mode="onEndEditMode"
7-
@keydown.enter="onKeydownEnter"
8+
@keydown.enter.prevent="onKeydownEnter"
89
>
910
<div
1011
data-testid="event-handle"
1112
@keydown.left.right.capture="onKeydownArrow"
12-
@keydown.tab.capture="onKeydownTab"
13-
@keydown.enter.capture="onKeydownEnter"
13+
@keydown.tab.capture.prevent="onKeydownTab"
1414
>
1515
<slot />
1616
</div>
@@ -50,7 +50,8 @@ const onKeydownEnter = (event: KeyboardEvent) => {
5050
}
5151
if (!props.isEditMode) {
5252
emit("start-edit-mode");
53-
event.preventDefault();
53+
} else {
54+
emit("end-edit-mode");
5455
}
5556
};
5657

src/modules/feature/board/board/BoardDraftChip.unit.ts

Lines changed: 0 additions & 19 deletions
This file was deleted.

src/modules/feature/board/board/BoardDraftChip.vue

Lines changed: 0 additions & 9 deletions
This file was deleted.

0 commit comments

Comments
 (0)