diff --git a/src/plugins/condition/components/Condition.vue b/src/plugins/condition/components/Condition.vue index 3d93f5d9f0..59e93794ea 100644 --- a/src/plugins/condition/components/Condition.vue +++ b/src/plugins/condition/components/Condition.vue @@ -21,167 +21,159 @@ *****************************************************************************/ @@ -215,14 +207,6 @@ export default { type: Array, required: true, default: () => [] - }, - isDragging: { - type: Boolean, - default: false - }, - moveIndex: { - type: Number, - default: 0 } }, data() { @@ -233,8 +217,8 @@ export default { selectedOutputSelection: '', outputOptions: ['false', 'true', 'string'], criterionIndex: 0, - draggingOver: false, - isDefault: this.condition.isDefault + selectedTelemetryName: '', + selectedFieldName: '' }; }, computed: { @@ -302,39 +286,11 @@ export default { dragStart(e) { e.dataTransfer.setData('dragging', e.target); // required for FF to initiate drag e.dataTransfer.effectAllowed = "copyMove"; - e.dataTransfer.setDragImage(e.target.closest('.c-condition-h'), 0, 0); + e.dataTransfer.setDragImage(e.target.closest('.js-condition-drag-wrapper'), 0, 0); this.$emit('setMoveIndex', this.conditionIndex); }, - dragEnd(event) { - this.dragStarted = false; - event.dataTransfer.clearData(); - this.$emit('dragComplete'); - }, - dropCondition(event, targetIndex) { - if (!this.isDragging) { return } - if (targetIndex > this.moveIndex) { targetIndex-- } // for 'downward' move - if (this.isValidTarget(targetIndex)) { - this.dragElement = undefined; - this.draggingOver = false; - this.$emit('dropCondition', targetIndex); - } - }, - dragEnter(event, targetIndex) { - if (!this.isDragging) { return } - if (targetIndex > this.moveIndex) { targetIndex-- } // for 'downward' move - if (this.isValidTarget(targetIndex)) { - this.dragElement = event.target.parentElement; - this.draggingOver = true; - } - }, - dragLeave(event) { - if (event.target.parentElement === this.dragElement) { - this.draggingOver = false; - this.dragElement = undefined; - } - }, - isValidTarget(targetIndex) { - return this.moveIndex !== targetIndex; + dragStop(e) { + e.dataTransfer.clearData(); }, destroy() { }, diff --git a/src/plugins/condition/components/ConditionCollection.vue b/src/plugins/condition/components/ConditionCollection.vue index ea5f601e40..f3c290c7b6 100644 --- a/src/plugins/condition/components/ConditionCollection.vue +++ b/src/plugins/condition/components/ConditionCollection.vue @@ -52,24 +52,28 @@ Add Condition -
- +
+
+
+ +
@@ -104,10 +108,9 @@ export default { conditionResults: {}, conditions: [], telemetryObjs: [], - moveIndex: undefined, + moveIndex: Number, isDragging: false, - defaultOutput: undefined, - dragCounter: 0 + defaultOutput: undefined }; }, watch: { @@ -162,7 +165,9 @@ export default { this.moveIndex = index; this.isDragging = true; }, - dropCondition(targetIndex) { + dropCondition(e) { + let targetIndex = Array.from(document.querySelectorAll('.c-c__drag-ghost')).indexOf(e.target); + if (targetIndex > this.moveIndex) { targetIndex-- } // for 'downward' move const oldIndexArr = Object.keys(this.conditionCollection); const move = function (arr, old_index, new_index) { while (old_index < 0) { @@ -188,10 +193,20 @@ export default { } this.reorder(reorderPlan); - }, - dragComplete() { + + e.target.classList.remove("dragging"); this.isDragging = false; }, + dragEnter(e) { + if (!this.isDragging) { return } + let targetIndex = Array.from(document.querySelectorAll('.c-c__drag-ghost')).indexOf(e.target); + if (targetIndex > this.moveIndex) { targetIndex-- } // for 'downward' move + if (this.moveIndex === targetIndex) { return } + e.target.classList.add("dragging"); + }, + dragLeave(e) { + e.target.classList.remove("dragging"); + }, addTelemetryObject(domainObject) { this.telemetryObjs.push(domainObject); this.$emit('telemetryUpdated', this.telemetryObjs); diff --git a/src/plugins/condition/components/conditionals.scss b/src/plugins/condition/components/conditionals.scss index 9592f89d8c..8dd1cceb2d 100644 --- a/src/plugins/condition/components/conditionals.scss +++ b/src/plugins/condition/components/conditionals.scss @@ -19,129 +19,260 @@ * this source code distribution or the Licensing information page available * at runtime from the About dialog for additional information. *****************************************************************************/ -/***************************** DRAGGING */ -.is-active-dragging { - .c-condition-h__drop-target { - height: 3px; - margin-bottom: $interiorMarginSm; - } -} -.c-condition-h { - &__drop-target { - border-radius: $controlCr; - height: 0; - min-height: 0; - transition: background-color, height; - transition-duration: 150ms; +.c-cs { + display: flex; + flex-direction: column; + height: 100%; + overflow: hidden; + + /************************** CONDITION SET LAYOUT */ + &__current-output { + flex: 0 0 auto; } - &.is-drag-target { - .c-condition > * { - pointer-events: none; // Keeps the JS drop handler from being intercepted by internal elements + &__test-data-and-conditions-w { + display: flex; + flex-direction: column; + flex: 1 1 auto; + height: 100%; + overflow: hidden; + } + + &__test-data, + &__conditions { + flex: 0 0 auto; + overflow: hidden; + } + + &__test-data { + flex: 0 0 auto; + max-height: 50%; + + &.is-expanded { + margin-bottom: $interiorMargin * 4; + } + } + + &__conditions { + flex: 1 1 auto; + + > * + * { + margin-top: $interiorMarginSm; + } + } + + &__content { + display: flex; + flex-direction: column; + flex: 0 1 auto; + overflow: hidden; + + > * { + flex: 0 0 auto; + overflow: hidden; + + * { + margin-top: $interiorMarginSm; + } } - .c-condition-h__drop-target { - background-color: rgba($colorKey, 0.7); + .c-button { + align-self: start; + } + } + + .is-editing & { + // Add some space to kick away from blue editing border indication + padding: $interiorMargin; + } + + section { + display: flex; + flex-direction: column; + overflow: hidden; + } + + &__conditions-h { + display: flex; + flex-direction: column; + flex: 1 1 auto; + overflow: auto; + padding-right: $interiorMarginSm; + + > * + * { + margin-top: $interiorMarginSm; + } + } + + .hint { + padding: $interiorMarginSm; + } + + /************************** SPECIFIC ITEMS */ + &__current-output-value { + flex-direction: row; + align-items: baseline; + padding: 0 $interiorMargin $interiorMarginLg $interiorMargin; + + > * { + padding: $interiorMargin 0; // Must do this to align label and value + } + + &__label { + color: $colorInspectorSectionHeaderFg; + opacity: 0.9; + text-transform: uppercase; + } + + &__value { + $p: $interiorMargin * 3; + font-size: 1.25em; + margin-left: $interiorMargin; + padding-left: $p; + padding-right: $p; + background: rgba(black, 0.2); + border-radius: 5px; } } } - .c-condition, - .c-test-datum { - @include discreteItem(); - display: flex; - padding: $interiorMargin; - &--edit { - line-height: 160%; // For layout when inputs wrap, like in criteria - } - } +/***************************** CONDITIONS AND TEST DATUM ELEMENTS */ +.c-condition, +.c-test-datum { + @include discreteItem(); + display: flex; + padding: $interiorMargin; + line-height: 170%; // Aligns text with controls like selects +} - .c-condition { - flex-direction: column; - min-width: 400px; +.c-cdef, +.c-cs-test { + &__controls { + display: flex; + flex: 1 1 auto; + flex-wrap: wrap; - > * + * { - margin-top: $interiorMarginSm; - } - &--browse { - .c-condition__summary { - border-top: 1px solid $colorInteriorBorder; - padding-top: $interiorMargin; - } - } + > * > * { + margin-right: $interiorMarginSm; + } + } - /***************************** HEADER */ - &__header { - $h: 22px; - display: flex; - align-items: start; - align-content: stretch; - overflow: hidden; - min-height: $h; - line-height: $h; + &__buttons { + white-space: nowrap; + } +} - > * { - flex: 0 0 auto; - + * { - margin-left: $interiorMarginSm; - } - } - } +.c-condition { + flex-direction: column; + min-width: 400px; - &__drag-grippy { - transform: translateY(50%); - } + > * + * { + margin-top: $interiorMarginSm; + } + &--browse { + .c-condition__summary { + border-top: 1px solid $colorInteriorBorder; + padding-top: $interiorMargin; + } + } - &__name { - font-weight: bold; - align-self: baseline; // Fixes bold line-height offset problem - } + /***************************** HEADER */ + &__header { + $h: 22px; + display: flex; + align-items: start; + align-content: stretch; + overflow: hidden; + min-height: $h; + line-height: $h; - &__output, - &__summary { - flex: 1 1 auto; - } - } + > * { + flex: 0 0 auto; + + * { + margin-left: $interiorMarginSm; + } + } + } - /***************************** CONDITION DEFINITION, EDITING */ - .c-cdef { - display: grid; - grid-row-gap: $interiorMarginSm; - grid-column-gap: $interiorMargin; - grid-auto-columns: min-content 1fr max-content; - align-items: start; - min-width: 150px; - margin-left: 29px; - overflow: hidden; + &__drag-grippy { + transform: translateY(50%); + } - &__criteria, - &__match-and-criteria { - display: contents; - } + &__name { + font-weight: bold; + align-self: baseline; // Fixes bold line-height offset problem + } - &__label { - grid-column: 1; - text-align: right; - white-space: nowrap; - } + &__output, + &__summary { + flex: 1 1 auto; + } +} - &__separator { - grid-column: 1 / span 3; - } +/***************************** CONDITION DEFINITION, EDITING */ +.c-cdef { + display: grid; + grid-row-gap: $interiorMarginSm; + grid-column-gap: $interiorMargin; + grid-auto-columns: min-content 1fr max-content; + align-items: start; + min-width: 150px; + margin-left: 29px; + overflow: hidden; - &__controls { - display: flex; - flex-wrap: wrap; - align-items: flex-start; - grid-column: 2; + &__criteria, + &__match-and-criteria { + display: contents; + } - > * > * { - margin-right: $interiorMarginSm; - } - } + &__label { + grid-column: 1; + text-align: right; + white-space: nowrap; + } - &__buttons { - grid-column: 3; - } - } + &__separator { + grid-column: 1 / span 3; + } + + &__controls { + align-items: flex-start; + grid-column: 2; + + > * > * { + margin-right: $interiorMarginSm; + } + } + + &__buttons { + grid-column: 3; + } +} + +.c-c__drag-ghost { + width: 100%; + min-height: $interiorMarginSm; + + &.dragging { + min-height: 5em; + background-color: lightblue; + border-radius: 2px; + } +} + +/***************************** TEST DATA */ +.c-cs-tests { + flex: 0 1 auto; + overflow: auto; + padding-right: $interiorMarginSm; + + > * + * { + margin-top: $interiorMarginSm; + } +} + +.c-cs-test { + > * + * { + margin-left: $interiorMargin; + } +}