diff --git a/src/presentation/Scripts/Cards/CardList.vue b/src/presentation/Scripts/Cards/CardList.vue
index 5a596c51..714c3da4 100644
--- a/src/presentation/Scripts/Cards/CardList.vue
+++ b/src/presentation/Scripts/Cards/CardList.vue
@@ -20,6 +20,7 @@ import { Component, Prop, Vue } from 'vue-property-decorator';
import CardListItem from './CardListItem.vue';
import { StatefulVue } from '@/presentation/StatefulVue';
import { ICategory } from '@/domain/ICategory';
+import { hasDirective } from './NonCollapsingDirective';
@Component({
components: {
@@ -33,7 +34,10 @@ export default class CardList extends StatefulVue {
public async mounted() {
const state = await this.getCurrentStateAsync();
this.setCategories(state.app.actions);
- this.onOutsideOfActiveCardClicked(() => {
+ this.onOutsideOfActiveCardClicked((element) => {
+ if (hasDirective(element)) {
+ return;
+ }
this.activeCategoryId = null;
});
}
@@ -46,14 +50,14 @@ export default class CardList extends StatefulVue {
this.categoryIds = categories.map((category) => category.id);
}
- private onOutsideOfActiveCardClicked(callback) {
+ private onOutsideOfActiveCardClicked(callback: (clickedElement: Element) => void) {
const outsideClickListener = (event) => {
if (!this.activeCategoryId) {
return;
}
const element = document.querySelector(`[data-category="${this.activeCategoryId}"]`);
if (element && !element.contains(event.target)) {
- callback();
+ callback(event.target);
}
};
document.addEventListener('click', outsideClickListener);
diff --git a/src/presentation/Scripts/Cards/NonCollapsingDirective.ts b/src/presentation/Scripts/Cards/NonCollapsingDirective.ts
new file mode 100644
index 00000000..2ac6ab2c
--- /dev/null
+++ b/src/presentation/Scripts/Cards/NonCollapsingDirective.ts
@@ -0,0 +1,17 @@
+import { DirectiveOptions } from 'vue';
+
+const attributeName = 'data-interactionDoesNotCollapse';
+
+export function hasDirective(el: Element): boolean {
+ if (el.hasAttribute(attributeName)) {
+ return true;
+ }
+ const parent = el.closest(`[${attributeName}]`);
+ return !!parent;
+}
+
+export const NonCollapsing: DirectiveOptions = {
+ inserted(el: HTMLElement) {
+ el.setAttribute(attributeName, '');
+ },
+};
diff --git a/src/presentation/Scripts/Selector/SelectableOption.vue b/src/presentation/Scripts/Selector/SelectableOption.vue
index 327b7b5a..56e60e83 100644
--- a/src/presentation/Scripts/Selector/SelectableOption.vue
+++ b/src/presentation/Scripts/Selector/SelectableOption.vue
@@ -1,14 +1,18 @@
{{label}}