-
Notifications
You must be signed in to change notification settings - Fork 2.9k
Tree Item Picker: Make table rows and cards with children navigable in pickers during selection #23593
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Tree Item Picker: Make table rows and cards with children navigable in pickers during selection #23593
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,110 @@ | ||
| import { UmbDefaultTreeItemCardElement } from './default-tree-item-card.element.js'; | ||
| import type { UmbTreeItemCardApi } from '../types.js'; | ||
| import type { UmbTreeItemModel } from '../../types.js'; | ||
| import { expect, fixture, html } from '@open-wc/testing'; | ||
| import { UmbBooleanState, UmbStringState } from '@umbraco-cms/backoffice/observable-api'; | ||
|
|
||
| class UmbTestTreeItemCardApi { | ||
| #isSelectable = new UmbBooleanState(false); | ||
| readonly isSelectable = this.#isSelectable.asObservable(); | ||
|
|
||
| #isSelectableContext = new UmbBooleanState(false); | ||
| readonly isSelectableContext = this.#isSelectableContext.asObservable(); | ||
|
|
||
| #selectOnly = new UmbBooleanState(false); | ||
| readonly selectOnly = this.#selectOnly.asObservable(); | ||
|
|
||
| #isSelected = new UmbBooleanState(false); | ||
| readonly isSelected = this.#isSelected.asObservable(); | ||
|
|
||
| #isActive = new UmbBooleanState(false); | ||
| readonly isActive = this.#isActive.asObservable(); | ||
|
|
||
| #hasChildren = new UmbBooleanState(false); | ||
| readonly hasChildren = this.#hasChildren.asObservable(); | ||
|
|
||
| #noAccess = new UmbBooleanState(false); | ||
| readonly noAccess = this.#noAccess.asObservable(); | ||
|
|
||
| #path = new UmbStringState(''); | ||
| readonly path = this.#path.asObservable(); | ||
|
|
||
| #hasActions = new UmbBooleanState(false); | ||
| readonly hasActions = this.#hasActions.asObservable(); | ||
|
|
||
| setSelectableContext(value: boolean) { | ||
| this.#isSelectableContext.setValue(value); | ||
| this.#isSelectable.setValue(value); | ||
| } | ||
|
|
||
| setSelectOnly(value: boolean) { | ||
| this.#selectOnly.setValue(value); | ||
| } | ||
|
|
||
| setHasChildren(value: boolean) { | ||
| this.#hasChildren.setValue(value); | ||
| } | ||
|
|
||
| open() {} | ||
| select() {} | ||
| deselect() {} | ||
| } | ||
|
|
||
| const item: UmbTreeItemModel = { | ||
| unique: 'a-1', | ||
| entityType: 'type-a', | ||
| name: 'A1', | ||
| hasChildren: false, | ||
| isFolder: false, | ||
| parent: { unique: null, entityType: 'type-a' }, | ||
| }; | ||
|
|
||
| describe('UmbDefaultTreeItemCardElement', () => { | ||
| let element: UmbDefaultTreeItemCardElement; | ||
| let api: UmbTestTreeItemCardApi; | ||
|
|
||
| beforeEach(async () => { | ||
| element = await fixture(html`<umb-default-tree-item-card></umb-default-tree-item-card>`); | ||
| api = new UmbTestTreeItemCardApi(); | ||
| element.item = item; | ||
| element.api = api as unknown as UmbTreeItemCardApi; | ||
| await element.updateComplete; | ||
| }); | ||
|
|
||
| function isSelectOnly(): boolean { | ||
| return element.shadowRoot!.querySelector('umb-figure-card')!.hasAttribute('select-only'); | ||
| } | ||
|
|
||
| it('is defined with its own instance', () => { | ||
| expect(element).to.be.instanceOf(UmbDefaultTreeItemCardElement); | ||
| }); | ||
|
|
||
| it('is not select-only outside a selectable context', async () => { | ||
|
Check failure on line 82 in src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-card/default/default-tree-item-card.element.test.ts
|
||
| await element.updateComplete; | ||
| expect(isSelectOnly()).to.be.false; | ||
| }); | ||
|
|
||
| it('is select-only for an item without children in a selectable context', async () => { | ||
|
Check failure on line 87 in src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-card/default/default-tree-item-card.element.test.ts
|
||
| api.setSelectableContext(true); | ||
| await element.updateComplete; | ||
|
|
||
| expect(isSelectOnly()).to.be.true; | ||
| }); | ||
|
|
||
| it('is not select-only for an item with children in a selectable context', async () => { | ||
|
Check failure on line 94 in src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-card/default/default-tree-item-card.element.test.ts
|
||
| api.setSelectableContext(true); | ||
| api.setHasChildren(true); | ||
| await element.updateComplete; | ||
|
|
||
| expect(isSelectOnly()).to.be.false; | ||
| }); | ||
|
|
||
| it('is not select-only for an item with children while a selection is in progress', async () => { | ||
|
Check failure on line 102 in src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item-card/default/default-tree-item-card.element.test.ts
|
||
| api.setSelectableContext(true); | ||
| api.setSelectOnly(true); | ||
| api.setHasChildren(true); | ||
| await element.updateComplete; | ||
|
|
||
| expect(isSelectOnly()).to.be.false; | ||
| }); | ||
| }); | ||
Uh oh!
There was an error while loading. Please reload this page.