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

feat(tab-nav): adds optional closable functionality to individual tab-titles #6740

Merged
merged 104 commits into from
May 22, 2023
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
bce01a7
feat(tab-title): adds optional closable functionality to individual t…
Elijbet Apr 4, 2023
2fb821d
WIP: disableLastClosableTabTitle
Elijbet Apr 5, 2023
715c969
WIP: closingSelectedSequence handles resetting selected attribute on …
Elijbet Apr 5, 2023
3dfb00f
WIP: The last selected tab falls back to the previous when closed.
Elijbet Apr 6, 2023
247bed0
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet Apr 6, 2023
a76e456
WIP: clean up logic
Elijbet Apr 7, 2023
0b36ef8
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet Apr 8, 2023
e1db7a5
WIP: style changes to accomodate close button
Elijbet Apr 9, 2023
802c673
WIP: modify tests to account for new changes
Elijbet Apr 10, 2023
ec9eabc
WIP: describe closing behavior e2e tests
Elijbet Apr 10, 2023
a0475c7
Temporary demo for testing
Elijbet Apr 10, 2023
a9144b3
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet Apr 17, 2023
e642813
WIP: work out the css
Elijbet Apr 19, 2023
35e921f
WIP: bring back border styling
Elijbet Apr 19, 2023
95072c5
WIP: render last remaining styles as disabled
Elijbet Apr 19, 2023
6114d2b
WIP: use hidden instead of removing the element
Elijbet Apr 20, 2023
6b942ba
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet Apr 20, 2023
7d33b18
WIP: remove observer and list prop and adjust tabTitles instead
Elijbet Apr 21, 2023
5e9a9d8
fix for eliza
driskull Apr 21, 2023
90898a5
WIP: remove existing logic for emitting emitActiveTab as non-user act…
Elijbet Apr 22, 2023
08b1580
merge conflicts resolved
Elijbet May 2, 2023
f16b06c
cleanup
Elijbet May 2, 2023
821913e
WIP: refactor
Elijbet May 5, 2023
0d04d6e
cleanup
Elijbet May 6, 2023
8328df9
cleanup
Elijbet May 7, 2023
50a7642
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 7, 2023
cf78ae3
cleanup
Elijbet May 7, 2023
497d16a
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 8, 2023
bbb9408
WIP: apply forceUpdate to non-selected closable tabs to force selecti…
Elijbet May 8, 2023
f4de254
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 9, 2023
d51f252
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 9, 2023
1ab3e27
WIP: refactors
Elijbet May 9, 2023
caa8e22
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 10, 2023
91d8b8d
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 11, 2023
47708d7
WIP: handleTabTitleClose keep track of visibleTabIndeces instead of h…
Elijbet May 12, 2023
1ff3f29
cleanup
Elijbet May 12, 2023
0d11557
WIP: cleanup
Elijbet May 14, 2023
0b002d1
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 14, 2023
83c6d11
Add test for the closing sequence: works when closing tab-titles in s…
Elijbet May 15, 2023
49ffa03
workaround
Elijbet May 15, 2023
66fb3c1
Refactor closing sequence describe block, add when closing tab-titles…
Elijbet May 15, 2023
afc262b
refactors and cleanup
Elijbet May 15, 2023
f2261a0
adjust existing tab-title test for should inherit default medium scal…
Elijbet May 15, 2023
dcfeeff
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 15, 2023
4b4a2f2
cleanup
Elijbet May 15, 2023
0123c9f
pick up feedback
Elijbet May 16, 2023
6904317
css and test adjustments
Elijbet May 16, 2023
a26e832
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 16, 2023
74a118b
add closable option to stories for bordered and icons
Elijbet May 16, 2023
de2bbe0
merge files and cleanup
Elijbet May 16, 2023
f06f4b0
add coverage for 'closing an unselected tab-title does not deselect t…
Elijbet May 17, 2023
6499866
Remove unwanted readme files
Elijbet May 17, 2023
0745688
fix to focus styles differenciation for tab and the close button
Elijbet May 17, 2023
2ae1549
additional tests for randomized close | selection sequence and cleanup
Elijbet May 17, 2023
2a802ca
drop unnecessary event cancelation
jcfranco May 17, 2023
ab4adf5
tidy up eslint-disabled lines
jcfranco May 17, 2023
ab2bc58
revert menu t9n manifest entry
jcfranco May 17, 2023
1821aa7
add ID to tab event detail interface doc
jcfranco May 17, 2023
e3b5a41
tidy up tab-title CSS object
jcfranco May 17, 2023
6519122
tidy up types
jcfranco May 17, 2023
8dfdb64
restore interface prop
jcfranco May 17, 2023
e46e1b5
fix missed renames
jcfranco May 17, 2023
685d69a
tidy up tab-title test
jcfranco May 17, 2023
19e9045
restore demo
Elijbet May 17, 2023
2dd39bd
fix(input-date-picker): update input-date-picker to properly handle B…
jcfranco May 17, 2023
1c2efac
build(deps): Bump focus-trap from 7.4.1 to 7.4.2 (#6974)
driskull May 17, 2023
18255f2
chore(release): 1.4.0-next.17
github-actions[bot] May 17, 2023
cef59db
fix(flow-item): Close back button tooltip on click (#6978)
driskull May 17, 2023
6062b73
chore(release): 1.4.0-next.18
github-actions[bot] May 17, 2023
d7bdd2b
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 17, 2023
21213b4
refactor loopTabTitles to be a function where you can pass the argume…
Elijbet May 17, 2023
30fa462
add missing await after setting tab-title attribute in test
jcfranco May 17, 2023
51da63d
roll back unnecessary changes
jcfranco May 17, 2023
b54f6e5
tidy up
jcfranco May 18, 2023
45b547c
tidy up
jcfranco May 18, 2023
25c3579
tweak close button listeners
jcfranco May 18, 2023
1221b16
tweak close button props
jcfranco May 18, 2023
0c6c3a0
refactor to check for property instead of the attribute
Elijbet May 18, 2023
d0c301c
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 18, 2023
ab9fb0c
refactor to simplify handleTabTitleClose, restore withIcons story, cl…
Elijbet May 18, 2023
92863e8
cleanup
Elijbet May 18, 2023
b4326d9
restored bordered story and add one for closable separately
Elijbet May 19, 2023
ec06997
pick up feedback
Elijbet May 19, 2023
0724469
prefixed ids with title1-/tab1- numbering for ease of tracking
Elijbet May 19, 2023
57d00f7
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 19, 2023
1015717
tidy up
jcfranco May 19, 2023
d6335fe
use close button click events for Space/Enter
jcfranco May 19, 2023
d621bee
ensure selected tab is in focus after closing
jcfranco May 19, 2023
e623704
tweak styles
jcfranco May 20, 2023
4674739
fix selected bordered tab-title regression
jcfranco May 20, 2023
0d09592
restore styles and tidy up
jcfranco May 20, 2023
6fd6293
tweak styles
jcfranco May 20, 2023
0bde7c4
ensure tab indicator is rendered on top
jcfranco May 20, 2023
a059aed
fix x-button placement
jcfranco May 20, 2023
ed23b01
fix test
jcfranco May 20, 2023
536bb41
drop name in the id in favor of numbering
Elijbet May 19, 2023
bd0fcdb
chore(release): 1.4.0-next.23
github-actions[bot] May 19, 2023
563fa37
refactor(combobox, combobox-item): tidy up CSS object usage (#6979)
jcfranco May 20, 2023
692677f
chore: add t9n message bundles. (#6955)
anveshmekala May 22, 2023
955e785
build(deps): bump calcite-ui-icons to 3.22.6 (#6984)
geospatialem May 22, 2023
67ba5ed
fix(popover): change event listener to 'pointerup' (#6985)
driskull May 22, 2023
d2f2a4b
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 22, 2023
af81378
add bordered boolean knob to the closable story
Elijbet May 22, 2023
edce0da
Merge branch 'master' into elijbet/2620-closable-tabs
Elijbet May 22, 2023
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
67 changes: 61 additions & 6 deletions src/components/tab-nav/tab-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
Element,
Event,
EventEmitter,
forceUpdate,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of calling forceUpdate, is there an internal prop that could be added on the element or something in order to more naturally trigger a rerender?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It fails to update tabs in a few places when tabTitle changes due to the selection moving after tab-title closes. I'll be following this up with a refactor issue on all tab-related components, as they are a bit more complicated than might need to be. And to address inconsistent variable naming. I'll add forceUpdate as an item to address.

h,
Host,
Listen,
Expand All @@ -19,7 +20,7 @@ import {
} from "../../utils/dom";
import { createObserver } from "../../utils/observers";
import { Scale } from "../interfaces";
import { TabChangeEventDetail } from "../tab/interfaces";
import { TabChangeEventDetail, TabCloseEventDetail } from "../tab/interfaces";
import { TabID, TabLayout, TabPosition } from "../tabs/interfaces";

/**
Expand Down Expand Up @@ -102,15 +103,22 @@ export class TabNav {
) {
localStorage.setItem(`calcite-tab-nav-${this.storageId}`, JSON.stringify(this.selectedTabId));
}
const selectedTabTitleElementId = this.tabTitles[this.selectedTabId].id;

this.calciteInternalTabChange.emit({
tab: this.selectedTabId
tab: this.selectedTabId,
tabElId: selectedTabTitleElementId
});

this.selectedTitle = await this.getTabTitleById(this.selectedTabId);
const selectedTitle = await this.getTabTitleById(this.selectedTabId);

if (selectedTitle) {
this.selectedTitle = selectedTitle;
}
}

@Watch("selectedTitle") selectedTitleChanged(): void {
@Watch("selectedTitle")
selectedTitleChanged(): void {
this.updateOffsetPosition();
this.updateActiveWidth();
// reset the animation time on tab selection
Expand Down Expand Up @@ -234,9 +242,16 @@ export class TabNav {
event.preventDefault();
}

@Listen("calciteTabsActivate") activateTabHandler(event: CustomEvent<void>): void {
@Listen("calciteTabsActivate")
activateTabHandler(event: CustomEvent<void>): void {
this.calciteTabChange.emit();
event.stopPropagation();
}

@Listen("calciteInternalTabsClose")
internalCloseTabHandler(event: CustomEvent<TabCloseEventDetail>): void {
const closedTabTitleEl = event.target as HTMLCalciteTabTitleElement;
this.handleTabTitleClose(closedTabTitleEl);
event.stopPropagation();
event.preventDefault();
}
Expand Down Expand Up @@ -370,9 +385,49 @@ export class TabNav {
}

get enabledTabTitles(): HTMLCalciteTabTitleElement[] {
return filterDirectChildren<HTMLCalciteTabTitleElement>(
const directEnabled = filterDirectChildren<HTMLCalciteTabTitleElement>(
this.el,
"calcite-tab-title:not([disabled])"
);
return directEnabled.filter((tabTitle) => !tabTitle.closed);
}

handleTabTitleClose(closedTabTitleEl: HTMLCalciteTabTitleElement): void {
Elijbet marked this conversation as resolved.
Show resolved Hide resolved
const { tabTitles } = this;

let visibleTabTitlesIndices = tabTitles.reduce((acc, curr, i) => {
if (!curr.closed) {
acc.push(i);
}
return acc;
}, []);

const closedTabTitleIndex = tabTitles.findIndex((el) => el === closedTabTitleEl);

visibleTabTitlesIndices = visibleTabTitlesIndices.filter(
(index) => index !== closedTabTitleIndex
);

if (visibleTabTitlesIndices.length > 1) {
const nextTabTitleIndex = visibleTabTitlesIndices.find(
(value) => value > closedTabTitleIndex
);
this.selectedTabId = nextTabTitleIndex
? nextTabTitleIndex
: visibleTabTitlesIndices.length - 1;
forceUpdate(this.el);
} else if (
visibleTabTitlesIndices.length === 1 &&
tabTitles[visibleTabTitlesIndices[0]].closable
) {
tabTitles[visibleTabTitlesIndices[0]].closable = false;
this.selectedTabId = visibleTabTitlesIndices[0];
forceUpdate(this.el);
}

requestAnimationFrame(() => {
this.updateOffsetPosition();
this.updateActiveWidth();
});
}
}
3 changes: 3 additions & 0 deletions src/components/tab-title/assets/tab-title/t9n/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Close"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "إغلاق"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Затваряне"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zatvori"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Tanca"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zavřít"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Luk"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Schließen"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Κλείσιμο"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Close"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Cerrar"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Sule"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Sulje"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Fermer"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "סגירה"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zatvori"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Bezárás"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Tutup"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Chiudi"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "閉じる"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "닫기"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Uždaryti"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Aizvērt"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Sluiten"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Lukk"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zamknij"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Fechar"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Fechar"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Închidere"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Закрыть"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zatvoriť"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zapri"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Zatvori"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Stäng"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "ปิด"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Kapat"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Закрити"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "Đóng"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "关闭"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "關閉"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"close": "關閉"
}
9 changes: 8 additions & 1 deletion src/components/tab-title/resources.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,15 @@
export const CSS = {
close: "tab-title-close",
closeButton: "close-button",
container: "container",
containerHasText: "container--has-text",
content: "content",
contentHasText: "content--has-text",
iconEnd: "icon-end",
iconStart: "icon-start",
iconPresent: "icon-present",
titleIcon: "calcite-tab-title--icon"
};

export const ICONS = {
close: "x"
};
Loading