Unverified Commit 6f3bdaef authored by 老广's avatar 老广 Committed by GitHub

Merge pull request #102 from jumpserver/dev_beta

Dev beta
parents 39f977cb e3328ead
......@@ -27,12 +27,15 @@
"styles.css",
"assets/ztree/awesomeStyle/awesome.css"
],
"scripts": [
"../node_modules/jquery/dist/jquery.min.js",
"../node_modules/metismenu/dist/metisMenu.js",
"comment": [
"../node_modules/jquery-sparkline/jquery.sparkline.js",
"../node_modules/tether/dist/js/tether.min.js",
"../node_modules/metismenu/dist/metisMenu.js",
"assets/slimscroll/jquery.slimscroll.min.js",
"../node_modules/tether/dist/js/tether.min.js"
],
"scripts": [
"../node_modules/jquery/dist/jquery.min.js",
"../node_modules/xterm/dist/xterm.js",
"assets/ztree/jquery.ztree.all.min.js",
"assets/ztree/jquery.ztree.exhide.min.js"
......
This diff is collapsed.
......@@ -11,72 +11,73 @@
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/animations": "^5.2.11",
"@angular/cdk": "^5.2.4",
"@angular/common": "^5.2.11",
"@angular/compiler": "^5.2.11",
"@angular/core": "^5.2.11",
"@angular/flex-layout": "^5.0.0-beta.15",
"@angular/forms": "^5.2.11",
"@angular/http": "^5.2.11",
"@angular/material": "^5.2.0",
"@angular/platform-browser": "^5.2.11",
"@angular/platform-browser-dynamic": "^5.2.11",
"@angular/router": "^5.2.11",
"other": {
"@swimlane/ngx-datatable": "^11.3.2",
"@swimlane/ngx-ui": "^20.2.1",
"@types/jquery": "^3.3.6",
"@types/neffos.js": "^0.1.1",
"@types/socket.io-client": "^1.4.32",
"ajv": "^6.5.0",
"animate.css": "^3.6.1",
"body-parser": "^1.18.2",
"bootstrap": "^4.3.1",
"clipboard": "^1.7.1",
"compass-mixins": "^0.12.10",
"core-js": "2.5.3",
"directory-encoder": "^0.9.2",
"font-awesome": "4.7.0",
"guacamole-common-js": "0.9.14-b",
"handlebars": "^4.1.2",
"intl": "1.2.5",
"jquery": "^3.4.1",
"jquery-slimscroll": "^1.3.8",
"jquery-sparkline": "^2.4.0",
"jvectormap": "1.2.2",
"lodash": "^4.17.15",
"material-design-icons": "^3.0.1",
"materialize-css": "^0.100.2",
"metismenu": "^2.7.9",
"neffos.js": "^0.1.19",
"ng2-charts": "^1.5.0",
"ngx-bootstrap": "^1.6.6",
"ngx-cookie-service": "^1.0.10",
"ngx-layer": "0.0.4",
"ngx-logger": "^2.2.4",
"ngx-perfect-scrollbar": "5.2.0",
"ngx-progressbar": "^2.1.1",
"npm-font-open-sans": "^1.1.0",
"peity": "^3.3.0",
"popper.js": "1.12.9",
"requirejs": "^2.3.5",
"roboto-fontface": "^0.8.0",
"rxjs": "5.5.6",
"sass-math": "^1.0.0",
"socket.io": "^1.4.32",
"socket.io-client": "^1.4.32",
"ssh-keygen": "^0.4.1",
"tether": "^1.4.4",
"tslib": "^1.9.0",
"utf-8-validate": "^5.0.2",
"utf-8-validate": "^5.0.2"
},
"dependencies": {
"@angular/animations": "^5.2.11",
"@angular/cdk": "^5.2.4",
"@angular/common": "^5.2.11",
"@angular/compiler": "^5.2.11",
"@angular/core": "^5.2.11",
"@angular/flex-layout": "^5.0.0-beta.15",
"@angular/forms": "^5.2.11",
"@angular/http": "^5.2.11",
"@angular/material": "^5.2.0",
"@angular/platform-browser": "^5.2.11",
"@angular/platform-browser-dynamic": "^5.2.11",
"@angular/router": "^5.2.11",
"@swimlane/ngx-ui": "^20.2.1",
"@types/jquery": "^3.3.6",
"@types/neffos.js": "^0.1.1",
"@types/socket.io-client": "^1.4.32",
"rxjs": "5.5.6",
"zone.js": "0.8.20",
"uuid-js": "^0.7.5",
"xterm": "3.3.0",
"zone.js": "0.8.20"
"socket.io": "^1.4.32",
"socket.io-client": "^1.4.32",
"core-js": "2.5.3",
"neffos.js": "^0.1.19",
"bootstrap": "^4.3.1",
"popper.js": "^1.14.7",
"jquery": "^3.4.1",
"guacamole-common-js": "0.9.14-b",
"ngx-cookie-service": "^1.0.10",
"metismenu": "^2.7.9",
"ngx-logger": "^2.2.4",
"animate.css": "^3.6.1",
"tslib": "^1.9.0",
"requirejs": "^2.3.5",
"ngx-progressbar": "^2.1.1",
"npm-font-open-sans": "^1.1.0",
"font-awesome": "4.7.0"
},
"devDependencies": {
"@angular-devkit/core": "^0.4.9",
"@angular-devkit/schematics": "^0.4.9",
"@angular-devkit/core": "^0.3.2",
"@angular-devkit/schematics": "^0.3.2",
"@angular/cli": "^1.7.4",
"@angular/compiler-cli": "^5.2.11",
"@angular/language-service": "5.2.0",
......
// Elements
import {ElementTableComponent} from './table/table.component';
import {ElementLeftBarComponent} from './left-bar/left-bar.component';
import {ElementContentComponent} from './content/content.component';
import {ElementContentViewComponent} from './content-window/content-window.component';
......@@ -8,9 +7,7 @@ import {ElementAssetTreeComponent} from './asset-tree/asset-tree.component';
import {ElementTreeFilterComponent} from './tree-filter/tree-filter.component';
import {ElementFooterComponent} from './footer/footer.component';
import {ElementTermComponent} from './term/term.component';
import {ElementInteractiveComponent} from './interactive/interactive.component';
import {ChangLanWarningDialogComponent, ElementNavComponent} from './nav/nav.component';
import {ElementPopupComponent} from './popup/popup.component';
import {ElementRdpComponent} from './rdp/rdp.component';
import {ElementServerMenuComponent} from './server-menu/server-menu.component';
import {ElementIframeComponent} from './iframe/iframe.component';
......@@ -27,13 +24,10 @@ export const ElementComponents = [
ElementContentViewComponent,
ElementConnectComponent,
ElementTreeFilterComponent,
ElementTableComponent,
ElementFooterComponent,
ElementTermComponent,
ElementInteractiveComponent,
ElementNavComponent,
ChangLanWarningDialogComponent,
ElementPopupComponent,
ElementRdpComponent,
ElementServerMenuComponent,
ElementIframeComponent,
......
<div class="menu">
<input type="checkbox" href="#" class="menu-open" name="menu-open" id="menu-open"/>
<label class="menu-open-button" for="menu-open">
<span class="hamburger hamburger-1"></span>
<span class="hamburger hamburger-2"></span>
<span class="hamburger hamburger-3"></span>
</label>
<a href="#" class="menu-item"> <i class="fa fa-bar-chart"></i> </a>
<a href="#" class="menu-item"> <i class="fa fa-plus"></i> </a>
<a href="#" class="menu-item"> <i class="fa fa-heart"></i> </a>
<a href="#" class="menu-item"> <i class="fa fa-envelope"></i> </a>
</div>
@import "~sass-math/math";
//vars
$fg: #ff4081;
$bg: #3f51b5;
$pi: pi();
//config
$menu-items: 5;
$open-distance: 115px;
$opening-angle: $pi - .2;
%goo {
filter: url('#shadowed-goo');
// debug
//background:rgba(255,0,0,0.2);
}
%ball {
background: $fg;
border-radius: 100%;
width: 80px;
height: 80px;
margin-left: -40px;
position: absolute;
top: 20px;
color: white;
text-align: center;
line-height: 80px;
transform: translate3d(0, 0, 0);
transition: transform ease-out 200ms;
}
.menu-open {
display: none;
}
.menu-item {
@extend %ball;
}
.hamburger {
$width: 25px;
$height: 3px;
width: $width;
height: $height;
background: white;
display: block;
position: absolute;
top: 50%;
left: 50%;
margin-left: -$width/2;
margin-top: -$height/2;
transition: transform 200ms;
}
$hamburger-spacing: 8px;
.hamburger-1 {
transform: translate3d(0, -$hamburger-spacing, 0);
}
.hamburger-2 {
transform: translate3d(0, 0, 0);
}
.hamburger-3 {
transform: translate3d(0, $hamburger-spacing, 0);
}
.menu-open:checked + .menu-open-button {
.hamburger-1 {
transform: translate3d(0, 0, 0) rotate(45deg);
}
.hamburger-2 {
transform: translate3d(0, 0, 0) scale(0.1, 1);
}
.hamburger-3 {
transform: translate3d(0, 0, 0) rotate(-45deg);
}
}
.menu {
@extend %goo;
$width: 380px;
$height: 250px;
position: absolute;
left: 50%;
margin-left: -$width/2;
padding-top: 20px;
padding-left: $width/2;
width: $width;
height: $height;
box-sizing: border-box;
font-size: 20px;
text-align: left;
}
.menu-item {
&:hover {
background: white;
color: $fg;
}
@for $i from 1 through $menu-items {
&:nth-child(#{$i+2}) {
transition-duration: 10ms+(60ms*($i));
}
}
}
.menu-open-button {
@extend %ball;
z-index: 2;
transition-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1.275);
transition-duration: 400ms;
transform: scale(1.1, 1.1) translate3d(0, 0, 0);
cursor: pointer;
}
.menu-open-button:hover {
transform: scale(1.2, 1.2) translate3d(0, 0, 0);
}
.menu-open:checked + .menu-open-button {
transition-timing-function: linear;
transition-duration: 200ms;
transform: scale(0.8, 0.8) translate3d(0, 0, 0);
}
.menu-open:checked ~ .menu-item {
transition-timing-function: cubic-bezier(0.935, 0.000, 0.340, 1.330);
@for $i from 1 through $menu-items {
$angle: (($pi - $opening-angle)/2)+(($opening-angle/($menu-items - 1))*($i - 1)+($pi*0.43));
&:nth-child(#{$i+2}) {
transition-duration: 80ms+(80ms*$i);
transform: translate3d(sin($angle)*$open-distance, cos($angle)*$open-distance, 0);
}
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ElementInteractiveComponent } from './interactive.component';
describe('ElementInteractiveComponent', () => {
let component: ElementInteractiveComponent;
let fixture: ComponentFixture<ElementInteractiveComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ElementInteractiveComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ElementInteractiveComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'elements-interactive',
templateUrl: './interactive.component.html',
styleUrls: ['./interactive.component.scss']
})
export class ElementInteractiveComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ElementPopupComponent } from './popup.component';
describe('ElementPopupComponent', () => {
let component: ElementPopupComponent;
let fixture: ComponentFixture<ElementPopupComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ElementPopupComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ElementPopupComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should be created', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'elements-popup',
templateUrl: './popup.component.html',
styleUrls: ['./popup.component.css']
})
export class ElementPopupComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
<div>
<input
type='text'
placeholder='Type to filter the name column...'
(keyup)='updateFilter($event)'
*ngIf="config.search"/>
<ngx-datatable
#table
class="material"
[rows]="rows"
[columns]="columns"
[limit]="config.limit"
[columnMode]="config.columnMode"
[headerHeight]="config.headerHeight"
[footerHeight]="config.footerHeight"
[rowHeight]="config.rowHeight"
[scrollbarV]="config.scrollbarV"
[scrollbarH]="config.scrollbarH"
></ngx-datatable>
<mat-paginator #paginator
[pageSize]="config.pageSize"
[pageSizeOptions]="config.pageSizeOptions"
(click)="test()">
</mat-paginator>
</div>
<button (click)="test()">ssss</button>
input {
padding: 8px;
margin: 15px auto;
width: 30%;
}
.material {
box-shadow: 0 3px 5px -3px rgba(0, 0, 0, 0.2);
}
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ElementTableComponent } from './table.component';
describe('ElementTableComponent', () => {
let component: ElementTableComponent;
let fixture: ComponentFixture<ElementTableComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ElementTableComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ElementTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, Input, OnInit, ViewChild} from '@angular/core';
import {DatatableComponent} from '@swimlane/ngx-datatable';
import {MatPaginator} from '@angular/material';
import {LogService} from '@app/app.service';
export let Config: {
search: boolean,
scrollbarV: boolean,
scrollbarH: boolean,
rowHeight: number,
footerHeight: number,
headerHeight: number,
limit: number,
columnMode: string,
pageSize: number,
pageSizeOptions: Array<number>,
} = {
search: false,
scrollbarV: false,
scrollbarH: false,
rowHeight: 50,
footerHeight: 50,
headerHeight: 50,
limit: 10,
columnMode: 'force',
pageSize: 10,
pageSizeOptions: [5, 10, 20],
};
@Component({
selector: 'elements-table',
templateUrl: './table.component.html',
styleUrls: ['./table.component.scss']
})
export class ElementTableComponent implements OnInit {
@Input() rows: Array<any>;
@Input() columns: Array<any>;
@Input() config: any;
temp = [];
@ViewChild(DatatableComponent) table: DatatableComponent;
@ViewChild(MatPaginator) paginator: MatPaginator;
constructor(private _logger: LogService) {
}
ngOnInit() {
Config = this.config;
this.paginator.length = this.rows.length;
}
updateFilter(event) {
const val = event.target.value.toLowerCase();
// filter our data
const temp = this.temp.filter(function (d) {
return d.name.toLowerCase().indexOf(val) !== -1 || !val;
});
// update the rows
this.rows = temp;
// Whenever the filter changes, always go back to the first page
this.table.offset = 0;
}
test() {
console.log(this.paginator._pageIndex);
console.log(this.paginator._pageIndex * this.paginator.pageSize + 1);
this.table.limit = this.paginator.pageSize;
}
}
<div *ngFor="let node of TreeData">
<div *ngIf="node.leafs?.length>0">
{{node.id}}
<elements-tree [TreeData]="node.leafs"></elements-tree>
</div>
<div *ngIf="node.leafs?.length==0">
{{node.id}}
</div>
</div>
<!--<ul class="filetree ">-->
<!--<li *ngFor="let hostGroup of HostGroups | SearchFilter: q; let i = index ">-->
<!--<input type="checkbox" id="hostgroup-{{i}}">-->
<!--<label for="hostgroup-{{i}}" matTooltip="{{hostGroup.name}}" [matTooltipPosition]="TooltipPosition">{{hostGroup.name}}</label>-->
<!--</li>-->
<!--</ul>-->
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { ElementTreeComponent } from './tree.component';
describe('R ', () => {
let component: ElementTreeComponent;
let fixture: ComponentFixture<ElementTreeComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ ElementTreeComponent ]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(ElementTreeComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import {Component, Input, OnInit} from '@angular/core';
import {HttpService} from '@app/app.service';
export interface Assets {
name: string;
id: string;
type: string;
}
export interface Groups {
id: string;
key: string;
name: string;
value: string;
parent: string;
assets_granted: Array<Assets>;
}
export class TreeStruct {
id: string;
leafs: Array<TreeStruct>;
static create(id, parent: string) {
const tmp = new TreeStruct();
tmp.id = id;
tmp.leafs = [];
return tmp;
}
}
@Component({
selector: 'elements-tree',
templateUrl: './tree.component.html',
styleUrls: ['./tree.component.scss']
})
export class ElementTreeComponent implements OnInit {
@Input() TreeData: Array<TreeStruct>;
constructor(private _http: HttpService) {
}
ngOnInit() {
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import {ElementTreeComponent} from './tree.component';
@NgModule({
imports: [
CommonModule
],
declarations: [
ElementTreeComponent
]
})
export class TreeModule {
}
import {MaterialModule} from './MaterialModule.component';
import {NgxUIModule, SplitModule} from '@swimlane/ngx-ui';
import {LoggerModule, NgxLoggerLevel} from 'ngx-logger';
import {NgxDatatableModule} from '@swimlane/ngx-datatable';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {NgProgressModule} from 'ngx-progressbar';
import {FlexLayoutModule} from '@angular/flex-layout';
......@@ -13,7 +12,6 @@ export const PluginModules = [
MaterialModule,
FlexLayoutModule,
LoggerModule.forRoot({level: NgxLoggerLevel.DEBUG, serverLogLevel: NgxLoggerLevel.ERROR}),
NgxDatatableModule,
NgxUIModule,
SplitModule
];
......
......@@ -6,10 +6,10 @@ $fa-font-path: '~font-awesome/fonts';
// Todo: 去掉依赖
@import '~bootstrap/scss/bootstrap';
$FontPathOpenSans: '~npm-font-open-sans/fonts';
@import '~npm-font-open-sans/open-sans';
$roboto-font-path: '~roboto-fontface/fonts';
@import '~roboto-fontface/css/mixins.scss';
//$FontPathOpenSans: '~npm-font-open-sans/fonts';
//@import '~npm-font-open-sans/open-sans';
//$roboto-font-path: '~roboto-fontface/fonts';
//@import '~roboto-fontface/css/mixins.scss';
/*
*
......@@ -21,49 +21,49 @@ $asset-path: '../static/imgs/inspinia';
// Todo: 去掉依赖
@import '../assets/inspinia/style';
@import '~@swimlane/ngx-datatable/release/index.css';
@import '~@swimlane/ngx-datatable/release/themes/material.css';
@import '~@swimlane/ngx-datatable/release/assets/icons.css';
//@import '~@swimlane/ngx-datatable/release/index.css';
//@import '~@swimlane/ngx-datatable/release/themes/material.css';
//@import '~@swimlane/ngx-datatable/release/assets/icons.css';
@import './material.css';
$material-design-icons-font-path: '~/material-design-icons/iconfont/';
//$material-design-icons-font-path: '~/material-design-icons/iconfont/';
//@import '~material-design-icons/iconfont/material-icons';
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url('#{$material-design-icons-font-path}/MaterialIcons-Regular.eot'); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url('#{$material-design-icons-font-path}/MaterialIcons-Regular.woff2') format('woff2'),
url('#{$material-design-icons-font-path}/MaterialIcons-Regular.woff') format('woff'),
url('#{$material-design-icons-font-path}/MaterialIcons-Regular.ttf') format('truetype');
}
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px; /* Preferred icon size */
display: inline-block;
line-height: 1;
text-transform: none;
letter-spacing: normal;
word-wrap: normal;
white-space: nowrap;
direction: ltr;
/* Support for all WebKit browsers. */
-webkit-font-smoothing: antialiased;
/* Support for Safari and Chrome. */
text-rendering: optimizeLegibility;
/* Support for Firefox. */
-moz-osx-font-smoothing: grayscale;
/* Support for IE. */
font-feature-settings: 'liga';
}
//@font-face {
// font-family: 'Material Icons';
// font-style: normal;
// font-weight: 400;
// src: url('#{$material-design-icons-font-path}/MaterialIcons-Regular.eot'); /* For IE6-8 */
// src: local('Material Icons'),
// local('MaterialIcons-Regular'),
// url('#{$material-design-icons-font-path}/MaterialIcons-Regular.woff2') format('woff2'),
// url('#{$material-design-icons-font-path}/MaterialIcons-Regular.woff') format('woff'),
// url('#{$material-design-icons-font-path}/MaterialIcons-Regular.ttf') format('truetype');
//}
//
//.material-icons {
// font-family: 'Material Icons';
// font-weight: normal;
// font-style: normal;
// font-size: 24px; /* Preferred icon size */
// display: inline-block;
// line-height: 1;
// text-transform: none;
// letter-spacing: normal;
// word-wrap: normal;
// white-space: nowrap;
// direction: ltr;
//
// /* Support for all WebKit browsers. */
// -webkit-font-smoothing: antialiased;
// /* Support for Safari and Chrome. */
// text-rendering: optimizeLegibility;
//
// /* Support for Firefox. */
// -moz-osx-font-smoothing: grayscale;
//
// /* Support for IE. */
// font-feature-settings: 'liga';
//}
//ul {
// padding-left: 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment