From 71a24db47b81ac633340f53bcbe7d5f6005371e1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 19 Jan 2022 03:29:03 +0100 Subject: [PATCH] Avoid string comparison for QueryBuilderGroup identification As reported by @ucuncuatabek [[1]](https://github.com/rtucek/vue-query-builder/issues/61#issuecomment-1005849690) and @janhorubala [[2]](https://github.com/dabernathy89/vue-query-builder/issues/70#issue-953708668), this is an attempt to fix odd drag'n'drop behaviour with production builds. --- src/MergeTrap.ts | 3 ++- src/QueryBuilderGroup.vue | 6 ++++-- src/types.ts | 3 +++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/MergeTrap.ts b/src/MergeTrap.ts index 81ca408..89628b1 100644 --- a/src/MergeTrap.ts +++ b/src/MergeTrap.ts @@ -1,5 +1,6 @@ import Vue from 'vue'; import { + QueryBuilderGroupSym, RuleSet, QueryBuilderGroup, ComponentRegistration, MergeTrap as MergeTrapInterface, Rule, } from '@/types'; @@ -12,7 +13,7 @@ function getNextGroup(group: QueryBuilderGroup): QueryBuilderGroup { do { vm = vm.$parent; - } while (vm.$options.name !== 'QueryBuilderGroup'); + } while ((vm as QueryBuilderGroup).type !== QueryBuilderGroupSym); return vm as QueryBuilderGroup; } diff --git a/src/QueryBuilderGroup.vue b/src/QueryBuilderGroup.vue index 2a0cc58..c9d4d11 100644 --- a/src/QueryBuilderGroup.vue +++ b/src/QueryBuilderGroup.vue @@ -7,7 +7,7 @@ import Draggable, { } from 'vuedraggable'; import Sortable, { SortableOptions, PutResult } from 'sortablejs'; import { - QueryBuilderConfig, RuleSet, Rule, OperatorDefinition, RuleDefinition, + QueryBuilderConfig, RuleSet, Rule, OperatorDefinition, RuleDefinition, QueryBuilderGroupSym, GroupOperatorSlotProps, GroupCtrlSlotProps, QueryBuilderGroup as QueryBuilderGroupInterface, } from '@/types'; import { isQueryBuilderConfig, isRule } from '@/guards'; @@ -79,7 +79,9 @@ export default class QueryBuilderGroup extends Vue implements QueryBuilderGroupI trap: ((position: number, newChild: RuleSet | Rule) => void) | null = null; - selectedRule: string = '' + selectedRule: string = ''; + + type: Symbol = QueryBuilderGroupSym; get children(): Array { if (this.maxDepthExeeded) { diff --git a/src/types.ts b/src/types.ts index 8f43ecc..e6cc1f9 100644 --- a/src/types.ts +++ b/src/types.ts @@ -50,11 +50,14 @@ export interface RuleSlotProps { updateRuleData: (newData: any) => void, } +export const QueryBuilderGroupSym = Symbol('QueryBuilderGroup'); + export interface QueryBuilderGroup extends Vue { selectedOperator: string, depth: number, trap: ((position: number, newChild: RuleSet | Rule) => void) | null, children: Array, + type: Symbol, } export interface ComponentRegistration {