2
0
mirror of https://github.com/frappe/books.git synced 2024-11-12 16:36:27 +00:00

fix: Popover arrow

- Use popper.js 2.x
- placement prop for uh, placement
- show prop for explicit show/hide
This commit is contained in:
Faris Ansari 2020-01-29 16:31:03 +05:30
parent 307083d7fe
commit f4fc9703bb
4 changed files with 84 additions and 12 deletions

View File

@ -17,6 +17,7 @@
}, },
"main": "background.js", "main": "background.js",
"dependencies": { "dependencies": {
"@popperjs/core": "^2.0.3",
"core-js": "^3.4.3", "core-js": "^3.4.3",
"electron-store": "^5.1.0", "electron-store": "^5.1.0",
"frappe-charts": "^1.3.0", "frappe-charts": "^1.3.0",
@ -24,7 +25,6 @@
"knex": "^0.20.4", "knex": "^0.20.4",
"lodash": "^4.17.15", "lodash": "^4.17.15",
"luxon": "^1.21.3", "luxon": "^1.21.3",
"popper.js": "^1.16.0",
"portal-vue": "^2.1.6", "portal-vue": "^2.1.6",
"sqlite3": "^4.1.1", "sqlite3": "^4.1.1",
"tailwindcss": "^1.1.4", "tailwindcss": "^1.1.4",

View File

@ -1,5 +1,5 @@
<template> <template>
<Popover @close="emitFilterChange" right> <Popover @close="emitFilterChange" placement="bottom-end">
<template v-slot:target="{ togglePopover }"> <template v-slot:target="{ togglePopover }">
<Button :icon="true" @click="togglePopover()"> <Button :icon="true" @click="togglePopover()">
<span class="flex items-center"> <span class="flex items-center">

View File

@ -7,9 +7,10 @@
<div <div
ref="popover" ref="popover"
:class="popoverClass" :class="popoverClass"
class="mt-1 bg-white rounded border min-w-40 shadow-md" class="bg-white rounded border min-w-40 shadow-md popover-container relative"
v-show="isOpen" v-show="isOpen"
> >
<div class="popover-arrow" ref="popover-arrow"></div>
<slot name="content" :togglePopover="togglePopover"></slot> <slot name="content" :togglePopover="togglePopover"></slot>
</div> </div>
</portal> </portal>
@ -17,14 +18,31 @@
</template> </template>
<script> <script>
import Popper from 'popper.js'; import { createPopper } from '@popperjs/core';
export default { export default {
name: 'Popover', name: 'Popover',
props: { props: {
show: {
default: null
},
right: Boolean, right: Boolean,
placement: {
type: String,
default: 'bottom-start'
},
popoverClass: [String, Object, Array] popoverClass: [String, Object, Array]
}, },
watch: {
show(value) {
if (value === true) {
this.open();
}
if (value === false) {
this.close();
}
}
},
data() { data() {
return { return {
isOpen: false isOpen: false
@ -41,10 +59,12 @@ export default {
} }
this.close(); this.close();
}; };
document.addEventListener('click', listener); if (this.show == null) {
this.$once('hook:beforeDestroy', () => { document.addEventListener('click', listener);
document.removeEventListener('click', listener); this.$once('hook:beforeDestroy', () => {
}); document.removeEventListener('click', listener);
});
}
}, },
beforeDestroy() { beforeDestroy() {
this.popper && this.popper.destroy(); this.popper && this.popper.destroy();
@ -52,11 +72,25 @@ export default {
methods: { methods: {
setupPopper() { setupPopper() {
if (!this.popper) { if (!this.popper) {
this.popper = new Popper(this.$refs.reference, this.$refs.popover, { this.popper = createPopper(this.$refs.reference, this.$refs.popover, {
placement: this.right ? 'bottom-end' : 'bottom-start' placement: this.placement,
modifiers: [
{
name: 'arrow',
options: {
element: this.$refs['popover-arrow']
}
},
{
name: 'offset',
options: {
offset: [0, 10]
}
}
]
}); });
} else { } else {
this.popper.scheduleUpdate(); this.popper.update();
} }
}, },
togglePopover(flag) { togglePopover(flag) {
@ -90,3 +124,36 @@ export default {
} }
}; };
</script> </script>
<style scoped>
.popover-arrow,
.popover-arrow::after {
position: absolute;
width: theme('spacing.3');
height: theme('spacing.3');
z-index: -1;
}
.popover-arrow::after {
content: '';
background: white;
transform: rotate(45deg);
border-top: 1px solid theme('borderColor.gray.400');
border-left: 1px solid theme('borderColor.gray.400');
}
.popover-container[data-popper-placement^='top'] > .popover-arrow {
bottom: -6px;
}
.popover-container[data-popper-placement^='bottom'] > .popover-arrow {
top: -6px;
}
.popover-container[data-popper-placement^='left'] > .popover-arrow {
right: -6px;
}
.popover-container[data-popper-placement^='right'] > .popover-arrow {
left: -6px;
}
</style>

View File

@ -803,6 +803,11 @@
"@nodelib/fs.scandir" "2.1.3" "@nodelib/fs.scandir" "2.1.3"
fastq "^1.6.0" fastq "^1.6.0"
"@popperjs/core@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.0.3.tgz#e18b505eb2ac5aeb4df4b41d69b324149f1bb9fd"
integrity sha512-LruFy9VJw+RdsvWXUCmqmCFBb5Q0YrbJ8qMDnjoXxTuOSwsmDgXw3sIgEIy0eRnKpdHMV8UOPnRRJNDRcidlCA==
"@samverschueren/stream-to-observable@^0.3.0": "@samverschueren/stream-to-observable@^0.3.0":
version "0.3.0" version "0.3.0"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@ -8248,7 +8253,7 @@ please-upgrade-node@^3.1.1:
dependencies: dependencies:
semver-compare "^1.0.0" semver-compare "^1.0.0"
popper.js@^1.14.3, popper.js@^1.16.0: popper.js@^1.14.3:
version "1.16.0" version "1.16.0"
resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.0.tgz#2e1816bcbbaa518ea6c2e15a466f4cb9c6e2fbb3"
integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw== integrity sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==