NodePreviewZone.vue 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <div
  3. id="preview-zone"
  4. class="preview-zone" :class="{ 'no-events-container': value === null }"
  5. @mousedown="onZoneClick"
  6. >
  7. <b-popover
  8. v-for="node in nodes" :key="'popover-' + node.id"
  9. custom-class="popover-node-preview"
  10. :target="'preview-node-' + node.id" container="preview-zone"
  11. placement="auto" triggers="manual"
  12. >
  13. <node-view
  14. :node="node"
  15. mode="card" preview
  16. @open-node="$emit('open-node', $event)"
  17. @open-child="$emit('open-node', { parentId: node.id, ...$event })"
  18. />
  19. </b-popover>
  20. </div>
  21. </template>
  22. <script>
  23. import { NodeView } from '@/components/nodes'
  24. export default {
  25. name: 'NodePreviewZone',
  26. components: {
  27. NodeView
  28. },
  29. props: {
  30. value: { type: Object, default: null },
  31. nodes: { type: Array, required: true }
  32. },
  33. methods: {
  34. onZoneClick (e) {
  35. if (this.value) {
  36. if (e.target.id !== 'preview-zone') return
  37. this.$root.$emit('bv::hide::popover', 'preview-node-' + this.value.id)
  38. this.$emit('input', null)
  39. }
  40. }
  41. }
  42. }
  43. </script>
  44. <style lang="scss">
  45. .preview-zone {
  46. position: absolute;
  47. top: 0;
  48. height: 100%;
  49. width: 100%;
  50. }
  51. .popover-node-preview {
  52. max-width: 100%;
  53. .popover-body {
  54. padding: 0;
  55. }
  56. .node-view {
  57. width: $node-card-width-sm;
  58. max-width: 100%;
  59. max-height: 100%;
  60. @include media-breakpoint-up($size-bp) {
  61. width: $node-card-width;
  62. }
  63. &-wrapper {
  64. height: $node-card-height-sm;
  65. @include media-breakpoint-up($size-bp) {
  66. height: $node-card-height;
  67. }
  68. }
  69. }
  70. }
  71. </style>