From 418907936eba82bcfd6e1eceba8654707bf0e948 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Mar 2022 04:06:10 +0000 Subject: [PATCH 01/22] Bump zone.js from 0.11.4 to 0.11.5 Bumps [zone.js](https://github.com/angular/angular/tree/HEAD/packages/zone.js) from 0.11.4 to 0.11.5. - [Release notes](https://github.com/angular/angular/releases) - [Changelog](https://github.com/angular/angular/blob/master/packages/zone.js/CHANGELOG.md) - [Commits](https://github.com/angular/angular/commits/zone.js-0.11.5/packages/zone.js) --- updated-dependencies: - dependency-name: zone.js dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 6a93abd6..59536e1e 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4.9.2", "yaml-loader": "0.6.0", - "zone.js": "^0.11.4" + "zone.js": "^0.11.5" }, "resolutions": { "*/pug": "^3", diff --git a/yarn.lock b/yarn.lock index 6f7a9932..8cf765af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8280,7 +8280,7 @@ tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.1: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== @@ -9045,9 +9045,9 @@ yocto-queue@^0.1.0: resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -zone.js@^0.11.4: - version "0.11.4" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.4.tgz#0f70dcf6aba80f698af5735cbb257969396e8025" - integrity sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw== +zone.js@^0.11.5: + version "0.11.5" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.11.5.tgz#ab0b449e91fadb5ebb2db189ffe1b7b6048dc8b1" + integrity sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g== dependencies: - tslib "^2.0.0" + tslib "^2.3.0" From cd7440052cb4da0a5fbc16ccd3a75b2d2c0acd04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Mar 2022 22:11:16 +0000 Subject: [PATCH 02/22] Bump typedoc from 0.22.12 to 0.22.13 Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.22.12 to 0.22.13. - [Release notes](https://github.com/TypeStrong/TypeDoc/releases) - [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.22.12...v0.22.13) --- updated-dependencies: - dependency-name: typedoc dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 44 +++++++++++++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 12a251bc..4cdccc63 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "svg-inline-loader": "^0.8.2", "ts-loader": "^9.2.7", "tslib": "^2.3.1", - "typedoc": "^0.22.12", + "typedoc": "^0.22.13", "typescript": "^4.3.5", "utils-decorators": "^1.10.4", "val-loader": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 833845a4..ed123b45 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1422,6 +1422,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -5176,10 +5183,10 @@ map-obj@^4.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== -marked@^4.0.10: - version "4.0.10" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.10.tgz#423e295385cc0c3a70fa495e0df68b007b879423" - integrity sha512-+QvuFj0nGgO970fySghXGmuw+Fd0gD2x3+MqCWLIPf5oxdv1Ka6b2q+z9RP01P/IaKPMEramy+7cNy/Lw8c3hw== +marked@^4.0.12: + version "4.0.12" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.12.tgz#2262a4e6fd1afd2f13557726238b69a48b982f7d" + integrity sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ== matcher@^3.0.0: version "3.0.0" @@ -5312,6 +5319,13 @@ minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -7474,10 +7488,10 @@ shelljs@0.8.5: interpret "^1.0.0" rechoir "^0.6.2" -shiki@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.0.tgz#85f21ecfa95b377ff64db6c71442c22c220e9540" - integrity sha512-iczxaIYeBFHTFrQPb9DVy2SKgYxC4Wo7Iucm7C17cCh2Ge/refnvHscUOxM85u57MfLoNOtjoEFUWt9gBexblA== +shiki@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" + integrity sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng== dependencies: jsonc-parser "^3.0.0" vscode-oniguruma "^1.6.1" @@ -8390,16 +8404,16 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typedoc@^0.22.12: - version "0.22.12" - resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.12.tgz#52a8bb0e77458dcbab35fb89e24b80160ba6558d" - integrity sha512-FcyC+YuaOpr3rB9QwA1IHOi9KnU2m50sPJW5vcNRPCIdecp+3bFkh7Rq5hBU1Fyn29UR2h4h/H7twZHWDhL0sw== +typedoc@^0.22.13: + version "0.22.13" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.22.13.tgz#d061f8f0fb7c9d686e48814f245bddeea4564e66" + integrity sha512-NHNI7Dr6JHa/I3+c62gdRNXBIyX7P33O9TafGLd07ur3MqzcKgwTvpg18EtvCLHJyfeSthAtCLpM7WkStUmDuQ== dependencies: glob "^7.2.0" lunr "^2.3.9" - marked "^4.0.10" - minimatch "^3.0.4" - shiki "^0.10.0" + marked "^4.0.12" + minimatch "^5.0.1" + shiki "^0.10.1" "typescript@2 - 4", typescript@^4.3.5: version "4.5.5" From 2aa95f5e259d41d228c5eef4fc96e57da4ca16c3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Mar 2022 04:02:04 +0000 Subject: [PATCH 03/22] Bump rxjs from 7.5.1 to 7.5.5 in /app Bumps [rxjs](https://github.com/reactivex/rxjs) from 7.5.1 to 7.5.5. - [Release notes](https://github.com/reactivex/rxjs/releases) - [Changelog](https://github.com/ReactiveX/rxjs/blob/master/CHANGELOG.md) - [Commits](https://github.com/reactivex/rxjs/compare/7.5.1...7.5.5) --- updated-dependencies: - dependency-name: rxjs dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/package.json | 2 +- app/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index 6f1b7001..ce664c94 100644 --- a/app/package.json +++ b/app/package.json @@ -29,7 +29,7 @@ "mz": "^2.7.0", "native-process-working-directory": "^1.0.2", "npm": "6", - "rxjs": "^7.5.1", + "rxjs": "^7.5.5", "source-map-support": "^0.5.20", "v8-compile-cache": "^2.3.0", "yargs": "^17.3.1" diff --git a/app/yarn.lock b/app/yarn.lock index 3f43c631..d03d853f 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -3196,10 +3196,10 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157" - integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ== +rxjs@^7.5.5: + version "7.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" + integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== dependencies: tslib "^2.1.0" From 7771f5708b8e969f5ec95969f3e7f47fb4d57725 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Mar 2022 04:07:11 +0000 Subject: [PATCH 04/22] Bump axios from 0.26.0 to 0.26.1 Bumps [axios](https://github.com/axios/axios) from 0.26.0 to 0.26.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/master/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.26.0...v0.26.1) --- updated-dependencies: - dependency-name: axios dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12a251bc..40be249e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "@typescript-eslint/eslint-plugin": "^4.33.0", "@typescript-eslint/parser": "^4.33.0", "apply-loader": "2.0.0", - "axios": "^0.26.0", + "axios": "^0.26.1", "browserify-sign": "^4.2.1", "clone-deep": "^4.0.1", "compare-versions": "^4", diff --git a/yarn.lock b/yarn.lock index 833845a4..11c346fb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1256,10 +1256,10 @@ aws4@^1.2.1, aws4@^1.8.0: resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz" integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== -axios@^0.26.0: - version "0.26.0" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.0.tgz#9a318f1c69ec108f8cd5f3c3d390366635e13928" - integrity sha512-lKoGLMYtHvFrPVt3r+RBMp9nh34N0M8zEfCWqdWZx6phynIEhQqAdydpyBAAG211zlhX9Rgu08cOamy6XjE5Og== +axios@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" + integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== dependencies: follow-redirects "^1.14.8" From b6957b25d2052e0250067ea6dfa0626696eff217 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Mar 2022 04:02:57 +0000 Subject: [PATCH 05/22] Bump ts-loader from 9.2.7 to 9.2.8 Bumps [ts-loader](https://github.com/TypeStrong/ts-loader) from 9.2.7 to 9.2.8. - [Release notes](https://github.com/TypeStrong/ts-loader/releases) - [Changelog](https://github.com/TypeStrong/ts-loader/blob/main/CHANGELOG.md) - [Commits](https://github.com/TypeStrong/ts-loader/compare/v9.2.7...v9.2.8) --- updated-dependencies: - dependency-name: ts-loader dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 18 +++++------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 12a251bc..8c4f20d6 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "ssh2": "^1.7.0", "style-loader": "^3.3.1", "svg-inline-loader": "^0.8.2", - "ts-loader": "^9.2.7", + "ts-loader": "^9.2.8", "tslib": "^2.3.1", "typedoc": "^0.22.12", "typescript": "^4.3.5", diff --git a/yarn.lock b/yarn.lock index 833845a4..3e8e85cf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2818,15 +2818,7 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.0.0: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.9.2: +enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.2: version "5.9.2" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9" integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA== @@ -8302,10 +8294,10 @@ truncate-utf8-bytes@^1.0.0: dependencies: utf8-byte-length "^1.0.1" -ts-loader@^9.2.7: - version "9.2.7" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.7.tgz#948654099ca96992b62ec47bd9cee5632006e101" - integrity sha512-Fxh44mKli9QezgbdCXkEJWxnedQ0ead7DXTH+lfXEPedu+Y9EtMJ2aQ9G3Dj1j7Q612E8931rww8NDZha4Tibg== +ts-loader@^9.2.8: + version "9.2.8" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.8.tgz#e89aa32fa829c5cad0a1d023d6b3adecd51d5a48" + integrity sha512-gxSak7IHUuRtwKf3FIPSW1VpZcqF9+MBrHOvBp9cjHh+525SjtCIJKVGjRKIAfxBwDGDGCFF00rTfzB1quxdSw== dependencies: chalk "^4.1.0" enhanced-resolve "^5.0.0" From 90becada86b4b1f7442d2390f328b9ad9c0c3a2f Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 18:31:21 +0100 Subject: [PATCH 06/22] fixed SVG icons in tab headers - fixes #5926 --- .../src/components/profileIcon.component.pug | 9 +++++++++ .../src/components/profileIcon.component.scss | 10 ++++++++++ .../src/components/profileIcon.component.ts | 18 ++++++++++++++++++ .../src/components/selectorModal.component.pug | 12 +++--------- .../src/components/selectorModal.component.ts | 4 ---- .../src/components/tabHeader.component.pug | 6 +++--- .../src/components/tabHeader.component.scss | 5 ++--- tabby-core/src/index.ts | 3 +++ .../components/editProfileModal.component.pug | 5 ++++- .../profilesSettingsTab.component.pug | 11 +++-------- .../profilesSettingsTab.component.scss | 4 ++-- .../profilesSettingsTab.component.ts | 4 ---- 12 files changed, 57 insertions(+), 34 deletions(-) create mode 100644 tabby-core/src/components/profileIcon.component.pug create mode 100644 tabby-core/src/components/profileIcon.component.scss create mode 100644 tabby-core/src/components/profileIcon.component.ts diff --git a/tabby-core/src/components/profileIcon.component.pug b/tabby-core/src/components/profileIcon.component.pug new file mode 100644 index 00000000..6e5ec137 --- /dev/null +++ b/tabby-core/src/components/profileIcon.component.pug @@ -0,0 +1,9 @@ +i.icon( + class='fa-fw {{icon}}', + [style.color]='color', + *ngIf='!isHTML' +) +.icon( + [fastHtmlBind]='icon', + *ngIf='isHTML' +) diff --git a/tabby-core/src/components/profileIcon.component.scss b/tabby-core/src/components/profileIcon.component.scss new file mode 100644 index 00000000..257652d1 --- /dev/null +++ b/tabby-core/src/components/profileIcon.component.scss @@ -0,0 +1,10 @@ +:host { + display: flex; + align-items: center; + max-width: 1.25rem; +} + +::ng-deep img { + max-width: 100%; + max-height: 100%; +} diff --git a/tabby-core/src/components/profileIcon.component.ts b/tabby-core/src/components/profileIcon.component.ts new file mode 100644 index 00000000..c7bf0649 --- /dev/null +++ b/tabby-core/src/components/profileIcon.component.ts @@ -0,0 +1,18 @@ +/* eslint-disable @typescript-eslint/explicit-module-boundary-types */ +import { Component, Input } from '@angular/core' +import { BaseComponent } from './base.component' + +/** @hidden */ +@Component({ + selector: 'profile-icon', + template: require('./profileIcon.component.pug'), + styles: [require('./profileIcon.component.scss')], +}) +export class ProfileIconComponent extends BaseComponent { + @Input() icon?: string + @Input() color?: string + + get isHTML (): boolean { + return this.icon?.startsWith('<') ?? false + } +} diff --git a/tabby-core/src/components/selectorModal.component.pug b/tabby-core/src/components/selectorModal.component.pug index 20d292b0..e4d359c8 100644 --- a/tabby-core/src/components/selectorModal.component.pug +++ b/tabby-core/src/components/selectorModal.component.pug @@ -17,15 +17,9 @@ (click)='selectOption(option)', [class.active]='selectedIndex == i' ) - i.icon( - class='fa-fw {{option.icon}}', - style='color: {{option.color}}', - *ngIf='!iconIsSVG(option.icon)' - ) - .icon( - [fastHtmlBind]='option.icon', - style='color: {{option.color}}', - *ngIf='iconIsSVG(option.icon)' + profile-icon( + [icon]='option.icon', + [color]='option.color' ) .title.mr-2 {{getOptionText(option)}} .description.no-wrap.text-muted {{option.description}} diff --git a/tabby-core/src/components/selectorModal.component.ts b/tabby-core/src/components/selectorModal.component.ts index 02da460a..a50d4284 100644 --- a/tabby-core/src/components/selectorModal.component.ts +++ b/tabby-core/src/components/selectorModal.component.ts @@ -84,8 +84,4 @@ export class SelectorModalComponent { close (): void { this.modalInstance.dismiss() } - - iconIsSVG (icon?: string): boolean { - return icon?.startsWith('<') ?? false - } } diff --git a/tabby-core/src/components/tabHeader.component.pug b/tabby-core/src/components/tabHeader.component.pug index d71f85f6..9a6a91dc 100644 --- a/tabby-core/src/components/tabHeader.component.pug +++ b/tabby-core/src/components/tabHeader.component.pug @@ -5,10 +5,10 @@ .index(*ngIf='!config.store.terminal.hideTabIndex && hostApp.platform === Platform.macOS', cdkDragHandle) {{index + 1}} .index(*ngIf='!config.store.terminal.hideTabIndex && hostApp.platform !== Platform.macOS') {{index + 1}} -.icon( +profile-icon( *ngIf='config.store.terminal.showTabProfileIcon && tab.icon', - [ngClass]='tab.icon', - [style.color]='tab.color' + [icon]='tab.icon', + [color]='tab.color' ) .name( diff --git a/tabby-core/src/components/tabHeader.component.scss b/tabby-core/src/components/tabHeader.component.scss index bc664d98..f09eff52 100644 --- a/tabby-core/src/components/tabHeader.component.scss +++ b/tabby-core/src/components/tabHeader.component.scss @@ -26,8 +26,7 @@ $tabs-height: 38px; height: $tabs-height; } - .index, - .icon { + .index { flex: none; font-weight: bold; -webkit-app-region: no-drag; @@ -41,7 +40,7 @@ $tabs-height: 38px; margin-top: 1px; } - .icon { + profile-icon { font-size: 13px; margin: 1px 4px 0 0; } diff --git a/tabby-core/src/index.ts b/tabby-core/src/index.ts index 252e3b48..d5092b5b 100644 --- a/tabby-core/src/index.ts +++ b/tabby-core/src/index.ts @@ -29,6 +29,7 @@ import { SplitTabPaneLabelComponent } from './components/splitTabPaneLabel.compo import { UnlockVaultModalComponent } from './components/unlockVaultModal.component' import { WelcomeTabComponent } from './components/welcomeTab.component' import { TransfersMenuComponent } from './components/transfersMenu.component' +import { ProfileIconComponent } from './components/profileIcon.component' import { AutofocusDirective } from './directives/autofocus.directive' import { AlwaysVisibleTypeaheadDirective } from './directives/alwaysVisibleTypeahead.directive' @@ -128,6 +129,7 @@ const PROVIDERS = [ TransfersMenuComponent, DropZoneDirective, CdkAutoDropGroup, + ProfileIconComponent, ], entryComponents: [ PromptModalComponent, @@ -150,6 +152,7 @@ const PROVIDERS = [ DragDropModule, TranslateModule, CdkAutoDropGroup, + ProfileIconComponent, ], }) export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class diff --git a/tabby-settings/src/components/editProfileModal.component.pug b/tabby-settings/src/components/editProfileModal.component.pug index 5e19c22e..a81a5d28 100644 --- a/tabby-settings/src/components/editProfileModal.component.pug +++ b/tabby-settings/src/components/editProfileModal.component.pug @@ -40,7 +40,10 @@ ) .input-group-append .input-group-text - i([class]='"fa-fw " + profile.icon') + profile-icon( + [icon]='profile.icon', + [color]='profile.color' + ) ng-template(#rt,let-r='result',let-t='term') i([class]='"fa-fw " + r') diff --git a/tabby-settings/src/components/profilesSettingsTab.component.pug b/tabby-settings/src/components/profilesSettingsTab.component.pug index 705f111a..6062a050 100644 --- a/tabby-settings/src/components/profilesSettingsTab.component.pug +++ b/tabby-settings/src/components/profilesSettingsTab.component.pug @@ -58,14 +58,9 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') [class.list-group-item-action]='!profile.isBuiltin', (click)='profile.isBuiltin ? null : editProfile(profile)' ) - i.icon( - class='fa-fw {{profile.icon}}', - [style.color]='profile.color', - *ngIf='!iconIsSVG(profile.icon)' - ) - .icon( - [fastHtmlBind]='profile.icon', - *ngIf='iconIsSVG(profile.icon)' + profile-icon( + [icon]='profile.icon', + [color]='profile.color' ) .no-wrap {{profile.name}} diff --git a/tabby-settings/src/components/profilesSettingsTab.component.scss b/tabby-settings/src/components/profilesSettingsTab.component.scss index ec1f9eaa..ed7f7623 100644 --- a/tabby-settings/src/components/profilesSettingsTab.component.scss +++ b/tabby-settings/src/components/profilesSettingsTab.component.scss @@ -1,8 +1,8 @@ -.icon { +profile-icon { width: 1.25rem; margin-right: 0.25rem; } -.icon + * { +profile-icon + * { margin-left: 10px; } diff --git a/tabby-settings/src/components/profilesSettingsTab.component.ts b/tabby-settings/src/components/profilesSettingsTab.component.ts index 9174d24d..33405328 100644 --- a/tabby-settings/src/components/profilesSettingsTab.component.ts +++ b/tabby-settings/src/components/profilesSettingsTab.component.ts @@ -225,10 +225,6 @@ export class ProfilesSettingsTabComponent extends BaseComponent { return !this.filter || (profile.name + '$' + (this.getDescription(profile) ?? '')).toLowerCase().includes(this.filter.toLowerCase()) } - iconIsSVG (icon?: string): boolean { - return icon?.startsWith('<') ?? false - } - getDescription (profile: PartialProfile): string|null { return this.profilesService.getDescription(profile) } From fc4bbfcd5d85a62d778444033c4d029fc428fc8c Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 18:31:31 +0100 Subject: [PATCH 07/22] bumped electron --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 12a251bc..72edaceb 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "cross-env": "7.0.3", "css-loader": "^6.7.1", "deep-equal": "2.0.5", - "electron": "17.1.1", + "electron": "17.1.2", "electron-builder": "^22.14.13", "electron-download": "^4.1.1", "electron-installer-snap": "^5.1.0", diff --git a/yarn.lock b/yarn.lock index 833845a4..4677fdc9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2743,10 +2743,10 @@ electron-to-chromium@^1.3.723: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz#f632d900a1f788dab22fec9c62ec5c9c8f0c4052" integrity sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig== -electron@17.1.1: - version "17.1.1" - resolved "https://registry.yarnpkg.com/electron/-/electron-17.1.1.tgz#a936907faf68a0a4ae24e8f79c8b22995661c54b" - integrity sha512-S+PIsCOfxB+9DkPsbnWpbLQx6+3P5FGedCeVQ/vhZEX8zD4Wj2F118HGFX6ShEfsaTYE623ESK/f+b2ueHpEpQ== +electron@17.1.2: + version "17.1.2" + resolved "https://registry.yarnpkg.com/electron/-/electron-17.1.2.tgz#b4e4a0df883d9a9854cf865efa2bb00b12d55b1d" + integrity sha512-hqKQaUIRWX5Y2eAD8FZINWD/e5TKdpkbBYbkcZmJS4Bd1PKQsaDVc9h5xoA8zZQkPymE9rss+swjRpAFurOPGQ== dependencies: "@electron/get" "^1.13.0" "@types/node" "^14.6.2" From 2c00b9a4bcb43e0ecdfae2c3a4af3ee6323b421e Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 18:31:59 +0100 Subject: [PATCH 08/22] fixed profile order in the selector dialog - fixes #5537 --- tabby-core/package.json | 1 + tabby-core/src/api/selector.ts | 1 + tabby-core/src/components/selectorModal.component.ts | 8 ++++++-- tabby-core/src/services/profiles.service.ts | 4 ++++ tabby-core/yarn.lock | 5 +++++ 5 files changed, 17 insertions(+), 2 deletions(-) diff --git a/tabby-core/package.json b/tabby-core/package.json index a420ff80..89bed148 100644 --- a/tabby-core/package.json +++ b/tabby-core/package.json @@ -27,6 +27,7 @@ "ngx-perfect-scrollbar": "^10.1.0", "ngx-translate-messageformat-compiler": "^4.11.0", "readable-stream": "3.6.0", + "thenby": "^1.3.4", "uuid": "^8.0.0" }, "peerDependencies": { diff --git a/tabby-core/src/api/selector.ts b/tabby-core/src/api/selector.ts index 12c69020..2b5d5412 100644 --- a/tabby-core/src/api/selector.ts +++ b/tabby-core/src/api/selector.ts @@ -6,5 +6,6 @@ export interface SelectorOption { icon?: string freeInputPattern?: string color?: string + weight?: number callback?: (string?) => void } diff --git a/tabby-core/src/components/selectorModal.component.ts b/tabby-core/src/components/selectorModal.component.ts index a50d4284..4a614099 100644 --- a/tabby-core/src/components/selectorModal.component.ts +++ b/tabby-core/src/components/selectorModal.component.ts @@ -1,3 +1,4 @@ +import { firstBy } from 'thenby' import { Component, Input, HostListener, ViewChildren, QueryList, ElementRef } from '@angular/core' // eslint-disable-line @typescript-eslint/no-unused-vars import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' import { SelectorOption } from '../api/selector' @@ -52,8 +53,11 @@ export class SelectorModalComponent { onFilterChange (): void { const f = this.filter.trim().toLowerCase() if (!f) { - this.filteredOptions = this.options.slice() - .sort((a, b) => a.group?.localeCompare(b.group ?? '') ?? 0) + this.filteredOptions = this.options.slice().sort( + firstBy, number>(x => x.weight ?? 0) + .thenBy, string>(x => x.group ?? '') + .thenBy, string>(x => x.name) + ) .filter(x => !x.freeInputPattern) } else { const terms = f.split(' ') diff --git a/tabby-core/src/services/profiles.service.ts b/tabby-core/src/services/profiles.service.ts index 7c287038..055e011e 100644 --- a/tabby-core/src/services/profiles.service.ts +++ b/tabby-core/src/services/profiles.service.ts @@ -112,6 +112,7 @@ export class ProfilesService { group: this.translate.instant('Recent'), icon: 'fas fa-history', color: p.color, + weight: -1, callback: async () => { if (p.id) { p = (await this.getProfiles()).find(x => x.id === p.id) ?? p @@ -124,6 +125,7 @@ export class ProfilesService { name: this.translate.instant('Clear recent profiles'), group: this.translate.instant('Recent'), icon: 'fas fa-eraser', + weight: -1, callback: async () => { window.localStorage.removeItem('recentProfiles') this.config.save() @@ -142,6 +144,7 @@ export class ProfilesService { options = [...options, ...profiles.map((p): SelectorOption => ({ ...this.selectorOptionForProfile(p), + weight: p.isBuiltin ? 2 : 1, callback: () => resolve(p), }))] @@ -150,6 +153,7 @@ export class ProfilesService { options.push({ name: this.translate.instant('Manage profiles'), icon: 'fas fa-window-restore', + weight: 10, callback: () => { this.app.openNewTabRaw({ type: SettingsTabComponent, diff --git a/tabby-core/yarn.lock b/tabby-core/yarn.lock index 89251ae3..2d7c0b07 100644 --- a/tabby-core/yarn.lock +++ b/tabby-core/yarn.lock @@ -161,6 +161,11 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +thenby@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/thenby/-/thenby-1.3.4.tgz#81581f6e1bb324c6dedeae9bfc28e59b1a2201cc" + integrity sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ== + tslib@^1.10.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" From f6c0dd6ad3d27ea251f69e666704f45a43e1180a Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 19:02:03 +0100 Subject: [PATCH 09/22] potentially fix Zmodem corruption issues --- app/lib/pty.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/lib/pty.ts b/app/lib/pty.ts index c671d512..6aab8eda 100644 --- a/app/lib/pty.ts +++ b/app/lib/pty.ts @@ -4,6 +4,7 @@ import { ipcMain } from 'electron' import { Application } from './app' import { UTF8Splitter } from './utfSplitter' import { Subject, debounceTime } from 'rxjs' +import { StringDecoder } from './stringDecoder' class PTYDataQueue { private buffers: Buffer[] = [] @@ -90,6 +91,7 @@ class PTYDataQueue { export class PTY { private pty: nodePTY.IPty private outputQueue: PTYDataQueue + private decoder = new StringDecoder() exited = false constructor (private id: string, private app: Application, ...args: any[]) { @@ -99,7 +101,7 @@ export class PTY { } this.outputQueue = new PTYDataQueue(this.pty, data => { - setImmediate(() => this.emit('data', data)) + setImmediate(() => this.emit('data', this.decoder.write(data))) }) this.pty.onData(data => this.outputQueue.push(Buffer.from(data))) From 8d11a91201d0aa4a7c7dff521b16dba06ee549ef Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 21:14:15 +0100 Subject: [PATCH 10/22] merged the xterm sogou/win fix --- tabby-terminal/package.json | 2 +- tabby-terminal/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tabby-terminal/package.json b/tabby-terminal/package.json index b8c83891..81a94ddf 100644 --- a/tabby-terminal/package.json +++ b/tabby-terminal/package.json @@ -25,7 +25,7 @@ "hexer": "^1.5.0", "ps-node": "^0.1.6", "runes": "^0.4.2", - "xterm": "npm:@tabby-gang/xterm@^4.17.1-beta.1", + "xterm": "npm:@tabby-gang/xterm@^4.17.1-beta.2", "xterm-addon-fit": "^0.5.0", "xterm-addon-ligatures": "^0.5.0", "xterm-addon-search": "^0.8.2", diff --git a/tabby-terminal/yarn.lock b/tabby-terminal/yarn.lock index 1a4b275d..50cc54cb 100644 --- a/tabby-terminal/yarn.lock +++ b/tabby-terminal/yarn.lock @@ -178,10 +178,10 @@ xterm-addon-webgl@^0.12.0-beta.24: resolved "https://registry.yarnpkg.com/xterm-addon-webgl/-/xterm-addon-webgl-0.12.0-beta.24.tgz#5c17256933991856554c95c9bd1eaab42e9727a0" integrity sha512-+wZxKReEOlfN9JRHyikoffA6Do61/THR7QY35ajkQo0lLutKr6hTd/TLTuZh0PhFVelgTgudpXqlP++Lc0WFIA== -"xterm@npm:@tabby-gang/xterm@^4.17.1-beta.1": - version "4.17.1-beta.1" - resolved "https://registry.yarnpkg.com/@tabby-gang/xterm/-/xterm-4.17.1-beta.1.tgz#c24d507362c052491ca7ef1cb26445b9b1417942" - integrity sha512-nQNMhU7rBZTDv/0V+9UHxCjCCuEZNGftg+2/FiWrZxa1Tl5cWYFvlpMAB+O4drBJPTpkKJUKmDDdKKnbqlxnRg== +"xterm@npm:@tabby-gang/xterm@^4.17.1-beta.2": + version "4.17.1-beta.2" + resolved "https://registry.yarnpkg.com/@tabby-gang/xterm/-/xterm-4.17.1-beta.2.tgz#3b4b542297609f082c12b0877582cdf1398a84b5" + integrity sha512-tKePw6VBFVGvnKaxtfuS7qKbeX8bIT0+7asXSP70RA/78h8xeq3YoRHaV/cZEHaicNHMchlYFbXl3VpHXwusDw== yallist@^4.0.0: version "4.0.0" From 1029884ef76c59f5016b201f7ea68fadde8fd846 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 12 Mar 2022 21:18:27 +0100 Subject: [PATCH 11/22] set COLORTERM --- tabby-local/src/session.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tabby-local/src/session.ts b/tabby-local/src/session.ts index da4ec3e6..bba57f75 100644 --- a/tabby-local/src/session.ts +++ b/tabby-local/src/session.ts @@ -140,6 +140,7 @@ export class Session extends BaseSession { let env = mergeEnv( process.env, { + COLORTERM: 'truecolor', TERM: 'xterm-256color', TERM_PROGRAM: 'Tabby', }, From a5d84a490f5d1958576fd9677eaad3321fb77631 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sun, 13 Mar 2022 10:03:32 +0100 Subject: [PATCH 12/22] fixed SVG icons --- tabby-core/src/components/profileIcon.component.scss | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tabby-core/src/components/profileIcon.component.scss b/tabby-core/src/components/profileIcon.component.scss index 257652d1..c44c405d 100644 --- a/tabby-core/src/components/profileIcon.component.scss +++ b/tabby-core/src/components/profileIcon.component.scss @@ -8,3 +8,8 @@ max-width: 100%; max-height: 100%; } + +::ng-deep svg { + width: 100%; + height: 100%; +} From 7508c371df8365df13fe9091a80cb1ea31439248 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Mon, 14 Mar 2022 15:31:06 +0100 Subject: [PATCH 13/22] ensure xterm's own _keyUp is getting called --- tabby-terminal/src/frontends/xtermFrontend.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tabby-terminal/src/frontends/xtermFrontend.ts b/tabby-terminal/src/frontends/xtermFrontend.ts index 99eac0a3..b44a393f 100644 --- a/tabby-terminal/src/frontends/xtermFrontend.ts +++ b/tabby-terminal/src/frontends/xtermFrontend.ts @@ -138,9 +138,12 @@ export class XTermFrontend extends Frontend { } } + const oldKeyUp = this.xtermCore._keyUp this.xtermCore._keyUp = (e: KeyboardEvent) => { this.xtermCore.updateCursorStyle(e) - keyboardEventHandler('keyup', e) + if (keyboardEventHandler('keyup', e)) { + oldKeyUp(e) + } } this.xterm.buffer.onBufferChange(() => { From a76654a7b6f557125b0be7efe77d165a7d34ae2d Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Mon, 14 Mar 2022 16:24:36 +0100 Subject: [PATCH 14/22] Update xtermFrontend.ts --- tabby-terminal/src/frontends/xtermFrontend.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tabby-terminal/src/frontends/xtermFrontend.ts b/tabby-terminal/src/frontends/xtermFrontend.ts index b44a393f..66d243c9 100644 --- a/tabby-terminal/src/frontends/xtermFrontend.ts +++ b/tabby-terminal/src/frontends/xtermFrontend.ts @@ -138,7 +138,7 @@ export class XTermFrontend extends Frontend { } } - const oldKeyUp = this.xtermCore._keyUp + const oldKeyUp = this.xtermCore._keyUp.bind(this.xtermCore) this.xtermCore._keyUp = (e: KeyboardEvent) => { this.xtermCore.updateCursorStyle(e) if (keyboardEventHandler('keyup', e)) { From 2958dc3353506f18533c0ff81aab4bc4a782ef65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Mar 2022 04:01:30 +0000 Subject: [PATCH 15/22] Bump @electron/remote from 2.0.5 to 2.0.8 in /app Bumps [@electron/remote](https://github.com/electron/remote) from 2.0.5 to 2.0.8. - [Release notes](https://github.com/electron/remote/releases) - [Changelog](https://github.com/electron/remote/blob/main/.releaserc.json) - [Commits](https://github.com/electron/remote/compare/v2.0.5...v2.0.8) --- updated-dependencies: - dependency-name: "@electron/remote" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- app/package.json | 2 +- app/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/package.json b/app/package.json index 6f1b7001..4c95ce83 100644 --- a/app/package.json +++ b/app/package.json @@ -15,7 +15,7 @@ "watch": "webpack --progress --color --watch" }, "dependencies": { - "@electron/remote": "2.0.5", + "@electron/remote": "2.0.8", "@tabby-gang/node-pty": "^0.11.0-beta.200", "any-promise": "^1.3.0", "electron-config": "2.0.0", diff --git a/app/yarn.lock b/app/yarn.lock index 3f43c631..982c21e0 100644 --- a/app/yarn.lock +++ b/app/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@electron/remote@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.5.tgz#d38bcd2ad2825cca42c5ea4c92efafa99720c52a" - integrity sha512-Ot8VsYCwAJ+9DgqRuYCiAobS8TVKvnXJMncR14/28ORso1iWFG0X6geyk3hc13N48Oc/WJnPYlYI3o7g5Ja2Qg== +"@electron/remote@2.0.8": + version "2.0.8" + resolved "https://registry.yarnpkg.com/@electron/remote/-/remote-2.0.8.tgz#85ff321f0490222993207106e2f720273bb1a5c3" + integrity sha512-P10v3+iFCIvEPeYzTWWGwwHmqWnjoh8RYnbtZAb3RlQefy4guagzIwcWtfftABIfm6JJTNQf4WPSKWZOpLmHXw== "@iarna/cli@^1.2.0": version "1.2.0" From 1f73cd11b27cd041a613cba40924aea195afb422 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Wed, 16 Mar 2022 10:04:49 +0100 Subject: [PATCH 16/22] fixed admin tabs requiring debug VC libs - fixes #5933, fixes #4793, fixes #5633, fixes #4743 --- extras/UAC.exe | Bin 156672 -> 31232 bytes tabby-uac/UAC/UAC.vcxproj | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/extras/UAC.exe b/extras/UAC.exe index 42b74bbf63f9550f5966b78a7c8c8fe58eac2a0c..31bd16eca901deeec2ca53d446c7722550cd8b2e 100644 GIT binary patch literal 31232 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ð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 Win32Proj UAC - 10.0.18298.0 + 10.0.17763.0 From 05601965469063ae6a94925a5efa07e92c92d353 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Wed, 16 Mar 2022 10:10:30 +0100 Subject: [PATCH 17/22] filter out unsupported SSH algos - fixes #5942 --- tabby-ssh/src/session/ssh.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tabby-ssh/src/session/ssh.ts b/tabby-ssh/src/session/ssh.ts index 26a2c13b..f0da8f13 100644 --- a/tabby-ssh/src/session/ssh.ts +++ b/tabby-ssh/src/session/ssh.ts @@ -16,9 +16,10 @@ import { PasswordStorageService } from '../services/passwordStorage.service' import { SSHKnownHostsService } from '../services/sshKnownHosts.service' import { promisify } from 'util' import { SFTPSession } from './sftp' -import { ALGORITHM_BLACKLIST, SSHAlgorithmType, PortForwardType, SSHProfile, SSHProxyStream, AutoPrivateKeyLocator } from '../api' +import { SSHAlgorithmType, PortForwardType, SSHProfile, SSHProxyStream, AutoPrivateKeyLocator } from '../api' import { ForwardedPort } from './forwards' import { X11Socket } from './x11' +import { supportedAlgorithms } from '../algorithms' const WINDOWS_OPENSSH_AGENT_PIPE = '\\\\.\\pipe\\openssh-ssh-agent' @@ -201,7 +202,7 @@ export class SSHSession { let connected = false const algorithms = {} for (const key of Object.values(SSHAlgorithmType)) { - algorithms[key] = this.profile.options.algorithms![key].filter(x => !ALGORITHM_BLACKLIST.includes(x)) + algorithms[key] = this.profile.options.algorithms![key].filter(x => supportedAlgorithms[key].includes(x)) } const hostVerifiedPromise: Promise = new Promise((resolve, reject) => { From 515ddbf64b5d06078b7f94b746e98324a37629e6 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Wed, 16 Mar 2022 10:26:34 +0100 Subject: [PATCH 18/22] new color picker --- tabby-core/src/theme.scss | 12 ++++++++++++ tabby-terminal/package.json | 1 + .../src/components/colorPicker.component.pug | 17 ++++------------- .../src/components/colorPicker.component.ts | 17 +++++------------ tabby-terminal/src/index.ts | 2 ++ tabby-terminal/yarn.lock | 12 ++++++++++++ 6 files changed, 36 insertions(+), 25 deletions(-) diff --git a/tabby-core/src/theme.scss b/tabby-core/src/theme.scss index 56a0fbc6..685b0756 100644 --- a/tabby-core/src/theme.scss +++ b/tabby-core/src/theme.scss @@ -393,3 +393,15 @@ hr { .dropdown-menu { box-shadow: $dropdown-box-shadow; } + +ngx-colors-panel .opened { + background: $body-bg !important; + + button { + color: $body-color; + } + + .button svg { + fill: white; + } +} diff --git a/tabby-terminal/package.json b/tabby-terminal/package.json index 81a94ddf..0b5aded8 100644 --- a/tabby-terminal/package.json +++ b/tabby-terminal/package.json @@ -23,6 +23,7 @@ "cli-spinner": "^0.2.10", "dataurl": "0.1.0", "hexer": "^1.5.0", + "ngx-colors": "^3.0.4", "ps-node": "^0.1.6", "runes": "^0.4.2", "xterm": "npm:@tabby-gang/xterm@^4.17.1-beta.2", diff --git a/tabby-terminal/src/components/colorPicker.component.pug b/tabby-terminal/src/components/colorPicker.component.pug index 33ccec31..e29757fb 100644 --- a/tabby-terminal/src/components/colorPicker.component.pug +++ b/tabby-terminal/src/components/colorPicker.component.pug @@ -1,16 +1,7 @@ -ng-template(#content) - .preview( - [style.width]='"100%"', - [style.background]='model', - ) - input.form-control(type='text', [(ngModel)]='model', (ngModelChange)='onChange()', #input) - div( - [ngbPopover]='content', [style.background]='model', - (click)='open()', - autoClose='outside', - container='body', - #popover='ngbPopover', - [title]='hint' + ngx-colors-trigger, + [(ngModel)]='model', + (ngModelChange)='onChange($event)', + [ngbTooltip]='hint' ) {{ title }} diff --git a/tabby-terminal/src/components/colorPicker.component.ts b/tabby-terminal/src/components/colorPicker.component.ts index 6ea7eb1e..db6bcff0 100644 --- a/tabby-terminal/src/components/colorPicker.component.ts +++ b/tabby-terminal/src/components/colorPicker.component.ts @@ -1,5 +1,4 @@ -import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core' -import { NgbPopover } from '@ng-bootstrap/ng-bootstrap' +import { Component, Input, Output, EventEmitter } from '@angular/core' /** @hidden */ @Component({ @@ -12,16 +11,10 @@ export class ColorPickerComponent { @Input() title: string @Input() hint: string @Output() modelChange = new EventEmitter() - @ViewChild('popover') popover: NgbPopover - open (): void { - setImmediate(() => { - this.popover.open() - this.popover['_windowRef'].location.nativeElement.querySelector('input').focus() - }) - } - - onChange (): void { - this.modelChange.emit(this.model) + onChange (value: string): void { + if (value !== this.model) { + this.modelChange.emit(value) + } } } diff --git a/tabby-terminal/src/index.ts b/tabby-terminal/src/index.ts index 6de3d67c..eaf6ee58 100644 --- a/tabby-terminal/src/index.ts +++ b/tabby-terminal/src/index.ts @@ -3,6 +3,7 @@ import { BrowserModule } from '@angular/platform-browser' import { FormsModule } from '@angular/forms' import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { ToastrModule } from 'ngx-toastr' +import { NgxColorsModule } from 'ngx-colors' import TabbyCorePlugin, { ConfigProvider, HotkeyProvider, TabContextMenuItemProvider, CLIHandler } from 'tabby-core' import { SettingsTabProvider } from 'tabby-settings' @@ -40,6 +41,7 @@ import { TerminalCLIHandler } from './cli' NgbModule, ToastrModule, TabbyCorePlugin, + NgxColorsModule, ], providers: [ { provide: SettingsTabProvider, useClass: AppearanceSettingsTabProvider, multi: true }, diff --git a/tabby-terminal/yarn.lock b/tabby-terminal/yarn.lock index 50cc54cb..10e7b98b 100644 --- a/tabby-terminal/yarn.lock +++ b/tabby-terminal/yarn.lock @@ -94,6 +94,13 @@ minimist@^1.1.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +ngx-colors@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/ngx-colors/-/ngx-colors-3.0.4.tgz#69b760760e6e1e92fda5da51fa9b4bea7e555d40" + integrity sha512-peNvVpYkm8pe3nP8/TbaFFqo/RxZevGljKrzFa2g1hPPacdx+WdfwAN4uJfcGk7qTYbqlV64SSfb3Pnx8qjzDA== + dependencies: + tslib "^2.0.0" + opentype.js@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/opentype.js/-/opentype.js-0.8.0.tgz#acabcfa1642fbe894a3e4d759e43ba694e02bd35" @@ -140,6 +147,11 @@ tiny-inflate@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== +tslib@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" + integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" From 7e876afb3bda456fea451fa77b92a61b00e2260d Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Wed, 16 Mar 2022 10:26:38 +0100 Subject: [PATCH 19/22] Update platform.service.ts --- tabby-electron/src/services/platform.service.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tabby-electron/src/services/platform.service.ts b/tabby-electron/src/services/platform.service.ts index ea308de0..2f49ebee 100644 --- a/tabby-electron/src/services/platform.service.ts +++ b/tabby-electron/src/services/platform.service.ts @@ -3,6 +3,7 @@ import * as fs from 'fs/promises' import * as gracefulFS from 'graceful-fs' import * as fsSync from 'fs' import * as os from 'os' +import { v4 as uuidv4 } from 'uuid' import { promisify } from 'util' import promiseIpc, { RendererProcessType } from 'electron-promise-ipc' import { execFile } from 'mz/child_process' @@ -119,7 +120,7 @@ export class ElectronPlatformService extends PlatformService { } async _saveConfigInternal (content: string): Promise { - const tempPath = this.configPath + '.new.' + Date.now().toString() + const tempPath = this.configPath + '.new.' + uuidv4().toString() await fs.writeFile(tempPath, content, 'utf8') await fs.writeFile(this.configPath + '.backup', content, 'utf8') await promisify(gracefulFS.rename)(tempPath, this.configPath) From 9bc6831f400148dc65d28e03ba423ab3292d212a Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Wed, 16 Mar 2022 10:34:40 +0100 Subject: [PATCH 20/22] sort hosts in the jump hosts list --- package.json | 1 + tabby-core/package.json | 1 - tabby-core/yarn.lock | 5 ----- tabby-ssh/src/components/sshProfileSettings.component.pug | 2 +- tabby-ssh/src/components/sshProfileSettings.component.ts | 7 +++++++ yarn.lock | 5 +++++ 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 72edaceb..617109f7 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "graceful-fs": "^4.2.9", "html-loader": "3.1.0", "json-loader": "^0.5.7", + "thenby": "^1.3.4", "lru-cache": "^6.0.0", "macos-release": "^3.0.1", "ngx-sortablejs": "^11.1.0", diff --git a/tabby-core/package.json b/tabby-core/package.json index 89bed148..a420ff80 100644 --- a/tabby-core/package.json +++ b/tabby-core/package.json @@ -27,7 +27,6 @@ "ngx-perfect-scrollbar": "^10.1.0", "ngx-translate-messageformat-compiler": "^4.11.0", "readable-stream": "3.6.0", - "thenby": "^1.3.4", "uuid": "^8.0.0" }, "peerDependencies": { diff --git a/tabby-core/yarn.lock b/tabby-core/yarn.lock index 2d7c0b07..89251ae3 100644 --- a/tabby-core/yarn.lock +++ b/tabby-core/yarn.lock @@ -161,11 +161,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -thenby@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/thenby/-/thenby-1.3.4.tgz#81581f6e1bb324c6dedeae9bfc28e59b1a2201cc" - integrity sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ== - tslib@^1.10.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" diff --git a/tabby-ssh/src/components/sshProfileSettings.component.pug b/tabby-ssh/src/components/sshProfileSettings.component.pug index 57aa248a..6c630a9d 100644 --- a/tabby-ssh/src/components/sshProfileSettings.component.pug +++ b/tabby-ssh/src/components/sshProfileSettings.component.pug @@ -61,7 +61,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav') label(translate) Jump host select.form-control([(ngModel)]='profile.options.jumpHost') option([ngValue]='null', translate) Select - option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{x.name}} + option([ngValue]='x.id', *ngFor='let x of jumpHosts') {{getJumpHostLabel(x)}} .d-flex.w-100(*ngIf='connectionMode === "socksProxy"') diff --git a/tabby-ssh/src/components/sshProfileSettings.component.ts b/tabby-ssh/src/components/sshProfileSettings.component.ts index 5d3dc35e..659e98e5 100644 --- a/tabby-ssh/src/components/sshProfileSettings.component.ts +++ b/tabby-ssh/src/components/sshProfileSettings.component.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/explicit-module-boundary-types */ import { Component, ViewChild } from '@angular/core' import { NgbModal } from '@ng-bootstrap/ng-bootstrap' +import { firstBy } from 'thenby' import { ConfigService, FileProvidersService, Platform, HostAppService, PromptModalComponent, PartialProfile } from 'tabby-core' import { LoginScriptsSettingsComponent } from 'tabby-terminal' @@ -34,6 +35,8 @@ export class SSHProfileSettingsComponent { async ngOnInit () { this.jumpHosts = this.config.store.profiles.filter(x => x.type === 'ssh' && x !== this.profile) + this.jumpHosts.sort(firstBy(x => this.getJumpHostLabel(x))) + for (const k of Object.values(SSHAlgorithmType)) { this.algorithms[k] = {} for (const alg of this.profile.options.algorithms?.[k] ?? []) { @@ -63,6 +66,10 @@ export class SSHProfileSettingsComponent { } } + getJumpHostLabel (p: PartialProfile) { + return p.group ? `${p.group} / ${p.name}` : p.name + } + async setPassword () { const modal = this.ngbModal.open(PromptModalComponent) modal.componentInstance.prompt = `Password for ${this.profile.options.user}@${this.profile.options.host}` diff --git a/yarn.lock b/yarn.lock index 4677fdc9..1c47d6e2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8143,6 +8143,11 @@ text-table@^0.2.0, text-table@~0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +thenby@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/thenby/-/thenby-1.3.4.tgz#81581f6e1bb324c6dedeae9bfc28e59b1a2201cc" + integrity sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ== + throttleit@0.0.2: version "0.0.2" resolved "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz" From 45b6e21dbce0ef3155a71699c33e177e7ed2bf78 Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 19 Mar 2022 11:53:44 +0100 Subject: [PATCH 21/22] relax OSC52 processing rules to support tmux - fixes #5961 --- tabby-terminal/src/middleware/oscProcessing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tabby-terminal/src/middleware/oscProcessing.ts b/tabby-terminal/src/middleware/oscProcessing.ts index 85c61633..2b68048f 100644 --- a/tabby-terminal/src/middleware/oscProcessing.ts +++ b/tabby-terminal/src/middleware/oscProcessing.ts @@ -35,7 +35,7 @@ export class OSCProcessor extends SessionMiddleware { console.debug('Unsupported OSC 1337 parameter:', paramString) } } else if (oscCode === 52) { - if (oscParams[0] === 'c') { + if (oscParams[0] === 'c' || oscParams[0] === '') { const content = Buffer.from(oscParams[1], 'base64') this.copyRequested.next(content.toString()) } From 780691413d6ec0fa82c591e51c2355d89d33e7dc Mon Sep 17 00:00:00 2001 From: Eugene Pankov Date: Sat, 19 Mar 2022 13:42:27 +0100 Subject: [PATCH 22/22] fixed incorrect passthrough handling in zmodem --- tabby-terminal/src/features/zmodem.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tabby-terminal/src/features/zmodem.ts b/tabby-terminal/src/features/zmodem.ts index cd5d660b..3b9ca5ba 100644 --- a/tabby-terminal/src/features/zmodem.ts +++ b/tabby-terminal/src/features/zmodem.ts @@ -26,9 +26,10 @@ export class ZModemDecorator extends TerminalDecorator { } attach (terminal: BaseTerminalTabComponent): void { + let isActive = false const sentry = new ZModem.Sentry({ to_terminal: data => { - if (!terminal.enablePassthrough) { + if (isActive) { terminal.write(data) } }, @@ -36,9 +37,11 @@ export class ZModemDecorator extends TerminalDecorator { on_detect: async detection => { try { terminal.enablePassthrough = false + isActive = true await this.process(terminal, detection) } finally { terminal.enablePassthrough = true + isActive = false } }, on_retract: () => {