Compare commits
5 Commits
ff91626c43
...
0591902de1
Author | SHA1 | Date |
---|---|---|
subhra74 | 0591902de1 | |
subhra74 | 1784d8abdc | |
subhra74 | cf9150872c | |
subhra74 | f5595df57f | |
subhra74 | 6aa833b546 |
|
@ -1,4 +1,4 @@
|
|||
# Easy Cloud Shell
|
||||
# Linux Web Console
|
||||
|
||||
Easy to use web based file manager with built in text editor, terminal, image viewer and video player
|
||||
|
||||
|
@ -19,12 +19,12 @@ run commands using built in terminal, and view images and videos, all from your
|
|||
|
||||
Installation
|
||||
- Install java
|
||||
- Download the binary archive from https://github.com/subhra74/easy-cloud-shell/releases
|
||||
- Download the binary archive from https://github.com/subhra74/linux-web-console/releases
|
||||
- Extract the archive to a suitable location
|
||||
- Make file executable with chmod
|
||||
- Run ./start-cloud-shell.sh (For security reasons do not use root user)
|
||||
- Run ./web-console.sh (For security reasons do not use root user)
|
||||
- Open recent version on Chrome or Firefox and visit https://[your ip address]:8055/ or, on local machine use https://localhost:8055/
|
||||
- Ignore any certificate error, appeared due to newly created self signed certificate by easy cloud shell.
|
||||
- Ignore any certificate error, appeared due to newly created self signed certificate by linux web console.
|
||||
- Initial credential:
|
||||
Username: admin
|
||||
Password: admin
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
1. Install java and make sure java is in PATH
|
||||
2. Download the binary archive from https://github.com/subhra74/easy-cloud-shell/releases
|
||||
2. Download the binary archive from https://github.com/subhra74/linux-web-console/releases
|
||||
3. Extract the archive to a suitable location and switch to that directory
|
||||
4. Make file executable with chmod if required
|
||||
5. Run ./start-cloud-shell.sh (For security reasons do not use root user)
|
||||
5. Run ./start-web-console.sh (For security reasons do not use root user)
|
||||
6. Open recent version on Chrome or Firefox and visit https://[your ip address]:8055/ or, on local machine use https://localhost:8055/
|
||||
7. Ignore any certificate error, appeared due to newly created self signed certificate by easy cloud shell.
|
||||
7. Ignore any certificate error, appeared due to newly created self signed certificate by the app.
|
||||
8. Initial credential: admin/admin
|
||||
Please change default username and password from Settings tab in the app.
|
||||
Also you can change default port by setting environment variable server.port=<any port number>
|
356
app/pom.xml
356
app/pom.xml
|
@ -1,178 +1,178 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.1.5.RELEASE</version>
|
||||
<relativePath /> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>webshell</groupId>
|
||||
<artifactId>app</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>app</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.pty4j</groupId>
|
||||
<artifactId>pty4j</artifactId>
|
||||
<version>0.9.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.jetbrains.pty4j</groupId> -->
|
||||
<!-- <artifactId>purejavacomm</artifactId> -->
|
||||
<!-- <version>0.0.11.1</version> -->
|
||||
<!-- </dependency> -->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.10.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.10.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.10.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.54</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna-platform</artifactId>
|
||||
<version>5.3.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>5.3.1</version>
|
||||
</dependency>
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>log4j</groupId> -->
|
||||
<!-- <artifactId>log4j</artifactId> -->
|
||||
<!-- <version>1.2.17</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>com.google.guava</groupId> -->
|
||||
<!-- <artifactId>guava</artifactId> -->
|
||||
<!-- <version>27.0-jre</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>log4j</groupId> -->
|
||||
<!-- <artifactId>log4j</artifactId> -->
|
||||
<!-- <version>1.2.17</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- https://mvnrepository.com/artifact/org.jetbrains/annotations -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.jetbrains</groupId> -->
|
||||
<!-- <artifactId>annotations</artifactId> -->
|
||||
<!-- <version>16.0.3</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>1.62</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcpkix-jdk15on</artifactId>
|
||||
<version>1.62</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tika</groupId>
|
||||
<artifactId>tika-core</artifactId>
|
||||
<version>1.21</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-dist</artifactId>
|
||||
<version>3.13.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-core</artifactId>
|
||||
<version>3.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-json</artifactId>
|
||||
<version>3.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-parent</artifactId>
|
||||
<version>3.13.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>bintray-jetbrains-pty4j</id>
|
||||
<name>bintray</name>
|
||||
<url>https://jetbrains.bintray.com/pty4j</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<finalName>cloud-shell</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.1.5.RELEASE</version>
|
||||
<relativePath /> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>web-console</groupId>
|
||||
<artifactId>app</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>app</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-websocket</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-devtools</artifactId>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.pty4j</groupId>
|
||||
<artifactId>pty4j</artifactId>
|
||||
<version>0.9.3</version>
|
||||
</dependency>
|
||||
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.jetbrains.pty4j</groupId> -->
|
||||
<!-- <artifactId>purejavacomm</artifactId> -->
|
||||
<!-- <version>0.0.11.1</version> -->
|
||||
<!-- </dependency> -->
|
||||
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<version>0.10.5</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-impl</artifactId>
|
||||
<version>0.10.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-jackson</artifactId>
|
||||
<version>0.10.5</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jcraft</groupId>
|
||||
<artifactId>jsch</artifactId>
|
||||
<version>0.1.54</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna-platform</artifactId>
|
||||
<version>5.3.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.java.dev.jna</groupId>
|
||||
<artifactId>jna</artifactId>
|
||||
<version>5.3.1</version>
|
||||
</dependency>
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>log4j</groupId> -->
|
||||
<!-- <artifactId>log4j</artifactId> -->
|
||||
<!-- <version>1.2.17</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>com.google.guava</groupId> -->
|
||||
<!-- <artifactId>guava</artifactId> -->
|
||||
<!-- <version>27.0-jre</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>log4j</groupId> -->
|
||||
<!-- <artifactId>log4j</artifactId> -->
|
||||
<!-- <version>1.2.17</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- https://mvnrepository.com/artifact/org.jetbrains/annotations -->
|
||||
<!-- <dependency> -->
|
||||
<!-- <groupId>org.jetbrains</groupId> -->
|
||||
<!-- <artifactId>annotations</artifactId> -->
|
||||
<!-- <version>16.0.3</version> -->
|
||||
<!-- </dependency> -->
|
||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>1.62</version>
|
||||
</dependency>
|
||||
<!-- https://mvnrepository.com/artifact/org.bouncycastle/bcpkix-jdk15on -->
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcpkix-jdk15on</artifactId>
|
||||
<version>1.62</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.tika</groupId>
|
||||
<artifactId>tika-core</artifactId>
|
||||
<version>1.21</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-dist</artifactId>
|
||||
<version>3.13.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-core</artifactId>
|
||||
<version>3.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-json</artifactId>
|
||||
<version>3.13.3</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.github.oshi</groupId>
|
||||
<artifactId>oshi-parent</artifactId>
|
||||
<version>3.13.3</version>
|
||||
<type>pom</type>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>bintray-jetbrains-pty4j</id>
|
||||
<name>bintray</name>
|
||||
<url>https://jetbrains.bintray.com/pty4j</url>
|
||||
</repository>
|
||||
</repositories>
|
||||
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<finalName>web-console</finalName>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
|
@ -31,17 +31,17 @@ public class HealthApiController {
|
|||
@Autowired
|
||||
private SystemHealthMonitor healthMon;
|
||||
|
||||
@GetMapping("/app/sys/stats")
|
||||
@GetMapping("/sys/stats")
|
||||
public SystemStats getStats() {
|
||||
return this.healthMon.getStats();
|
||||
}
|
||||
|
||||
@GetMapping("/app/sys/procs")
|
||||
@GetMapping("/sys/procs")
|
||||
public List<ProcessInfo> getProcessList() {
|
||||
return this.healthMon.getProcessList();
|
||||
}
|
||||
|
||||
@PostMapping("/app/sys/procs")
|
||||
@PostMapping("/sys/procs")
|
||||
public Map<String, Boolean> killProcesses(
|
||||
@RequestBody List<Integer> pidList) {
|
||||
Map<String, Boolean> map = new HashMap<>();
|
||||
|
|
|
@ -1,24 +1,18 @@
|
|||
package cloudshell.app;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest
|
||||
public class AppApplicationTests {
|
||||
|
||||
@Autowired
|
||||
private BCryptPasswordEncoder passwordEncoder;
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
System.out.println("Password match: " + passwordEncoder.matches("Starscream@64",
|
||||
"$2a$10$greBvSdJwMfmrz7Fof0mB.i2oiBNypVeGa9KCBOZ2BPMxXBa3xJUK"));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
package cloudshell.app;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(classes = AppApplicationTests.class)
|
||||
public class AppApplicationTests {
|
||||
|
||||
@Test
|
||||
public void contextLoads() {
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,7 +0,0 @@
|
|||
#/bin/sh
|
||||
|
||||
mkdir ~/.easy-cloud-shell
|
||||
|
||||
nohup java -jar cloud-shell.jar >$HOME/.easy-cloud-shell/log.txt 2>&1&
|
||||
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
#/bin/sh
|
||||
mkdir ~/.linux-web-console
|
||||
nohup java -jar web-console.jar >$HOME/.linux-web-console/log.txt 2>&1&
|
||||
|
|
@ -42,5 +42,3 @@ testem.log
|
|||
# System Files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
ui/package-lock.json
|
|
@ -1,4 +1,4 @@
|
|||
# WebShellJs
|
||||
# WebConsole
|
||||
|
||||
This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.2.
|
||||
|
|
@ -3,7 +3,7 @@
|
|||
"version": 1,
|
||||
"newProjectRoot": "projects",
|
||||
"projects": {
|
||||
"cloud-shell-js": {
|
||||
"web-console": {
|
||||
"root": "",
|
||||
"sourceRoot": "src",
|
||||
"projectType": "application",
|
||||
|
@ -13,7 +13,7 @@
|
|||
"build": {
|
||||
"builder": "@angular-devkit/build-angular:browser",
|
||||
"options": {
|
||||
"outputPath": "dist/cloud-shell-js",
|
||||
"outputPath": "dist/web-console",
|
||||
"index": "src/index.html",
|
||||
"main": "src/main.ts",
|
||||
"polyfills": "src/polyfills.ts",
|
||||
|
@ -57,18 +57,18 @@
|
|||
"serve": {
|
||||
"builder": "@angular-devkit/build-angular:dev-server",
|
||||
"options": {
|
||||
"browserTarget": "cloud-shell-js:build"
|
||||
"browserTarget": "web-console:build"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"browserTarget": "cloud-shell-js:build:production"
|
||||
"browserTarget": "web-console:build:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
"extract-i18n": {
|
||||
"builder": "@angular-devkit/build-angular:extract-i18n",
|
||||
"options": {
|
||||
"browserTarget": "cloud-shell-js:build"
|
||||
"browserTarget": "web-console:build"
|
||||
}
|
||||
},
|
||||
"test": {
|
||||
|
@ -102,7 +102,7 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"cloud-shell-js-e2e": {
|
||||
"web-console-e2e": {
|
||||
"root": "e2e/",
|
||||
"projectType": "application",
|
||||
"prefix": "",
|
||||
|
@ -111,11 +111,11 @@
|
|||
"builder": "@angular-devkit/build-angular:protractor",
|
||||
"options": {
|
||||
"protractorConfig": "e2e/protractor.conf.js",
|
||||
"devServerTarget": "cloud-shell-js:serve"
|
||||
"devServerTarget": "web-console:serve"
|
||||
},
|
||||
"configurations": {
|
||||
"production": {
|
||||
"devServerTarget": "cloud-shell-js:serve:production"
|
||||
"devServerTarget": "web-console:serve:production"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -131,5 +131,5 @@
|
|||
}
|
||||
}
|
||||
},
|
||||
"defaultProject": "cloud-shell-js"
|
||||
"defaultProject": "web-console"
|
||||
}
|
|
@ -10,7 +10,7 @@ describe('workspace-project App', () => {
|
|||
|
||||
it('should display welcome message', () => {
|
||||
page.navigateTo();
|
||||
expect(page.getTitleText()).toEqual('Welcome to web-shell-js!');
|
||||
expect(page.getTitleText()).toEqual('Welcome to web-console!');
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
File diff suppressed because it is too large
Load Diff
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "cloud-shell-js",
|
||||
"name": "web-console",
|
||||
"version": "0.0.0",
|
||||
"scripts": {
|
||||
"ng": "ng",
|
||||
|
@ -19,18 +19,18 @@
|
|||
"@angular/platform-browser": "~7.2.0",
|
||||
"@angular/platform-browser-dynamic": "~7.2.0",
|
||||
"@angular/router": "~7.2.0",
|
||||
"core-js": "^2.5.4",
|
||||
"rxjs": "~6.3.3",
|
||||
"tslib": "^1.9.0",
|
||||
"zone.js": "~0.8.26",
|
||||
"@ng-bootstrap/ng-bootstrap": "^4.2.0",
|
||||
"@swimlane/ngx-charts": "^12.0.1",
|
||||
"bootstrap": "^4.3.1",
|
||||
"chart.js": "^2.8.0",
|
||||
"core-js": "^2.5.4",
|
||||
"font-awesome": "^4.7.0",
|
||||
"ng2-ace-editor": "^0.3.9",
|
||||
"ng2-charts": "^2.2.3",
|
||||
"rxjs": "~6.3.3",
|
||||
"tslib": "^1.9.0",
|
||||
"xterm": "^3.14.5",
|
||||
"zone.js": "~0.8.26"
|
||||
"ng2-charts": "2.2.5",
|
||||
"xterm": "^3.14.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@angular-devkit/build-angular": "~0.12.0",
|
||||
|
@ -53,4 +53,4 @@
|
|||
"tslint": "~5.11.0",
|
||||
"typescript": "~3.2.2"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,175 +1,175 @@
|
|||
.selected-tab{
|
||||
border-bottom: 3px solid dodgerblue;
|
||||
border-right: 1px solid rgb(230,230,230);
|
||||
}
|
||||
|
||||
.normal-tab{
|
||||
border-bottom: 3px solid rgb(240,240,240);
|
||||
border-right: 1px solid rgb(230,230,230);
|
||||
}
|
||||
|
||||
.nav-tree {
|
||||
height: 100%;
|
||||
width: 250px;
|
||||
min-width: 250px;
|
||||
background: rgb(240, 240, 240);
|
||||
overflow: hidden;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
border-right: 1px solid rgb(230, 230, 230);
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.file-list {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
position: relative;
|
||||
max-width: calc(100vw - 250px);
|
||||
}
|
||||
|
||||
.file-list-header {
|
||||
display: flex;
|
||||
height: 51px;
|
||||
background: white;
|
||||
border-bottom: 1px solid rgb(230, 230, 230);
|
||||
cursor: pointer;
|
||||
position: sticky;
|
||||
top: 0px;
|
||||
box-shadow: 0px 0px 6px 0px rgb(230, 230, 230);
|
||||
}
|
||||
|
||||
.file-list-item-row {
|
||||
display: flex;
|
||||
height: 51px;
|
||||
border-bottom: 1px solid rgb(240, 240, 240);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.desktop-file-list-first-item {
|
||||
flex: 2;
|
||||
overflow-x: hidden;
|
||||
line-height: 50px;
|
||||
display: flex;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.desktop-file-list-other-item {
|
||||
flex: 1;
|
||||
line-height: 50px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.mobile-file-list-row {
|
||||
display: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.desktop-nav {
|
||||
display: flex;
|
||||
padding: 10px;
|
||||
padding-left: 15px;
|
||||
background: rgb(245, 245, 245);
|
||||
border-bottom: 1px solid rgb(230, 230, 230);
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mobile-nav {
|
||||
display: none;
|
||||
justify-content: space-around;
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
background: rgb(245, 245, 245);
|
||||
border-top: 1px solid rgb(230, 230, 230);
|
||||
}
|
||||
|
||||
.desktop-file-tabs {
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
background: rgb(240, 240, 240);
|
||||
border-bottom: 1px solid rgb(220,220,220);
|
||||
}
|
||||
|
||||
.dropdown-ctx-menu {
|
||||
display: flex;
|
||||
width: 200px;
|
||||
flex-direction: column;
|
||||
position: fixed;
|
||||
right: 0px;
|
||||
max-height: 50vh;
|
||||
background: white;
|
||||
border: 1px solid rgb(200, 200, 200);
|
||||
box-shadow: 3px 3px 10px 0px rgb(200, 200, 200);
|
||||
z-index: 301;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.noselect {
|
||||
-webkit-touch-callout: none;
|
||||
/* iOS Safari */
|
||||
-webkit-user-select: none;
|
||||
/* Safari */
|
||||
-khtml-user-select: none;
|
||||
/* Konqueror HTML */
|
||||
-moz-user-select: none;
|
||||
/* Firefox */
|
||||
-ms-user-select: none;
|
||||
/* Internet Explorer/Edge */
|
||||
user-select: none;
|
||||
/* Non-prefixed version, currently
|
||||
supported by Chrome and Opera */
|
||||
}
|
||||
|
||||
@media (max-width:800px) {
|
||||
[class="nav-tree"] {
|
||||
display: none;
|
||||
}
|
||||
[class="file-list"] {
|
||||
max-width: 100vw;
|
||||
}
|
||||
[class="file-list-header"] {
|
||||
display: none;
|
||||
}
|
||||
[class*="file-list-content-wrapper"] {
|
||||
padding-top: 0px;
|
||||
}
|
||||
[class*="file-list-item-row"] {
|
||||
height: 80px;
|
||||
}
|
||||
[class="desktop-file-list-first-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="desktop-file-list-other-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-file-list-row"] {
|
||||
display: flex;
|
||||
}
|
||||
[class="desktop-file-list-other-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="desktop-nav"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-nav"] {
|
||||
display: flex;
|
||||
}
|
||||
[class*="desktop-file-tabs"] {
|
||||
display: none;
|
||||
}
|
||||
[class="dropdown-ctx-menu"] {
|
||||
bottom: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:800px) {
|
||||
[class="dropdown-ctx-menu"] {
|
||||
top: 100px;
|
||||
}
|
||||
.selected-tab{
|
||||
border-bottom: 3px solid dodgerblue;
|
||||
border-right: 1px solid rgb(230,230,230);
|
||||
}
|
||||
|
||||
.normal-tab{
|
||||
border-bottom: 3px solid rgb(240,240,240);
|
||||
border-right: 1px solid rgb(230,230,230);
|
||||
}
|
||||
|
||||
.nav-tree {
|
||||
height: 100%;
|
||||
width: 250px;
|
||||
min-width: 250px;
|
||||
background: rgb(240, 240, 240);
|
||||
overflow: hidden;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
border-right: 1px solid rgb(230, 230, 230);
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.file-list {
|
||||
flex: 1;
|
||||
overflow: hidden;
|
||||
overflow-x: auto;
|
||||
overflow-y: auto;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
position: relative;
|
||||
max-width: calc(100vw - 250px);
|
||||
}
|
||||
|
||||
.file-list-header {
|
||||
display: flex;
|
||||
height: 51px;
|
||||
background: white;
|
||||
border-bottom: 1px solid rgb(230, 230, 230);
|
||||
cursor: pointer;
|
||||
position: sticky;
|
||||
top: 0px;
|
||||
box-shadow: 0px 0px 6px 0px rgb(230, 230, 230);
|
||||
}
|
||||
|
||||
.file-list-item-row {
|
||||
display: flex;
|
||||
height: 51px;
|
||||
border-bottom: 1px solid rgb(240, 240, 240);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.desktop-file-list-first-item {
|
||||
flex: 2;
|
||||
overflow-x: hidden;
|
||||
line-height: 50px;
|
||||
display: flex;
|
||||
padding-left: 10px;
|
||||
}
|
||||
|
||||
.desktop-file-list-other-item {
|
||||
flex: 1;
|
||||
line-height: 50px;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.mobile-file-list-row {
|
||||
display: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.desktop-nav {
|
||||
display: flex;
|
||||
padding: 10px;
|
||||
padding-left: 15px;
|
||||
background: rgb(245, 245, 245);
|
||||
border-bottom: 1px solid rgb(230, 230, 230);
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mobile-nav {
|
||||
display: none;
|
||||
justify-content: space-around;
|
||||
flex-wrap: nowrap;
|
||||
overflow: hidden;
|
||||
background: rgb(245, 245, 245);
|
||||
border-top: 1px solid rgb(230, 230, 230);
|
||||
}
|
||||
|
||||
.desktop-file-tabs {
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
background: rgb(240, 240, 240);
|
||||
border-bottom: 1px solid rgb(220,220,220);
|
||||
}
|
||||
|
||||
.dropdown-ctx-menu {
|
||||
display: flex;
|
||||
width: 200px;
|
||||
flex-direction: column;
|
||||
position: fixed;
|
||||
right: 0px;
|
||||
max-height: 50vh;
|
||||
background: white;
|
||||
border: 1px solid rgb(200, 200, 200);
|
||||
box-shadow: 3px 3px 10px 0px rgb(200, 200, 200);
|
||||
z-index: 301;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.noselect {
|
||||
-webkit-touch-callout: none;
|
||||
/* iOS Safari */
|
||||
-webkit-user-select: none;
|
||||
/* Safari */
|
||||
-khtml-user-select: none;
|
||||
/* Konqueror HTML */
|
||||
-moz-user-select: none;
|
||||
/* Firefox */
|
||||
-ms-user-select: none;
|
||||
/* Internet Explorer/Edge */
|
||||
user-select: none;
|
||||
/* Non-prefixed version, currently
|
||||
supported by Chrome and Opera */
|
||||
}
|
||||
|
||||
@media (max-width:800px) {
|
||||
[class="nav-tree"] {
|
||||
display: none;
|
||||
}
|
||||
[class="file-list"] {
|
||||
max-width: 100vw;
|
||||
}
|
||||
[class="file-list-header"] {
|
||||
display: none;
|
||||
}
|
||||
[class*="file-list-content-wrapper"] {
|
||||
padding-top: 0px;
|
||||
}
|
||||
[class*="file-list-item-row"] {
|
||||
height: 80px;
|
||||
}
|
||||
[class="desktop-file-list-first-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="desktop-file-list-other-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-file-list-row"] {
|
||||
display: flex;
|
||||
}
|
||||
[class="desktop-file-list-other-item"] {
|
||||
display: none;
|
||||
}
|
||||
[class="desktop-nav"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-nav"] {
|
||||
display: flex;
|
||||
}
|
||||
[class*="desktop-file-tabs"] {
|
||||
display: none;
|
||||
}
|
||||
[class="dropdown-ctx-menu"] {
|
||||
bottom: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width:800px) {
|
||||
[class="dropdown-ctx-menu"] {
|
||||
top: 100px;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,170 +1,170 @@
|
|||
.fullscreen {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: black;
|
||||
color: white;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.minimized {
|
||||
width: 200px;
|
||||
position: fixed;
|
||||
right: 10px;
|
||||
bottom: 0px;
|
||||
color: white;
|
||||
background: black;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.rounded-top {
|
||||
border-top-left-radius: 10px;
|
||||
border-top-right-radius: 10px;
|
||||
}
|
||||
|
||||
.normal {
|
||||
width: 740px;
|
||||
height: 450px;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
right: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: black;
|
||||
color: white;
|
||||
z-index: 100;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.term-normal {
|
||||
height: 410px;
|
||||
}
|
||||
|
||||
.term-fullscreen {
|
||||
height: calc(100vh - 40px);
|
||||
}
|
||||
|
||||
|
||||
.router-wrapper {
|
||||
padding-top: 55px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.desktop-title {
|
||||
flex: 1;
|
||||
line-height: 55px;
|
||||
color: gray;
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.mobile-title {
|
||||
flex: 1;
|
||||
line-height: 55px;
|
||||
color: gray;
|
||||
font-size: 22px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.desktop-nav {
|
||||
height: 55px;
|
||||
/* background: rgb(33, 37, 43); */
|
||||
background: rgb(36, 46, 43);;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
box-shadow: 0px 3px 6px 0px rgb(200, 200, 200);
|
||||
margin-bottom: 5px;
|
||||
position: fixed;
|
||||
width: 100vw;
|
||||
z-index: 150;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.mobile-nav {
|
||||
background: rgb(33, 37, 43);
|
||||
display: none;
|
||||
justify-content: space-around;
|
||||
box-shadow: 0px 3px 6px 0px rgb(200, 200, 200);
|
||||
margin-bottom: 5px;
|
||||
position: fixed;
|
||||
width: 100vw;
|
||||
z-index: 150;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.desktop-terminal-wrapper {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.terminal-btn {
|
||||
position: fixed;
|
||||
right: 30px;
|
||||
bottom: 30px;
|
||||
border-radius: 50%;
|
||||
background: rgb(20, 20, 20);
|
||||
color: white;
|
||||
width: 50px;
|
||||
text-align: center;
|
||||
height: 50px;
|
||||
z-index: 300;
|
||||
box-shadow: 2px 2px 5px gray;
|
||||
}
|
||||
|
||||
.active-link {
|
||||
background: rgb(62, 66, 81)
|
||||
}
|
||||
|
||||
.device-keyboard {
|
||||
padding-right: 10px;
|
||||
cursor: pointer;
|
||||
color: white;
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (max-width:800px) {
|
||||
[class="desktop-nav"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-nav"] {
|
||||
display: flex;
|
||||
}
|
||||
[class*="desktop-terminal-wrapper"] {
|
||||
display: none;
|
||||
}
|
||||
[class="terminal-btn"] {
|
||||
bottom: 60px;
|
||||
right: 30px;
|
||||
}
|
||||
[class*="desktop-title"] {
|
||||
display: none;
|
||||
}
|
||||
[class*="mobile-title"] {
|
||||
display: block;
|
||||
}
|
||||
[class="device-keyboard"] {
|
||||
display: block;
|
||||
}
|
||||
[class="term-fullscreen"]{
|
||||
height: 50vh
|
||||
}
|
||||
}
|
||||
|
||||
.bg-gradient {
|
||||
background: #3A1C71;
|
||||
/* fallback for old browsers */
|
||||
background: -webkit-linear-gradient(to right, #FFAF7B, #D76D77, #3A1C71);
|
||||
/* Chrome 10-25, Safari 5.1-6 */
|
||||
background: linear-gradient(to right, #FFAF7B, #D76D77, #3A1C71);
|
||||
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
|
||||
.fullscreen {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: black;
|
||||
color: white;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.minimized {
|
||||
width: 200px;
|
||||
position: fixed;
|
||||
right: 10px;
|
||||
bottom: 0px;
|
||||
color: white;
|
||||
background: black;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.rounded-top {
|
||||
border-top-left-radius: 10px;
|
||||
border-top-right-radius: 10px;
|
||||
}
|
||||
|
||||
.normal {
|
||||
width: 740px;
|
||||
height: 450px;
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
right: 10px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: black;
|
||||
color: white;
|
||||
z-index: 100;
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.term-normal {
|
||||
height: 410px;
|
||||
}
|
||||
|
||||
.term-fullscreen {
|
||||
height: calc(100vh - 40px);
|
||||
}
|
||||
|
||||
|
||||
.router-wrapper {
|
||||
padding-top: 55px;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.desktop-title {
|
||||
flex: 1;
|
||||
line-height: 55px;
|
||||
color: gray;
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.mobile-title {
|
||||
flex: 1;
|
||||
line-height: 55px;
|
||||
color: gray;
|
||||
font-size: 22px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.desktop-nav {
|
||||
height: 55px;
|
||||
/* background: rgb(33, 37, 43); */
|
||||
background: rgb(36, 46, 43);;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
box-shadow: 0px 3px 6px 0px rgb(200, 200, 200);
|
||||
margin-bottom: 5px;
|
||||
position: fixed;
|
||||
width: 100vw;
|
||||
z-index: 150;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.mobile-nav {
|
||||
background: rgb(33, 37, 43);
|
||||
display: none;
|
||||
justify-content: space-around;
|
||||
box-shadow: 0px 3px 6px 0px rgb(200, 200, 200);
|
||||
margin-bottom: 5px;
|
||||
position: fixed;
|
||||
width: 100vw;
|
||||
z-index: 150;
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.desktop-terminal-wrapper {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.terminal-btn {
|
||||
position: fixed;
|
||||
right: 30px;
|
||||
bottom: 30px;
|
||||
border-radius: 50%;
|
||||
background: rgb(20, 20, 20);
|
||||
color: white;
|
||||
width: 50px;
|
||||
text-align: center;
|
||||
height: 50px;
|
||||
z-index: 300;
|
||||
box-shadow: 2px 2px 5px gray;
|
||||
}
|
||||
|
||||
.active-link {
|
||||
background: rgb(62, 66, 81)
|
||||
}
|
||||
|
||||
.device-keyboard {
|
||||
padding-right: 10px;
|
||||
cursor: pointer;
|
||||
color: white;
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media (max-width:800px) {
|
||||
[class="desktop-nav"] {
|
||||
display: none;
|
||||
}
|
||||
[class="mobile-nav"] {
|
||||
display: flex;
|
||||
}
|
||||
[class*="desktop-terminal-wrapper"] {
|
||||
display: none;
|
||||
}
|
||||
[class="terminal-btn"] {
|
||||
bottom: 60px;
|
||||
right: 30px;
|
||||
}
|
||||
[class*="desktop-title"] {
|
||||
display: none;
|
||||
}
|
||||
[class*="mobile-title"] {
|
||||
display: block;
|
||||
}
|
||||
[class="device-keyboard"] {
|
||||
display: block;
|
||||
}
|
||||
[class="term-fullscreen"]{
|
||||
height: 50vh
|
||||
}
|
||||
}
|
||||
|
||||
.bg-gradient {
|
||||
background: #3A1C71;
|
||||
/* fallback for old browsers */
|
||||
background: -webkit-linear-gradient(to right, #FFAF7B, #D76D77, #3A1C71);
|
||||
/* Chrome 10-25, Safari 5.1-6 */
|
||||
background: linear-gradient(to right, #FFAF7B, #D76D77, #3A1C71);
|
||||
/* W3C, IE 10+/ Edge, Firefox 16+, Chrome 26+, Opera 12+, Safari 7+ */
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
.search-box{
|
||||
border-bottom: 1px solid rgb(200,200,200);
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.search-text{
|
||||
border: none;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.search-text:focus{
|
||||
outline: none;
|
||||
.search-box{
|
||||
border-bottom: 1px solid rgb(200,200,200);
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.search-text{
|
||||
border: none;
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.search-text:focus{
|
||||
outline: none;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue