q2-tecton-elements 1.47.0 → 1.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/click-elsewhere_2.cjs.entry.js +43 -7
- package/dist/cjs/click-elsewhere_2.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/q2-chart-donut.cjs.entry.js +7 -4
- package/dist/cjs/q2-chart-donut.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-data-table.cjs.entry.js +8 -5
- package/dist/cjs/q2-data-table.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-dropdown-item.cjs.entry.js +13 -4
- package/dist/cjs/q2-dropdown-item.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-editable-field.cjs.entry.js +36 -27
- package/dist/cjs/q2-editable-field.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-input.cjs.entry.js +2 -2
- package/dist/cjs/q2-input.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-option-list.cjs.entry.js +2 -3
- package/dist/cjs/q2-option-list.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-relative-time.cjs.entry.js +34 -17
- package/dist/cjs/q2-relative-time.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-section.cjs.entry.js +2 -2
- package/dist/cjs/q2-section.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-select.cjs.entry.js +7 -2
- package/dist/cjs/q2-select.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-stepper.cjs.entry.js +2 -2
- package/dist/cjs/q2-stepper.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js +1 -1
- package/dist/cjs/q2-tab-container.cjs.entry.js.map +1 -1
- package/dist/cjs/q2-tecton-elements.cjs.js +1 -1
- package/dist/collection/components/q2-chart-donut/q2-chart-donut.js +7 -4
- package/dist/collection/components/q2-chart-donut/q2-chart-donut.js.map +1 -1
- package/dist/collection/components/q2-data-table/q2-data-table.css +15 -1
- package/dist/collection/components/q2-data-table/q2-data-table.js +28 -8
- package/dist/collection/components/q2-data-table/q2-data-table.js.map +1 -1
- package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js +22 -5
- package/dist/collection/components/q2-dropdown-item/q2-dropdown-item.js.map +1 -1
- package/dist/collection/components/q2-editable-field/q2-editable-field.js +41 -29
- package/dist/collection/components/q2-editable-field/q2-editable-field.js.map +1 -1
- package/dist/collection/components/q2-input/q2-input.js +22 -19
- package/dist/collection/components/q2-input/q2-input.js.map +1 -1
- package/dist/collection/components/q2-option-list/q2-option-list.js +2 -3
- package/dist/collection/components/q2-option-list/q2-option-list.js.map +1 -1
- package/dist/collection/components/q2-popover/q2-popover.js +43 -7
- package/dist/collection/components/q2-popover/q2-popover.js.map +1 -1
- package/dist/collection/components/q2-relative-time/q2-relative-time.js +79 -25
- package/dist/collection/components/q2-relative-time/q2-relative-time.js.map +1 -1
- package/dist/collection/components/q2-section/q2-section.js +7 -4
- package/dist/collection/components/q2-section/q2-section.js.map +1 -1
- package/dist/collection/components/q2-select/q2-select.js +7 -2
- package/dist/collection/components/q2-select/q2-select.js.map +1 -1
- package/dist/collection/components/q2-stepper/q2-stepper.js +2 -2
- package/dist/collection/components/q2-stepper/q2-stepper.js.map +1 -1
- package/dist/collection/components/q2-tab-container/q2-tab-container.css +2 -1
- package/dist/components/q2-chart-donut.js +7 -4
- package/dist/components/q2-chart-donut.js.map +1 -1
- package/dist/components/q2-data-table.js +10 -6
- package/dist/components/q2-data-table.js.map +1 -1
- package/dist/components/q2-dropdown-item2.js +16 -6
- package/dist/components/q2-dropdown-item2.js.map +1 -1
- package/dist/components/q2-editable-field.js +37 -28
- package/dist/components/q2-editable-field.js.map +1 -1
- package/dist/components/q2-input2.js +3 -3
- package/dist/components/q2-input2.js.map +1 -1
- package/dist/components/q2-option-list2.js +2 -3
- package/dist/components/q2-option-list2.js.map +1 -1
- package/dist/components/q2-popover2.js +43 -7
- package/dist/components/q2-popover2.js.map +1 -1
- package/dist/components/q2-relative-time.js +37 -18
- package/dist/components/q2-relative-time.js.map +1 -1
- package/dist/components/q2-section.js +2 -2
- package/dist/components/q2-section.js.map +1 -1
- package/dist/components/q2-select2.js +7 -2
- package/dist/components/q2-select2.js.map +1 -1
- package/dist/components/q2-stepper.js +2 -2
- package/dist/components/q2-stepper.js.map +1 -1
- package/dist/components/q2-tab-container.js +1 -1
- package/dist/components/q2-tab-container.js.map +1 -1
- package/dist/esm/click-elsewhere_2.entry.js +43 -7
- package/dist/esm/click-elsewhere_2.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/q2-chart-donut.entry.js +7 -4
- package/dist/esm/q2-chart-donut.entry.js.map +1 -1
- package/dist/esm/q2-data-table.entry.js +8 -5
- package/dist/esm/q2-data-table.entry.js.map +1 -1
- package/dist/esm/q2-dropdown-item.entry.js +14 -5
- package/dist/esm/q2-dropdown-item.entry.js.map +1 -1
- package/dist/esm/q2-editable-field.entry.js +37 -28
- package/dist/esm/q2-editable-field.entry.js.map +1 -1
- package/dist/esm/q2-input.entry.js +2 -2
- package/dist/esm/q2-input.entry.js.map +1 -1
- package/dist/esm/q2-option-list.entry.js +2 -3
- package/dist/esm/q2-option-list.entry.js.map +1 -1
- package/dist/esm/q2-relative-time.entry.js +34 -17
- package/dist/esm/q2-relative-time.entry.js.map +1 -1
- package/dist/esm/q2-section.entry.js +2 -2
- package/dist/esm/q2-section.entry.js.map +1 -1
- package/dist/esm/q2-select.entry.js +7 -2
- package/dist/esm/q2-select.entry.js.map +1 -1
- package/dist/esm/q2-stepper.entry.js +2 -2
- package/dist/esm/q2-stepper.entry.js.map +1 -1
- package/dist/esm/q2-tab-container.entry.js +1 -1
- package/dist/esm/q2-tab-container.entry.js.map +1 -1
- package/dist/esm/q2-tecton-elements.js +1 -1
- package/dist/q2-tecton-elements/p-11982614.entry.js +2 -0
- package/dist/q2-tecton-elements/p-11982614.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-e25194ce.entry.js → p-24719520.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-24719520.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-30296b0e.entry.js +2 -0
- package/dist/q2-tecton-elements/p-30296b0e.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-b849365e.entry.js → p-32b56406.entry.js} +2 -2
- package/dist/q2-tecton-elements/{p-b849365e.entry.js.map → p-32b56406.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/p-43236cac.entry.js +2 -0
- package/dist/q2-tecton-elements/p-43236cac.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-6f2de185.entry.js → p-4f7e6e79.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-4f7e6e79.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-a3d58a50.entry.js → p-56dd051a.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-56dd051a.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-6986a60e.entry.js +2 -0
- package/dist/q2-tecton-elements/{p-6eac40be.entry.js.map → p-6986a60e.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/{p-774975fa.entry.js → p-6fdda37e.entry.js} +2 -2
- package/dist/q2-tecton-elements/p-6fdda37e.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-75bb43b2.entry.js +2 -0
- package/dist/q2-tecton-elements/p-75bb43b2.entry.js.map +1 -0
- package/dist/q2-tecton-elements/p-9a71bd16.entry.js +2 -0
- package/dist/q2-tecton-elements/p-9a71bd16.entry.js.map +1 -0
- package/dist/q2-tecton-elements/{p-c9ee763d.entry.js → p-f4b28e89.entry.js} +2 -2
- package/dist/q2-tecton-elements/{p-c9ee763d.entry.js.map → p-f4b28e89.entry.js.map} +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js +1 -1
- package/dist/q2-tecton-elements/q2-tecton-elements.esm.js.map +1 -1
- package/dist/test/elements/q2-chart-donut-test.e2e.js +9 -1
- package/dist/test/elements/q2-chart-donut-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-data-table-test.e2e.js +107 -11
- package/dist/test/elements/q2-data-table-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-dropdown-item-test.e2e.js +183 -104
- package/dist/test/elements/q2-dropdown-item-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-editable-field-test.e2e.js +436 -418
- package/dist/test/elements/q2-editable-field-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-popover-test.spec.js +162 -31
- package/dist/test/elements/q2-popover-test.spec.js.map +1 -1
- package/dist/test/elements/q2-relative-time-test.e2e.js +65 -40
- package/dist/test/elements/q2-relative-time-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-select-test.e2e.js +53 -22
- package/dist/test/elements/q2-select-test.e2e.js.map +1 -1
- package/dist/test/elements/q2-stepper-test.e2e.js +23 -0
- package/dist/test/elements/q2-stepper-test.e2e.js.map +1 -1
- package/dist/types/components/q2-input/q2-input.d.ts +15 -1
- package/dist/types/components/q2-popover/q2-popover.d.ts +2 -0
- package/dist/types/components/q2-relative-time/q2-relative-time.d.ts +25 -11
- package/dist/types/components/q2-section/q2-section.d.ts +10 -2
- package/dist/types/components.d.ts +53 -22
- package/dist/types/workspace/workspace/_Gitlab_tecton-production_master/packages/q2-tecton-elements/.stencil/test/helpers.d.ts +1 -1
- package/package.json +3 -3
- package/dist/q2-tecton-elements/p-0e27ea75.entry.js +0 -2
- package/dist/q2-tecton-elements/p-0e27ea75.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-45d70da2.entry.js +0 -2
- package/dist/q2-tecton-elements/p-45d70da2.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-52e277b8.entry.js +0 -2
- package/dist/q2-tecton-elements/p-52e277b8.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-6eac40be.entry.js +0 -2
- package/dist/q2-tecton-elements/p-6f2de185.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-774975fa.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-a3d58a50.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-e25194ce.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-f450db0b.entry.js +0 -2
- package/dist/q2-tecton-elements/p-f450db0b.entry.js.map +0 -1
- package/dist/q2-tecton-elements/p-fce6bc58.entry.js +0 -2
- package/dist/q2-tecton-elements/p-fce6bc58.entry.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { setTestStrings, setup, dispatchEvent, getActiveElementTestId, testDeprecatedAriaLabel, getNestedElementStyle, getNestedElementProperty, getListOfStyleCompilationIssues, } from "../helpers";
|
|
1
|
+
import { setTestStrings, setup, dispatchEvent, getActiveElementTestId, testDeprecatedAriaLabel, getNestedElementStyle, getNestedElementProperty, getListOfStyleCompilationIssues, evaluateA11y, } from "../helpers";
|
|
2
2
|
describe('q2-editable-field', () => {
|
|
3
3
|
let page;
|
|
4
4
|
let editableField;
|
|
@@ -7,194 +7,9 @@ describe('q2-editable-field', () => {
|
|
|
7
7
|
let saveButton;
|
|
8
8
|
let cancelButton;
|
|
9
9
|
it('properly compiles CSS vars and functions', async () => {
|
|
10
|
-
|
|
10
|
+
page = await setup({ html: '<q2-editable-field></q2-editable-field>' });
|
|
11
11
|
expect(await getListOfStyleCompilationIssues(page, 'q2-editable-field')).toHaveLength(0);
|
|
12
12
|
});
|
|
13
|
-
it('should render the component in the dom', async () => {
|
|
14
|
-
page = await setup({ html: `<q2-editable-field></q2-editable-field>` });
|
|
15
|
-
editableField = await page.find('q2-editable-field');
|
|
16
|
-
expect(editableField.tagName).toEqual('Q2-EDITABLE-FIELD');
|
|
17
|
-
const editStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(1)');
|
|
18
|
-
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
19
|
-
// both edit and read states render
|
|
20
|
-
expect(editStateWrapper).toBeTruthy();
|
|
21
|
-
expect(readStateWrapper).toBeTruthy();
|
|
22
|
-
});
|
|
23
|
-
it('it correctly renders the read state when label not persisted', async () => {
|
|
24
|
-
page = await setup({
|
|
25
|
-
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
26
|
-
});
|
|
27
|
-
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
28
|
-
const readStateHidden = await readStateWrapper.getProperty('hidden');
|
|
29
|
-
const readStateTextWrapper = await page.find('q2-editable-field >>> .text-wrapper');
|
|
30
|
-
const editButton = await page.find('q2-editable-field >>> .begin-edit');
|
|
31
|
-
expect(readStateHidden).toEqual(false);
|
|
32
|
-
expect(readStateWrapper).not.toHaveClass('editing');
|
|
33
|
-
// value rendered into text wrapper
|
|
34
|
-
expect(readStateTextWrapper.textContent).toEqual('Test Value');
|
|
35
|
-
// edit button renders
|
|
36
|
-
expect(editButton).toBeTruthy();
|
|
37
|
-
});
|
|
38
|
-
it('it correctly renders the read state when label is persisted', async () => {
|
|
39
|
-
page = await setup({
|
|
40
|
-
html: `<q2-editable-field value="Test Value" label="Test Label" persistent-label></q2-editable-field>`,
|
|
41
|
-
});
|
|
42
|
-
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
43
|
-
expect(readStateWrapper).not.toHaveClass('editing');
|
|
44
|
-
expect(await readStateWrapper.getProperty('hidden')).toEqual(false);
|
|
45
|
-
const readStateLabel = await page.find('q2-editable-field >>> .read-state-label');
|
|
46
|
-
expect(readStateLabel).not.toBeNull;
|
|
47
|
-
expect(readStateLabel.tagName).toEqual('DT');
|
|
48
|
-
expect(readStateLabel.textContent).toEqual('Test Label');
|
|
49
|
-
const readStateTextWrapper = await page.find('q2-editable-field >>> .text-wrapper');
|
|
50
|
-
// value rendered into text wrapper
|
|
51
|
-
expect(readStateTextWrapper.textContent).toEqual('Test Value');
|
|
52
|
-
const editButton = await page.find('q2-editable-field >>> .begin-edit');
|
|
53
|
-
// edit button renders
|
|
54
|
-
expect(editButton).toBeTruthy();
|
|
55
|
-
});
|
|
56
|
-
it('correctly renders the edit state', async () => {
|
|
57
|
-
page = await setup({
|
|
58
|
-
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
59
|
-
});
|
|
60
|
-
const editStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(1)');
|
|
61
|
-
const innerInput = await page.find('q2-editable-field >>> q2-input');
|
|
62
|
-
expect(editStateWrapper).toHaveClass('editing');
|
|
63
|
-
// input renders
|
|
64
|
-
expect(innerInput).toBeTruthy();
|
|
65
|
-
const inputValue = await innerInput.getProperty('value');
|
|
66
|
-
// input value matches element value
|
|
67
|
-
expect(inputValue).toEqual('Test Value');
|
|
68
|
-
const cancelBtn = await page.find('q2-editable-field >>> .cancel-edit');
|
|
69
|
-
const saveBtn = await page.find('q2-editable-field >>> .save-edit');
|
|
70
|
-
expect(cancelBtn).toBeTruthy();
|
|
71
|
-
expect(saveBtn).toBeTruthy();
|
|
72
|
-
});
|
|
73
|
-
it('passes appropriate properties through to q2-input', async () => {
|
|
74
|
-
page = await setup({
|
|
75
|
-
html: `<q2-editable-field editing label="Test Label" type="testType" format-modifier="testFormatModifier" maxlength="10" value="Test Value"></q2-editable-field>`,
|
|
76
|
-
});
|
|
77
|
-
editableField = await page.find('q2-editable-field');
|
|
78
|
-
editableField.setProperty('errors', ['error1', 'error2']);
|
|
79
|
-
editableField.setProperty('hints', ['hint1', 'hint2']);
|
|
80
|
-
await page.waitForChanges();
|
|
81
|
-
const innerInput = await page.find('q2-editable-field >>> q2-input');
|
|
82
|
-
const inputType = await innerInput.getProperty('type');
|
|
83
|
-
const inputErrors = await innerInput.getProperty('errors');
|
|
84
|
-
const inputHints = await innerInput.getProperty('hints');
|
|
85
|
-
const inputLabel = await innerInput.getProperty('label');
|
|
86
|
-
const inputFormatter = await innerInput.getProperty('formatModifier');
|
|
87
|
-
const inputMaxLength = await innerInput.getProperty('maxlength');
|
|
88
|
-
expect(inputType).toEqual('testType');
|
|
89
|
-
expect(inputErrors).toEqual(['error1', 'error2']);
|
|
90
|
-
expect(inputHints).toEqual(['hint1', 'hint2']);
|
|
91
|
-
expect(inputLabel).toEqual('Test Label');
|
|
92
|
-
expect(inputFormatter).toEqual('testFormatModifier');
|
|
93
|
-
expect(inputMaxLength).toEqual(10);
|
|
94
|
-
expect(innerInput).not.toHaveAttribute('hide-label');
|
|
95
|
-
editableField.setProperty('ariaLabel', 'Test aria-label');
|
|
96
|
-
await page.waitForChanges();
|
|
97
|
-
expect(innerInput).toEqualAttribute('label', 'Test aria-label');
|
|
98
|
-
expect(innerInput).toHaveAttribute('hide-label');
|
|
99
|
-
});
|
|
100
|
-
it('correctly bubbles the q2-input input event', async function () {
|
|
101
|
-
page = await setup({
|
|
102
|
-
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
103
|
-
});
|
|
104
|
-
editableField = await page.find('q2-editable-field');
|
|
105
|
-
const inputEventSpy = await editableField.spyOnEvent('input');
|
|
106
|
-
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'input', {
|
|
107
|
-
detail: { value: 'testValue', formattedValue: 'formattedTestValue' },
|
|
108
|
-
});
|
|
109
|
-
expect(inputEventSpy).toHaveReceivedEventDetail({
|
|
110
|
-
value: 'testValue',
|
|
111
|
-
formattedValue: 'formattedTestValue',
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
it('correctly emits the change event data', async function () {
|
|
115
|
-
page = await setup({
|
|
116
|
-
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
117
|
-
});
|
|
118
|
-
editableField = await page.find('q2-editable-field');
|
|
119
|
-
const changeEventSpy = await editableField.spyOnEvent('change');
|
|
120
|
-
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
121
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({
|
|
122
|
-
value: 'Test Value',
|
|
123
|
-
editing: false,
|
|
124
|
-
name: 'save',
|
|
125
|
-
formattedValue: 'Test Value',
|
|
126
|
-
});
|
|
127
|
-
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
128
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({ editing: true, name: 'edit' });
|
|
129
|
-
await dispatchEvent(page, ['q2-editable-field', '.cancel-edit'], 'click');
|
|
130
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({ editing: false, name: 'cancel' });
|
|
131
|
-
});
|
|
132
|
-
it('allows custom handler to control the change event effects', async function () {
|
|
133
|
-
page = await setup({
|
|
134
|
-
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
135
|
-
});
|
|
136
|
-
editableField = await page.find('q2-editable-field');
|
|
137
|
-
let isEditing = await editableField.getProperty('editing');
|
|
138
|
-
await page.$eval('q2-editable-field', function (editableField) {
|
|
139
|
-
editableField.onchange = function (e) {
|
|
140
|
-
// basically don't allow editing value to change via change event
|
|
141
|
-
e.target.editing = !e.detail.editing;
|
|
142
|
-
};
|
|
143
|
-
});
|
|
144
|
-
await page.waitForChanges();
|
|
145
|
-
expect(isEditing).toEqual(true);
|
|
146
|
-
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
147
|
-
isEditing = await editableField.getProperty('editing');
|
|
148
|
-
// still editable because onchange event overwrote default behavior
|
|
149
|
-
expect(isEditing).toEqual(true);
|
|
150
|
-
// manually set editing to false to test inverse
|
|
151
|
-
editableField.setProperty('editing', false);
|
|
152
|
-
await page.waitForChanges();
|
|
153
|
-
isEditing = await editableField.getProperty('editing');
|
|
154
|
-
expect(isEditing).toEqual(false);
|
|
155
|
-
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
156
|
-
isEditing = await editableField.getProperty('editing');
|
|
157
|
-
// still false...
|
|
158
|
-
expect(isEditing).toEqual(false);
|
|
159
|
-
});
|
|
160
|
-
it('triggers change event from Escape and Enter keyboard events', async function () {
|
|
161
|
-
page = await setup({
|
|
162
|
-
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
163
|
-
});
|
|
164
|
-
editableField = await page.find('q2-editable-field');
|
|
165
|
-
const changeEventSpy = await editableField.spyOnEvent('change');
|
|
166
|
-
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', { key: 'Escape' });
|
|
167
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({ name: 'cancel', editing: false });
|
|
168
|
-
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
169
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({ name: 'edit', editing: true });
|
|
170
|
-
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', {
|
|
171
|
-
key: 'Enter',
|
|
172
|
-
bubbles: true,
|
|
173
|
-
});
|
|
174
|
-
expect(changeEventSpy).toHaveReceivedEventDetail({
|
|
175
|
-
name: 'save',
|
|
176
|
-
editing: false,
|
|
177
|
-
value: 'Test Value',
|
|
178
|
-
formattedValue: 'Test Value',
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
it('shifts focus on editing change', async function () {
|
|
182
|
-
page = await setup({
|
|
183
|
-
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
184
|
-
});
|
|
185
|
-
const editBtn = await page.find('q2-editable-field >>> .begin-edit');
|
|
186
|
-
const innerInput = await page.find('q2-editable-field >>> q2-input');
|
|
187
|
-
const inputFocusSpy = await innerInput.spyOnEvent('focus');
|
|
188
|
-
expect(inputFocusSpy).toHaveReceivedEventTimes(0);
|
|
189
|
-
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
190
|
-
// focus on input when switched to editing state
|
|
191
|
-
expect(inputFocusSpy).toHaveReceivedEventTimes(2); // 2 because of focus bubbling
|
|
192
|
-
const editBtnFocusSpy = await editBtn.spyOnEvent('focus');
|
|
193
|
-
expect(editBtnFocusSpy).toHaveReceivedEventTimes(0);
|
|
194
|
-
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
195
|
-
// edit button focused when changed to no longer editing
|
|
196
|
-
expect(editBtnFocusSpy).toHaveReceivedEventTimes(2); // 2 because of focus bubbling
|
|
197
|
-
});
|
|
198
13
|
it('localizes appropriate attribute strings', async function () {
|
|
199
14
|
page = await setup({
|
|
200
15
|
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
@@ -203,128 +18,449 @@ describe('q2-editable-field', () => {
|
|
|
203
18
|
'q2-editable-field.label': 'Label Text',
|
|
204
19
|
'q2-editable-field.ariaLabel': 'Aria-Label Text',
|
|
205
20
|
});
|
|
206
|
-
|
|
21
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
207
22
|
editableField = await page.find('q2-editable-field');
|
|
208
23
|
editableField.setProperty('label', 'q2-editable-field.label');
|
|
209
24
|
await page.waitForChanges();
|
|
210
|
-
expect(
|
|
211
|
-
expect(
|
|
25
|
+
expect(inputField).toEqualAttribute('label', 'Label Text');
|
|
26
|
+
expect(inputField).not.toHaveAttribute('hide-label');
|
|
212
27
|
editableField.setProperty('ariaLabel', 'q2-editable-field.ariaLabel');
|
|
213
28
|
await page.waitForChanges();
|
|
214
|
-
expect(
|
|
215
|
-
expect(
|
|
29
|
+
expect(inputField).toEqualAttribute('label', 'Aria-Label Text');
|
|
30
|
+
expect(inputField).toHaveAttribute('hide-label');
|
|
216
31
|
});
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
32
|
+
describe('[A11y] guideline compliance', () => {
|
|
33
|
+
it('Does not have accessibility violations', async () => {
|
|
34
|
+
page = await setup({
|
|
35
|
+
html: `<q2-editable-field label="Test Label"></q2-editable-field>`,
|
|
36
|
+
});
|
|
37
|
+
const hasViolations = await evaluateA11y(page);
|
|
38
|
+
expect(hasViolations).toBe(false);
|
|
220
39
|
});
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
40
|
+
});
|
|
41
|
+
describe('Rendering', () => {
|
|
42
|
+
it('should render the component in the dom', async () => {
|
|
43
|
+
page = await setup({ html: `<q2-editable-field></q2-editable-field>` });
|
|
44
|
+
editableField = await page.find('q2-editable-field');
|
|
45
|
+
expect(editableField.tagName).toEqual('Q2-EDITABLE-FIELD');
|
|
46
|
+
const editStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(1)');
|
|
47
|
+
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
48
|
+
// both edit and read states render
|
|
49
|
+
expect(editStateWrapper).toBeTruthy();
|
|
50
|
+
expect(readStateWrapper).toBeTruthy();
|
|
51
|
+
});
|
|
52
|
+
it('it correctly renders the read state when label not persisted', async () => {
|
|
53
|
+
page = await setup({
|
|
54
|
+
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
55
|
+
});
|
|
56
|
+
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
57
|
+
const readStateHidden = await readStateWrapper.getProperty('hidden');
|
|
58
|
+
const readStateTextWrapper = await page.find('q2-editable-field >>> .text-wrapper');
|
|
59
|
+
editButton = await page.find('q2-editable-field >>> .begin-edit');
|
|
60
|
+
expect(readStateHidden).toEqual(false);
|
|
61
|
+
expect(readStateWrapper).not.toHaveClass('editing');
|
|
62
|
+
// value rendered into text wrapper
|
|
63
|
+
expect(readStateTextWrapper.textContent).toEqual('Test Value');
|
|
64
|
+
// edit button renders
|
|
65
|
+
expect(editButton).toBeTruthy();
|
|
66
|
+
});
|
|
67
|
+
it('it correctly renders the read state when label is persisted', async () => {
|
|
68
|
+
page = await setup({
|
|
69
|
+
html: `<q2-editable-field value="Test Value" label="Test Label" persistent-label></q2-editable-field>`,
|
|
70
|
+
});
|
|
71
|
+
const readStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(2)');
|
|
72
|
+
expect(readStateWrapper).not.toHaveClass('editing');
|
|
73
|
+
expect(await readStateWrapper.getProperty('hidden')).toEqual(false);
|
|
74
|
+
const readStateLabel = await page.find('q2-editable-field >>> .read-state-label');
|
|
75
|
+
expect(readStateLabel).not.toBeNull;
|
|
76
|
+
expect(readStateLabel.tagName).toEqual('DT');
|
|
77
|
+
expect(readStateLabel.textContent).toEqual('Test Label');
|
|
78
|
+
const readStateTextWrapper = await page.find('q2-editable-field >>> .text-wrapper');
|
|
79
|
+
// value rendered into text wrapper
|
|
80
|
+
expect(readStateTextWrapper.textContent).toEqual('Test Value');
|
|
81
|
+
editButton = await page.find('q2-editable-field >>> .begin-edit');
|
|
82
|
+
// edit button renders
|
|
83
|
+
expect(editButton).toBeTruthy();
|
|
84
|
+
});
|
|
85
|
+
it('correctly renders the edit state', async () => {
|
|
86
|
+
page = await setup({
|
|
87
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
88
|
+
});
|
|
89
|
+
const editStateWrapper = await page.find('q2-editable-field >>> .q2-editable-field-wrapper:nth-child(1)');
|
|
90
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
91
|
+
expect(editStateWrapper).toHaveClass('editing');
|
|
92
|
+
// input renders
|
|
93
|
+
expect(inputField).toBeTruthy();
|
|
94
|
+
const inputValue = await inputField.getProperty('value');
|
|
95
|
+
// input value matches element value
|
|
96
|
+
expect(inputValue).toEqual('Test Value');
|
|
97
|
+
cancelButton = await page.find('q2-editable-field >>> .cancel-edit');
|
|
98
|
+
saveButton = await page.find('q2-editable-field >>> .save-edit');
|
|
99
|
+
expect(cancelButton).toBeTruthy();
|
|
100
|
+
expect(saveButton).toBeTruthy();
|
|
227
101
|
});
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
102
|
+
});
|
|
103
|
+
describe('Props', () => {
|
|
104
|
+
it('passes appropriate properties through to q2-input', async () => {
|
|
105
|
+
page = await setup({
|
|
106
|
+
html: `<q2-editable-field editing label="Test Label" type="testType" format-modifier="testFormatModifier" maxlength="10" value="Test Value"></q2-editable-field>`,
|
|
107
|
+
});
|
|
108
|
+
editableField = await page.find('q2-editable-field');
|
|
109
|
+
editableField.setProperty('errors', ['error1', 'error2']);
|
|
110
|
+
editableField.setProperty('hints', ['hint1', 'hint2']);
|
|
111
|
+
await page.waitForChanges();
|
|
112
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
113
|
+
const inputType = await inputField.getProperty('type');
|
|
114
|
+
const inputErrors = await inputField.getProperty('errors');
|
|
115
|
+
const inputHints = await inputField.getProperty('hints');
|
|
116
|
+
const inputLabel = await inputField.getProperty('label');
|
|
117
|
+
const inputFormatter = await inputField.getProperty('formatModifier');
|
|
118
|
+
const inputMaxLength = await inputField.getProperty('maxlength');
|
|
119
|
+
expect(inputType).toEqual('testType');
|
|
120
|
+
expect(inputErrors).toEqual(['error1', 'error2']);
|
|
121
|
+
expect(inputHints).toEqual(['hint1', 'hint2']);
|
|
122
|
+
expect(inputLabel).toEqual('Test Label');
|
|
123
|
+
expect(inputFormatter).toEqual('testFormatModifier');
|
|
124
|
+
expect(inputMaxLength).toEqual(10);
|
|
125
|
+
expect(inputField).not.toHaveAttribute('hide-label');
|
|
126
|
+
editableField.setProperty('ariaLabel', 'Test aria-label');
|
|
127
|
+
await page.waitForChanges();
|
|
128
|
+
expect(inputField).toEqualAttribute('label', 'Test aria-label');
|
|
129
|
+
expect(inputField).toHaveAttribute('hide-label');
|
|
231
130
|
});
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
131
|
+
describe('when value and type are provided to q2-editable-field', () => {
|
|
132
|
+
it('maintains formatted value in q2-input', async () => {
|
|
133
|
+
page = await setup({
|
|
134
|
+
html: `<q2-editable-field type='phone' value='1234567890'></q2-editable-field>`,
|
|
135
|
+
});
|
|
136
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
137
|
+
const formattedVal = await inputField.getProperty('formattedValue');
|
|
138
|
+
expect(formattedVal).toBe('(123) 456-7890');
|
|
139
|
+
});
|
|
140
|
+
it('displays formattedValue in .text-wrapper on q2-editable-field', async () => {
|
|
141
|
+
page = await setup({
|
|
142
|
+
html: `<q2-editable-field type='phone' value='1234567890'></q2-editable-field>`,
|
|
143
|
+
});
|
|
144
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
145
|
+
const formattedVal = await inputField.getProperty('formattedValue');
|
|
146
|
+
const textWrapper = await page.find('q2-editable-field >>> .text-wrapper');
|
|
147
|
+
expect(formattedVal).toBe(textWrapper.innerText);
|
|
148
|
+
});
|
|
235
149
|
});
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
150
|
+
describe('when errors is updated', () => {
|
|
151
|
+
beforeEach(async () => {
|
|
152
|
+
page = await setup({
|
|
153
|
+
html: `<q2-editable-field value="Test Value" editing></q2-editable-field>`,
|
|
154
|
+
});
|
|
155
|
+
editableField = await page.find('q2-editable-field');
|
|
156
|
+
});
|
|
157
|
+
describe('when component has focus', () => {
|
|
158
|
+
it('focuses on input field', async () => {
|
|
159
|
+
saveButton = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
160
|
+
saveButton.focus();
|
|
161
|
+
await page.waitForChanges();
|
|
162
|
+
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
163
|
+
editableField.setProperty('errors', ["It's busted."]);
|
|
164
|
+
await page.waitForChanges();
|
|
165
|
+
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe('when component does not have focus', () => {
|
|
169
|
+
it('does not change focus', async () => {
|
|
170
|
+
expect(await getActiveElementTestId(page)).toBeNull();
|
|
171
|
+
editableField.setProperty('errors', ["It's busted."]);
|
|
172
|
+
await page.waitForChanges();
|
|
173
|
+
expect(await getActiveElementTestId(page)).toBeNull();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('when component is disabled', () => {
|
|
177
|
+
beforeEach(async () => {
|
|
178
|
+
page = await setup({ html: `<q2-editable-field disabled> Hello </q2-editable-field>` });
|
|
179
|
+
});
|
|
180
|
+
it('editButton is disabled', async () => {
|
|
181
|
+
editableField = await page.find('q2-editable-field');
|
|
182
|
+
const spy = await editableField.spyOnEvent('click');
|
|
183
|
+
await dispatchEvent(page, ['q2-editable-field', '[test-id="editButton"]'], 'click');
|
|
184
|
+
expect(spy).not.toHaveReceivedEvent();
|
|
185
|
+
});
|
|
186
|
+
it('editableInput is disabled', async () => {
|
|
187
|
+
editableField = await page.find('q2-editable-field');
|
|
188
|
+
const spy = await editableField.spyOnEvent('click');
|
|
189
|
+
await dispatchEvent(page, ['q2-editable-field', '[test-id="editableInput"]'], 'click');
|
|
190
|
+
expect(spy).not.toHaveReceivedEvent();
|
|
191
|
+
});
|
|
192
|
+
});
|
|
241
193
|
});
|
|
242
|
-
expect(clickEventSpy).toHaveReceivedEventTimes(1);
|
|
243
194
|
});
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
195
|
+
describe('Events', () => {
|
|
196
|
+
describe('Input', () => {
|
|
197
|
+
it('correctly bubbles the q2-input input event', async function () {
|
|
198
|
+
page = await setup({
|
|
199
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
200
|
+
});
|
|
201
|
+
editableField = await page.find('q2-editable-field');
|
|
202
|
+
const inputEventSpy = await editableField.spyOnEvent('input');
|
|
203
|
+
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'input', {
|
|
204
|
+
detail: { value: 'testValue', formattedValue: 'formattedTestValue' },
|
|
205
|
+
});
|
|
206
|
+
expect(inputEventSpy).toHaveReceivedEventDetail({
|
|
207
|
+
value: 'testValue',
|
|
208
|
+
formattedValue: 'formattedTestValue',
|
|
209
|
+
});
|
|
210
|
+
});
|
|
249
211
|
});
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
212
|
+
describe('Change', () => {
|
|
213
|
+
it('correctly emits the change event data', async function () {
|
|
214
|
+
page = await setup({
|
|
215
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
216
|
+
});
|
|
217
|
+
editableField = await page.find('q2-editable-field');
|
|
218
|
+
const changeEventSpy = await editableField.spyOnEvent('change');
|
|
219
|
+
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
220
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({
|
|
221
|
+
value: 'Test Value',
|
|
222
|
+
editing: false,
|
|
223
|
+
name: 'save',
|
|
224
|
+
formattedValue: 'Test Value',
|
|
225
|
+
});
|
|
226
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
227
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({ editing: true, name: 'edit' });
|
|
228
|
+
await dispatchEvent(page, ['q2-editable-field', '.cancel-edit'], 'click');
|
|
229
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({ editing: false, name: 'cancel' });
|
|
230
|
+
});
|
|
231
|
+
it('allows custom handler to control the change event effects', async function () {
|
|
232
|
+
page = await setup({
|
|
233
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
234
|
+
});
|
|
235
|
+
editableField = await page.find('q2-editable-field');
|
|
236
|
+
let isEditing = await editableField.getProperty('editing');
|
|
237
|
+
await page.$eval('q2-editable-field', function (editableField) {
|
|
238
|
+
editableField.onchange = function (e) {
|
|
239
|
+
// basically don't allow editing value to change via change event
|
|
240
|
+
e.target.editing = !e.detail.editing;
|
|
241
|
+
};
|
|
242
|
+
});
|
|
243
|
+
await page.waitForChanges();
|
|
244
|
+
expect(isEditing).toEqual(true);
|
|
245
|
+
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
246
|
+
isEditing = await editableField.getProperty('editing');
|
|
247
|
+
// still editable because onchange event overwrote default behavior
|
|
248
|
+
expect(isEditing).toEqual(true);
|
|
249
|
+
// manually set editing to false to test inverse
|
|
250
|
+
editableField.setProperty('editing', false);
|
|
251
|
+
await page.waitForChanges();
|
|
252
|
+
isEditing = await editableField.getProperty('editing');
|
|
253
|
+
expect(isEditing).toEqual(false);
|
|
254
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
255
|
+
isEditing = await editableField.getProperty('editing');
|
|
256
|
+
// still false...
|
|
257
|
+
expect(isEditing).toEqual(false);
|
|
258
|
+
});
|
|
259
|
+
it('triggers change event from Escape and Enter keyboard events', async function () {
|
|
260
|
+
page = await setup({
|
|
261
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
262
|
+
});
|
|
263
|
+
editableField = await page.find('q2-editable-field');
|
|
264
|
+
const changeEventSpy = await editableField.spyOnEvent('change');
|
|
265
|
+
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', { key: 'Escape' });
|
|
266
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({ name: 'cancel', editing: false });
|
|
267
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
268
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({ name: 'edit', editing: true });
|
|
269
|
+
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', {
|
|
270
|
+
key: 'Enter',
|
|
271
|
+
bubbles: true,
|
|
272
|
+
});
|
|
273
|
+
expect(changeEventSpy).toHaveReceivedEventDetail({
|
|
274
|
+
name: 'save',
|
|
275
|
+
editing: false,
|
|
276
|
+
value: 'Test Value',
|
|
277
|
+
formattedValue: 'Test Value',
|
|
278
|
+
});
|
|
279
|
+
});
|
|
269
280
|
});
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
281
|
+
describe('Click', () => {
|
|
282
|
+
it('prevents click propagation from internal elements', async function () {
|
|
283
|
+
page = await setup({
|
|
284
|
+
html: `<q2-editable-field editing value="Test Value"></q2-editable-field>`,
|
|
285
|
+
});
|
|
286
|
+
editableField = await page.find('q2-editable-field');
|
|
287
|
+
const clickEventSpy = await editableField.spyOnEvent('click');
|
|
288
|
+
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'click', { composed: true });
|
|
289
|
+
expect(clickEventSpy).not.toHaveReceivedEvent();
|
|
290
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click', {
|
|
291
|
+
composed: true,
|
|
292
|
+
});
|
|
293
|
+
expect(clickEventSpy).not.toHaveReceivedEvent();
|
|
294
|
+
await dispatchEvent(page, ['q2-editable-field', '.cancel-edit'], 'click', {
|
|
295
|
+
composed: true,
|
|
296
|
+
});
|
|
297
|
+
expect(clickEventSpy).not.toHaveReceivedEvent();
|
|
298
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click', {
|
|
299
|
+
composed: true,
|
|
300
|
+
});
|
|
301
|
+
expect(clickEventSpy).not.toHaveReceivedEvent();
|
|
302
|
+
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click', { composed: true });
|
|
303
|
+
expect(clickEventSpy).not.toHaveReceivedEvent();
|
|
304
|
+
await dispatchEvent(page, ['q2-editable-field', '.text-wrapper'], 'click', {
|
|
305
|
+
composed: true,
|
|
306
|
+
});
|
|
307
|
+
expect(clickEventSpy).toHaveReceivedEventTimes(1);
|
|
308
|
+
});
|
|
309
|
+
describe('when save button is clicked', () => {
|
|
310
|
+
beforeEach(async () => {
|
|
311
|
+
page = await setup({
|
|
312
|
+
html: `<q2-editable-field value="Test Value" editing></q2-editable-field>`,
|
|
313
|
+
});
|
|
314
|
+
editableField = await page.find('q2-editable-field');
|
|
315
|
+
});
|
|
316
|
+
describe('when there are errors', () => {
|
|
317
|
+
it('maintains edit state and focuses the input field', async () => {
|
|
318
|
+
editableField.setProperty('errors', ["It's busted."]);
|
|
319
|
+
await page.waitForChanges();
|
|
320
|
+
saveButton = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
321
|
+
await saveButton.focus();
|
|
322
|
+
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
323
|
+
await saveButton.click();
|
|
324
|
+
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
describe('when there are not errors', () => {
|
|
328
|
+
it('closes the edit state and focuses the edit button', async () => {
|
|
329
|
+
saveButton = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
330
|
+
await saveButton.focus();
|
|
331
|
+
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
332
|
+
await saveButton.click();
|
|
333
|
+
editableField = await page.find('q2-editable-field');
|
|
334
|
+
expect(await editableField.getAttribute('editable')).toBeFalsy();
|
|
335
|
+
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('Focus', () => {
|
|
341
|
+
describe('when invoked directly', () => {
|
|
342
|
+
describe('when in default mode', () => {
|
|
343
|
+
beforeEach(async () => {
|
|
344
|
+
page = await setup({
|
|
345
|
+
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
346
|
+
});
|
|
347
|
+
editableField = await page.find('q2-editable-field');
|
|
348
|
+
});
|
|
349
|
+
it('focuses edit button on event dispatch', async () => {
|
|
350
|
+
await dispatchEvent(page, ['q2-editable-field'], 'focus');
|
|
351
|
+
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
352
|
+
});
|
|
353
|
+
it('focuses edit button when method called', async () => {
|
|
354
|
+
await editableField.focus();
|
|
355
|
+
await page.waitForChanges();
|
|
356
|
+
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
357
|
+
});
|
|
358
|
+
});
|
|
359
|
+
describe('when in edit mode', () => {
|
|
360
|
+
beforeEach(async () => {
|
|
361
|
+
page = await setup({
|
|
362
|
+
html: `<q2-editable-field value="Test Value" editing></q2-editable-field>`,
|
|
363
|
+
});
|
|
364
|
+
editableField = await page.find('q2-editable-field');
|
|
365
|
+
});
|
|
366
|
+
it('focuses input on event dispatch', async () => {
|
|
367
|
+
await page.waitForChanges();
|
|
368
|
+
await dispatchEvent(page, ['q2-editable-field'], 'focus');
|
|
369
|
+
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
370
|
+
});
|
|
371
|
+
it('focuses input when method called', async () => {
|
|
372
|
+
await editableField.focus();
|
|
373
|
+
await page.waitForChanges();
|
|
374
|
+
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
it('shifts focus on editing change', async function () {
|
|
379
|
+
page = await setup({
|
|
380
|
+
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
381
|
+
});
|
|
382
|
+
editButton = await page.find('q2-editable-field >>> .begin-edit');
|
|
383
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
384
|
+
const inputFocusSpy = await inputField.spyOnEvent('focus');
|
|
385
|
+
expect(inputFocusSpy).toHaveReceivedEventTimes(0);
|
|
386
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
387
|
+
// focus on input when switched to editing state
|
|
388
|
+
expect(inputFocusSpy).toHaveReceivedEventTimes(2); // 2 because of focus bubbling
|
|
389
|
+
const editBtnFocusSpy = await editButton.spyOnEvent('focus');
|
|
390
|
+
expect(editBtnFocusSpy).toHaveReceivedEventTimes(0);
|
|
391
|
+
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
392
|
+
// edit button focused when changed to no longer editing
|
|
393
|
+
expect(editBtnFocusSpy).toHaveReceivedEventTimes(2); // 2 because of focus bubbling
|
|
394
|
+
});
|
|
296
395
|
});
|
|
297
|
-
const innerInput = await page.find('q2-editable-field >>> q2-input');
|
|
298
|
-
let inputValue = await innerInput.getProperty('value');
|
|
299
|
-
// input value matches element value
|
|
300
|
-
expect(inputValue).toEqual(defaultValue);
|
|
301
|
-
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
302
|
-
innerInput.setProperty('value', newValue);
|
|
303
|
-
await page.waitForChanges();
|
|
304
|
-
inputValue = await innerInput.getProperty('value');
|
|
305
|
-
expect(inputValue).toEqual(newValue);
|
|
306
|
-
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', { key: 'Escape' });
|
|
307
|
-
inputValue = await innerInput.getProperty('value');
|
|
308
|
-
await page.waitForChanges();
|
|
309
|
-
expect(inputValue).toEqual(defaultValue);
|
|
310
396
|
});
|
|
311
|
-
describe('
|
|
312
|
-
it('
|
|
397
|
+
describe('Keyboard input', () => {
|
|
398
|
+
it('correctly restores previous value when cancel button clicked', async function () {
|
|
399
|
+
const defaultValue = 'Default Value';
|
|
400
|
+
const newValue = 'New Value';
|
|
401
|
+
page = await setup({
|
|
402
|
+
html: `<q2-editable-field editing value="${defaultValue}"></q2-editable-field>`,
|
|
403
|
+
});
|
|
404
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
405
|
+
let inputValue = await inputField.getProperty('value');
|
|
406
|
+
// input value matches element value
|
|
407
|
+
expect(inputValue).toEqual(defaultValue);
|
|
408
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
409
|
+
inputField.setProperty('value', newValue);
|
|
410
|
+
await page.waitForChanges();
|
|
411
|
+
inputValue = await inputField.getProperty('value');
|
|
412
|
+
expect(inputValue).toEqual(newValue);
|
|
413
|
+
await dispatchEvent(page, ['q2-editable-field', '.cancel-edit'], 'click');
|
|
414
|
+
inputValue = await inputField.getProperty('value');
|
|
415
|
+
await page.waitForChanges();
|
|
416
|
+
expect(inputValue).toEqual(defaultValue);
|
|
417
|
+
});
|
|
418
|
+
it('correctly restores previous value when cancel button clicked and save button clicked', async function () {
|
|
419
|
+
const defaultValue = 'Default Value';
|
|
420
|
+
const newValue = 'New Value';
|
|
313
421
|
page = await setup({
|
|
314
|
-
html: `<q2-editable-field
|
|
422
|
+
html: `<q2-editable-field editing value="${defaultValue}"></q2-editable-field>`,
|
|
315
423
|
});
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
424
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
425
|
+
let inputValue;
|
|
426
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
427
|
+
inputField.setProperty('value', newValue);
|
|
428
|
+
await page.waitForChanges();
|
|
429
|
+
inputValue = await inputField.getProperty('value');
|
|
430
|
+
expect(inputValue).toEqual(newValue);
|
|
431
|
+
// should not save after cancel buton clicked
|
|
432
|
+
await dispatchEvent(page, ['q2-editable-field', '.cancel-edit'], 'click');
|
|
433
|
+
inputValue = await inputField.getProperty('value');
|
|
434
|
+
await page.waitForChanges();
|
|
435
|
+
expect(inputValue).toEqual(defaultValue);
|
|
436
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
437
|
+
inputValue = await inputField.getProperty('value');
|
|
438
|
+
await page.waitForChanges();
|
|
439
|
+
expect(inputValue).toEqual(defaultValue);
|
|
440
|
+
await dispatchEvent(page, ['q2-editable-field', '.save-edit'], 'click');
|
|
441
|
+
inputValue = await inputField.getProperty('value');
|
|
442
|
+
await page.waitForChanges();
|
|
443
|
+
expect(inputValue).toEqual(defaultValue);
|
|
319
444
|
});
|
|
320
|
-
it('
|
|
445
|
+
it('correctly restores previous value when escape key pressed', async function () {
|
|
446
|
+
const defaultValue = 'Default Value';
|
|
447
|
+
const newValue = 'New Value';
|
|
321
448
|
page = await setup({
|
|
322
|
-
html: `<q2-editable-field
|
|
449
|
+
html: `<q2-editable-field editing value="${defaultValue}"></q2-editable-field>`,
|
|
323
450
|
});
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
expect(
|
|
451
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
452
|
+
let inputValue = await inputField.getProperty('value');
|
|
453
|
+
// input value matches element value
|
|
454
|
+
expect(inputValue).toEqual(defaultValue);
|
|
455
|
+
await dispatchEvent(page, ['q2-editable-field', '.begin-edit'], 'click');
|
|
456
|
+
inputField.setProperty('value', newValue);
|
|
457
|
+
await page.waitForChanges();
|
|
458
|
+
inputValue = await inputField.getProperty('value');
|
|
459
|
+
expect(inputValue).toEqual(newValue);
|
|
460
|
+
await dispatchEvent(page, ['q2-editable-field', 'q2-input'], 'keydown', { key: 'Escape' });
|
|
461
|
+
inputValue = await inputField.getProperty('value');
|
|
462
|
+
await page.waitForChanges();
|
|
463
|
+
expect(inputValue).toEqual(defaultValue);
|
|
328
464
|
});
|
|
329
465
|
});
|
|
330
466
|
describe('Methods', () => {
|
|
@@ -344,7 +480,7 @@ describe('q2-editable-field', () => {
|
|
|
344
480
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
345
481
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
346
482
|
await editableField.callMethod('clickEdit');
|
|
347
|
-
page.waitForChanges();
|
|
483
|
+
await page.waitForChanges();
|
|
348
484
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
349
485
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
350
486
|
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
@@ -356,7 +492,7 @@ describe('q2-editable-field', () => {
|
|
|
356
492
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
357
493
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
358
494
|
await editableField.callMethod('clickEdit');
|
|
359
|
-
page.waitForChanges();
|
|
495
|
+
await page.waitForChanges();
|
|
360
496
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
361
497
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
362
498
|
});
|
|
@@ -369,7 +505,7 @@ describe('q2-editable-field', () => {
|
|
|
369
505
|
expect(cancelButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
370
506
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
371
507
|
await editableField.callMethod('clickCancel');
|
|
372
|
-
page.waitForChanges();
|
|
508
|
+
await page.waitForChanges();
|
|
373
509
|
expect(cancelButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
374
510
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
375
511
|
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
@@ -379,20 +515,20 @@ describe('q2-editable-field', () => {
|
|
|
379
515
|
expect(cancelButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
380
516
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
381
517
|
await editableField.callMethod('clickCancel');
|
|
382
|
-
page.waitForChanges();
|
|
518
|
+
await page.waitForChanges();
|
|
383
519
|
expect(cancelButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
384
520
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
385
521
|
});
|
|
386
522
|
});
|
|
387
523
|
describe('clickSave', () => {
|
|
388
524
|
it('clicks the save button and exits editing mode', async () => {
|
|
389
|
-
|
|
525
|
+
editableField.setProperty('editing', true);
|
|
390
526
|
await page.waitForChanges();
|
|
391
527
|
const saveButtonClickSpy = await saveButton.spyOnEvent('click');
|
|
392
528
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
393
529
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
394
530
|
await editableField.callMethod('clickSave');
|
|
395
|
-
page.waitForChanges();
|
|
531
|
+
await page.waitForChanges();
|
|
396
532
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
397
533
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
398
534
|
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
@@ -402,7 +538,7 @@ describe('q2-editable-field', () => {
|
|
|
402
538
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
403
539
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
404
540
|
await editableField.callMethod('clickSave');
|
|
405
|
-
page.waitForChanges();
|
|
541
|
+
await page.waitForChanges();
|
|
406
542
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
407
543
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
408
544
|
});
|
|
@@ -416,7 +552,7 @@ describe('q2-editable-field', () => {
|
|
|
416
552
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
417
553
|
const newValue = 'New Value';
|
|
418
554
|
await editableField.callMethod('setValue', newValue);
|
|
419
|
-
page.waitForChanges();
|
|
555
|
+
await page.waitForChanges();
|
|
420
556
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
421
557
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
422
558
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
@@ -433,7 +569,7 @@ describe('q2-editable-field', () => {
|
|
|
433
569
|
expect(await editableField.getProperty('editing')).toEqual(false);
|
|
434
570
|
const newValue = 'New Value';
|
|
435
571
|
await editableField.callMethod('setValue', newValue, { clickSave: false });
|
|
436
|
-
page.waitForChanges();
|
|
572
|
+
await page.waitForChanges();
|
|
437
573
|
expect(editButtonClickSpy).toHaveReceivedEventTimes(1);
|
|
438
574
|
expect(saveButtonClickSpy).toHaveReceivedEventTimes(0);
|
|
439
575
|
expect(await editableField.getProperty('editing')).toEqual(true);
|
|
@@ -444,125 +580,7 @@ describe('q2-editable-field', () => {
|
|
|
444
580
|
});
|
|
445
581
|
});
|
|
446
582
|
});
|
|
447
|
-
describe('focus', () => {
|
|
448
|
-
describe('when invoked directly', () => {
|
|
449
|
-
describe('when in default mode', () => {
|
|
450
|
-
beforeEach(async () => {
|
|
451
|
-
page = await setup({
|
|
452
|
-
html: `<q2-editable-field value="Test Value"></q2-editable-field>`,
|
|
453
|
-
});
|
|
454
|
-
editableField = await page.find('q2-editable-field');
|
|
455
|
-
});
|
|
456
|
-
it('focuses edit button on event dispatch', async () => {
|
|
457
|
-
await dispatchEvent(page, ['q2-editable-field'], 'focus');
|
|
458
|
-
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
459
|
-
});
|
|
460
|
-
it('focuses edit button when method called', async () => {
|
|
461
|
-
await editableField.focus();
|
|
462
|
-
await page.waitForChanges();
|
|
463
|
-
expect(await getActiveElementTestId(page)).toEqual('editButton');
|
|
464
|
-
});
|
|
465
|
-
});
|
|
466
|
-
describe('when in edit mode', () => {
|
|
467
|
-
beforeEach(async () => {
|
|
468
|
-
page = await setup({
|
|
469
|
-
html: `<q2-editable-field value="Test Value" editing></q2-editable-field>`,
|
|
470
|
-
});
|
|
471
|
-
editableField = await page.find('q2-editable-field');
|
|
472
|
-
});
|
|
473
|
-
it('focuses input on event dispatch', async () => {
|
|
474
|
-
await page.waitForChanges();
|
|
475
|
-
await dispatchEvent(page, ['q2-editable-field'], 'focus');
|
|
476
|
-
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
477
|
-
});
|
|
478
|
-
it('focuses input when method called', async () => {
|
|
479
|
-
await editableField.focus();
|
|
480
|
-
await page.waitForChanges();
|
|
481
|
-
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
482
|
-
});
|
|
483
|
-
});
|
|
484
|
-
});
|
|
485
|
-
describe('when save is clicked', () => {
|
|
486
|
-
let editableField;
|
|
487
|
-
beforeEach(async () => {
|
|
488
|
-
page = await setup({
|
|
489
|
-
html: `<q2-editable-field value="Test Value" editing onchange="() => {}"></q2-editable-field>`,
|
|
490
|
-
});
|
|
491
|
-
editableField = await page.find('q2-editable-field');
|
|
492
|
-
});
|
|
493
|
-
describe('when there are errors', () => {
|
|
494
|
-
beforeEach(async () => {
|
|
495
|
-
await editableField.setProperty('errors', ["It's busted."]);
|
|
496
|
-
await page.waitForChanges();
|
|
497
|
-
});
|
|
498
|
-
it('focuses the input field', async () => {
|
|
499
|
-
await page.waitForChanges();
|
|
500
|
-
const saveBtn = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
501
|
-
await saveBtn.focus();
|
|
502
|
-
await dispatchEvent(page, ['q2-editable-field', '[test-id=saveButton]'], 'click');
|
|
503
|
-
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
504
|
-
});
|
|
505
|
-
});
|
|
506
|
-
describe('when there are not errors', () => {
|
|
507
|
-
it('does not change focus', async () => {
|
|
508
|
-
const saveBtn = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
509
|
-
await saveBtn.focus();
|
|
510
|
-
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
511
|
-
await dispatchEvent(page, ['q2-editable-field', '[test-id=saveButton]'], 'click');
|
|
512
|
-
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
513
|
-
});
|
|
514
|
-
});
|
|
515
|
-
});
|
|
516
|
-
describe('when errors is updated', () => {
|
|
517
|
-
beforeEach(async () => {
|
|
518
|
-
page = await setup({
|
|
519
|
-
html: `<q2-editable-field value="Test Value" editing onchange="() => {}"></q2-editable-field>`,
|
|
520
|
-
});
|
|
521
|
-
editableField = await page.find('q2-editable-field');
|
|
522
|
-
});
|
|
523
|
-
describe('when component has focus', () => {
|
|
524
|
-
beforeEach(async () => {
|
|
525
|
-
const saveBtn = await page.find('q2-editable-field >>> [test-id=saveButton]');
|
|
526
|
-
await saveBtn.focus();
|
|
527
|
-
await page.waitForChanges();
|
|
528
|
-
});
|
|
529
|
-
it('focuses on input field', async () => {
|
|
530
|
-
expect(await getActiveElementTestId(page)).toEqual('saveButton');
|
|
531
|
-
await editableField.setProperty('errors', ["It's busted."]);
|
|
532
|
-
await page.waitForChanges();
|
|
533
|
-
expect(await getActiveElementTestId(page)).toEqual('editableInput');
|
|
534
|
-
});
|
|
535
|
-
});
|
|
536
|
-
describe('when component does not have focus', () => {
|
|
537
|
-
it('does not change focus', async () => {
|
|
538
|
-
expect(await getActiveElementTestId(page)).toBeNull();
|
|
539
|
-
await editableField.setProperty('errors', ["It's busted."]);
|
|
540
|
-
await page.waitForChanges();
|
|
541
|
-
expect(await getActiveElementTestId(page)).toBeNull();
|
|
542
|
-
});
|
|
543
|
-
});
|
|
544
|
-
describe('when component is disabled', () => {
|
|
545
|
-
beforeEach(async () => {
|
|
546
|
-
page = await setup({ html: `<q2-editable-field disabled> Hello </q2-editable-field>` });
|
|
547
|
-
});
|
|
548
|
-
it('editButton is disabled', async () => {
|
|
549
|
-
const el = await page.find('q2-editable-field');
|
|
550
|
-
const spy = await el.spyOnEvent('click');
|
|
551
|
-
await dispatchEvent(page, ['q2-editable-field', '[test-id="editButton"]'], 'click');
|
|
552
|
-
expect(spy).not.toHaveReceivedEvent();
|
|
553
|
-
});
|
|
554
|
-
it('editableInput is disabled', async () => {
|
|
555
|
-
const el = await page.find('q2-editable-field');
|
|
556
|
-
const spy = await el.spyOnEvent('click');
|
|
557
|
-
await dispatchEvent(page, ['q2-editable-field', '[test-id="editableInput"]'], 'click');
|
|
558
|
-
expect(spy).not.toHaveReceivedEvent();
|
|
559
|
-
});
|
|
560
|
-
});
|
|
561
|
-
});
|
|
562
|
-
});
|
|
563
583
|
describe('display block', () => {
|
|
564
|
-
let page;
|
|
565
|
-
let editableField;
|
|
566
584
|
describe('when block property is provided', () => {
|
|
567
585
|
beforeEach(async () => {
|
|
568
586
|
page = await setup({
|
|
@@ -594,9 +612,9 @@ describe('q2-editable-field', () => {
|
|
|
594
612
|
});
|
|
595
613
|
await page.waitForChanges();
|
|
596
614
|
await testDeprecatedAriaLabel(await page.find('q2-editable-field'), label);
|
|
597
|
-
|
|
598
|
-
expect(
|
|
599
|
-
expect(
|
|
615
|
+
inputField = await page.find('q2-editable-field >>> q2-input');
|
|
616
|
+
expect(inputField).toEqualAttribute('label', label);
|
|
617
|
+
expect(inputField).toHaveAttribute('hide-label');
|
|
600
618
|
});
|
|
601
619
|
});
|
|
602
620
|
});
|