mirror of
https://github.com/nasa/openmct.git
synced 2025-05-29 05:34:18 +00:00
[clock] Timezone dropdown will collapse when clicked outside or on dropdown icon again (#4956)
* Fix timezone dropdown collapse issue * Dropdown should collapse when click outside * Fix Lint error * add e2e test for autocomplete * updates based of code review * Typo fixed * Modification based on review Co-authored-by: Scott Bell <scott@traclabs.com>
This commit is contained in:
parent
0705d321da
commit
cf5edf2db0
66
e2e/tests/example/generator/Clock.e2e.spec.js
Normal file
66
e2e/tests/example/generator/Clock.e2e.spec.js
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2022, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test suite is dedicated to tests which verify the basic operations surrounding Clock.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
|
||||||
|
test.describe('Clock Generator', () => {
|
||||||
|
|
||||||
|
test('Timezone dropdown will collapse when clicked outside or on dropdown icon again', async ({ page }) => {
|
||||||
|
test.info().annotations.push({
|
||||||
|
type: 'issue',
|
||||||
|
description: 'https://github.com/nasa/openmct/issues/4878'
|
||||||
|
});
|
||||||
|
//Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Click Clock
|
||||||
|
await page.click('text=Clock');
|
||||||
|
|
||||||
|
// Click .icon-arrow-down
|
||||||
|
await page.locator('.icon-arrow-down').click();
|
||||||
|
//verify if the autocomplete dropdown is visible
|
||||||
|
await expect(page.locator(".optionPreSelected")).toBeVisible();
|
||||||
|
// Click .icon-arrow-down
|
||||||
|
await page.locator('.icon-arrow-down').click();
|
||||||
|
|
||||||
|
// Verify clicking on the autocomplete arrow collapses the dropdown
|
||||||
|
await expect(page.locator(".optionPreSelected")).not.toBeVisible();
|
||||||
|
|
||||||
|
// Click timezone input to open dropdown
|
||||||
|
await page.locator('.autocompleteInput').click();
|
||||||
|
//verify if the autocomplete dropdown is visible
|
||||||
|
await expect(page.locator(".optionPreSelected")).toBeVisible();
|
||||||
|
|
||||||
|
// Verify clicking outside the autocomplete dropdown collapses it
|
||||||
|
await page.locator('text=Timezone').click();
|
||||||
|
// Verify clicking on the autocomplete arrow collapses the dropdown
|
||||||
|
await expect(page.locator(".optionPreSelected")).not.toBeVisible();
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
@ -65,10 +65,11 @@ export default class FormControl {
|
|||||||
*/
|
*/
|
||||||
_getControlViewProvider(control) {
|
_getControlViewProvider(control) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
let rowComponent;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
show(element, model, onChange) {
|
show(element, model, onChange) {
|
||||||
const rowComponent = new Vue({
|
rowComponent = new Vue({
|
||||||
el: element,
|
el: element,
|
||||||
components: {
|
components: {
|
||||||
FormControlComponent: DEFAULT_CONTROLS_MAP[control]
|
FormControlComponent: DEFAULT_CONTROLS_MAP[control]
|
||||||
@ -86,6 +87,9 @@ export default class FormControl {
|
|||||||
});
|
});
|
||||||
|
|
||||||
return rowComponent;
|
return rowComponent;
|
||||||
|
},
|
||||||
|
destroy() {
|
||||||
|
rowComponent.$destroy();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -22,17 +22,19 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="form-control autocomplete">
|
<div class="form-control autocomplete">
|
||||||
<input
|
<span class="autocompleteInputAndArrow">
|
||||||
v-model="field"
|
<input
|
||||||
class="autocompleteInput"
|
v-model="field"
|
||||||
type="text"
|
class="autocompleteInput"
|
||||||
@click="inputClicked()"
|
type="text"
|
||||||
@keydown="keyDown($event)"
|
@click="inputClicked()"
|
||||||
>
|
@keydown="keyDown($event)"
|
||||||
<span
|
>
|
||||||
class="icon-arrow-down"
|
<span
|
||||||
@click="arrowClicked()"
|
class="icon-arrow-down"
|
||||||
></span>
|
@click="arrowClicked()"
|
||||||
|
></span>
|
||||||
|
</span>
|
||||||
<div
|
<div
|
||||||
class="autocompleteOptions"
|
class="autocompleteOptions"
|
||||||
@blur="hideOptions = true"
|
@blur="hideOptions = true"
|
||||||
@ -108,10 +110,21 @@ export default {
|
|||||||
|
|
||||||
this.$emit('onChange', data);
|
this.$emit('onChange', data);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
hideOptions(newValue) {
|
||||||
|
if (!newValue) {
|
||||||
|
// adding a event listener when the hideOpntions is false (dropdown is visible)
|
||||||
|
// handleoutsideclick can collapse the dropdown when clicked outside autocomplete
|
||||||
|
document.body.addEventListener('click', this.handleOutsideClick);
|
||||||
|
} else {
|
||||||
|
//removing event listener when hideOptions become true (dropdown is collapsed)
|
||||||
|
document.body.removeEventListener('click', this.handleOutsideClick);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.options = this.model.options;
|
this.options = this.model.options;
|
||||||
|
this.autocompleteInputAndArrow = this.$el.getElementsByClassName('autocompleteInputAndArrow')[0];
|
||||||
this.autocompleteInputElement = this.$el.getElementsByClassName('autocompleteInput')[0];
|
this.autocompleteInputElement = this.$el.getElementsByClassName('autocompleteInput')[0];
|
||||||
if (this.options[0].name) {
|
if (this.options[0].name) {
|
||||||
// If "options" include name, value pair
|
// If "options" include name, value pair
|
||||||
@ -123,6 +136,9 @@ export default {
|
|||||||
this.optionNames = this.options;
|
this.optionNames = this.options;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
destroyed() {
|
||||||
|
document.body.removeEventListener('click', this.handleOutsideClick);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
decrementOptionIndex() {
|
decrementOptionIndex() {
|
||||||
if (this.optionIndex === 0) {
|
if (this.optionIndex === 0) {
|
||||||
@ -176,7 +192,21 @@ export default {
|
|||||||
// to show them all the options
|
// to show them all the options
|
||||||
this.showFilteredOptions = false;
|
this.showFilteredOptions = false;
|
||||||
this.autocompleteInputElement.select();
|
this.autocompleteInputElement.select();
|
||||||
this.showOptions();
|
|
||||||
|
if (this.hideOptions) {
|
||||||
|
this.showOptions();
|
||||||
|
} else {
|
||||||
|
this.hideOptions = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
},
|
||||||
|
handleOutsideClick(event) {
|
||||||
|
// if click event is detected outside autocomplete (both input & arrow) while the
|
||||||
|
// dropdown is visible, this will collapse the dropdown.
|
||||||
|
const clickedInsideAutocomplete = this.autocompleteInputAndArrow.contains(event.target);
|
||||||
|
if (!clickedInsideAutocomplete && !this.hideOptions) {
|
||||||
|
this.hideOptions = true;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
optionMouseover(optionId) {
|
optionMouseover(optionId) {
|
||||||
this.optionIndex = optionId;
|
this.optionIndex = optionId;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user