Skip to content

Commit db6af71

Browse files
author
Leupp, Joel
committed
feat: add icon support for six-sidbar-item
1 parent e8b5a11 commit db6af71

29 files changed

+229
-15
lines changed

docs/changelog.md

+5
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,20 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
1212
- **⚠️Experimental**: Adding example React app with Vite.
1313

1414
- [Documentation](guide/angular.md) for using web components with Angular's standalone bootstrapping
15+
- `ActiveSidebarItemGroupDirective` and `ActiveSidebarItemDirective`: Added angular sidbar helper
16+
directives
17+
- Added nested sidbar menu to the angular demo application to showcase the helper directives
1518
- `six-header-dropdown`: Added `filter` and `filterPlaceholder` properties.
1619
- `six-header-menu-button`: Added `caret`, `disabled`, `loading`, `submit` and `reset` properties.
1720
- `six-header-menu-button`: Added `suffix` and `prefix` slots.
21+
- `six-sidebar-item` : added icon property analog to `six-sidebar-item-group`
1822

1923
### Fixed
2024

2125
- `six-logo`: removed inline style tag
2226
- `six-timepicker`: removed unnecessary bottom padding
2327
- `six-button` : simplify use of prefix and suffix icons
28+
- `six-sidebar-item-group`: fixed spacing for sub items
2429

2530
### Removed
2631

docs/components/six-icon.md

+2
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ Enter an icon label and press enter to display an icon:
282282
- [six-menu-item](six-menu-item.html)
283283
- [six-search-field](six-search-field.html)
284284
- [six-select](six-select.html)
285+
- [six-sidebar-item](six-sidebar-item.html)
285286
- [six-sidebar-item-group](six-sidebar-item-group.html)
286287
- [six-stage-indicator](six-stage-indicator.html)
287288
- [six-tile](six-tile.html)
@@ -302,6 +303,7 @@ graph TD;
302303
six-menu-item --> six-icon
303304
six-search-field --> six-icon
304305
six-select --> six-icon
306+
six-sidebar-item --> six-icon
305307
six-sidebar-item-group --> six-icon
306308
six-stage-indicator --> six-icon
307309
six-tile --> six-icon

docs/components/six-sidebar-item-group.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
```html
99
<div style="max-width: 20rem; padding: 1rem">
1010
<six-sidebar-item-group icon="description" name="Upload" value="upload">
11-
<six-sidebar-item value="data">Data</six-sidebar-item>
12-
<six-sidebar-item value="history">History</six-sidebar-item>
11+
<six-sidebar-item value="data" icon="analytics">Data</six-sidebar-item>
12+
<six-sidebar-item value="history" icon="history">History</six-sidebar-item>
1313
<six-sidebar-item-group icon="settings" name="Settings">
1414
<six-sidebar-item value="data">Data</six-sidebar-item>
1515
<six-sidebar-item value="history">History</six-sidebar-item>

docs/components/six-sidebar-item.md

+29
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,21 @@
1616
```
1717

1818

19+
## six sidebar item with icons
20+
21+
<docs-demo-six-sidebar-item-1></docs-demo-six-sidebar-item-1>
22+
23+
```html
24+
<div style="width: 10em" id="six-sidebar-items-icon">
25+
<six-sidebar-item icon="description">Data</six-sidebar-item>
26+
<six-sidebar-item icon="history">History</six-sidebar-item>
27+
<six-sidebar-item icon="account_balance">Transactions</six-sidebar-item>
28+
<six-sidebar-item icon="upload">Upload</six-sidebar-item>
29+
<six-sidebar-item icon="link" href="http://www.google.ch">Link</six-sidebar-item>
30+
</div>
31+
```
32+
33+
1934

2035
<!-- Auto Generated Below -->
2136

@@ -26,6 +41,7 @@
2641
| ---------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------- | --------------------- | ----------- |
2742
| `disabled` | `disabled` | Set to true to draw the sidebar item in a disabled state. | `boolean` | `false` |
2843
| `href` | `href` | Provide if the item should be rendered as anchor tag. Note, that the href is added automatically when using routerLink in Angular. | `string \| undefined` | `undefined` |
44+
| `icon` | `icon` | Icon of the item | `string` | `''` |
2945
| `selected` | `selected` | Set to true to draw the item in a selected state. | `boolean` | `false` |
3046
| `value` | `value` | A unique value to store in the sidebar item. This can be used as a way to identify sidebar items when selected. | `string` | `''` |
3147

@@ -37,6 +53,19 @@
3753
| | Used to define the nested displayed text of the item. |
3854

3955

56+
## Dependencies
57+
58+
### Depends on
59+
60+
- [six-icon](six-icon.html)
61+
62+
### Graph
63+
```mermaid
64+
graph TD;
65+
six-sidebar-item --> six-icon
66+
style six-sidebar-item fill:#f9f,stroke:#333,stroke-width:4px
67+
```
68+
4069
----------------------------------------------
4170

4271
Copyright © 2021-present SIX-Group

docs/components/six-sidebar.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ six-sidebar allows to add a static sidebar to the left or right of the `six-root
1414
```html
1515
<six-sidebar position="left" width="20rem" open>
1616
<six-sidebar-item-group icon="description" name="Upload" value="upload">
17-
<six-sidebar-item value="data" disabled="true">Data</six-sidebar-item>
18-
<six-sidebar-item value="history">History</six-sidebar-item>
17+
<six-sidebar-item value="data" icon="analytics" disabled="true">Data</six-sidebar-item>
18+
<six-sidebar-item value="history" icon="history">History</six-sidebar-item>
1919
<six-sidebar-item-group icon="settings" name="Settings">
2020
<six-sidebar-item value="data" selected>Data</six-sidebar-item>
2121
<six-sidebar-item value="history">History</six-sidebar-item>

docs/examples/docs-demo-six-sidebar-0.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
<six-sidebar position="left" width="20rem" open>
55
<six-sidebar-item-group icon="description" name="Upload" value="upload">
6-
<six-sidebar-item value="data" disabled="true">Data</six-sidebar-item>
7-
<six-sidebar-item value="history">History</six-sidebar-item>
6+
<six-sidebar-item value="data" icon="analytics" disabled="true">Data</six-sidebar-item>
7+
<six-sidebar-item value="history" icon="history">History</six-sidebar-item>
88
<six-sidebar-item-group icon="settings" name="Settings">
99
<six-sidebar-item value="data" selected>Data</six-sidebar-item>
1010
<six-sidebar-item value="history">History</six-sidebar-item>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<template>
2+
<div>
3+
4+
<div style="width: 10em" id="six-sidebar-items-icon">
5+
<six-sidebar-item icon="description">Data</six-sidebar-item>
6+
<six-sidebar-item icon="history">History</six-sidebar-item>
7+
<six-sidebar-item icon="account_balance">Transactions</six-sidebar-item>
8+
<six-sidebar-item icon="upload">Upload</six-sidebar-item>
9+
<six-sidebar-item icon="link" href="http://www.google.ch">Link</six-sidebar-item>
10+
</div>
11+
12+
</div>
13+
</template>
14+
<style>
15+
16+
</style>
17+
<script>
18+
export default {
19+
name: 'docs-demo-six-sidebar-item-1',
20+
mounted() { }
21+
}
22+
</script>

docs/examples/docs-demo-six-sidebar-item-group-0.vue

+2-2
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33

44
<div style="max-width: 20rem; padding: 1rem">
55
<six-sidebar-item-group icon="description" name="Upload" value="upload">
6-
<six-sidebar-item value="data">Data</six-sidebar-item>
7-
<six-sidebar-item value="history">History</six-sidebar-item>
6+
<six-sidebar-item value="data" icon="analytics">Data</six-sidebar-item>
7+
<six-sidebar-item value="history" icon="history">History</six-sidebar-item>
88
<six-sidebar-item-group icon="settings" name="Settings">
99
<six-sidebar-item value="data">Data</six-sidebar-item>
1010
<six-sidebar-item value="history">History</six-sidebar-item>

examples/angular/src/app/app.module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { HeaderComponent } from './components/header/header.component';
1414
import { FormComponent } from './pages/form/form.component';
1515
import { AlertComponent } from './pages/alert/alert.component';
1616
import { DialogComponent } from './pages/dialog/dialog.component';
17+
import { SettingsComponent } from './pages/settings/settings.component';
1718

1819
@NgModule({
1920
declarations: [
@@ -25,6 +26,7 @@ import { DialogComponent } from './pages/dialog/dialog.component';
2526
FormComponent,
2627
AlertComponent,
2728
DialogComponent,
29+
SettingsComponent,
2830
],
2931
imports: [
3032
BrowserModule,

examples/angular/src/app/app.routes.ts

+9
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { FormComponent } from './pages/form/form.component';
33
import { HomeComponent } from './pages/home/home.component';
44
import { AlertComponent } from './pages/alert/alert.component';
55
import { DialogComponent } from './pages/dialog/dialog.component';
6+
import { SettingsComponent } from './pages/settings/settings.component';
67

78
export const routes: Routes = [
89
{
@@ -26,4 +27,12 @@ export const routes: Routes = [
2627
path: 'dialog',
2728
component: DialogComponent,
2829
},
30+
{
31+
path: 'settings',
32+
children: [
33+
{ path: '', redirectTo: 'data', pathMatch: 'full' },
34+
{ path: 'data', component: SettingsComponent },
35+
{ path: 'history', component: SettingsComponent },
36+
],
37+
},
2938
];

examples/angular/src/app/components/left-sidebar/left-sidebar.component.html

+4
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@
33
<six-sidebar-item-group routerLink="/form" name="Form" icon="assignment"></six-sidebar-item-group>
44
<six-sidebar-item-group routerLink="/alert" name="Alert" icon="notifications_active"></six-sidebar-item-group>
55
<six-sidebar-item-group routerLink="/dialog" name="Dialog" icon="web_asset"></six-sidebar-item-group>
6+
<six-sidebar-item-group icon="settings" name="Settings">
7+
<six-sidebar-item routerLink="/settings/data" icon="analytics">Data</six-sidebar-item>
8+
<six-sidebar-item routerLink="/settings/history" icon="history">History</six-sidebar-item>
9+
</six-sidebar-item-group>
610
</six-sidebar>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { Component, OnInit } from '@angular/core';
2+
import { ActivatedRoute } from '@angular/router';
3+
import { map } from 'rxjs';
4+
5+
@Component({
6+
selector: 'app-settings',
7+
template: ` <h1>This is the {{ settingsType$ | async }} settings</h1> `,
8+
})
9+
export class SettingsComponent {
10+
settingsType$ = this.route.url.pipe(map((segments) => segments[segments.length - 1].path));
11+
12+
constructor(private route: ActivatedRoute) {}
13+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { ContentChildren, Directive, HostBinding, HostListener, inject, QueryList } from '@angular/core';
2+
import { RouterLinkActive } from '@angular/router';
3+
import { SixSidebarItem, SixSidebarItemGroup } from '../stencil-generated/components';
4+
5+
/**
6+
* This directive opens the six-sidbar-item-group bases on the active route
7+
*/
8+
@Directive({
9+
selector: 'six-sidebar-item-group',
10+
hostDirectives: [RouterLinkActive],
11+
})
12+
export class ActiveSidebarItemGroupDirective {
13+
private routerLinkActive = inject(RouterLinkActive);
14+
private sidebarItemGroup = inject(SixSidebarItemGroup);
15+
16+
@ContentChildren(SixSidebarItem) private sidebarItems!: QueryList<SixSidebarItem>;
17+
18+
@HostBinding('open')
19+
get open() {
20+
if (this.sidebarItems?.length > 0) {
21+
return this.routerLinkActive.isActive ? true : this.sidebarItemGroup.open;
22+
} else {
23+
return this.routerLinkActive.isActive;
24+
}
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { Directive, HostBinding, inject } from '@angular/core';
2+
import { RouterLinkActive } from '@angular/router';
3+
4+
/**
5+
* This directive selects the six-sidbar-item bases on the active route
6+
*/
7+
@Directive({
8+
selector: 'six-sidebar-item',
9+
hostDirectives: [RouterLinkActive],
10+
})
11+
export class ActiveSidebarItemDirective {
12+
private routerLinkActive = inject(RouterLinkActive);
13+
14+
@HostBinding('selected')
15+
get selected() {
16+
return this.routerLinkActive.isActive;
17+
}
18+
}

libraries/ui-library-angular/src/lib/stencil-generated/components.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1301,14 +1301,14 @@ allow you to set it on a different element in the sidebar, such as an input or b
13011301

13021302

13031303
@ProxyCmp({
1304-
inputs: ['disabled', 'href', 'selected', 'value']
1304+
inputs: ['disabled', 'href', 'icon', 'selected', 'value']
13051305
})
13061306
@Component({
13071307
selector: 'six-sidebar-item',
13081308
changeDetection: ChangeDetectionStrategy.OnPush,
13091309
template: '<ng-content></ng-content>',
13101310
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
1311-
inputs: ['disabled', 'href', 'selected', 'value'],
1311+
inputs: ['disabled', 'href', 'icon', 'selected', 'value'],
13121312
})
13131313
export class SixSidebarItem {
13141314
protected el: HTMLElement;

libraries/ui-library-angular/src/lib/ui-library-angular.module.ts

+10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import { SwitchValueAccessor } from './control-value-accessors/switch-value-acce
2020
import { TimepickerValueAccessor } from './control-value-accessors/timepicker-value-accessor';
2121
import { ValidationMessagesService } from './services/validation-messages.service';
2222
import { SixRouterLinkDirective } from './link/six-router-link.directive';
23+
import { ActiveSidebarItemDirective } from './sidebar/active-sidebar-item.directive';
24+
import { ActiveSidebarItemGroupDirective } from './sidebar/active-sidebar-item-group.directive';
2325

2426
@NgModule({
2527
declarations: [
@@ -50,6 +52,10 @@ import { SixRouterLinkDirective } from './link/six-router-link.directive';
5052

5153
// router link directive
5254
SixRouterLinkDirective,
55+
56+
// sidebar helpers
57+
ActiveSidebarItemDirective,
58+
ActiveSidebarItemGroupDirective,
5359
],
5460
imports: [],
5561
exports: [
@@ -80,6 +86,10 @@ import { SixRouterLinkDirective } from './link/six-router-link.directive';
8086

8187
// router link directive
8288
SixRouterLinkDirective,
89+
90+
// sidebar helpers
91+
ActiveSidebarItemDirective,
92+
ActiveSidebarItemGroupDirective,
8393
],
8494
})
8595
export class UiLibraryAngularModule {

libraries/ui-library-angular/src/public-api.ts

+4
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ export * from './lib/form/six-form.directive';
2929
// link helpers
3030
export * from './lib/link/six-router-link.directive';
3131

32+
// sidbar helpers
33+
export * from './lib/sidebar/active-sidebar-item.directive';
34+
export * from './lib/sidebar/active-sidebar-item-group.directive';
35+
3236
// services
3337
export * from './lib/services/validation-messages.service';
3438
export * from './lib/services/alert.service';

libraries/ui-library-vue/src/lib/stencil-generated/components.ts

+1
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ export const SixSidebarItem = /*@__PURE__*/ defineContainer<JSX.SixSidebarItem>(
508508
'value',
509509
'selected',
510510
'disabled',
511+
'icon',
511512
'href'
512513
]);
513514

libraries/ui-library/src/components.d.ts

+8
Original file line numberDiff line numberDiff line change
@@ -1558,6 +1558,10 @@ export namespace Components {
15581558
* Provide if the item should be rendered as anchor tag. Note, that the href is added automatically when using routerLink in Angular.
15591559
*/
15601560
"href": string | undefined;
1561+
/**
1562+
* Icon of the item
1563+
*/
1564+
"icon": string;
15611565
/**
15621566
* Set to true to draw the item in a selected state.
15631567
*/
@@ -4784,6 +4788,10 @@ declare namespace LocalJSX {
47844788
* Provide if the item should be rendered as anchor tag. Note, that the href is added automatically when using routerLink in Angular.
47854789
*/
47864790
"href"?: string | undefined;
4791+
/**
4792+
* Icon of the item
4793+
*/
4794+
"icon"?: string;
47874795
/**
47884796
* Set to true to draw the item in a selected state.
47894797
*/

libraries/ui-library/src/components/six-icon/readme.md

+2
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
- [six-menu-item](../six-menu-item)
3737
- [six-search-field](../six-search-field)
3838
- [six-select](../six-select)
39+
- [six-sidebar-item](../six-sidebar-item)
3940
- [six-sidebar-item-group](../six-sidebar-item-group)
4041
- [six-stage-indicator](../six-stage-indicator)
4142
- [six-tile](../six-tile)
@@ -56,6 +57,7 @@ graph TD;
5657
six-menu-item --> six-icon
5758
six-search-field --> six-icon
5859
six-select --> six-icon
60+
six-sidebar-item --> six-icon
5961
six-sidebar-item-group --> six-icon
6062
six-stage-indicator --> six-icon
6163
six-tile --> six-icon

libraries/ui-library/src/components/six-sidebar-item-group/index.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ <h2>six sidebar group</h2>
1515
<section>
1616
<div style="max-width: 20rem; padding: 1rem">
1717
<six-sidebar-item-group icon="description" name="Upload" value="upload">
18-
<six-sidebar-item value="data">Data</six-sidebar-item>
19-
<six-sidebar-item value="history">History</six-sidebar-item>
18+
<six-sidebar-item value="data" icon="analytics">Data</six-sidebar-item>
19+
<six-sidebar-item value="history" icon="history">History</six-sidebar-item>
2020
<six-sidebar-item-group icon="settings" name="Settings">
2121
<six-sidebar-item value="data">Data</six-sidebar-item>
2222
<six-sidebar-item value="history">History</six-sidebar-item>

libraries/ui-library/src/components/six-sidebar-item-group/six-sidebar-item-group.scss

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
.six-sidebar-item-group--subgroup::part(header) {
1616
background-color: transparent !important;
17+
--horizontal-padding: var(--six-spacing-large);
1718
}
1819

1920
.six-sidebar-item-group__header-icon {

0 commit comments

Comments
 (0)