Merge pull request #6613 from aignatov-bio/ai-sci-update-outside-click

Update outside click
This commit is contained in:
aignatov-bio 2023-11-10 09:54:14 +01:00 committed by GitHub
commit b2810d4702
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 96 additions and 105 deletions

View file

@ -2,7 +2,7 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import ActionToolbar from '../../vue/components/action_toolbar.vue'; import ActionToolbar from '../../vue/components/action_toolbar.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
window.initActionToolbar = () => { window.initActionToolbar = () => {
@ -10,7 +10,6 @@ window.initActionToolbar = () => {
const app = createApp({}); const app = createApp({});
app.component('ActionToolbar', ActionToolbar); app.component('ActionToolbar', ActionToolbar);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#actionToolbar'); mountWithTurbolinks(app, '#actionToolbar');
handleTurbolinks(app);
} }
} }

View file

@ -3,7 +3,7 @@ import PerfectScrollbar from 'vue3-perfect-scrollbar';
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css';
import AssignItemsToTaskModalContainer from '../../vue/assign_items_to_tasks_modal/container.vue'; import AssignItemsToTaskModalContainer from '../../vue/assign_items_to_tasks_modal/container.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
function initAssignItemsToTaskModalComponent() { function initAssignItemsToTaskModalComponent() {
const container = $('.assign-items-to-task-modal-container'); const container = $('.assign-items-to-task-modal-container');
@ -34,10 +34,7 @@ function initAssignItemsToTaskModalComponent() {
app.component('AssignItemsToTaskModalContainer', AssignItemsToTaskModalContainer); app.component('AssignItemsToTaskModalContainer', AssignItemsToTaskModalContainer);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('.assign-items-to-task-modal-container'); window.AssignItemsToTaskModalComponentContainer = mountWithTurbolinks(app, '.assign-items-to-task-modal-container');
handleTurbolinks(app);
window.AssignItemsToTaskModalComponentContainer = app;
} }
} }

View file

@ -1,34 +0,0 @@
// Use this to register outside-click directive on a Vue component
// eslint-disable-next-line max-len
// eg v-click-outside="{handler: 'handlerToTrigger', exclude: [refs to ignore on click (eg 'searchInput', 'searchInputBtn')]}"
// eslint-enable-next-line max-len
export default {
bind(el, binding, vnode) {
el._vueClickOutside_ = (e) => {
let clickedOnExcludedEl = false;
const { exclude } = binding.value;
exclude.forEach(refName => {
if (!clickedOnExcludedEl) {
const excludedEl = vnode.context.$refs[refName];
if (!excludedEl) return;
clickedOnExcludedEl = (excludedEl._isVue ? excludedEl.$el : excludedEl).contains(e.target);
}
});
if (!el.contains(e.target) && !clickedOnExcludedEl) {
const { handler } = binding.value;
vnode.context[handler]();
}
};
document.addEventListener('click', el._vueClickOutside_);
document.addEventListener('touchstart', el._vueClickOutside_);
},
unbind(el) {
document.removeEventListener('click', el._vueClickOutside_);
document.removeEventListener('touchstart', el._vueClickOutside_);
el._vueClickOutside_ = null;
}
};

View file

@ -1,7 +1,7 @@
/* global notTurbolinksPreview */ /* global notTurbolinksPreview */
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import ExportStockConsumptionModal from '../../vue/repository_row/export_stock_consumption_modal.vue'; import ExportStockConsumptionModal from '../../vue/repository_row/export_stock_consumption_modal.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
window.initExportStockConsumptionModal = () => { window.initExportStockConsumptionModal = () => {
if (window.exportStockConsumptionModalComponent) return; if (window.exportStockConsumptionModalComponent) return;
@ -10,7 +10,6 @@ window.initExportStockConsumptionModal = () => {
const app = createApp({}); const app = createApp({});
app.component('ExportStockConsumptionModal', ExportStockConsumptionModal); app.component('ExportStockConsumptionModal', ExportStockConsumptionModal);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#exportStockConsumtionModal'); mountWithTurbolinks(app, '#exportStockConsumtionModal');
handleTurbolinks(app);
} }
}; };

View file

@ -1,7 +1,12 @@
function handleTurbolinks(app) { function mountWithTurbolinks(app, target) {
const originalHtml = document.querySelector(target).innerHTML;
document.addEventListener('turbolinks:before-cache', () => { document.addEventListener('turbolinks:before-cache', () => {
app.unmount(); app.unmount();
document.querySelector(target).innerHTML = originalHtml;
}, { once: true }); }, { once: true });
return app.mount(target);
} }
export { handleTurbolinks }; export { mountWithTurbolinks };

View file

@ -1,6 +1,6 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import LabelTemplateContainer from '../../vue/label_template/container.vue'; import LabelTemplateContainer from '../../vue/label_template/container.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
window.initLabelTemplateComponent = () => { window.initLabelTemplateComponent = () => {
const app = createApp({ const app = createApp({
@ -15,8 +15,7 @@ window.initLabelTemplateComponent = () => {
}); });
app.component('LabelTemplateContainer', LabelTemplateContainer); app.component('LabelTemplateContainer', LabelTemplateContainer);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#labelTemplateContainer'); mountWithTurbolinks(app, '#labelTemplateContainer');
handleTurbolinks(app);
}; };
initLabelTemplateComponent(); initLabelTemplateComponent();

View file

@ -1,6 +1,6 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import DateTimePicker from '../../../vue/shared/date_time_picker.vue'; import DateTimePicker from '../../../vue/shared/date_time_picker.vue';
import { handleTurbolinks } from '../helpers/turbolinks.js'; import { mountWithTurbolinks } from '../helpers/turbolinks.js';
/* /*
<div id="date-time-picker" class="vue-date-time-picker"> <div id="date-time-picker" class="vue-date-time-picker">
<input ref="input" type="hidden" v-model="date" id="legacy-id" data-default="" /> <input ref="input" type="hidden" v-model="date" id="legacy-id" data-default="" />
@ -66,8 +66,7 @@ window.initDateTimePickerComponent = (id) => {
}); });
app.component('DateTimePicker', DateTimePicker); app.component('DateTimePicker', DateTimePicker);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount(id); mountWithTurbolinks(app, id);
handleTurbolinks(app);
}; };
document.addEventListener('turbolinks:load', () => { document.addEventListener('turbolinks:load', () => {

View file

@ -3,13 +3,11 @@ import PerfectScrollbar from 'vue3-perfect-scrollbar';
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css';
import Breadcrumbs from '../../../vue/navigation/breadcrumbs/breadcrumbs.vue'; import Breadcrumbs from '../../../vue/navigation/breadcrumbs/breadcrumbs.vue';
import { handleTurbolinks } from '../helpers/turbolinks.js'; import { mountWithTurbolinks } from '../helpers/turbolinks.js';
const app = createApp({}); const app = createApp({});
app.component('Breadcrumbs', Breadcrumbs); app.component('Breadcrumbs', Breadcrumbs);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#breadcrumbs'); window.breadcrumbsComponent = mountWithTurbolinks(app, '#breadcrumbs');
handleTurbolinks(app);
window.breadcrumbsComponent = app;

View file

@ -47,9 +47,7 @@ function addNavigationNavigatorContainer() {
app.component('NavigatorContainer', NavigatorContainer); app.component('NavigatorContainer', NavigatorContainer);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#sciNavigationNavigatorContainer'); window.navigatorContainer = app.mount('#sciNavigationNavigatorContainer');
window.navigatorContainer = app;
} }
if (document.readyState !== 'loading') { if (document.readyState !== 'loading') {

View file

@ -2,13 +2,11 @@ import PerfectScrollbar from 'vue3-perfect-scrollbar';
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css'; import 'vue3-perfect-scrollbar/dist/vue3-perfect-scrollbar.css';
import TopMenuContainer from '../../../vue/navigation/top_menu.vue'; import TopMenuContainer from '../../../vue/navigation/top_menu.vue';
import outsideClick from '../directives/outside_click';
function addNavigationTopMenuContainer() { function addNavigationTopMenuContainer() {
const app = createApp({}); const app = createApp({});
app.component('TopMenuContainer', TopMenuContainer); app.component('TopMenuContainer', TopMenuContainer);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.directive('click-outside', outsideClick);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#sciNavigationTopMenuContainer'); app.mount('#sciNavigationTopMenuContainer');
} }

View file

@ -1,9 +1,8 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import OpenVectorEditor from '../../vue/ove/OpenVectorEditor.vue'; import OpenVectorEditor from '../../vue/ove/OpenVectorEditor.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
const app = createApp({}); const app = createApp({});
app.component('OpenVectorEditor', OpenVectorEditor); app.component('OpenVectorEditor', OpenVectorEditor);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#open-vector-editor'); mountWithTurbolinks(app, '#open-vector-editor');
handleTurbolinks(app);

View file

@ -3,8 +3,7 @@
import PerfectScrollbar from 'vue3-perfect-scrollbar'; import PerfectScrollbar from 'vue3-perfect-scrollbar';
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import ProtocolContainer from '../../vue/protocol/container.vue'; import ProtocolContainer from '../../vue/protocol/container.vue';
import outsideClick from './directives/outside_click'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
import { handleTurbolinks } from './helpers/turbolinks.js';
window.initProtocolComponent = () => { window.initProtocolComponent = () => {
const app = createApp({ const app = createApp({
@ -16,13 +15,11 @@ window.initProtocolComponent = () => {
}); });
app.component('ProtocolContainer', ProtocolContainer); app.component('ProtocolContainer', ProtocolContainer);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.directive('click-outside', outsideClick);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.config.globalProperties.inlineEditing = window.inlineEditing; app.config.globalProperties.inlineEditing = window.inlineEditing;
app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews; app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews;
app.config.globalProperties.dateFormat = $('#protocolContainer').data('date-format'); app.config.globalProperties.dateFormat = $('#protocolContainer').data('date-format');
app.mount('#protocolContainer'); mountWithTurbolinks(app, '#protocolContainer');
handleTurbolinks(app);
$('.protocols-show').on('click', '#protocol-versions-modal .delete-draft', (e) => { $('.protocols-show').on('click', '#protocol-versions-modal .delete-draft', (e) => {
const url = e.currentTarget.dataset.url; const url = e.currentTarget.dataset.url;

View file

@ -1,13 +1,12 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import ProtocolFileImportModal from '../../vue/protocol_import/file_import_modal.vue'; import ProtocolFileImportModal from '../../vue/protocol_import/file_import_modal.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
window.initProtocolFileImportModalComponent = () => { window.initProtocolFileImportModalComponent = () => {
const app = createApp({}); const app = createApp({});
app.component('ProtocolFileImportModal', ProtocolFileImportModal); app.component('ProtocolFileImportModal', ProtocolFileImportModal);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#protocolFileImportModal'); mountWithTurbolinks(app, '#protocolFileImportModal');
handleTurbolinks(app);
}; };
initProtocolFileImportModalComponent(); initProtocolFileImportModalComponent();

View file

@ -2,7 +2,7 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import FilterContainer from '../../vue/repository_filter/container.vue'; import FilterContainer from '../../vue/repository_filter/container.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
const DEFAULT_FILTERS = [ const DEFAULT_FILTERS = [
{ {
@ -150,8 +150,7 @@ window.initRepositoryFilter = () => {
app.component('FilterContainer', FilterContainer); app.component('FilterContainer', FilterContainer);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.config.globalProperties.dateFormat = $('#filterContainer').data('date-format'); app.config.globalProperties.dateFormat = $('#filterContainer').data('date-format');
app.mount('#filterContainer'); window.repositoryFilterObject = mountWithTurbolinks(app, '#filterContainer');
handleTurbolinks(app);
$('#filterContainer').on('click', (e) => { $('#filterContainer').on('click', (e) => {
$('#filterContainer .dropdown-selector-container').removeClass('open') $('#filterContainer .dropdown-selector-container').removeClass('open')
@ -161,6 +160,4 @@ window.initRepositoryFilter = () => {
$('#filtersDropdownButton').on('show.bs.dropdown', () => { $('#filtersDropdownButton').on('show.bs.dropdown', () => {
$('#filtersColumnsDropdown, #savedFiltersContainer').removeClass('open'); $('#filtersColumnsDropdown, #savedFiltersContainer').removeClass('open');
}); });
window.repositoryFilterObject = app;
}; };

View file

@ -2,15 +2,14 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import RepositoryItemSidebar from '../../vue/repository_item_sidebar/RepositoryItemSidebar.vue'; import RepositoryItemSidebar from '../../vue/repository_item_sidebar/RepositoryItemSidebar.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
function initRepositoryItemSidebar() { function initRepositoryItemSidebar() {
const app = createApp({}); const app = createApp({});
app.component('RepositoryItemSidebar', RepositoryItemSidebar); app.component('RepositoryItemSidebar', RepositoryItemSidebar);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#repositoryItemSidebar'); mountWithTurbolinks(app, '#repositoryItemSidebar');
handleTurbolinks(app);
} }
initRepositoryItemSidebar(); initRepositoryItemSidebar();

View file

@ -1,6 +1,6 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import PrintModalContainer from '../../vue/repository_print_modal/container.vue'; import PrintModalContainer from '../../vue/repository_print_modal/container.vue';
import { handleTurbolinks } from './helpers/turbolinks.js'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
function initPrintModalComponent() { function initPrintModalComponent() {
const container = $('.print-label-modal-container'); const container = $('.print-label-modal-container');
@ -30,9 +30,7 @@ function initPrintModalComponent() {
}); });
app.component('PrintModalContainer', PrintModalContainer); app.component('PrintModalContainer', PrintModalContainer);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('.print-label-modal-container'); mountWithTurbolinks(app, '.print-label-modal-container');
handleTurbolinks(app);
window.PrintModalComponent = app;
} }
} }

View file

@ -1,15 +1,10 @@
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import RepositorySearchContainer from '../../vue/repository_search/container.vue'; import RepositorySearchContainer from '../../vue/repository_search/container.vue';
import outsideClick from './directives/outside_click'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
import { handleTurbolinks } from './helpers/turbolinks.js';
window.initRepositorySearch = () => { window.initRepositorySearch = () => {
const app = createApp({}); const app = createApp({});
app.component('RepositorySearchContainer', RepositorySearchContainer); app.component('RepositorySearchContainer', RepositorySearchContainer);
app.directive('click-outside', outsideClick);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.mount('#inventorySearchComponent'); mountWithTurbolinks(app, '#inventorySearchComponent');
handleTurbolinks(app);
window.RepositorySearchComponent = app;
} }

View file

@ -1,14 +1,11 @@
import PerfectScrollbar from 'vue3-perfect-scrollbar'; import PerfectScrollbar from 'vue3-perfect-scrollbar';
import { createApp } from 'vue/dist/vue.esm-bundler.js'; import { createApp } from 'vue/dist/vue.esm-bundler.js';
import Results from '../../vue/results/results.vue'; import Results from '../../vue/results/results.vue';
import outsideClick from './directives/outside_click'; import { mountWithTurbolinks } from './helpers/turbolinks.js';
import { handleTurbolinks } from './helpers/turbolinks.js';
const app = createApp({}); const app = createApp({});
app.component('Results', Results); app.component('Results', Results);
app.use(PerfectScrollbar); app.use(PerfectScrollbar);
app.directive('click-outside', outsideClick);
app.config.globalProperties.i18n = window.I18n; app.config.globalProperties.i18n = window.I18n;
app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews; app.config.globalProperties.ActiveStoragePreviews = window.ActiveStoragePreviews;
app.mount('#results'); mountWithTurbolinks(app, '#results');
handleTurbolinks(app);

View file

@ -12,7 +12,7 @@
@resizing="onResizeMove" @resizing="onResizeMove"
@resize-end="onResizeEnd" @resize-end="onResizeEnd"
> >
<div class="ml-4 h-full border rounded bg-sn-white flex flex-col right-0 absolute navigator-container"> <div class="ml-4 h-full w-full border rounded bg-sn-white flex flex-col right-0 absolute navigator-container">
<div class="px-3 py-2.5 flex items-center relative leading-4"> <div class="px-3 py-2.5 flex items-center relative leading-4">
<i class="sn-icon sn-icon-navigator"></i> <i class="sn-icon sn-icon-navigator"></i>
<div class="font-bold text-base pl-3"> <div class="font-bold text-base pl-3">

View file

@ -1,7 +1,7 @@
<template> <template>
<div <div
class="flex items-center mr-3 flex-nowrap relative" class="flex items-center mr-3 flex-nowrap relative"
v-click-outside="{handler: 'closeSearchInputs', exclude: ['searchInput', 'searchInputBtn', 'barcodeSearchInput', 'barcodeSearchInputBtn']}" v-click-outside="closeSearchInputs"
> >
<button :class="{hidden: searchOpened}" ref='searchInputBtn' class="btn btn-light btn-black icon-btn" :title="i18n.t('repositories.show.search_button_tooltip')" @click="openSearch"> <button :class="{hidden: searchOpened}" ref='searchInputBtn' class="btn btn-light btn-black icon-btn" :title="i18n.t('repositories.show.search_button_tooltip')" @click="openSearch">
<i class="sn-icon sn-icon-search"></i> <i class="sn-icon sn-icon-search"></i>
@ -35,6 +35,8 @@
</template> </template>
<script> <script>
import { vOnClickOutside } from '@vueuse/components'
export default { export default {
name: 'RepositorySearchContainer', name: 'RepositorySearchContainer',
data() { data() {
@ -45,6 +47,9 @@ export default {
value: '' value: ''
} }
}, },
directives: {
'click-outside': vOnClickOutside
},
watch: { watch: {
barcodeValue() { barcodeValue() {
this.updateRepositoySearch(); this.updateRepositoySearch();

View file

@ -15,7 +15,7 @@
'!mb-0': !openUp, '!mb-0': !openUp,
}" }"
v-if="showMenu" v-if="showMenu"
v-click-outside="{handler: 'closeMenu', exclude: ['openBtn', 'flyout']}"> v-click-outside="closeMenu">
<span v-for="(item, i) in listItems" :key="i" class="contents"> <span v-for="(item, i) in listItems" :key="i" class="contents">
<div v-if="item.dividerBefore" class="border-0 border-t border-solid border-sn-light-grey"></div> <div v-if="item.dividerBefore" class="border-0 border-t border-solid border-sn-light-grey"></div>
<a :href="item.url" v-if="!item.submenu" <a :href="item.url" v-if="!item.submenu"
@ -64,6 +64,7 @@
<script> <script>
import isInViewPort from './isInViewPort.js'; import isInViewPort from './isInViewPort.js';
import { vOnClickOutside } from '@vueuse/components'
export default { export default {
name: 'DropdownMenu', name: 'DropdownMenu',
@ -81,6 +82,9 @@ export default {
openUp: false openUp: false
} }
}, },
directives: {
'click-outside': vOnClickOutside
},
watch: { watch: {
showMenu() { showMenu() {
if (this.showMenu) { if (this.showMenu) {

View file

@ -1,5 +1,5 @@
<template> <template>
<div v-click-outside="{ handler: 'close', exclude: ['optionsContainer'] }" @click="toggle" ref="container" class="sn-select" :class="{ 'sn-select--open': isOpen, 'sn-select--blank': !valueLabel, 'disabled': disabled }"> <div v-click-outside="close" @click="toggle" ref="container" class="sn-select" :class="{ 'sn-select--open': isOpen, 'sn-select--blank': !valueLabel, 'disabled': disabled }">
<slot> <slot>
<button ref="focusElement" class="sn-select__value"> <button ref="focusElement" class="sn-select__value">
<span>{{ valueLabel || (placeholder || i18n.t('general.select')) }}</span> <span>{{ valueLabel || (placeholder || i18n.t('general.select')) }}</span>
@ -37,7 +37,7 @@
</div> </div>
</template> </template>
<script> <script>
import outsideClick from '../../packs/vue/directives/outside_click'; import { vOnClickOutside } from '@vueuse/components'
export default { export default {
name: 'Select', name: 'Select',
@ -50,7 +50,7 @@
disabled: { type: Boolean, default: false } disabled: { type: Boolean, default: false }
}, },
directives: { directives: {
'click-outside': outsideClick 'click-outside': vOnClickOutside
}, },
data() { data() {
return { return {

View file

@ -33,6 +33,8 @@
"@teselagen/ove": "^0.3.23", "@teselagen/ove": "^0.3.23",
"@vue/compiler-sfc": "^3.3.4", "@vue/compiler-sfc": "^3.3.4",
"@vuepic/vue-datepicker": "^7.2.0", "@vuepic/vue-datepicker": "^7.2.0",
"@vueuse/components": "^10.5.0",
"@vueuse/core": "^10.5.0",
"ajv": "6.12.6", "ajv": "6.12.6",
"autoprefixer": "10.4.14", "autoprefixer": "10.4.14",
"axios": "^1.4.0", "axios": "^1.4.0",

View file

@ -1650,6 +1650,11 @@
resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43"
integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==
"@types/web-bluetooth@^0.0.18":
version "0.0.18"
resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz#74bd1c8fd3a2058cb6fc76b188fcded50a83d866"
integrity sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw==
"@types/yauzl@^2.9.1": "@types/yauzl@^2.9.1":
version "2.10.1" version "2.10.1"
resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691" resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.1.tgz#4e8f299f0934d60f36c74f59cb5a8483fd786691"
@ -1767,6 +1772,37 @@
date-fns "^2.30.0" date-fns "^2.30.0"
date-fns-tz "^1.3.7" date-fns-tz "^1.3.7"
"@vueuse/components@^10.5.0":
version "10.5.0"
resolved "https://registry.yarnpkg.com/@vueuse/components/-/components-10.5.0.tgz#fdb8c20e3d9bf52a32be8c59dd389fa37acabd09"
integrity sha512-zWQZ8zkNBvX++VHfyiUaQ4otb+4PWI8679GR8FvdrNnj+01LXnqvrkyKd8yTCMJ9nHqwRRTJikS5fu4Zspn9DQ==
dependencies:
"@vueuse/core" "10.5.0"
"@vueuse/shared" "10.5.0"
vue-demi ">=0.14.6"
"@vueuse/core@10.5.0", "@vueuse/core@^10.5.0":
version "10.5.0"
resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-10.5.0.tgz#04d1e6d26592bb997bb755a4830ea7583c3e8612"
integrity sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==
dependencies:
"@types/web-bluetooth" "^0.0.18"
"@vueuse/metadata" "10.5.0"
"@vueuse/shared" "10.5.0"
vue-demi ">=0.14.6"
"@vueuse/metadata@10.5.0":
version "10.5.0"
resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-10.5.0.tgz#7501a88cf5cbf7a515a03f0b8bbe3cecf30cad11"
integrity sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==
"@vueuse/shared@10.5.0":
version "10.5.0"
resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-10.5.0.tgz#b3ac8c190a5dae41db5e1b60fe304a9b4247393c"
integrity sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==
dependencies:
vue-demi ">=0.14.6"
"@webassemblyjs/ast@1.11.1": "@webassemblyjs/ast@1.11.1":
version "1.11.1" version "1.11.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
@ -7776,6 +7812,11 @@ vm-browserify@^1.1.2:
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
vue-demi@>=0.14.6:
version "0.14.6"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92"
integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==
vue-loader@^16.0.0: vue-loader@^16.0.0:
version "16.8.3" version "16.8.3"
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087" resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-16.8.3.tgz#d43e675def5ba9345d6c7f05914c13d861997087"