Skip to content

Commit d954f7d

Browse files
use GModal in history selection operations
1 parent 0747439 commit d954f7d

2 files changed

Lines changed: 98 additions & 48 deletions

File tree

client/src/components/BaseComponents/GModal.vue

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ const props = withDefaults(
4242
okDisabledTitle?: string;
4343
/** When false, keeps the modal open on "ok" */
4444
closeOnOk?: boolean;
45+
/** Allows content to overflow the modal body (e.g. for dropdowns/selectors inside the modal) */
46+
overflowVisible?: boolean;
4547
}>(),
4648
{
4749
id: undefined,
@@ -57,6 +59,7 @@ const props = withDefaults(
5759
okDisabled: false,
5860
okDisabledTitle: undefined,
5961
closeOnOk: true,
62+
overflowVisible: false,
6063
},
6164
);
6265
@@ -168,7 +171,12 @@ defineExpose({ showModal, hideModal });
168171
<template>
169172
<!-- This is a convenience shortcut for mouse-users to close the dialog, so disabling this warning is fine here -->
170173
<!-- eslint-disable-next-line vuejs-accessibility/no-static-element-interactions, vuejs-accessibility/click-events-have-key-events -->
171-
<dialog :id="currentId" ref="dialog" class="g-dialog" :class="sizeClass" @click="onClickDialog">
174+
<dialog
175+
:id="currentId"
176+
ref="dialog"
177+
class="g-dialog"
178+
:class="[sizeClass, { 'g-overflow-visible': props.overflowVisible }]"
179+
@click="onClickDialog">
172180
<section>
173181
<header>
174182
<Heading
@@ -240,6 +248,19 @@ defineExpose({ showModal, hideModal });
240248
}
241249
}
242250
251+
&.g-overflow-visible {
252+
overflow: visible;
253+
254+
section {
255+
overflow: visible;
256+
}
257+
258+
.g-modal-content {
259+
overflow: visible;
260+
max-height: none;
261+
}
262+
}
263+
243264
&::backdrop {
244265
background-color: var(--color-blue-800);
245266
opacity: 0.33;

client/src/components/History/CurrentHistory/HistoryOperations/SelectionOperations.vue

Lines changed: 76 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@
3838
<span v-localize>Build Dataset List</span>
3939
</b-dropdown-item>
4040
<b-dropdown-divider />
41-
<b-dropdown-item v-b-modal:change-dbkey-of-selected-content data-description="change database build">
41+
<b-dropdown-item data-description="change database build" @click="showChangeDbKeyModal = true">
4242
<span v-localize>Change Database/Build</span>
4343
</b-dropdown-item>
4444
<b-dropdown-item
4545
v-if="isConfigLoaded && config.enable_celery_tasks"
46-
v-b-modal:change-datatype-of-selected-content
47-
data-description="change data type">
46+
data-description="change data type"
47+
@click="showChangeDatatypeModal = true">
4848
<span v-localize>Change data type</span>
4949
</b-dropdown-item>
50-
<b-dropdown-item v-b-modal:add-tags-to-selected-content data-description="add tags">
50+
<b-dropdown-item data-description="add tags" @click="showAddTagsModal = true">
5151
<span v-localize>Add tags</span>
5252
</b-dropdown-item>
53-
<b-dropdown-item v-b-modal:remove-tags-from-selected-content data-description="remove tags">
53+
<b-dropdown-item data-description="remove tags" @click="showRemoveTagsModal = true">
5454
<span v-localize>Remove tags</span>
5555
</b-dropdown-item>
5656
<b-dropdown-divider v-if="showBuildOptions" />
@@ -62,12 +62,14 @@
6262
</b-dropdown-item>
6363
</b-dropdown>
6464

65-
<b-modal
66-
id="change-dbkey-of-selected-content"
65+
<GModal
66+
:show.sync="showChangeDbKeyModal"
6767
title="Change Database/Build?"
68-
title-tag="h2"
69-
body-class="modal-with-selector"
70-
@ok="changeDbkeyOfSelected">
68+
confirm
69+
size="small"
70+
overflow-visible
71+
@ok="changeDbkeyOfSelected"
72+
@cancel="resetDbKey">
7173
<p v-localize>Select a new Database/Build for {{ numSelected }} items:</p>
7274
<DbKeyProvider v-slot="{ item: dbkeys, loading: loadingDbKeys }">
7375
<SingleItemSelector
@@ -77,14 +79,16 @@
7779
:current-item="selectedDbKey"
7880
@update:selected-item="onSelectedDbKey" />
7981
</DbKeyProvider>
80-
</b-modal>
81-
<b-modal
82-
id="change-datatype-of-selected-content"
82+
</GModal>
83+
<GModal
84+
:show.sync="showChangeDatatypeModal"
8385
title="Change data type?"
84-
title-tag="h2"
85-
body-class="modal-with-selector"
86+
confirm
87+
size="small"
88+
overflow-visible
8689
:ok-disabled="selectedDatatype == null"
87-
@ok="changeDatatypeOfSelected">
90+
@ok="changeDatatypeOfSelected"
91+
@cancel="resetDatatype">
8892
<p v-localize>Select a new data type for {{ numSelected }} items:</p>
8993
<DatatypesProvider v-slot="{ item: datatypes, loading: loadingDatatypes }">
9094
<SingleItemSelector
@@ -94,25 +98,31 @@
9498
:current-item="selectedDatatype"
9599
@update:selected-item="onSelectedDatatype" />
96100
</DatatypesProvider>
97-
</b-modal>
98-
<b-modal
99-
id="add-tags-to-selected-content"
101+
</GModal>
102+
<GModal
103+
:show.sync="showAddTagsModal"
100104
title="Add tags?"
101-
title-tag="h2"
105+
confirm
106+
size="small"
102107
:ok-disabled="noTagsSelected"
103-
@ok="addTagsToSelected">
108+
@ok="addTagsToSelected"
109+
@cancel="selectedTags = []">
104110
<p v-localize>Apply the following tags to {{ numSelected }} items:</p>
105-
<StatelessTags v-model="selectedTags" class="tags" />
106-
</b-modal>
107-
<b-modal
108-
id="remove-tags-from-selected-content"
111+
<StatelessTags :key="showAddTagsModal" v-model="selectedTags" class="tags" />
112+
<GTip class="mt-2" :tips="['Press Enter after typing each tag.']" />
113+
</GModal>
114+
<GModal
115+
:show.sync="showRemoveTagsModal"
109116
title="Remove tags?"
110-
title-tag="h2"
117+
confirm
118+
size="small"
111119
:ok-disabled="noTagsSelected"
112-
@ok="removeTagsFromSelected">
120+
@ok="removeTagsFromSelected"
121+
@cancel="selectedTags = []">
113122
<p v-localize>Remove the following tags from {{ numSelected }} items:</p>
114-
<StatelessTags v-model="selectedTags" class="tags" />
115-
</b-modal>
123+
<StatelessTags :key="showRemoveTagsModal" v-model="selectedTags" class="tags" />
124+
<GTip :tips="['Press Enter after typing each tag.']" />
125+
</GModal>
116126
<CollectionCreatorIndex
117127
v-if="collectionModalType"
118128
:history-id="history.id"
@@ -128,6 +138,8 @@
128138
</template>
129139

130140
<script>
141+
import { ref } from "vue";
142+
131143
import { HistoryFilters } from "@/components/History/HistoryFilters";
132144
import {
133145
addTagsToSelectedContent,
@@ -146,6 +158,8 @@ import { useConfig } from "@/composables/config";
146158
import { useConfirmDialog } from "@/composables/confirmDialog";
147159
import { useCollectionBuilderItemSelection } from "@/stores/collectionBuilderItemsStore";
148160
161+
import GModal from "@/components/BaseComponents/GModal.vue";
162+
import GTip from "@/components/BaseComponents/GTip.vue";
149163
import CollectionCreatorIndex from "@/components/Collections/CollectionCreatorIndex.vue";
150164
import SingleItemSelector from "@/components/SingleItemSelector.vue";
151165
@@ -154,6 +168,8 @@ export default {
154168
CollectionCreatorIndex,
155169
DbKeyProvider,
156170
DatatypesProvider,
171+
GModal,
172+
GTip,
157173
SingleItemSelector,
158174
StatelessTags,
159175
},
@@ -170,15 +186,41 @@ export default {
170186
const { config, isConfigLoaded } = useConfig(true);
171187
const { confirm } = useConfirmDialog();
172188
173-
return { config, confirm, isConfigLoaded };
189+
// Modals for selection operations
190+
const showChangeDbKeyModal = ref(false);
191+
const showChangeDatatypeModal = ref(false);
192+
const showAddTagsModal = ref(false);
193+
const showRemoveTagsModal = ref(false);
194+
195+
const selectedDbKey = ref({ id: "?", text: "unspecified (?)" });
196+
const selectedDatatype = ref({ id: "auto", text: "Auto-detect" });
197+
198+
function resetDbKey() {
199+
selectedDbKey.value = { id: "?", text: "unspecified (?)" };
200+
}
201+
function resetDatatype() {
202+
selectedDatatype.value = { id: "auto", text: "Auto-detect" };
203+
}
204+
205+
return {
206+
config,
207+
confirm,
208+
isConfigLoaded,
209+
showChangeDbKeyModal,
210+
showChangeDatatypeModal,
211+
showAddTagsModal,
212+
showRemoveTagsModal,
213+
selectedDbKey,
214+
selectedDatatype,
215+
resetDbKey,
216+
resetDatatype,
217+
};
174218
},
175219
data: function () {
176220
return {
177221
collectionModalShow: false,
178222
collectionModalType: null,
179223
collectionSelection: undefined,
180-
selectedDbKey: { id: "?", text: "unspecified (?)" },
181-
selectedDatatype: { id: "auto", text: "Auto-detect" },
182224
selectedTags: [],
183225
};
184226
},
@@ -338,11 +380,11 @@ export default {
338380
},
339381
changeDbkeyOfSelected() {
340382
this.runOnSelection(changeDbkeyOfSelectedContent, { dbkey: this.selectedDbKey.id });
341-
this.selectedDbKey = { id: "?" };
383+
this.resetDbKey();
342384
},
343385
changeDatatypeOfSelected() {
344386
this.runOnSelection(changeDatatypeOfSelectedContent, { datatype: this.selectedDatatype.id });
345-
this.selectedDatatype = { id: "auto", text: "Auto-detect" };
387+
this.resetDatatype();
346388
},
347389
addTagsToSelected() {
348390
this.runOnSelection(addTagsToSelectedContent, { tags: this.selectedTags });
@@ -397,16 +439,3 @@ export default {
397439
},
398440
};
399441
</script>
400-
401-
<style>
402-
.modal-with-selector {
403-
overflow: initial;
404-
min-height: 300px; /* To make room for the selector */
405-
}
406-
407-
.subtle-header {
408-
font-size: 0.74375rem;
409-
color: #404862;
410-
font-weight: normal;
411-
}
412-
</style>

0 commit comments

Comments
 (0)