Skip to content
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

Fix/person/select/selectedperson clear #1566

Merged
merged 3 commits into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 94 additions & 0 deletions .changeset/cyan-items-provide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
'@equinor/fusion-wc-person': patch
---

Fixes clearing person when using the `selectedPerson` property

# Summary of Latest Changes in This Branch Compared to Main Branch

## File: `controller.ts`

### Lines: 199-264

### Summary of Changes:

1. **New Methods Added:**
- **`clearInput()`**: Clears the input fields and resets the host's value and search properties.
- **`clear()`**: Calls `clearInput()`, clears selected IDs, resets the selected person, and dispatches a custom `PersonSelectEvent`.
- **`closeClick(e: MouseEvent | KeyboardEvent)`**: Handles the close icon click event, blurs the input and close icon, closes the dropdown if open, and calls an external close handler if defined.

### Detailed Changes:

1. **Method: `clearInput()`**
- **Purpose:** Clears the input fields and resets the host's value and search properties.
- **Code:**
```typescript
public clearInput() {
this.#host.value = '';
this.#host.search = '';
this.#host.textInputElement.value = '';
}
```

2. **Method: `clear()`**
- **Purpose:** Calls `clearInput()`, clears selected IDs, resets the selected person, and dispatches a custom `PersonSelectEvent`.
- **Code:**
```typescript
public clear() {
this.clearInput();

if (this.selectedIds.size) {
this.selectedIds.clear();
}

if (this.#host.selectedPerson) {
this.#host.selectedPerson = null;
}

/* Dispatch custom select event with our details */
this.#host.dispatchEvent(
new PersonSelectEvent({
detail: {
selected: null,
},
bubbles: true,
}),
);
}
```

3. **Method: `closeClick(e: MouseEvent | KeyboardEvent)`**
- **Purpose:** Handles the close icon click event, blurs the input and close icon, closes the dropdown if open, and calls an external close handler if defined.
- **Code:**
```typescript
public closeClick = (e: MouseEvent | KeyboardEvent): void => {
if (e.type === 'keydown') {

/* only close on enter or space not tab */
const me = e as KeyboardEvent;
if (me.key !== 'Enter' && me.key !== 'Space') {
return;
}

/* blur closeicon if focused */
const closeIcon = this.#host.renderRoot.querySelector('.trailing');
if (closeIcon) {
(closeIcon as HTMLSpanElement).blur();
}
}

if (this.#host.textInputElement) {
this.#host.textInputElement.blur();
}

/* close dropdown if open */
if (this.isOpen) {
this.isOpen = false;
}

/* call resolvers handleclick if defined */
if (this.#externaCloseHandler) {
this.#externaCloseHandler(e);
}
}
```
35 changes: 18 additions & 17 deletions packages/person/src/components/select/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,19 +55,11 @@
* Runs on host updated when property is changed
*/
public attrSelectPerson(select: string | null | undefined) {
if (select === undefined) {
return;
}

// clear input if null
/* Do not trigger task if undefined or null */
if (!select) {
this.clear();
return;
}

/* clear search task when info task is running */
this.#host.search = '';

/* Trigger PersonInfo task with upn or azureId */
if (select.match('@')) {
this.#host.upn = select;
Expand Down Expand Up @@ -102,7 +94,7 @@
*/
private _handleGlobalClick = (e: MouseEvent): void => {
const t = e.target as HTMLElement;
if (t && !(this.#host as unknown as HTMLElement).contains(t)) {
if (t && !(this.#host as unknown as HTMLElement).contains(t) && this.isOpen) {
this.isOpen = false;
}
};
Expand Down Expand Up @@ -193,8 +185,8 @@
/* Dispatch custom select event with our details */
this.#firePersonSelectEvent(personData);

/* clear component after selection */
if (personData === null || this.#host.selectedPerson === null) {
/* clear component if null */
if (personData === null) {
this.clearInput();
}
}
Expand All @@ -211,7 +203,6 @@
}

public clearInput() {
this.selectedIds.clear();
this.#host.value = '';
this.#host.search = '';
this.#host.textInputElement.value = '';
Expand All @@ -220,6 +211,14 @@
public clear() {
this.clearInput();

if (this.selectedIds.size) {
this.selectedIds.clear();
}

if (this.#host.selectedPerson) {
this.#host.selectedPerson = null;
}

/* Dispatch custom select event with our details */
this.#host.dispatchEvent(
new PersonSelectEvent({
Expand All @@ -232,12 +231,13 @@
}

/**
* Fires on click on close icon in textinput
* Fires when triggering close icon in textinput
* Calls closeHandler callback set in resolver
*/
public closeClick = (e: MouseEvent | KeyboardEvent): void => {
if (e.type === 'keydown') {

/* only close on enter or space not tab */

Check warning on line 240 in packages/person/src/components/select/controller.ts

View workflow job for this annotation

GitHub Actions / ESLint Report Analysis

packages/person/src/components/select/controller.ts#L239-L240

[prettier/prettier] Delete `⏎`
const me = e as KeyboardEvent;
if (me.key !== 'Enter' && me.key !== 'Space') {
return;
Expand All @@ -254,16 +254,17 @@
this.#host.textInputElement.blur();
}

/* also close dropdown */
this.isOpen = false;
/* close dropdown if open */
if (this.isOpen) {
this.isOpen = false;
}

/* call resolvers handleclick if defined */
if (this.#externaCloseHandler) {
this.#externaCloseHandler(e);
}

if (this.selectedIds.size) {
// clear input and deselect
this.clear();
} else {
// clear input
Expand Down