diff --git a/package.json b/package.json index ef6d5ca..3568c3e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-electron-admin", - "version": "1.0.0-SNAPSHOT", + "version": "1.1.0-SNAPSHOT", "description": "Angular Electron Admin Template", "homepage": "https://aea.incubator.edurt.io", "author": { @@ -41,10 +41,15 @@ "@angular/platform-browser-dynamic": "12.1.2", "@angular/router": "12.1.2", "bootstrap": "4.0.0-beta", + "d3": "5", + "font-awesome": "^4.7.0", "material-design-iconic-font": "^2.2.0", + "moment": "^2.29.1", "ngx-bootstrap": "^7.1.0", "ngx-clipboard": "^14.0.1", + "ngx-perfect-scrollbar": "^10.1.1", "rxjs": "~6.6.0", + "simple-keyboard": "^3.3.22", "tslib": "^2.1.0", "zone.js": "~0.11.4" }, diff --git a/src/renderer/app/layout/layout.routing.ts b/src/renderer/app/layout/layout.routing.ts index 6e1f08e..8aca6df 100644 --- a/src/renderer/app/layout/layout.routing.ts +++ b/src/renderer/app/layout/layout.routing.ts @@ -19,6 +19,10 @@ const LAYOUT_ROUTES: Routes = [ { path: 'zmdi', loadChildren: () => import('../pages/icon/zmdi/zmdi.module').then(m => m.IconsZmdiModule) + }, + { + path: 'fa', + loadChildren: () => import('../pages/icon/fa/fa.module').then(m => m.IconsFaModule) } ] }, @@ -32,6 +36,35 @@ const LAYOUT_ROUTES: Routes = [ { path: 'tooltips', loadChildren: () => import('../pages/component/tooltips/tooltips.module').then(m => m.TooltipsComponentModule) + }, + { + path: 'scrollbar', + loadChildren: () => import('../pages/component/scrollbar/scrollbar.module').then(m => m.ScrollbarModule) + }, + { + path: 'datepicker', + loadChildren: () => import('../pages/component/datepicker/datepicker.module').then(m => m.DatepickerModule) + }, + { + path: 'carousel', + loadChildren: () => import('../pages/component/carousel/carousel.module').then(m => m.CarouselComponentModule) + }, + { + path: 'progressbar', + loadChildren: () => import('../pages/component/progressbar/progressbar.module').then(m => m.ProgressbarComponentModule) + }, + { + path: 'keyboard', + loadChildren: () => import('../pages/component/keyboard/keyboard.module').then(m => m.KeyboardModule) + } + ] + }, + { + path: 'directive', + children: [ + { + path: 'contribution', + loadChildren: () => import('../pages/directive/contribution/contribution.module').then(m => m.DirectiveContributionModule) } ] } diff --git a/src/renderer/app/layout/navigation/navigation.component.html b/src/renderer/app/layout/navigation/navigation.component.html index 5991cca..c0c3cc9 100644 --- a/src/renderer/app/layout/navigation/navigation.component.html +++ b/src/renderer/app/layout/navigation/navigation.component.html @@ -5,7 +5,10 @@ Icon @@ -14,10 +17,34 @@ Component + + diff --git a/src/renderer/app/layout/navigation/navigation.component.scss b/src/renderer/app/layout/navigation/navigation.component.scss index 745d1e9..696fcbe 100644 --- a/src/renderer/app/layout/navigation/navigation.component.scss +++ b/src/renderer/app/layout/navigation/navigation.component.scss @@ -152,7 +152,7 @@ @include font-icon('\f26d', 6px); position: absolute; left: 1rem; - top: 0.7rem; + top: 1rem; } } } diff --git a/src/renderer/app/layout/navigation/navigation.component.ts b/src/renderer/app/layout/navigation/navigation.component.ts index e883853..9d15da6 100644 --- a/src/renderer/app/layout/navigation/navigation.component.ts +++ b/src/renderer/app/layout/navigation/navigation.component.ts @@ -25,7 +25,8 @@ export class NavigationComponent implements OnInit { sidebarVisible: boolean; navigationSubState: any = { Icon: 'inactive', - Component: 'inactive' + Component: 'inactive', + Directive: 'inactive' }; constructor(private navigationService: NavigationService) { diff --git a/src/renderer/app/pages/component/carousel/carousel.component.html b/src/renderer/app/pages/component/carousel/carousel.component.html new file mode 100644 index 0000000..d44288c --- /dev/null +++ b/src/renderer/app/pages/component/carousel/carousel.component.html @@ -0,0 +1,30 @@ +
+
+

Carousel

+ This template is built using ngx-bootstrap/carousel and provides some usage examples +
+
+
+

Default

+ + + {{img.title}} + + +
+
+
+
+

Description

+ + + {{img.title}} + + + +
+
+
diff --git a/src/renderer/app/pages/component/carousel/carousel.component.ts b/src/renderer/app/pages/component/carousel/carousel.component.ts new file mode 100644 index 0000000..cfaef88 --- /dev/null +++ b/src/renderer/app/pages/component/carousel/carousel.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { CarouselService } from '@renderer/services/component/carousel.service'; + +@Component({ + selector: 'app-component-carousel', + templateUrl: './carousel.component.html' +}) +export class CarouselComponent implements OnInit { + public defaultCarousels: any = []; + + constructor(private carouselService: CarouselService) { + this.defaultCarousels = this.carouselService.builderCarousels(); + } + + ngOnInit() { + } +} diff --git a/src/renderer/app/pages/component/carousel/carousel.module.ts b/src/renderer/app/pages/component/carousel/carousel.module.ts new file mode 100644 index 0000000..5666593 --- /dev/null +++ b/src/renderer/app/pages/component/carousel/carousel.module.ts @@ -0,0 +1,28 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { CarouselModule } from 'ngx-bootstrap/carousel'; +import { CarouselComponent } from './carousel.component'; +import { CarouselService } from '@renderer/services/component/carousel.service'; + +const CAROUSEL_ROUTES = [ + {path: '', component: CarouselComponent} +]; + +@NgModule({ + declarations: [ + CarouselComponent + ], + imports: [ + CommonModule, + BsDropdownModule.forRoot(), + CarouselModule.forRoot(), + RouterModule.forChild(CAROUSEL_ROUTES) + ], + providers: [ + CarouselService + ] +}) +export class CarouselComponentModule { +} diff --git a/src/renderer/app/pages/component/datepicker/datepicker.component.html b/src/renderer/app/pages/component/datepicker/datepicker.component.html new file mode 100644 index 0000000..d83deec --- /dev/null +++ b/src/renderer/app/pages/component/datepicker/datepicker.component.html @@ -0,0 +1,53 @@ +
+
+

Datepicker

+ This template is built using ngx-bootstrap/datepicker and provides some usage examples +
+
+
+
+

Basic Datepicker

+
+ +
+
+ +
+
+
+
+
+
+
+

Range Datepicker

+
+ +
+
+ +
+
+
+
+
+
+
+

Theme Datepicker

+
+ +
+
+
+ +
+ +
+
+
+
+
+
+
diff --git a/src/renderer/app/pages/component/datepicker/datepicker.component.ts b/src/renderer/app/pages/component/datepicker/datepicker.component.ts new file mode 100644 index 0000000..ccf0a52 --- /dev/null +++ b/src/renderer/app/pages/component/datepicker/datepicker.component.ts @@ -0,0 +1,30 @@ +import { Component, OnInit } from '@angular/core'; +import { BsDatepickerConfig } from 'ngx-bootstrap/datepicker'; +import { DatepickerService } from '@renderer/services/component/datepicker.service'; + +@Component({ + selector: 'app-component-datepicker', + templateUrl: './datepicker.component.html' +}) +export class DatepickerComponent implements OnInit { + minDate = new Date(2017, 5, 10); + maxDate = new Date(2018, 9, 15); + bsValue: Date = new Date(); + colorTheme = 'theme-green'; + colorThemes = []; + bsConfig: Partial; + + constructor(private datepickerService: DatepickerService) { + this.colorThemes = this.datepickerService.themes; + } + + applyTheme(pop: any) { + this.bsConfig = Object.assign({}, {containerClass: this.colorTheme}); + setTimeout(() => { + pop.show(); + }); + } + + ngOnInit() { + } +} diff --git a/src/renderer/app/pages/component/datepicker/datepicker.module.ts b/src/renderer/app/pages/component/datepicker/datepicker.module.ts new file mode 100644 index 0000000..8727abe --- /dev/null +++ b/src/renderer/app/pages/component/datepicker/datepicker.module.ts @@ -0,0 +1,30 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { BsDatepickerModule } from 'ngx-bootstrap/datepicker'; +import { FormsModule } from '@angular/forms'; +import { DatepickerComponent } from './datepicker.component'; +import { DatepickerService } from '@renderer/services/component/datepicker.service'; + +const DATEPICKER_ROUTES = [ + {path: '', component: DatepickerComponent} +]; + +@NgModule({ + declarations: [ + DatepickerComponent + ], + imports: [ + CommonModule, + FormsModule, + BsDropdownModule.forRoot(), + BsDatepickerModule.forRoot(), + RouterModule.forChild(DATEPICKER_ROUTES) + ], + providers: [ + DatepickerService + ] +}) +export class DatepickerModule { +} diff --git a/src/renderer/app/pages/component/keyboard/keyboard.component.html b/src/renderer/app/pages/component/keyboard/keyboard.component.html new file mode 100644 index 0000000..41bb0bd --- /dev/null +++ b/src/renderer/app/pages/component/keyboard/keyboard.component.html @@ -0,0 +1,19 @@ +
+
+

Keyboard

+ This template is built using simple-keyboard and provides some usage examples +
+
+
+
+

Keyboard

+
+ + +
+
+
+
+
+
diff --git a/src/renderer/app/pages/component/keyboard/keyboard.component.ts b/src/renderer/app/pages/component/keyboard/keyboard.component.ts new file mode 100644 index 0000000..8582da5 --- /dev/null +++ b/src/renderer/app/pages/component/keyboard/keyboard.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit, ViewEncapsulation } from '@angular/core'; +import Keyboard from 'simple-keyboard'; + +@Component({ + selector: 'app-root', + encapsulation: ViewEncapsulation.None, + templateUrl: './keyboard.component.html', + styleUrls: [ + '../../../../../../node_modules/simple-keyboard/build/css/index.css' + ] +}) +export class KeyboardComponent implements OnInit { + value = ''; + keyboard: Keyboard; + + constructor() { + } + + ngOnInit(): void { + } + + // eslint-disable-next-line @angular-eslint/use-lifecycle-interface + ngAfterViewInit() { + this.keyboard = new Keyboard({ + onChange: input => this.onChange(input), + onKeyPress: button => this.onKeyPress(button) + }); + } + + onChange = (input: string) => { + this.value = input; + }; + onKeyPress = (button: string) => { + if (button === '{shift}' || button === '{lock}') { + this.handleShift(); + } + }; + onInputChange = (event: any) => { + this.keyboard.setInput(event.target.value); + }; + handleShift = () => { + const currentLayout = this.keyboard.options.layoutName; + const shiftToggle = currentLayout === 'default' ? 'shift' : 'default'; + this.keyboard.setOptions({ + layoutName: shiftToggle + }); + }; +} diff --git a/src/renderer/app/pages/component/keyboard/keyboard.module.ts b/src/renderer/app/pages/component/keyboard/keyboard.module.ts new file mode 100644 index 0000000..5abf472 --- /dev/null +++ b/src/renderer/app/pages/component/keyboard/keyboard.module.ts @@ -0,0 +1,21 @@ +import { NgModule } from '@angular/core'; +import { KeyboardComponent } from '@renderer/app/pages/component/keyboard/keyboard.component'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; + +const KEYBOARD_ROUTES = [ + {path: '', component: KeyboardComponent} +]; + +@NgModule({ + declarations: [ + KeyboardComponent + ], + imports: [ + CommonModule, + RouterModule.forChild(KEYBOARD_ROUTES) + ], + providers: [] +}) +export class KeyboardModule { +} diff --git a/src/renderer/app/pages/component/progressbar/progressbar.component.html b/src/renderer/app/pages/component/progressbar/progressbar.component.html new file mode 100644 index 0000000..864b4a7 --- /dev/null +++ b/src/renderer/app/pages/component/progressbar/progressbar.component.html @@ -0,0 +1,43 @@ +
+
+

Progressbar

+ This template is built using ngx-bootstrap/progressbar and provides some usage examples +
+
+
+

Static Progressbar

+ +
+ +
+ +
+ +
+ +
+
+
+
+

Theme Progressbar

+
Theme + type property implementation adds a topic to the Progressbar
+ +
+ +
+ +
+ +
+
+
+
+

Dynamic Progressbar

+ +
+
+ +
+
+
diff --git a/src/renderer/app/pages/component/progressbar/progressbar.component.ts b/src/renderer/app/pages/component/progressbar/progressbar.component.ts new file mode 100644 index 0000000..bfba54f --- /dev/null +++ b/src/renderer/app/pages/component/progressbar/progressbar.component.ts @@ -0,0 +1,31 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-component-progressbar', + templateUrl: './progressbar.component.html' +}) +export class ProgressbarComponent implements OnInit { + public type: string; + public stacked: any[] = []; + + constructor() { + this.randomStacked(); + } + + public randomStacked(): void { + const types = ['success', 'info', 'warning', 'danger']; + this.stacked = []; + const n = Math.floor((Math.random() * 4) + 1); + for (let i = 0; i < n; i++) { + const index = Math.floor((Math.random() * 4)); + const value = Math.floor((Math.random() * 27) + 3); + this.stacked.push({ + value, + type: types[index] + }); + } + } + + ngOnInit() { + } +} diff --git a/src/renderer/app/pages/component/progressbar/progressbar.module.ts b/src/renderer/app/pages/component/progressbar/progressbar.module.ts new file mode 100644 index 0000000..e0377b3 --- /dev/null +++ b/src/renderer/app/pages/component/progressbar/progressbar.module.ts @@ -0,0 +1,24 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { ProgressbarModule } from 'ngx-bootstrap/progressbar'; +import { ProgressbarComponent } from './progressbar.component'; + +const PROGRESSBAR_ROUTES = [ + {path: '', component: ProgressbarComponent} +]; + +@NgModule({ + declarations: [ + ProgressbarComponent + ], + imports: [ + CommonModule, + BsDropdownModule.forRoot(), + ProgressbarModule.forRoot(), + RouterModule.forChild(PROGRESSBAR_ROUTES) + ] +}) +export class ProgressbarComponentModule { +} diff --git a/src/renderer/app/pages/component/scrollbar/scrollbar.component.html b/src/renderer/app/pages/component/scrollbar/scrollbar.component.html new file mode 100644 index 0000000..fe77472 --- /dev/null +++ b/src/renderer/app/pages/component/scrollbar/scrollbar.component.html @@ -0,0 +1,102 @@ +
+
+

Scrollbar

+ This template is built using ngx-perfect-scrollbar and provides some usage examples +
+
+
+
+

Returns the top

+
+ +
+
+
+
+

+ I,m {{index}} +

+
+
+
+
+
+
+
+
+
+

Returns the bottom

+
+ +
+
+
+
+

+ I,m {{index}} +

+
+
+
+
+
+
+
+
+
+

At position

+
+ +
+
+
+
+

+ I,m {{index}} +

+
+
+
+
+
+
+
+
+
+

Go to Left

+
+ +
+
+
+
+ + I,m {{index}} + +
+
+
+
+
+
+
+
+
+

Go to Right

+
+ +
+
+
+
+ + I,m {{index}} + +
+
+
+
+
+
+ +
diff --git a/src/renderer/app/pages/component/scrollbar/scrollbar.component.scss b/src/renderer/app/pages/component/scrollbar/scrollbar.component.scss new file mode 100644 index 0000000..353c313 --- /dev/null +++ b/src/renderer/app/pages/component/scrollbar/scrollbar.component.scss @@ -0,0 +1,25 @@ +.content-container { + position: relative; + overflow: auto; + margin: 5px; + border-radius: 4px; + background-color: #fff; + position: relative; + min-height: 0; + padding: 8px; + border: 1px solid #ccc; +} + +.scroll-container { + position: relative; +} + +.scrollable-content { + padding: 2px; + height: 100px; + margin: 0; +} + +.no-space { + white-space: nowrap; +} diff --git a/src/renderer/app/pages/component/scrollbar/scrollbar.component.ts b/src/renderer/app/pages/component/scrollbar/scrollbar.component.ts new file mode 100644 index 0000000..ee21fa2 --- /dev/null +++ b/src/renderer/app/pages/component/scrollbar/scrollbar.component.ts @@ -0,0 +1,65 @@ +import { Component, OnInit, ViewChild } from '@angular/core'; +import { PerfectScrollbarConfigInterface, PerfectScrollbarDirective } from 'ngx-perfect-scrollbar'; +import { ScrollbarService } from '@renderer/services/component/scrollbar.service'; + +@Component({ + selector: 'app-component-scrollbar', + templateUrl: './scrollbar.component.html', + styleUrls: ['./scrollbar.component.scss'] +}) +export class ScrollbarComponent implements OnInit { + public scrollbarType = '1'; + public config: PerfectScrollbarConfigInterface = {}; + public data: [number]; + + public constructor(private scrollbarService: ScrollbarService) { + this.data = this.scrollbarService.data; + } + + public toggleType() { + this.scrollbarType = (this.scrollbarType === '1') ? '2' : '1'; + } + + // Top + @ViewChild('goToTopScroll') + goToTopScroll: PerfectScrollbarDirective; + + public goToTop() { + this.goToTopScroll.scrollToTop(); + } + + // Bottom + @ViewChild('goToBottomScroll') + goToBottomScroll: PerfectScrollbarDirective; + + public goToBottom() { + this.goToBottomScroll.scrollToBottom(); + } + + // Go To Scrollbar + @ViewChild('goToXYScroll') + goToXYScroll: PerfectScrollbarDirective; + + public goToXY(x: number, y: number) { + this.goToXYScroll.scrollTo(x, y, 500); + } + + // Left + @ViewChild('goToLeftScroll') + goToLeftScroll: PerfectScrollbarDirective; + + public goToLeft() { + this.goToLeftScroll.scrollToLeft(); + } + + // Top + @ViewChild('goToRightScroll') + goToRightScroll: PerfectScrollbarDirective; + + public goToRight() { + this.goToRightScroll.scrollToRight(); + } + + ngOnInit() { + } +} diff --git a/src/renderer/app/pages/component/scrollbar/scrollbar.module.ts b/src/renderer/app/pages/component/scrollbar/scrollbar.module.ts new file mode 100644 index 0000000..ab2e0d4 --- /dev/null +++ b/src/renderer/app/pages/component/scrollbar/scrollbar.module.ts @@ -0,0 +1,40 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { FormsModule } from '@angular/forms'; +import { + PERFECT_SCROLLBAR_CONFIG, + PerfectScrollbarConfigInterface, + PerfectScrollbarModule +} from 'ngx-perfect-scrollbar'; +import { ScrollbarComponent } from './scrollbar.component'; +import { ScrollbarService } from '@renderer/services/component/scrollbar.service'; + +const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = { + suppressScrollX: true, + wheelPropagation: false +}; +const SCROLLBARS_ROUTES = [ + {path: '', component: ScrollbarComponent} +]; + +@NgModule({ + declarations: [ + ScrollbarComponent + ], + imports: [ + CommonModule, + FormsModule, + PerfectScrollbarModule, + RouterModule.forChild(SCROLLBARS_ROUTES) + ], + providers: [ + { + provide: PERFECT_SCROLLBAR_CONFIG, + useValue: DEFAULT_PERFECT_SCROLLBAR_CONFIG + }, + ScrollbarService + ] +}) +export class ScrollbarModule { +} diff --git a/src/renderer/app/pages/directive/contribution/contribution.component.html b/src/renderer/app/pages/directive/contribution/contribution.component.html new file mode 100644 index 0000000..860da2c --- /dev/null +++ b/src/renderer/app/pages/directive/contribution/contribution.component.html @@ -0,0 +1,8 @@ +
+
+

Contribution Charts 1.0.0

+ Use d3.js to plot contribution charts for high customization. +
+

Contribution

+ +
diff --git a/src/renderer/app/pages/directive/contribution/contribution.component.scss b/src/renderer/app/pages/directive/contribution/contribution.component.scss new file mode 100644 index 0000000..aab6e89 --- /dev/null +++ b/src/renderer/app/pages/directive/contribution/contribution.component.scss @@ -0,0 +1,17 @@ +.icons-demo { + .card-body { + .fa { + font-size: 1.7rem; + vertical-align: bottom; + margin-right: 1rem; + } + + .col-sm-4 { + padding: 0.8rem 1.1rem; + + &:hover { + background: rgba(0, 0, 0, 0.03); + } + } + } +} diff --git a/src/renderer/app/pages/directive/contribution/contribution.component.ts b/src/renderer/app/pages/directive/contribution/contribution.component.ts new file mode 100644 index 0000000..9f25329 --- /dev/null +++ b/src/renderer/app/pages/directive/contribution/contribution.component.ts @@ -0,0 +1,42 @@ +import { Component, OnInit } from '@angular/core'; +import * as moment from 'moment'; +import * as d3 from 'd3'; + +@Component({ + selector: 'app-root', + templateUrl: './contribution.component.html', + styleUrls: ['./contribution.component.scss'] +}) +export class DirectiveContributionComponent implements OnInit { + public data; + + constructor() { + } + + ngOnInit(): void { + this.init(); + } + + init() { + moment.locale('zh_cn'); + // Initialize random data for the demo + const now = moment().endOf('year').toDate(); + const timeAgo = moment().startOf('day').subtract(10, 'year').toDate(); + this.data = d3.timeDays(timeAgo, now).map((dateElement: any, index: number) => ({ + date: dateElement, + details: Array.apply(null, new Array(Math.floor(Math.random() * 15))).map((e: number, i: number, arr: any) => ({ + date: function() { + const projectDate = new Date(dateElement.getTime()); + projectDate.setHours(Math.floor(Math.random() * 24)); + projectDate.setMinutes(Math.floor(Math.random() * 60)); + return projectDate; + }(), + value: 3600 * ((arr.length - i) / 5) + Math.floor(Math.random() * 3600) * Math.round(Math.random() * (index / 365)) + })), + init() { + this.total = this.details.reduce((prev: number, e: any) => prev + e.value, 0); + return this; + } + }.init())); + } +} diff --git a/src/renderer/app/pages/directive/contribution/contribution.module.ts b/src/renderer/app/pages/directive/contribution/contribution.module.ts new file mode 100644 index 0000000..8bf9003 --- /dev/null +++ b/src/renderer/app/pages/directive/contribution/contribution.module.ts @@ -0,0 +1,26 @@ +import { NgModule } from '@angular/core'; +import { ContributionModule } from '@renderer/directives/contribution/contribution.module'; +import { CommonModule } from '@angular/common'; +import { RouterModule } from '@angular/router'; +import { DirectiveContributionComponent } from './contribution.component'; +import { FaIconService } from '@renderer/services/icon/fa.service'; + +const DIRECTIVE_CONTRIBUTION_ROUTES = [ + {path: '', component: DirectiveContributionComponent} +]; + +@NgModule({ + declarations: [ + DirectiveContributionComponent + ], + imports: [ + CommonModule, + ContributionModule, + RouterModule.forChild(DIRECTIVE_CONTRIBUTION_ROUTES) + ], + providers: [ + FaIconService + ] +}) +export class DirectiveContributionModule { +} diff --git a/src/renderer/app/pages/icon/fa/fa.component.html b/src/renderer/app/pages/icon/fa/fa.component.html new file mode 100644 index 0000000..671dcf3 --- /dev/null +++ b/src/renderer/app/pages/icon/fa/fa.component.html @@ -0,0 +1,19 @@ +
+
+

Font Awesome 4.7.0

+ This template is built using Font Awesome and has all the icon content +
+
+
+

{{icon.type}}

+
+
+ + + {{value}} + +
+
+
+
+
diff --git a/src/renderer/app/pages/icon/fa/fa.component.scss b/src/renderer/app/pages/icon/fa/fa.component.scss new file mode 100644 index 0000000..aab6e89 --- /dev/null +++ b/src/renderer/app/pages/icon/fa/fa.component.scss @@ -0,0 +1,17 @@ +.icons-demo { + .card-body { + .fa { + font-size: 1.7rem; + vertical-align: bottom; + margin-right: 1rem; + } + + .col-sm-4 { + padding: 0.8rem 1.1rem; + + &:hover { + background: rgba(0, 0, 0, 0.03); + } + } + } +} diff --git a/src/renderer/app/pages/icon/fa/fa.component.ts b/src/renderer/app/pages/icon/fa/fa.component.ts new file mode 100644 index 0000000..9514e03 --- /dev/null +++ b/src/renderer/app/pages/icon/fa/fa.component.ts @@ -0,0 +1,17 @@ +import { Component, OnInit } from '@angular/core'; +import { FaIconService } from '@renderer/services/icon/fa.service'; + +@Component({ + selector: 'app-icons-fa', + templateUrl: './fa.component.html', + styleUrls: ['./fa.component.scss'] +}) +export class FaComponent implements OnInit { + icons: [] = this.faIconService.icons; + + constructor(private faIconService: FaIconService) { + } + + ngOnInit() { + } +} diff --git a/src/renderer/app/pages/icon/fa/fa.module.ts b/src/renderer/app/pages/icon/fa/fa.module.ts new file mode 100644 index 0000000..5b77d01 --- /dev/null +++ b/src/renderer/app/pages/icon/fa/fa.module.ts @@ -0,0 +1,26 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { RouterModule } from '@angular/router'; +import { BsDropdownModule } from 'ngx-bootstrap/dropdown'; +import { FaComponent } from './fa.component'; +import { FaIconService } from '@renderer/services/icon/fa.service'; + +const ICONS_FA_ROUTES = [ + {path: '', component: FaComponent} +]; + +@NgModule({ + declarations: [ + FaComponent + ], + imports: [ + CommonModule, + BsDropdownModule.forRoot(), + RouterModule.forChild(ICONS_FA_ROUTES) + ], + providers: [ + FaIconService + ] +}) +export class IconsFaModule { +} diff --git a/src/renderer/data/icon/fa.json b/src/renderer/data/icon/fa.json new file mode 100644 index 0000000..1c73bdc --- /dev/null +++ b/src/renderer/data/icon/fa.json @@ -0,0 +1,1022 @@ +[ + { + "type": "Web Application", + "icons": [ + "fa-address-book", + "fa-address-book-o", + "fa-address-card", + "fa-address-card-o", + "fa-adjust", + "fa-american-sign-language-interpreting", + "fa-anchor", + "fa-archive", + "fa-area-chart", + "fa-arrows", + "fa-arrows-h", + "fa-arrows-v", + "fa-asl-interpreting", + "fa-assistive-listening-systems", + "fa-asterisk", + "fa-at", + "fa-audio-description", + "fa-automobile", + "fa-balance-scale", + "fa-ban", + "fa-bank", + "fa-bar-chart", + "fa-bar-chart-o", + "fa-barcode", + "fa-bars", + "fa-bath", + "fa-bathtub", + "fa-battery", + "fa-battery-0", + "fa-battery-1", + "fa-battery-2", + "fa-battery-3", + "fa-battery-4", + "fa-battery-empty", + "fa-battery-full", + "fa-battery-half", + "fa-battery-quarter", + "fa-battery-three-quarters", + "fa-bed", + "fa-beer", + "fa-bell", + "fa-bell-o", + "fa-bell-slash", + "fa-bell-slash-o", + "fa-bicycle", + "fa-binoculars", + "fa-birthday-cake", + "fa-blind", + "fa-bluetooth", + "fa-bluetooth-b", + "fa-bolt", + "fa-bomb", + "fa-book", + "fa-bookmark", + "fa-bookmark-o", + "fa-braille", + "fa-briefcase", + "fa-bug", + "fa-building", + "fa-building-o", + "fa-bullhorn", + "fa-bullseye", + "fa-bus", + "fa-cab", + "fa-calculator", + "fa-calendar", + "fa-calendar-check-o", + "fa-calendar-minus-o", + "fa-calendar-o", + "fa-calendar-plus-o", + "fa-calendar-times-o", + "fa-camera", + "fa-camera-retro", + "fa-car", + "fa-caret-square-o-down", + "fa-caret-square-o-left", + "fa-caret-square-o-right", + "fa-caret-square-o-up", + "fa-cart-arrow-down", + "fa-cart-plus", + "fa-cc", + "fa-certificate", + "fa-check", + "fa-check-circle", + "fa-check-circle-o", + "fa-check-square", + "fa-check-square-o", + "fa-child", + "fa-circle", + "fa-circle-o", + "fa-circle-o-notch", + "fa-circle-thin", + "fa-clock-o", + "fa-clone", + "fa-close", + "fa-cloud", + "fa-cloud-download", + "fa-cloud-upload", + "fa-code", + "fa-code-fork", + "fa-coffee", + "fa-cog", + "fa-cogs", + "fa-comment", + "fa-comment-o", + "fa-commenting", + "fa-commenting-o", + "fa-comments", + "fa-comments-o", + "fa-compass", + "fa-copyright", + "fa-creative-commons", + "fa-credit-card", + "fa-credit-card-alt", + "fa-crop", + "fa-crosshairs", + "fa-cube", + "fa-cubes", + "fa-cutlery", + "fa-dashboard", + "fa-database", + "fa-deaf", + "fa-deafness", + "fa-desktop", + "fa-diamond", + "fa-dot-circle-o", + "fa-download", + "fa-drivers-license", + "fa-drivers-license-o", + "fa-edit", + "fa-ellipsis-h", + "fa-ellipsis-v", + "fa-envelope", + "fa-envelope-o", + "fa-envelope-open", + "fa-envelope-open-o", + "fa-envelope-square", + "fa-eraser", + "fa-exchange", + "fa-exclamation", + "fa-exclamation-circle", + "fa-exclamation-triangle", + "fa-external-link", + "fa-external-link-square", + "fa-eye", + "fa-eye-slash", + "fa-eyedropper", + "fa-fax", + "fa-feed", + "fa-female", + "fa-fighter-jet", + "fa-file-archive-o", + "fa-file-audio-o", + "fa-file-code-o", + "fa-file-excel-o", + "fa-file-image-o", + "fa-file-movie-o", + "fa-file-pdf-o", + "fa-file-photo-o", + "fa-file-picture-o", + "fa-file-powerpoint-o", + "fa-file-sound-o", + "fa-file-video-o", + "fa-file-word-o", + "fa-file-zip-o", + "fa-film", + "fa-filter", + "fa-fire", + "fa-fire-extinguisher", + "fa-flag", + "fa-flag-checkered", + "fa-flag-o", + "fa-flash", + "fa-flask", + "fa-folder", + "fa-folder-o", + "fa-folder-open", + "fa-folder-open-o", + "fa-frown-o", + "fa-futbol-o", + "fa-gamepad", + "fa-gavel", + "fa-gear", + "fa-gears", + "fa-gift", + "fa-glass", + "fa-globe", + "fa-graduation-cap", + "fa-group", + "fa-hand-grab-o", + "fa-hand-lizard-o", + "fa-hand-paper-o", + "fa-hand-peace-o", + "fa-hand-pointer-o", + "fa-hand-rock-o", + "fa-hand-scissors-o", + "fa-hand-spock-o", + "fa-hand-stop-o", + "fa-handshake-o", + "fa-hard-of-hearing", + "fa-hashtag", + "fa-hdd-o", + "fa-headphones", + "fa-heart", + "fa-heart-o", + "fa-heartbeat", + "fa-history", + "fa-home", + "fa-hotel", + "fa-hourglass", + "fa-hourglass-1", + "fa-hourglass-2", + "fa-hourglass-3", + "fa-hourglass-end", + "fa-hourglass-half", + "fa-hourglass-o", + "fa-hourglass-start", + "fa-i-cursor", + "fa-id-badge", + "fa-id-card", + "fa-id-card-o", + "fa-image", + "fa-inbox", + "fa-industry", + "fa-info", + "fa-info-circle", + "fa-institution", + "fa-key", + "fa-keyboard-o", + "fa-language", + "fa-laptop", + "fa-leaf", + "fa-legal", + "fa-lemon-o", + "fa-level-down", + "fa-level-up", + "fa-life-bouy", + "fa-life-buoy", + "fa-life-ring", + "fa-life-saver", + "fa-lightbulb-o", + "fa-line-chart", + "fa-location-arrow", + "fa-lock", + "fa-low-vision", + "fa-magic", + "fa-magnet", + "fa-mail-forward", + "fa-mail-reply", + "fa-mail-reply-all", + "fa-male", + "fa-map", + "fa-map-marker", + "fa-map-o", + "fa-map-pin", + "fa-map-signs", + "fa-meh-o", + "fa-microchip", + "fa-microphone", + "fa-microphone-slash", + "fa-minus", + "fa-minus-circle", + "fa-minus-square", + "fa-minus-square-o", + "fa-mobile", + "fa-mobile-phone", + "fa-money", + "fa-moon-o", + "fa-mortar-board", + "fa-motorcycle", + "fa-mouse-pointer", + "fa-music", + "fa-navicon", + "fa-newspaper-o", + "fa-object-group", + "fa-object-ungroup", + "fa-paint-brush", + "fa-paper-plane", + "fa-paper-plane-o", + "fa-paw", + "fa-pencil", + "fa-pencil-square", + "fa-pencil-square-o", + "fa-percent", + "fa-phone", + "fa-phone-square", + "fa-photo", + "fa-picture-o", + "fa-pie-chart", + "fa-plane", + "fa-plug", + "fa-plus", + "fa-plus-circle", + "fa-plus-square", + "fa-plus-square-o", + "fa-podcast", + "fa-power-off", + "fa-print", + "fa-puzzle-piece", + "fa-qrcode", + "fa-question", + "fa-question-circle", + "fa-question-circle-o", + "fa-quote-left", + "fa-quote-right", + "fa-random", + "fa-recycle", + "fa-refresh", + "fa-registered", + "fa-remove", + "fa-reorder", + "fa-reply", + "fa-reply-all", + "fa-retweet", + "fa-road", + "fa-rocket", + "fa-rss", + "fa-rss-square", + "fa-s15", + "fa-search", + "fa-search-minus", + "fa-search-plus", + "fa-send", + "fa-send-o", + "fa-server", + "fa-share", + "fa-share-alt", + "fa-share-alt-square", + "fa-share-square", + "fa-share-square-o", + "fa-shield", + "fa-ship", + "fa-shopping-bag", + "fa-shopping-basket", + "fa-shopping-cart", + "fa-shower", + "fa-sign-in", + "fa-sign-language", + "fa-sign-out", + "fa-signal", + "fa-signing", + "fa-sitemap", + "fa-sliders", + "fa-smile-o", + "fa-snowflake-o", + "fa-soccer-ball-o", + "fa-sort", + "fa-sort-alpha-asc", + "fa-sort-alpha-desc", + "fa-sort-amount-asc", + "fa-sort-amount-desc", + "fa-sort-asc", + "fa-sort-desc", + "fa-sort-down", + "fa-sort-numeric-asc", + "fa-sort-numeric-desc", + "fa-sort-up", + "fa-space-shuttle", + "fa-spinner", + "fa-spoon", + "fa-square", + "fa-square-o", + "fa-star", + "fa-star-half", + "fa-star-half-empty", + "fa-star-half-full", + "fa-star-half-o", + "fa-star-o", + "fa-sticky-note", + "fa-sticky-note-o", + "fa-street-view", + "fa-suitcase", + "fa-sun-o", + "fa-support", + "fa-tablet", + "fa-tachometer", + "fa-tag", + "fa-tags", + "fa-tasks", + "fa-taxi", + "fa-television", + "fa-terminal", + "fa-thermometer", + "fa-thermometer-0", + "fa-thermometer-1", + "fa-thermometer-2", + "fa-thermometer-3", + "fa-thermometer-4", + "fa-thermometer-empty", + "fa-thermometer-full", + "fa-thermometer-half", + "fa-thermometer-quarter", + "fa-thermometer-three-quarters", + "fa-thumb-tack", + "fa-thumbs-down", + "fa-thumbs-o-down", + "fa-thumbs-o-up", + "fa-thumbs-up", + "fa-ticket", + "fa-times", + "fa-times-circle", + "fa-times-circle-o", + "fa-times-rectangle", + "fa-times-rectangle-o", + "fa-tint", + "fa-toggle-down", + "fa-toggle-left", + "fa-toggle-off", + "fa-toggle-on", + "fa-toggle-right", + "fa-toggle-up", + "fa-trademark", + "fa-trash", + "fa-trash-o", + "fa-tree", + "fa-trophy", + "fa-truck", + "fa-tty", + "fa-tv", + "fa-umbrella", + "fa-universal-access", + "fa-university", + "fa-unlock", + "fa-unlock-alt", + "fa-unsorted", + "fa-upload", + "fa-user", + "fa-user-circle", + "fa-user-circle-o", + "fa-user-o", + "fa-user-plus", + "fa-user-secret", + "fa-user-times", + "fa-users", + "fa-vcard", + "fa-vcard-o", + "fa-video-camera", + "fa-volume-control-phone", + "fa-volume-down", + "fa-volume-off", + "fa-volume-up", + "fa-warning", + "fa-wheelchair", + "fa-wheelchair-alt", + "fa-wifi", + "fa-window-close", + "fa-window-close-o", + "fa-window-maximize", + "fa-window-minimize", + "fa-window-restore", + "fa-wrench" + ] + }, + { + "type": "Auxiliary", + "icons": [ + "fa-american-sign-language-interpreting", + "fa-asl-interpreting", + "fa-assistive-listening-systems", + "fa-audio-description", + "fa-blind", + "fa-braille", + "fa-cc", + "fa-deaf", + "fa-deafness", + "fa-hard-of-hearing", + "fa-low-vision", + "fa-question-circle-o", + "fa-sign-language", + "fa-signing", + "fa-tty", + "fa-universal-access", + "fa-volume-control-phone", + "fa-wheelchair", + "fa-wheelchair-alt", + "fa-hand-grab-o", + "fa-hand-lizard-o", + "fa-hand-o-down", + "fa-hand-o-left", + "fa-hand-o-right", + "fa-hand-o-up", + "fa-hand-paper-o", + "fa-hand-peace-o", + "fa-hand-pointer-o", + "fa-hand-rock-o", + "fa-hand-scissors-o", + "fa-hand-spock-o", + "fa-hand-stop-o", + "fa-thumbs-down", + "fa-thumbs-o-down", + "fa-thumbs-o-up", + "fa-thumbs-up", + "fa-ambulance", + "fa-automobile", + "fa-bicycle", + "fa-bus", + "fa-cab", + "fa-car", + "fa-fighter-jet", + "fa-motorcycle", + "fa-plane", + "fa-rocket", + "fa-ship", + "fa-space-shuttle", + "fa-subway", + "fa-taxi", + "fa-train", + "fa-truck", + "fa-wheelchair", + "fa-wheelchair-alt" + ] + }, + { + "type": "Gender", + "icons": [ + "fa-genderless", + "fa-intersex", + "fa-mars", + "fa-mars-double", + "fa-mars-stroke", + "fa-mars-stroke-h", + "fa-mars-stroke-v", + "fa-mercury", + "fa-neuter", + "fa-transgender", + "fa-transgender-alt", + "fa-venus", + "fa-venus-double", + "fa-venus-mars" + ] + }, + { + "type": "File", + "icons": [ + "fa-file", + "fa-file-archive-o", + "fa-file-audio-o", + "fa-file-code-o", + "fa-file-excel-o", + "fa-file-image-o", + "fa-file-movie-o", + "fa-file-o", + "fa-file-pdf-o", + "fa-file-photo-o", + "fa-file-picture-o", + "fa-file-powerpoint-o", + "fa-file-sound-o", + "fa-file-text", + "fa-file-text-o", + "fa-file-video-o", + "fa-file-word-o", + "fa-file-zip-o" + ] + }, + { + "type": "Rotate(fa-spin)", + "icons": [ + "fa-info-circle", + "fa-circle-o-notch", + "fa-cog", + "fa-gear", + "fa-refresh", + "fa-spinner" + ] + }, + { + "type": "Form", + "icons": [ + "fa-check-square", + "fa-check-square-o", + "fa-circle", + "fa-circle-o", + "fa-dot-circle-o", + "fa-minus-square", + "fa-minus-square-o", + "fa-plus-square", + "fa-plus-square-o", + "fa-square", + "fa-square-o" + ] + }, + { + "type": "Pay", + "icons": [ + "fa-cc-amex", + "fa-cc-diners-club", + "fa-cc-discover", + "fa-cc-jcb", + "fa-cc-mastercard", + "fa-cc-paypal", + "fa-cc-stripe", + "fa-cc-visa", + "fa-credit-card", + "fa-credit-card-alt", + "fa-google-wallet", + "fa-paypal" + ] + }, + { + "type": "Chart", + "icons": [ + "fa-area-chart", + "fa-bar-chart", + "fa-bar-chart-o", + "fa-line-chart", + "fa-pie-chart" + ] + }, + { + "type": "Currency", + "icons": [ + "fa-bitcoin", + "fa-btc", + "fa-cny", + "fa-dollar", + "fa-eur", + "fa-euro", + "fa-gbp", + "fa-gg", + "fa-gg-circle", + "fa-ils", + "fa-inr", + "fa-jpy", + "fa-krw", + "fa-money", + "fa-rmb", + "fa-rouble", + "fa-rub", + "fa-ruble", + "fa-rupee", + "fa-shekel", + "fa-sheqel", + "fa-try", + "fa-turkish-lira", + "fa-usd", + "fa-won", + "fa-yen" + ] + }, + { + "type": "Text Editor", + "icons": [ + "fa-align-center", + "fa-align-justify", + "fa-align-left", + "fa-align-right", + "fa-bold", + "fa-chain", + "fa-chain-broken", + "fa-clipboard", + "fa-columns", + "fa-copy", + "fa-cut", + "fa-dedent", + "fa-eraser", + "fa-file", + "fa-file-o", + "fa-file-text", + "fa-file-text-o", + "fa-files-o", + "fa-floppy-o", + "fa-font", + "fa-header", + "fa-indent", + "fa-italic", + "fa-link", + "fa-list", + "fa-list-alt", + "fa-list-ol", + "fa-list-ul", + "fa-outdent", + "fa-paperclip", + "fa-paragraph", + "fa-paste", + "fa-repeat", + "fa-rotate-left", + "fa-rotate-right", + "fa-save", + "fa-scissors", + "fa-strikethrough", + "fa-subscript", + "fa-superscript", + "fa-table", + "fa-text-height", + "fa-text-width", + "fa-th", + "fa-th-large", + "fa-th-list", + "fa-underline", + "fa-undo", + "fa-unlink" + ] + }, + { + "type": "Giving", + "icons": [ + "fa-angle-double-down", + "fa-angle-double-left", + "fa-angle-double-right", + "fa-angle-double-up", + "fa-angle-down", + "fa-angle-left", + "fa-angle-right", + "fa-angle-up", + "fa-arrow-circle-down", + "fa-arrow-circle-left", + "fa-arrow-circle-o-down", + "fa-arrow-circle-o-left", + "fa-arrow-circle-o-right", + "fa-arrow-circle-o-up", + "fa-arrow-circle-right", + "fa-arrow-circle-up", + "fa-arrow-down", + "fa-arrow-left", + "fa-arrow-right", + "fa-arrow-up", + "fa-arrows", + "fa-arrows-alt", + "fa-arrows-h", + "fa-arrows-v", + "fa-caret-down", + "fa-caret-left", + "fa-caret-right", + "fa-caret-square-o-down", + "fa-caret-square-o-left", + "fa-caret-square-o-right", + "fa-caret-square-o-up", + "fa-caret-up", + "fa-chevron-circle-down", + "fa-chevron-circle-left", + "fa-chevron-circle-right", + "fa-chevron-circle-up", + "fa-chevron-down", + "fa-chevron-left", + "fa-chevron-right", + "fa-chevron-up", + "fa-exchange", + "fa-hand-o-down", + "fa-hand-o-left", + "fa-hand-o-right", + "fa-hand-o-up", + "fa-long-arrow-down", + "fa-long-arrow-left", + "fa-long-arrow-right", + "fa-long-arrow-up", + "fa-toggle-down", + "fa-toggle-left", + "fa-toggle-right", + "fa-toggle-up" + ] + }, + { + "type": "Video", + "icons": [ + "fa-arrows-alt", + "fa-backward", + "fa-compress", + "fa-eject", + "fa-expand", + "fa-fast-backward", + "fa-fast-forward", + "fa-forward", + "fa-pause", + "fa-pause-circle", + "fa-pause-circle-o", + "fa-play", + "fa-play-circle", + "fa-play-circle-o", + "fa-random", + "fa-step-backward", + "fa-step-forward", + "fa-stop", + "fa-stop-circle", + "fa-stop-circle-o", + "fa-youtube-play" + ] + }, + { + "type": "Mark", + "icons": [ + "fa-adn", + "fa-amazon", + "fa-android", + "fa-angellist", + "fa-apple", + "fa-bandcamp", + "fa-behance", + "fa-behance-square", + "fa-bitbucket", + "fa-bitbucket-square", + "fa-bitcoin", + "fa-black-tie", + "fa-bluetooth", + "fa-bluetooth-b", + "fa-btc", + "fa-buysellads", + "fa-cc-amex", + "fa-cc-diners-club", + "fa-cc-discover", + "fa-cc-jcb", + "fa-cc-mastercard", + "fa-cc-paypal", + "fa-cc-stripe", + "fa-cc-visa", + "fa-chrome", + "fa-codepen", + "fa-codiepie", + "fa-connectdevelop", + "fa-contao", + "fa-css3", + "fa-dashcube", + "fa-delicious", + "fa-deviantart", + "fa-digg", + "fa-dribbble", + "fa-dropbox", + "fa-drupal", + "fa-edge", + "fa-eercast", + "fa-empire", + "fa-envira", + "fa-etsy", + "fa-expeditedssl", + "fa-fa", + "fa-facebook", + "fa-facebook-f", + "fa-facebook-official", + "fa-facebook-square", + "fa-firefox", + "fa-first-order", + "fa-flickr", + "fa-font-awesome", + "fa-fonticons", + "fa-fort-awesome", + "fa-forumbee", + "fa-foursquare", + "fa-free-code-camp", + "fa-ge", + "fa-get-pocket", + "fa-gg", + "fa-gg-circle", + "fa-git", + "fa-git-square", + "fa-github", + "fa-github-alt", + "fa-github-square", + "fa-gitlab", + "fa-gittip", + "fa-glide", + "fa-glide-g", + "fa-google", + "fa-google-plus", + "fa-google-plus-circle", + "fa-google-plus-official", + "fa-google-plus-square", + "fa-google-wallet", + "fa-gratipay", + "fa-grav", + "fa-hacker-news", + "fa-houzz", + "fa-html5", + "fa-imdb", + "fa-instagram", + "fa-internet-explorer", + "fa-ioxhost", + "fa-joomla", + "fa-jsfiddle", + "fa-lastfm", + "fa-lastfm-square", + "fa-leanpub", + "fa-linkedin", + "fa-linkedin-square", + "fa-linode", + "fa-linux", + "fa-maxcdn", + "fa-meanpath", + "fa-medium", + "fa-meetup", + "fa-mixcloud", + "fa-modx", + "fa-odnoklassniki", + "fa-odnoklassniki-square", + "fa-opencart", + "fa-openid", + "fa-opera", + "fa-optin-monster", + "fa-pagelines", + "fa-paypal", + "fa-pied-piper", + "fa-pied-piper-alt", + "fa-pied-piper-pp", + "fa-pinterest", + "fa-pinterest-p", + "fa-pinterest-square", + "fa-product-hunt", + "fa-qq", + "fa-quora", + "fa-ra", + "fa-ravelry", + "fa-rebel", + "fa-reddit", + "fa-reddit-alien", + "fa-reddit-square", + "fa-renren", + "fa-resistance", + "fa-safari", + "fa-scribd", + "fa-sellsy", + "fa-share-alt", + "fa-share-alt-square", + "fa-shirtsinbulk", + "fa-simplybuilt", + "fa-skyatlas", + "fa-skype", + "fa-slack", + "fa-slideshare", + "fa-snapchat", + "fa-snapchat-ghost", + "fa-snapchat-square", + "fa-soundcloud", + "fa-spotify", + "fa-stack-exchange", + "fa-stack-overflow", + "fa-steam", + "fa-steam-square", + "fa-stumbleupon", + "fa-stumbleupon-circle", + "fa-superpowers", + "fa-telegram", + "fa-tencent-weibo", + "fa-themeisle", + "fa-trello", + "fa-tripadvisor", + "fa-tumblr", + "fa-tumblr-square", + "fa-twitch", + "fa-twitter", + "fa-twitter-square", + "fa-usb", + "fa-viacoin", + "fa-viadeo", + "fa-viadeo-square", + "fa-vimeo", + "fa-vimeo-square", + "fa-vine", + "fa-vk", + "fa-wechat", + "fa-weibo", + "fa-weixin", + "fa-whatsapp", + "fa-wikipedia-w", + "fa-windows", + "fa-wordpress", + "fa-wpbeginner", + "fa-wpexplorer", + "fa-wpforms", + "fa-xing", + "fa-xing-square", + "fa-y-combinator", + "fa-y-combinator-square", + "fa-yahoo", + "fa-yc", + "fa-yc-square", + "fa-yelp", + "fa-yoast", + "fa-youtube", + "fa-youtube-play", + "fa-youtube-square" + ] + }, + { + "type": "Medical", + "icons": [ + "fa-ambulance", + "fa-h-square", + "fa-heart", + "fa-heart-o", + "fa-heartbeat", + "fa-hospital-o", + "fa-medkit", + "fa-plus-square", + "fa-stethoscope", + "fa-user-md", + "fa-wheelchair", + "fa-wheelchair-alt" + ] + }, + { + "type": "Rotation & Turnover", + "icons": [ + "fa-ambulance", + "fa-ambulance fa-rotate-90", + "fa-ambulance fa-rotate-180", + "fa-ambulance fa-rotate-270", + "fa-ambulance fa-flip-horizontal", + "fa-ambulance fa-flip-vertical" + ] + }, + { + "type": "Combination", + "icons": [ + "fa-square-o fa-stack-2x", + "fa fa-twitter fa-stack-1x", + "fa-circle fa-stack-2x", + "fa-flag fa-stack-1x fa-inverse" + ] + }, + { + "type": "Large", + "icons": [ + "fa-camera-retro fa-lg", + "fa-camera-retro fa-2x", + "fa-camera-retro fa-3x", + "fa-camera-retro fa-4x", + "fa-camera-retro fa-5x" + ] + } +] diff --git a/src/renderer/directives/contribution/contribution.component.html b/src/renderer/directives/contribution/contribution.component.html new file mode 100644 index 0000000..c4e2bbd --- /dev/null +++ b/src/renderer/directives/contribution/contribution.component.html @@ -0,0 +1 @@ +
diff --git a/src/renderer/directives/contribution/contribution.component.scss b/src/renderer/directives/contribution/contribution.component.scss new file mode 100644 index 0000000..51db179 --- /dev/null +++ b/src/renderer/directives/contribution/contribution.component.scss @@ -0,0 +1,35 @@ +:host { + position: relative; + user-select: none; + -ms-user-select: none; + -moz-user-select: none; + -webkit-user-select: none; +} + +:host > > > .item { + cursor: pointer; +} + +:host > > > .label { + cursor: pointer; + fill: rgb(170, 170, 170); +} + +:host > > > .heatmap-tooltip { + pointer-events: none; + position: absolute; + z-index: 9999; + overflow: hidden; + padding: 0.3rem; + font-size: 12px; + line-height: 14px; + color: rgb(51, 51, 51); + background: #495057; + white-space: nowrap; + overflow: hidden; + color: #ffffff; + padding: 1rem; + border-radius: 0.3rem; + text-overflow: ellipsis; + display: inline-block; +} diff --git a/src/renderer/directives/contribution/contribution.component.ts b/src/renderer/directives/contribution/contribution.component.ts new file mode 100644 index 0000000..e2083b5 --- /dev/null +++ b/src/renderer/directives/contribution/contribution.component.ts @@ -0,0 +1,323 @@ +import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; +import { ContributionConfig } from './contribution.model'; +import * as moment from 'moment'; +import * as d3 from 'd3'; + +@Component({ + selector: 'app-directive-contribution-charts', + templateUrl: './contribution.component.html', + styleUrls: [ + './contribution.component.scss' + ] +}) +export class ContributionComponent implements OnInit { + @ViewChild('contributionCharts') + element: any; + // Render data + @Input() + data: Array; + // The configuration file + @Input() + config: ContributionConfig; + @Output() + handler: EventEmitter = new EventEmitter(); + @Output() + onChange: EventEmitter = new EventEmitter(); + // default config + private gutter = 5; + private itemGutter = 1; + private width = 1000; + private height = 200; + private itemSize = 10; + private labelPadding = 40; + private transitionDuration = 500; + private inTransition = false; + // tooltip + private tooltipWidth = 250; + private tooltipPadding = 15; + private selected = {}; + // D3 + private svg: any; + private items: any; + private labels: any; + private buttons: any; + private tooltip: any; + + ngOnInit(): void { + // If the user does not send the configuration information, the default configuration information is used + if (!this.config) { + this.config = new ContributionConfig(); + } + } + + // eslint-disable-next-line @angular-eslint/use-lifecycle-interface + ngOnChanges() { + // If render data is empty, throw an exception + if (!this.data) { + throw new Error('contribution charts data not null'); + } + } + + ngAfterViewInit() { + const element = this.element.nativeElement; + // Initialize the SVG + this.svg = d3.select(element) + .append('svg') + .attr('class', 'svg'); + // Initialize the SVG global container + this.items = this.svg.append('g'); + this.labels = this.svg.append('g'); + this.buttons = this.svg.append('g'); + // Add tooltip + this.tooltip = d3.select(element).append('div') + .attr('class', 'heatmap-tooltip') + .style('opacity', 0); + this.calculateDimensions(); + this.drawChart(); + } + + /** + * Calculation period data + */ + getNumberOfWeeks() { + const dayIndex = Math.round((+moment() - +moment().subtract(1, 'year').startOf('week')) / 86400000); + const colIndex = Math.trunc(dayIndex / 7); + const numWeeks = colIndex + 1; + return numWeeks; + } + + /** + * Calculate the dimensions of each indicator of the icon + */ + calculateDimensions() { + const element = this.element.nativeElement; + this.width = element.clientWidth < 1000 ? 1000 : element.clientWidth; + this.itemSize = ((this.width - this.labelPadding) / this.getNumberOfWeeks() - this.gutter); + this.height = this.labelPadding + 7 * (this.itemSize + this.gutter); + this.svg.attr('width', this.width).attr('height', this.height); + } + + /** + * Draw diagrams + */ + drawChart() { + this.drawYearOverviewChart(); + this.onChange.emit({ + start: moment(this.selected['date']).startOf('year'), + end: moment(this.selected['date']).endOf('year') + }); + } + + /** + * Chart by year + */ + drawYearOverviewChart() { + moment.locale(this.config.locale); + // Define start/end times + const startYear = moment(this.selected['date']).startOf('year'); + const endYear = moment(this.selected['date']).endOf('year'); + // Fill in annual data + let yearData; + if (!this.config.isFill) { + // No padding data, display data filtering based on passing + yearData = this.data.filter((d: any) => startYear <= moment(d.date) && moment(d.date) < endYear); + } + // Calculates the maximum value of data in the current year + const maxValue = d3.max(yearData, (d: any) => d.total); + const color = d3.scaleLinear().range(['#ffffff', this.config.color]).domain([-0.15 * maxValue, maxValue]); + // Clear data to prevent duplication of previous data + this.items.selectAll('.item-circle').remove(); + // Render annual data to chart + this.items.selectAll('.item-circle').data(yearData).enter().append('rect') + .attr('class', 'item item-circle').style('opacity', 0) + .attr('x', (item: any) => this.calcItemX(item, startYear) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('y', (item: any) => this.calcItemY(item) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('width', (item: any) => this.calcItemSize(item, maxValue)) + .attr('height', (item: any) => this.calcItemSize(item, maxValue)) + .attr('fill', (item: any) => (item.total > 0) ? color(item.total) : this.config.fillColor) + .on('mouseover', (item: any) => { + if (this.inTransition) { + return; + } + const circle = d3.select(d3.event.currentTarget); + const repeat = () => { + circle.transition().duration(this.transitionDuration).ease(d3.easeLinear) + .attr('x', (item: any) => this.calcItemX(item, startYear) - (this.itemSize * 1.1 - this.itemSize) / 2) + .attr('y', (item: any) => this.calcItemY(item) - (this.itemSize * 1.1 - this.itemSize) / 2) + .attr('width', this.itemSize * 1.1) + .attr('height', this.itemSize * 1.1) + .transition().duration(this.transitionDuration).ease(d3.easeLinear) + .attr('x', (item: any) => this.calcItemX(item, startYear) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('y', (item: any) => this.calcItemY(item) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('width', (item: any) => this.calcItemSize(item, maxValue)) + .attr('height', (item: any) => this.calcItemSize(item, maxValue)) + .on('end', repeat); + }; + repeat(); + // tooltip + const tooltipHtml = '
' + (item.total ? item.total : '0') + + ' A piece of data is created from ' + moment(item.date).format('dddd, MMM Do YYYY') + '
'; + let x = this.calcItemX(item, startYear) + this.itemSize / 2; + if (this.width - x < (this.tooltipWidth + this.tooltipPadding * 3)) { + x -= this.tooltipWidth + this.tooltipPadding * 2; + } + const y = this.calcItemY(item) + this.itemSize / 2; + this.tooltip.html(tooltipHtml).style('left', x + 'px') + .style('top', y + 'px').transition().duration(this.transitionDuration / 2) + .ease(d3.easeLinear).style('opacity', 1); + }) + .on('mouseout', () => { + if (this.inTransition) { + return; + } + d3.select(d3.event.currentTarget).transition() + .duration(this.transitionDuration / 2).ease(d3.easeLinear) + .attr('x', (item: any) => this.calcItemX(item, startYear) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('y', (item: any) => this.calcItemY(item) + (this.itemSize - this.calcItemSize(item, maxValue)) / 2) + .attr('width', (item: any) => this.calcItemSize(item, maxValue)) + .attr('height', (item: any) => this.calcItemSize(item, maxValue)); + this.hideTooltip(); + }) + .transition() + .delay(() => (Math.cos(Math.PI * Math.random()) + 1) * this.transitionDuration) + .duration(() => this.transitionDuration) + .ease(d3.easeLinear).style('opacity', 1) + .call((transition: any, callback: any) => { + if (transition.empty()) { + callback(); + } + let n = 0; + transition + .each(() => ++n) + .on('end', function() { + if (!--n) { + callback.apply(this, arguments); + } + }); + }, () => { + this.inTransition = false; + }); + // Renders all months of the current year + const monthLabels = d3.timeMonths(startYear.toDate(), endYear.toDate()); + const monthScale = d3.scaleLinear().range([0, this.width]).domain([0, monthLabels.length]); + this.labels.selectAll('.label-month').remove(); + this.labels.selectAll('.label-month').data(monthLabels) + .enter().append('text').attr('class', 'label label-month') + .attr('font-size', () => Math.floor(this.labelPadding / 3) + 'px') + .text((item: any) => item.toLocaleDateString(this.config.locale, {month: 'short'})) + .attr('x', (item: any, i: number) => monthScale(i) + (monthScale(i) - monthScale(i - 1)) / 2) + .attr('y', this.labelPadding / 2) + .on('mouseenter', (item: any) => { + if (this.inTransition) { + return; + } + // When the mouse moves to, all the days under the current month are extracted and highlighted + const selectedMonth = moment(item); + this.items.selectAll('.item-circle').transition() + .duration(this.transitionDuration).ease(d3.easeLinear) + .style('opacity', (monthItem: any) => moment(monthItem.date).isSame(selectedMonth, 'month') ? 1 : 0.1); + }) + .on('mouseout', () => { + if (this.inTransition) { + return; + } + this.items.selectAll('.item-circle').transition() + .duration(this.transitionDuration).ease(d3.easeLinear).style('opacity', 1); + }); + // Render weekly data + const dayLabels = d3.timeDays( + moment().startOf('week').toDate(), + moment().endOf('week').toDate() + ); + const dayScale = d3.scaleBand() + .rangeRound([this.labelPadding, this.height]) + .domain(dayLabels.map((d: any) => moment(d).weekday().toString())); + this.labels.selectAll('.label-day').remove(); + this.labels.selectAll('.label-day').data(dayLabels).enter() + .append('text').attr('class', 'label label-day').attr('x', this.labelPadding / 3) + .attr('y', (item: any, i: number) => dayScale((i).toString()) + dayScale.bandwidth() / 1.75) + .style('text-anchor', 'left') + .attr('font-size', () => Math.floor(this.labelPadding / 3) + 'px') + .text((item: any) => { + // If Chinese time zone, cut the last digit of Chinese character + if (this.config.locale === 'zh-cn') { + return moment(item).format('dddd')[2]; + } + return moment(item).format('dddd')[0]; + }) + .on('mouseenter', (item: any) => { + if (this.inTransition) { + return; + } + const selected_day = moment(item); + this.items.selectAll('.item-circle').transition() + .duration(this.transitionDuration).ease(d3.easeLinear) + .style('opacity', (d: any) => (moment(d.date).day() === selected_day.day()) ? 1 : 0.1); + }) + .on('mouseout', () => { + if (this.inTransition) { + return; + } + this.items.selectAll('.item-circle').transition().duration(this.transitionDuration) + .ease(d3.easeLinear).style('opacity', 1); + }); + } + + /** + * Compute the X-axis position of the element + * + * @param item element + * @param startYear Start the year + */ + calcItemX(item: any, startYear: any) { + const date = moment(item.date); + const dayIndex = Math.round((+date - +moment(startYear).startOf('week')) / 86400000); + const colIndex = Math.trunc(dayIndex / 7); + return colIndex * (this.itemSize + this.gutter) + this.labelPadding; + } + + /** + * Computes the Y position of the current element + * + * @param item element + */ + calcItemY(item: any) { + return this.labelPadding + moment(item.date).weekday() * (this.itemSize + this.gutter); + } + + /** + * Computes the current element size + * + * @param item The current element + * @param max The maximum + */ + calcItemSize(item: any, max: number) { + if (max <= 0) { + return this.itemSize; + } + return this.itemSize * 0.75 + (this.itemSize * item.total / max) * 0.25; + } + + hideTooltip() { + this.tooltip.transition() + .duration(this.transitionDuration / 2) + .ease(d3.easeLinear) + .style('opacity', 0); + } + + formatTime(seconds: number) { + const hours = Math.floor(seconds / 3600); + const minutes = Math.floor((seconds - (hours * 3600)) / 60); + let time = ''; + if (hours > 0) { + time += hours === 1 ? '1 hour ' : hours + ' hours '; + } + if (minutes > 0) { + time += minutes === 1 ? '1 minute' : minutes + ' minutes'; + } + if (hours === 0 && minutes === 0) { + time = Math.round(seconds) + ' seconds'; + } + return time; + } +} diff --git a/src/renderer/directives/contribution/contribution.model.ts b/src/renderer/directives/contribution/contribution.model.ts new file mode 100644 index 0000000..3666aa5 --- /dev/null +++ b/src/renderer/directives/contribution/contribution.model.ts @@ -0,0 +1,9 @@ +export class ContributionConfig { + public color = '#7bc96f'; + public fillColor = '#ebedf0'; + public locale = 'zh-cn'; + public isFill = false; + + constructor() { + } +} diff --git a/src/renderer/directives/contribution/contribution.module.ts b/src/renderer/directives/contribution/contribution.module.ts new file mode 100644 index 0000000..7bf7874 --- /dev/null +++ b/src/renderer/directives/contribution/contribution.module.ts @@ -0,0 +1,18 @@ +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { ContributionComponent } from './contribution.component'; + +@NgModule({ + imports: [ + CommonModule + ], + declarations: [ + ContributionComponent + ], + exports: [ + ContributionComponent + ], + providers: [] +}) +export class ContributionModule { +} diff --git a/src/renderer/services/component/carousel.service.ts b/src/renderer/services/component/carousel.service.ts new file mode 100644 index 0000000..e6a98cd --- /dev/null +++ b/src/renderer/services/component/carousel.service.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class CarouselService { + constructor() { + } + + builderCarousels() { + const carousels = [ + { + image: 'https://cdn.pixabay.com/photo/2016/02/11/14/59/fruits-1193727_1280.png', + title: 'fruits', + description: 'Description' + }, + { + url: 'https://cdn.pixabay.com/photo/2016/09/05/18/54/texture-1647380_1280.jpg', + title: 'texture', + description: 'Description' + }, + { + image: 'https://cdn.pixabay.com/photo/2018/05/12/19/20/mosaic-3394375_1280.jpg', + title: 'mosaic', + description: 'Description' + } + ]; + return carousels; + } +} diff --git a/src/renderer/services/component/datepicker.service.ts b/src/renderer/services/component/datepicker.service.ts new file mode 100644 index 0000000..5f01919 --- /dev/null +++ b/src/renderer/services/component/datepicker.service.ts @@ -0,0 +1,16 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class DatepickerService { + public themes: any = [ + 'theme-default', + 'theme-green', + 'theme-blue', + 'theme-dark-blue', + 'theme-red', + 'theme-orange' + ]; + + constructor() { + } +} diff --git a/src/renderer/services/component/scrollbar.service.ts b/src/renderer/services/component/scrollbar.service.ts new file mode 100644 index 0000000..328f4a1 --- /dev/null +++ b/src/renderer/services/component/scrollbar.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; + +@Injectable() +export class ScrollbarService { + data: any = []; + + constructor() { + for (let i = 0; i <= 100; i++) { + this.data.push(i); + } + } +} diff --git a/src/renderer/services/icon/fa.service.ts b/src/renderer/services/icon/fa.service.ts new file mode 100644 index 0000000..842b25b --- /dev/null +++ b/src/renderer/services/icon/fa.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; + +const supportIcons = require('../../data/icon/fa.json'); + +@Injectable() +export class FaIconService { + icons: []; + + constructor() { + this.icons = supportIcons; + } +} diff --git a/src/renderer/styles.scss b/src/renderer/styles.scss index 8bbe790..8443f59 100644 --- a/src/renderer/styles.scss +++ b/src/renderer/styles.scss @@ -1,6 +1,8 @@ @import "node_modules/bootstrap/scss/functions"; @import "node_modules/bootstrap/scss/variables"; +@import "node_modules/font-awesome/css/font-awesome"; + // Site, Bootstrap, Variable, Mixins @import "./assets/scss/variables"; @import "./assets/scss/mixins"; diff --git a/yarn.lock b/yarn.lock index 83c37be..d2ed52f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2998,6 +2998,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +commander@2, commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@2.9.0: version "2.9.0" resolved "https://registry.nlark.com/commander/download/commander-2.9.0.tgz?cache=0&sync_timestamp=1624609570521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" @@ -3005,11 +3010,6 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.nlark.com/commander/download/commander-2.20.3.tgz?cache=0&sync_timestamp=1624609570521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= - commander@^5.0.0: version "5.1.0" resolved "https://registry.nlark.com/commander/download/commander-5.1.0.tgz?cache=0&sync_timestamp=1624609570521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" @@ -3017,8 +3017,8 @@ commander@^5.0.0: commander@^7.0.0, commander@^7.1.0: version "7.2.0" - resolved "https://registry.nlark.com/commander/download/commander-7.2.0.tgz?cache=0&sync_timestamp=1624609570521&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcommander%2Fdownload%2Fcommander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc= + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== comment-parser@1.1.5, comment-parser@^1.1.5: version "1.1.5" @@ -3465,6 +3465,254 @@ custom-event@~1.0.0: resolved "https://registry.npm.taobao.org/custom-event/download/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= +d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +d3-axis@1: + version "1.0.12" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" + integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== + +d3-brush@1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" + integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-chord@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" + integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== + dependencies: + d3-array "1" + d3-path "1" + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +d3-contour@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" + integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== + dependencies: + d3-array "^1.1.1" + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +d3-drag@1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" + integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== + dependencies: + d3-dispatch "1" + d3-selection "1" + +d3-dsv@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" + integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +d3-ease@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" + integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== + +d3-fetch@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" + integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== + dependencies: + d3-dsv "1" + +d3-force@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-format@1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +d3-geo@1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-hierarchy@1: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-interpolate@1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +d3-polygon@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" + integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +d3-random@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" + integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== + +d3-scale-chromatic@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" + integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== + dependencies: + d3-color "1" + d3-interpolate "1" + +d3-scale@2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + +d3-selection@1, d3-selection@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" + integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== + +d3-shape@1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-time-format@2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" + integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + dependencies: + d3-time "1" + +d3-time@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +d3-transition@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" + integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +d3-voronoi@1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +d3-zoom@1: + version "1.8.3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" + integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3@5: + version "5.16.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" + integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== + dependencies: + d3-array "1" + d3-axis "1" + d3-brush "1" + d3-chord "1" + d3-collection "1" + d3-color "1" + d3-contour "1" + d3-dispatch "1" + d3-drag "1" + d3-dsv "1" + d3-ease "1" + d3-fetch "1" + d3-force "1" + d3-format "1" + d3-geo "1" + d3-hierarchy "1" + d3-interpolate "1" + d3-path "1" + d3-polygon "1" + d3-quadtree "1" + d3-random "1" + d3-scale "2" + d3-scale-chromatic "1" + d3-selection "1" + d3-shape "1" + d3-time "1" + d3-time-format "2" + d3-timer "1" + d3-transition "1" + d3-voronoi "1" + d3-zoom "1" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4562,6 +4810,11 @@ follow-redirects@^1.0.0, follow-redirects@^1.10.0: resolved "https://registry.nlark.com/follow-redirects/download/follow-redirects-1.14.1.tgz?cache=0&sync_timestamp=1620555300559&other_urls=https%3A%2F%2Fregistry.nlark.com%2Ffollow-redirects%2Fdownload%2Ffollow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" integrity sha1-2RFN7Qoc/dM04WTmZirQK/2R/0M= +font-awesome@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" + integrity sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM= + for-in@^1.0.2: version "1.0.2" resolved "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -5113,17 +5366,17 @@ iconv-corefoundation@^1.1.6: cli-truncate "^1.1.0" node-addon-api "^1.6.3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" - resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.6.2: version "0.6.3" - resolved "https://registry.nlark.com/iconv-lite/download/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha1-pS+AvzjaGVLrXGgXkHGYcaGnJQE= + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== dependencies: safer-buffer ">= 2.1.2 < 3.0.0" @@ -6493,6 +6746,11 @@ mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4: resolved "https://registry.npm.taobao.org/mkdirp/download/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha1-PrXtYmInVteaXw4qIh3+utdcL34= +moment@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" + integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fms%2Fdownload%2Fms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -6597,6 +6855,15 @@ ngx-clipboard@^14.0.1: ngx-window-token ">=4.0.0" tslib "^2.0.0" +ngx-perfect-scrollbar@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/ngx-perfect-scrollbar/-/ngx-perfect-scrollbar-10.1.1.tgz#f89832b9109e89bb59d516184638accd028e9735" + integrity sha512-f9IaDJGlBzSxnJ3Ki76n2JdzfQngUFyCf0E+CuVLaR5jL0IJDcTu7vOs8wexXunRMTd8xvIv0+sdIxf8hXAGWg== + dependencies: + perfect-scrollbar "1.5.0" + resize-observer-polyfill "^1.5.0" + tslib "^2.0.0" + ngx-window-token@>=4.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ngx-window-token/-/ngx-window-token-5.0.0.tgz#ca63a25038c9fdd73159857276ff67ec7f5b730b" @@ -7199,6 +7466,11 @@ pend@~1.2.0: resolved "https://registry.npm.taobao.org/pend/download/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= +perfect-scrollbar@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/perfect-scrollbar/-/perfect-scrollbar-1.5.0.tgz#821d224ed8ff61990c23f26db63048cdc75b6b83" + integrity sha512-NrNHJn5mUGupSiheBTy6x+6SXCFbLlm8fVZh9moIzw/LgqElN5q4ncR4pbCBCYuCJ8Kcl9mYM0NgDxvW+b4LxA== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -8259,6 +8531,11 @@ requires-port@^1.0.0: resolved "https://registry.npm.taobao.org/requires-port/download/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= +resize-observer-polyfill@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.npm.taobao.org/resolve-cwd/download/resolve-cwd-2.0.0.tgz?cache=0&sync_timestamp=1615984440417&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fresolve-cwd%2Fdownload%2Fresolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" @@ -8395,6 +8672,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= + rxjs-for-await@0.0.2: version "0.0.2" resolved "https://registry.npm.taobao.org/rxjs-for-await/download/rxjs-for-await-0.0.2.tgz#26598a1d6167147cc192172970e7eed4e620384b" @@ -8660,6 +8942,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.npm.taobao.org/signal-exit/download/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= +simple-keyboard@^3.3.22: + version "3.3.22" + resolved "https://registry.yarnpkg.com/simple-keyboard/-/simple-keyboard-3.3.22.tgz#33aab849cc15779b9ea174d7a75a178471929d89" + integrity sha512-dXuqORS0XbmkzAIB9lRhyDq3lbq3FManY6RgBKteC6sCirvNLT5TgMSX0v4eDLxBaBRbE/J5nV1ixQgFpzuNsw== + slash@^3.0.0: version "3.0.0" resolved "https://registry.npm.taobao.org/slash/download/slash-3.0.0.tgz?cache=0&sync_timestamp=1618384496016&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fslash%2Fdownload%2Fslash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"