123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809 |
- import { beVisible, beHidden, haveAttribute, haveClasses, notHaveClasses, haveText, contain, notContain, html, notBeVisible, notHaveAttribute, notExist, haveFocus, test, haveValue} from '../../../utils'
- test('it works with x-model',
- [html`
- <div
- x-data="{
- init() {
- this.$watch('selected', (value) => {
- if (value) this.query = ''
- })
- },
- query: '',
- selected: null,
- people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ],
- get filteredPeople() {
- return this.query === ''
- ? this.people
- : this.people.filter((person) => {
- return person.name.toLowerCase().includes(this.query.toLowerCase())
- })
- },
- }"
- >
- <div x-combobox x-model="selected">
- <label x-combobox:label>Select person</label>
- <div>
- <div>
- <input
- x-combobox:input
- :display-value="person => person.name"
- @change="query = $event.target.value"
- placeholder="Search..."
- />
- <button x-combobox:button>Toggle</button>
- </div>
- <div x-combobox:options>
- <ul>
- <template
- x-for="person in filteredPeople"
- :key="person.id"
- hidden
- >
- <li
- x-combobox:option
- :option="person.id"
- :value="person"
- :disabled="person.disabled"
- x-text="person.name"
- >
- </li>
- </template>
- </ul>
- <p x-show="filteredPeople.length == 0">No people match your query.</p>
- </div>
- </div>
- <article x-text="selected?.name"></article>
- </div>
- </div>
- `],
- ({ get }) => {
- get('ul').should(notBeVisible())
- get('button').click()
- get('ul').should(beVisible())
- get('button').click()
- get('ul').should(notBeVisible())
- get('button').click()
- get('[option="2"]').click()
- get('ul').should(notBeVisible())
- get('input').should(haveValue('Arlene Mccoy'))
- get('article').should(haveText('Arlene Mccoy'))
- get('button').click()
- get('ul').should(contain('Wade Cooper'))
- .should(contain('Arlene Mccoy'))
- .should(contain('Devon Webb'))
- get('[option="3"]').click()
- get('ul').should(notBeVisible())
- get('input').should(haveValue('Devon Webb'))
- get('article').should(haveText('Devon Webb'))
- get('button').click()
- get('ul').should(contain('Wade Cooper'))
- .should(contain('Arlene Mccoy'))
- .should(contain('Devon Webb'))
- get('[option="1"]').click()
- get('ul').should(notBeVisible())
- get('input').should(haveValue('Wade Cooper'))
- get('article').should(haveText('Wade Cooper'))
- },
- )
- test('it works with internal state',
- [html`
- <div
- x-data="{ people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value.name : 'Select Person'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('ul').should(notBeVisible())
- get('button')
- .should(haveText('Select Person'))
- .click()
- get('ul').should(beVisible())
- get('button').click()
- get('ul').should(notBeVisible())
- get('button').click()
- get('[option="2"]').click()
- get('ul').should(notBeVisible())
- get('button').should(haveText('Arlene Mccoy'))
- get('input').should(haveValue('Arlene Mccoy'))
- },
- )
- test('$combobox/$comboboxOption',
- [html`
- <div
- x-data="{ people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value.name : 'Select Person'"></button>
- <p x-text="$combobox.activeIndex"></p>
- <article x-text="$combobox.activeOption?.name"></article>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- 'disabled': $comboboxOption.isDisabled,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('article').should(haveText(''))
- get('[option="5"]').should(haveClasses(['disabled']))
- get('button')
- .should(haveText('Select Person'))
- .click()
- get('[option="1"]').should(haveClasses(['active']))
- get('input').type('{downarrow}')
- get('article').should(haveText('Arlene Mccoy'))
- get('p').should(haveText('1'))
- get('[option="2"]').should(haveClasses(['active']))
- get('button').should(haveText('Select Person'))
- get('[option="2"]').click()
- get('button').should(haveText('Arlene Mccoy'))
- get('[option="2"]').should(haveClasses(['selected']))
- },
- )
- test('"name" prop',
- [html`
- <div
- x-data="{ people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- name="person"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value : 'Select Person'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person.id"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('input').should(haveAttribute('value', 'null'))
- get('button').click()
- get('input').should(haveAttribute('value', 'null'))
- get('[option="2"]').click()
- get('input').should(beHidden())
- .should(haveAttribute('name', 'person'))
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- get('button').click()
- get('[option="4"]').click()
- get('input').should(beHidden())
- .should(haveAttribute('name', 'person'))
- .should(haveAttribute('value', '4'))
- .should(haveAttribute('type', 'hidden'))
- },
- );
- test('"name" prop with object value',
- [html`
- <div
- x-data="{ people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- name="person"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value.name : 'Select Person'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('input[name="person"]').should(haveAttribute('value', 'null'))
- get('button').click()
- get('[name="person[id]"]').should(notExist())
- get('[option="2"]').click()
- get('input[name="person"]').should(notExist())
- get('[name="person[id]"]').should(beHidden())
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="person[name]"]').should(beHidden())
- .should(haveAttribute('value', 'Arlene Mccoy'))
- .should(haveAttribute('type', 'hidden'))
- get('button').click()
- get('[option="4"]').click()
- get('[name="person[id]"]').should(beHidden())
- .should(haveAttribute('value', '4'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="person[name]"]').should(beHidden())
- .should(haveAttribute('value', 'Tom Cook'))
- .should(haveAttribute('type', 'hidden'))
- },
- );
- test('"default-value" prop',
- [html`
- <div
- x-data="{ people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- name="person"
- default-value="2"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value : 'Select Person'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person.id"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('input[name="person"]').should(beHidden())
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- },
- );
- test('"multiple" prop',
- [html`
- <div
- x-data="{
- people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]
- }"
- x-combobox
- multiple
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value.join(',') : 'Select People'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person.id"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('button').click()
- get('[option="2"]').click()
- get('ul').should(beVisible())
- get('button').should(haveText('2'))
- get('[option="4"]').click()
- get('button').should(haveText('2,4'))
- get('ul').should(beVisible())
- get('[option="4"]').click()
- get('button').should(haveText('2'))
- get('ul').should(beVisible())
- },
- );
- test('"multiple" and "name" props together',
- [html`
- <div
- x-data="{
- people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]
- }"
- x-combobox
- multiple
- name="people"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="$combobox.value ? $combobox.value.map(p => p.id).join(',') : 'Select People'"></button>
- <ul x-combobox:options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- // get('input[name="people"]').should(haveAttribute('value', 'null'))
- get('button').click()
- get('[name="people[0][id]"]').should(notExist())
- get('[option="2"]').click()
- get('ul').should(beVisible())
- get('button').should(haveText('2'))
- get('input[name="people"]').should(notExist())
- get('[name="people[0][id]"]').should(beHidden())
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[0][name]"]').should(beHidden())
- .should(haveAttribute('value', 'Arlene Mccoy'))
- .should(haveAttribute('type', 'hidden'))
- get('[option="4"]').click()
- get('[name="people[0][id]"]').should(beHidden())
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[0][name]"]').should(beHidden())
- .should(haveAttribute('value', 'Arlene Mccoy'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[1][id]"]').should(beHidden())
- .should(haveAttribute('value', '4'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[1][name]"]').should(beHidden())
- .should(haveAttribute('value', 'Tom Cook'))
- .should(haveAttribute('type', 'hidden'))
- get('button').should(haveText('2,4'))
- get('ul').should(beVisible())
- get('[option="4"]').click()
- get('[name="people[0][id]"]').should(beHidden())
- .should(haveAttribute('value', '2'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[0][name]"]').should(beHidden())
- .should(haveAttribute('value', 'Arlene Mccoy'))
- .should(haveAttribute('type', 'hidden'))
- get('[name="people[1][id]"]').should(notExist())
- get('[name="people[1][name]"]').should(notExist())
- get('button').should(haveText('2'))
- get('ul').should(beVisible())
- },
- );
- test('keyboard controls',
- [html`
- <div
- x-data="{ active: null, people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb', disabled: true },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- x-model="active"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="active ? active.name : 'Select Person'"></button>
- <ul x-combobox:options options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('.active').should(notExist())
- get('button').click()
- get('[options]')
- .should(beVisible())
- get('input').should(haveFocus())
- get('[option="1"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{downarrow}')
- get('[option="2"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{downarrow}')
- get('[option="4"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{uparrow}')
- get('[option="2"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{home}')
- get('[option="1"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{end}')
- get('[option="10"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{pageUp}')
- get('[option="1"]')
- .should(haveClasses(['active']))
- get('input')
- .type('{pageDown}')
- get('[option="10"]')
- .should(haveClasses(['active']))
- get('input')
- .tab()
- .should(haveFocus())
- get('[options]')
- .should(beVisible())
- get('input')
- .type('{esc}')
- get('[options]')
- .should(notBeVisible())
- },
- )
- test('changing value manually changes internal state',
- [html`
- <div
- x-data="{ active: null, people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb', disabled: true },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- x-model="active"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button toggle x-combobox:button x-text="$combobox.value ? $combobox.value : 'Select Person'"></button>
- <button select-tim @click="active = 4">Select Tim</button>
- <ul x-combobox:options options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person.id"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('[select-tim]').click()
- get('[option="4"]').should(haveClasses(['selected']))
- get('[option="1"]').should(notHaveClasses(['selected']))
- get('[toggle]').should(haveText('4'))
- },
- )
- test('has accessibility attributes',
- [html`
- <div
- x-data="{ active: null, people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb', disabled: true },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- x-model="active"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button x-combobox:button x-text="active ? active.name : 'Select Person'"></button>
- <ul x-combobox:options options>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- :class="{
- 'selected': $comboboxOption.isSelected,
- 'active': $comboboxOption.isActive,
- }"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('button')
- .should(haveAttribute('aria-haspopup', 'true'))
- .should(haveAttribute('aria-labelledby', 'alpine-combobox-label-1 alpine-combobox-button-1'))
- .should(haveAttribute('aria-expanded', 'false'))
- .should(notHaveAttribute('aria-controls'))
- .should(haveAttribute('id', 'alpine-combobox-button-1'))
- .click()
- .should(haveAttribute('aria-expanded', 'true'))
- .should(haveAttribute('aria-controls', 'alpine-combobox-options-1'))
- get('[options]')
- .should(haveAttribute('role', 'combobox'))
- .should(haveAttribute('id', 'alpine-combobox-options-1'))
- .should(haveAttribute('aria-labelledby', 'alpine-combobox-label-1'))
- .should(notHaveAttribute('aria-activedescendant'))
- .should(haveAttribute('aria-activedescendant', 'alpine-combobox-option-1'))
- get('[option="1"]')
- .should(haveAttribute('role', 'option'))
- .should(haveAttribute('id', 'alpine-combobox-option-1'))
- .should(haveAttribute('tabindex', '-1'))
- .should(haveAttribute('aria-selected', 'false'))
- get('[option="2"]')
- .should(haveAttribute('role', 'option'))
- .should(haveAttribute('id', 'alpine-combobox-option-2'))
- .should(haveAttribute('tabindex', '-1'))
- .should(haveAttribute('aria-selected', 'false'))
- get('input')
- .type('{downarrow}')
- .should(haveAttribute('aria-activedescendant', 'alpine-combobox-option-2'))
- get('[option="2"]')
- .click()
- .should(haveAttribute('aria-selected', 'true'))
- },
- )
- test('"static" prop',
- [html`
- <div
- x-data="{ active: null, show: false, people: [
- { id: 1, name: 'Wade Cooper' },
- { id: 2, name: 'Arlene Mccoy' },
- { id: 3, name: 'Devon Webb' },
- { id: 4, name: 'Tom Cook' },
- { id: 5, name: 'Tanya Fox', disabled: true },
- { id: 6, name: 'Hellen Schmidt' },
- { id: 7, name: 'Caroline Schultz' },
- { id: 8, name: 'Mason Heaney' },
- { id: 9, name: 'Claudie Smitham' },
- { id: 10, name: 'Emil Schaefer' },
- ]}"
- x-combobox
- x-model="active"
- >
- <label x-combobox:label>Assigned to</label>
- <input x-combobox:input :display-value="(person) => person.name" type="text">
- <button normal-toggle x-combobox:button x-text="active ? active.name : 'Select Person'"></button>
- <button real-toggle @click="show = ! show">Toggle</button>
- <ul x-combobox:options x-show="show" static>
- <template x-for="person in people" :key="person.id">
- <li
- :option="person.id"
- x-combobox:option
- :value="person"
- :disabled="person.disabled"
- >
- <span x-text="person.name"></span>
- </li>
- </template>
- </ul>
- </div>
- `],
- ({ get }) => {
- get('ul').should(notBeVisible())
- get('[normal-toggle]')
- .should(haveText('Select Person'))
- .click()
- get('ul').should(notBeVisible())
- get('[real-toggle]').click()
- get('ul').should(beVisible())
- get('[option="2"]').click()
- get('ul').should(beVisible())
- get('[normal-toggle]').should(haveText('Arlene Mccoy'))
- },
- )
|