From 06b4bfe363162ccc9d2f275413f20d8899a05b18 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Mon, 7 Sep 2020 12:10:35 +0300 Subject: [PATCH 01/13] Removing DEBUG env from package.json commands (#810) * Removing DEBUG env from dev processes Signed-off-by: Alex Andreev * Removing cross-env dependency Signed-off-by: Alex Andreev * Updating lock file Signed-off-by: Alex Andreev --- package.json | 7 +++---- yarn.lock | 9 +-------- 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 9a1b57733e..cd31fa994d 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ }, "scripts": { "dev": "concurrently -k \"yarn dev-run -C\" \"yarn dev:main\" \"yarn dev:renderer\"", - "dev-run": "cross-env DEBUG=true nodemon --watch static/build/main.js --exec \"electron --inspect .\"", - "dev:main": "cross-env DEBUG=true yarn compile:main --watch", - "dev:renderer": "cross-env DEBUG=true yarn compile:renderer --watch", + "dev-run": "nodemon --watch static/build/main.js --exec \"electron --inspect .\"", + "dev:main": "yarn compile:main --watch", + "dev:renderer": "yarn compile:renderer --watch", "compile": "env NODE_ENV=production concurrently yarn:compile:*", "compile:main": "webpack --config webpack.main.ts", "compile:renderer": "webpack --config webpack.renderer.ts", @@ -269,7 +269,6 @@ "circular-dependency-plugin": "^5.2.0", "color": "^3.1.2", "concurrently": "^5.2.0", - "cross-env": "^7.0.2", "css-element-queries": "^1.2.3", "css-loader": "^3.5.3", "dompurify": "^2.0.11", diff --git a/yarn.lock b/yarn.lock index 44fc03bfd8..75569f4bef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4086,13 +4086,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-env@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-7.0.2.tgz#bd5ed31339a93a3418ac4f3ca9ca3403082ae5f9" - integrity sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw== - dependencies: - cross-spawn "^7.0.1" - cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4112,7 +4105,7 @@ cross-spawn@^3.0.0: lru-cache "^4.0.1" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.1, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== From 09079799a5cf5fe923068b4d02157108277efe5e Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Mon, 7 Sep 2020 14:04:12 +0300 Subject: [PATCH 02/13] v3.6.0-rc.1 (#812) Signed-off-by: Lauri Nevala --- package.json | 2 +- static/RELEASE_NOTES.md | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index cd31fa994d..1d4cb78c76 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "kontena-lens", "productName": "Lens", "description": "Lens - The Kubernetes IDE", - "version": "3.6.0-beta.2", + "version": "3.6.0-rc.1", "main": "static/build/main.js", "copyright": "© 2020, Mirantis, Inc.", "license": "MIT", diff --git a/static/RELEASE_NOTES.md b/static/RELEASE_NOTES.md index 6e53eb990d..d0553e542a 100644 --- a/static/RELEASE_NOTES.md +++ b/static/RELEASE_NOTES.md @@ -2,7 +2,24 @@ Here you can find description of changes we've built into each release. While we try our best to make each upgrade automatic and as smooth as possible, there may be some cases where you might need to do something to ensure the application works smoothly. So please read through the release highlights! -## 3.6.0-beta.2 (current version) +## 3.6.0-rc.1 (current version) +- Allow user to configure directory where Kubectl binaries are downloaded +- Allow user to configure path to Kubectl binary, instead of using bundled Kubectl +- Log application logs also to log file +- Restrict file permissions to only the user for pasted kubeconfigs +- Close Preferences and Cluster Setting on Esc keypress +- Update Kubectl versions used with Lens +- Update Helm binary version +- Fix: Update CRD api to use preferred version and implement v1 differences +- Fix: Allow to drag and drop cluster icons +- Fix: Wider version select box for Helm chart installation +- Fix: Reload only active dashboard view, not the whole app window +- Fix cluster icon margins +- Fix: Reconnect non-accessible clusters on reconnect +- Fix: Bundle Kubectl and Helm binaries +- Fix: Remove double copyright + +## 3.6.0-beta.2 - Fix: too narrow sidebar without clusters - Fix app crash when iterating Events without 'kind' property defined - Detect non-functional bundled kubectl From 0de4e16c9f29086b362d7f22b3a34b29f509d467 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Mon, 7 Sep 2020 14:09:56 +0300 Subject: [PATCH 03/13] More cluster menu fixes (#815) Signed-off-by: Alex Andreev --- src/renderer/components/cluster-icon/cluster-icon.scss | 1 - src/renderer/components/cluster-manager/clusters-menu.scss | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/cluster-icon/cluster-icon.scss b/src/renderer/components/cluster-icon/cluster-icon.scss index c64e6e07ab..540cecf9eb 100644 --- a/src/renderer/components/cluster-icon/cluster-icon.scss +++ b/src/renderer/components/cluster-icon/cluster-icon.scss @@ -4,7 +4,6 @@ position: relative; border-radius: $radius; padding: $radius; - margin-bottom: $padding * 2; user-select: none; cursor: pointer; diff --git a/src/renderer/components/cluster-manager/clusters-menu.scss b/src/renderer/components/cluster-manager/clusters-menu.scss index db1a182b38..8bebccdee6 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.scss +++ b/src/renderer/components/cluster-manager/clusters-menu.scss @@ -16,10 +16,10 @@ .clusters { @include hidden-scrollbar; padding: 0 $spacing; // extra spacing for cluster-icon's badge - margin-bottom: $spacing; + margin-bottom: $margin; - > :last-child { - margin-bottom: $margin; + .ClusterIcon { + margin-bottom: $margin * 1.5; } &:empty { From 653683c80226fc81fadcf21b13ffa497f0ad5cd5 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Tue, 8 Sep 2020 10:29:20 +0300 Subject: [PATCH 04/13] Update logo (#819) Signed-off-by: Lauri Nevala Co-authored-by: Alex Andreev --- build/icon.ico | Bin 118807 -> 173431 bytes build/icon.png | Bin 26813 -> 10880 bytes build/icons/512x512.png | Bin 26813 -> 10880 bytes src/renderer/components/icon/logo-full.svg | 18 +++++++++++++++++- src/renderer/components/layout/sidebar.scss | 3 ++- 5 files changed, 19 insertions(+), 2 deletions(-) diff --git a/build/icon.ico b/build/icon.ico index a203847c7cbd1c00de8e94a15bdee9fff89937e4..af1ec205bd0415936371271b2913f64162031b4e 100644 GIT binary patch literal 173431 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 z ^Enoh@gWg2n|Q!pU84qzW)?4@kvfqpUYCroPse`Nvp#59kNKZuMx&<_T{a;_L# zW$?4>;%5re5pt3dfBj%^k+3WTY}ExkBc^I}#2&&%9;6NfU7g0VU)VW`QkXPiH?WIgdMGzUU84)ld zpaub@b4y9Wi;HQaGvPeHNMtXZXBCO8g>w^;NI2ypj5Tb!7Dy?H|Nc{xdx9G74E z+&}r5oSK~5CqJLnc+S8u;=q@QUjhezKCk$n)1Ur{Lr#C;OzygLU6VeSuA9k{HiHy9@oEV%T-hqcH zWI9zB@VuC2($OgEWlr9s&VDBX54CCo#LvUN_8pP2?q_Zcz{9%WsU`u>5kc3ylgP;X zp92H%lFc8eD+BZ#`2QD?QNQzZ@E&y-yhMAhlKr?ZCL1~$>;BJ$0eGrX4iMkRdNSBy z8~OipVE~@0Tq`K%e-k=>GV=eYEC1jr<_i_}0k|%vf9aUIx-Z_l0{%ABmv|q9^7%>M zG{Luw>^>-(q(|@}E}s`Ie}lIQ`vBoO9d~INr)*gv-us-HBElXCp)Zc6BOMckJUzht zz5!pBC-|e>+n4!+OSkkrKg{+*;C&47zTJZ!>`;T(F}A0ij(&-x`GawQD*orB``1&$ zfA|x_ez+MWM8A1Rdl_|RJ{VE&*j`fPV?Vt@BJEAc_QVjkjo3p~6JPS!%L~}1hBx%? zRU#Q5RYGS#*HJE@D@>K_m(lnSpR?G95x&YPZ>$_(Z<;y>)jU`r^lU2?=VqM}4DL^_wV499;$7kj$H-<;5gqCdcXsJi&VPi>jOz7p`) zE?}&wFIqkEA9KSB#{hI4{4YuLnn;p9ZO=0z|G_itL*Yff76n-VN9+lOJ&MvY1m4>q zZpZn)|1<4Js!1^NUlWv6Kl3@*jr@`KP4@3d^)TqsZl!*hRmZ0NUF@R)f1ju$D1X@J z9ee(05{&%U1SR#)M0#H5ecRGl0Q~{{tzw_ov%H?0e3Nm;KP@(7q7xiLYre z@?TS=G=C0$!=Vch#)a5d4!Q#94D=na9~8guFTXdA?|CcH589he(_rMkrbub?ToU=Y zKSO@dThVxzmj|IMgw9ak0cFj3Yil;HMw=7tuv@E782PUiTpB-&Jx2oWuIKqrdJpgh zdlh5PGJS^7XNM)@PP8-FPf?p-dLdF391Mh8=x~ti#k^h?E zl$xiKNbZNtfRnHn4b@lIJv~LSfsUz(mSoJck~Rf;r$~=$TE}PPzt)iH^a9#t{~P~F z_=Pqbd#5Hu2k8`_i1r|SNBay4eLuz*=xekMnTG#_*SlLQD37m2UqU^JJTezix<7i| zVf&>DdI8wo_+7KsY0pIH8e!wX`hJup+IR0e*??#pG7JA9J7Hfj?BSQ031c)t4rFtKvb}>S%KNTX ztc&!xo;=q?bp!e)T|%bfKgv3_b!kO>Ig{g8Dr{J!>%Gi5<;nfP0M@r@%ELhWO?=-E z+e6x875mle5;6_{iTB=ilSQFq=NkI#km2e15!yd^ak9*A2);|ji8AeTW-1%gtK%c) zlDtp6|ThAkw3hl^~Xl~#4{7gyT4;wSs0O%Tw{7**i%LkgPIXFmC zx6+IM_%6!8+e`Dwj$Br!16wlp{R60P65D&6o1s=-NX}u(Gb8_bO!&FlsTqRz$>k1q z#`~Je6eJ5UJ94Rc9oUfxaw*oH zVQw)s;g{z>=}f~MPm1N~bddMdl?7_&-S+k&J91jjLurLhLYVV$-P2tZAL*AG_KSXX z{zt!kMC*9FNa|E_+iPGsUmf42?n4%U9XaN_JdX@#ebmbh7HsWy;@8hc{_BW9T(~dO zoe5*9jL7@sG&N)MebDs^_8zb=Ol|m8>;LyJAIWZhMh27j)U-Jy4@k-b*?UB|T~00g zf64YA`cOaX)ADrxxZSyl7?|I#T=h2a5M;x76 z_WyGA|C8Sn(yw;S(DI(THi+4KT>nom>xq7)`X3+hRw6&E!#HE#Z$fR@sZ`f}MDVNd z|9f1N$oImm%q8zB?3;L-^*pIR`v&@b#gYsEP`C|4Sm*&aL38?0<>bpNX|KSVa z)$Z<8-}(7+r%f%$hU^HlnaGrF0ObQ~N%R$dX8tSk#o$kJGsgcY7s9&fj4kWQwoh17 z{^_kls@adVqtGXNpPnSC8>zq{!})*v9v>}wb8)Uj-h+(m5^FBYu3!MsYQY6D1S zL7Eey-|Ni(q{MH`C(*lGtN3xSl72?ZvXG(pk37DAuq|2MBi_sVVnQ1Lds{Y_rXLKF zzh|KMkX9eENmXYbs;F=Pli2spYz-RLim^El{mH-?ivJO=m&7&_VtJ3|Og_H8nF1E9 z!_HLvr#Zj(54NYshpG$k1rrnSf~_-i+0lvkF6Fx%GLe4DK!)LeOu$RAFFf&jds<%= z{CJ;2`)K&*a}?I(8mP`{*^a7gL$H4Mqt|U!?3Ua^8v(n}w^tUj^+l|li+RoJKFuG& z#t{Ak^iT#e1pgDF0wq4M8SYfRRjseYdf8+j-m-F*KKZ7XxQKV~DW%ST4AzFg&(Iqh zBf@rwZ{PTNL!R%=$v@dh(jT5?I)tA^{^xz~EtJTzOx`;&R`gZH`fALd01Jjo2Cx6j z-s9vr^69SF-UD_ZQ9k#XjuSor<@t`b1M7vuU!9X#EA%t)A7h!Ihr5#3Lqgu$+gtQm z&6+s)W$?RZlPP2X@Dpo;y*#du{!eAUt(W$n+9zqBF<9##Nir?gL_#OPXvw(sKWgbdmp{!+{SKN&ijlK73!JP1H2NSE}GYQ~!L^lT3;JY+pZ7 z2(5eeBAEtu-;z9weLtbkhwo4L5zxjaG_%%!@YwIFwWQty56Cwd185VN9*Fu*zTean zzYHKtV%`E{)f9Xu8UM}2IihIa2Riu}&W!xWTIXN~TN!!J)wUP;)6#8D9J<1c&i~}L ziErm!NT-D{-Y37uZ2gKhWnTK(%*cP}Z6M?EdJB^Gwzf@`EiC#rJ{Wy zxfXpr=B}{@1agZmdSGeZ<2+OG|FNy;bBH^Q?WFcv*+^^TXrDXiw{;D1AABUfl=Q+Y zeU>4{_r^^A^S{27bofqM`S(_bNoL_c>bl=`8z%Qk`asBgwBLd*e$S+F!Ta!^CW%*{ z{L?iqG2dV9>caMNgMXjYlyT|&N}p#M{u7RnafSK`UO{&UUnr>#qz8g;Mj07^@YjQ0 zT#{ZP-D-~l-$~aSaCa?h@1Wl@RLD&HmtaS{hp%hQYw0Us4X8A~-46_8a|5hQpe*QG zk2QTy%y;E~&tl$?=@2oVrt*ckVYIpMv5GdB z^$mt72lOr2ropZQ--Ijzy>wcI%*X$x3@3f}g}h&l{)`u>^U$ThZWwJZWKOiju7Vw* zKFR^(JK6J)UMJ|`4t^bX8uDEzUzv&jsDsdTsM2Q(`O@|XI|=E1l;C4UdfzUz#c|{x zCXnpNF}K9*Nx?%++jrqP_D&PFCjfL9On#v?Y3UU*4gU!@&%?u0?e9Pp&hVwe>(hCi zf+G0>Z8O#p;aTjp#bgFe%7OS9*zSisJ;?k0PDj2AIAj+7qfJITX~+Qo+)U4kx=L+4 zWJ0BZc!#qz=2CMycZD3GzPmN2l<= zmi%Y+WYw60&nOXipk5JvBc^cTcN1x|Cni-xVYOrLd$n9e(tMF+awA7>{Wi z;7cz2)p?q$9VecvC7WAuJAk;ckAb({6lTAXTHU3#X_J56$bVTxU>7Oz0|$Fs1$N`I zZz%tTaSCiTu*OE#Rs%j9cpDw8Nr4|1MYdVWW7gjtBmZTw#GXuSZc%Jkp{>2WY;625 z^eeF2hFuPHSFC*zuRVpVAlPPN4+nj%>s6EvMc0h{mqq1U><2bBM}G}I!LCwYG8?ne zrTsbKhXA@p`Emf;HS8S?n?zpsVEA!@k^i#%hhCBSi6GuHy)5bHwAoKvHa5k-V51Ma z4a{9)@0S$ifMf;i=>U5#w${&pdIBT=Q}PJ*qrw;tbB0q%g{{q^d2NMjv#1bF@)|~&azOLmWakLq zh5DKwHu66uH(*-~J8RTK5cE0lCy-WwpKJ1F^PDN>nouSwO(>u5Zm(i~p;I##YUIBn zuF~GB)D|i0Pga0O+q=Kv_VgeaVzGlwGBr8D@H8k-pbb% zKbRI*G1n9o!2JGT9tm;@lM$d(WaR*M!5x@g@F)MLT8&qY{8!9CtSghz1Ceb``Uje8 zqP>1XUmRs~;m{XI%7L&Bh^+^i%hrHnoT)At`L7tEZ?WMtuRECO0MHM>SB$>&K#ISp z-BswRpsR-6vg}+FFSD}sVC3JNtp`)F9?r;r#kfPJf~^rR1MvQXRQVE69E;(ve)|&1 zY#}kftY}>z)`Mb=FxJc{nrliU{+FOW%afl2(`^k5_+aSye|c^}?;^CX(A%SL&8Pu$ zO<3!VHQ#JKIP{m2IR>e@CfAEHb4_W)|02YDr_9EG_|uTtXOnC^GJ4?Wn(nZ93-kf3 z{gRXe>A5C5<_9E=_@9q>?~vK}kFgil8A$X%wB9%=DKVoL0hYeRuU}|Q@c%?_F3e_f ztb92T=9)YX4`umF4R6G}1&=xTfNMnAi7pWFI#nHxvh6?S#SBd%W}^e&DVVEAKLCGO z-{S-yDu(`kYUAgN>5p&mG}q+7_K3z@lMD|iPbk|m*L2{Gn781uJo~|Wfi|Yx{7{XPSLqPkDtd3%(LChma~BC@&iu1U{!I0CYioZxkJqQuTc* zuV@F-k_6rh=}yaU>-$@RJSgNvPe<@{1d$@vvun6V^e0g`k)g_E|EI^ z|3=T;G4lVXEC08Mr{JwR{-X_;N|d@jAbrZXv29U|J9s$-ya%ZY;%6$+(VNJK=g)zG z7x5B2RmFOC56_6nnvO>P{~Q=B68NgN0MG;CXUo&k*;ocLeI0;4w;Xt?X~45$8c4@j zB4ay{IWYk5z(dAQP5F=K#P8&!BXkBvSupeQA3R%61RiR`ddahRkEkfoSt4T_khw4b z&%iqgKeauT^yFc<(^U<|A=mkaE{17&P7_;q|+Oc-ZYA?iW2fM_4lC8E1T4~(P}2EYy&0?YYC zz!n&@F+Cj(&R=amfHa8-v9ALM__bZ6AR$p4n_kEFXp)?e96XNdYUf9c=U-^pZv`a_unG*8)| zN_UVHoy-gLxVB+ck8bVr<}Q_+QkA!3hc>+^&2(zQndYFwkm)DJa9qvMj%`}@nd2R~ zcdpgokh#bA=Wm>AvVXTuZg+h)kD7SNENa&1$J5GG{nypPvGUbX&;NDW)$OM3_<4Wq zZ7}rJ`0kBeyNz)iU#4-#E%n02Z|M^7@alv|lLOjp4jOvZZkb!FUWI07@n2px-mzTq ztqwr?zJ1R`xmnTQbeE zNNCP^Oa8RXvXU!uu|<&~&XsN6t}p1nXGx@e1Ixna%bdtIWL10--%ok|S(UHNk^%*| zZ`Q8%x9m&Xcl>S1%3`}q6lud%v3Z;2a+dkljhEah(f#{}hZAjjOd4lj+2MqLf#}}; zrggK8TUI{DvD_^xM(?%1V*l9syLH|c%e;!WD=@tUH)?crnP`!9V2jsXD%5Su6tf$L%ap927UXU@ESqJ&28&BZmxwkyUvbLVYNpG&my53NU(LVJ`>|ijhh(W+uu<+m=6`Wus|Q4*%KKepz-;pVz>qN2%Yk4$qNP z$N%|J)Awz-F?qi>G+CT)L6K2K%A2;D_urCoCZe*Vg34FzZDW_m-Y&*>kM+Imvx1^4 z=4y3vMz(~7Yq#0h?I=68FE^&?*C>-DlTlrV7x?e!v{DIWrg9e>7kaXr8&WiJcn*)C z@DHY~N>0s@;52$*wu=?HLWwpTi(jmrrE@Xsf%g~Ji0*57XZ()#1v>4Y>_5#vS?n7@%g|)*(!+U)Ezn1<@Dr|l);0dD9&@w!t4~s4U>d_?eFgF*`i&Ry5V^yn>1Th zVvcF63eg??$2?h3{rt{qEs8D=Sh;CM`64-LmH2buwy<)?YH^pg22Hly?=`lj>HmsG zWSzX?MLUyS>$y`)R+wD#8e4-d_8Haa-+$`me$t1V+%>U#f&cy&n6JuXA-uan_!)PO!T6b1zy}={qFfDk3LP`SPwH9GB$2kE}M$m!5eOB9j3Yxd}^%uwZV^-M?WFIgp&dbbxOy5Uwl}4{U*1AjQvH=a&{IA!C z;s>331PJk6zv@dO}pT z=5wb^ay0+YVx8-=){O@b=oenoYhsTcX6MaJ+t+_v`nTwjJMu5C+plK+gQb4kZ|xd; zr&?K)0onWPp8JP||HXl??_6A-Z-eWL)=$kJ=RD?8uk~+dujjbgZN`9ygd z>$S@pJaJ~zc7^>8Ww+m)z*Wd^wISQ8hat@@>Xj|!JIi}w=fdg=LId6;jqhX9W>J>n?aFrV)P~EQt*fVb<5HE+hRs<1 z_2yaEUXcfG3|h2$QeBIpLF1yb%eRKcijA8TQ+Z@p>6!nO|cv8_ecI~cBc=YaTxe{N%N(4)ry)neOth_ z;J@8AhFiGxeI0sY%h$z!JgmPrX_aa7sJPhwRjYI7ZGmY+oy?*m`{miQr^by@cUBDc zba&|$Xl7opn2A||o9(kathdl{OWXFxPd@85ah+)ki*Yx*ooo2wzU#20!_T{m=Iop^ z^6lLo{^2FQ7F*%|zvaQ5nq5A+WRHj2cB^;WOk0=~SUchKoYtW?_g(fLJ$LVxK|5v^ z+&`q*!+MogeG3?0uFn3l#}_wQU_RoS^VFe_3#`w*XWK*{U*9`k56*6@U!`oq-_%uc zm3kMf{cTHeu3C{jgM8cW`Ny%o%k_c@g#O&GcKbIyHM0yIXR+j5xW(iZ+s;JxjqrK@ z&Y^F8x9iWU)_fMyCC|>zfdy~7KFwo2WY(G@T$KuiJk8A;yh=*mo04T|am@_qD@`?FLrlvbXS@YWX(HfvbZCiuPA1;y!1})ZN9q%{5=J zD9iBj+ZXL!R55zu&<3;4*u6Wu?)S69hqe8uWR9fYDsq1m_AFMNyXZQkN|w5}T83Pq zs#7?xMVMz;xLbd3ue*nK&%ajh{FyiFT>qF^l%5XE^YD7T?k3LO4!Ldr8N$^ox<2;X zvX1%o#l!?JJK45gXlT9bkr6|CKX1Ax-0Ss_YD=2uDadUpxo@>|^WQt}<}MGioN@Zr zdyjptBbvAzi1l6d=lY?x6$=b)v$Wf~rH=0PBYZ|@yZdI)`u@`wwc)x1`wm!XS+7~h zy>N>;)&H$o=TesPi|aaUiVbYC_|@~L_qqGOW%WCB;EcolGplm!bzD>9M*;gJl<0jZ$-0>oDxa-Vsw?_xI4$ zUHf}U)Wv}VJl_ZJtJThbN9(5t9*H&W$%I( zT-!j4syU9&{rKOG!%YjX?K<}Df!;xvr@y&4;p44iOCrk#4JApHxE$a+uI@~ejXuNr zG%o+rEv#IVpg{Mxxo&qJ=j?UuyO({%304(P~|`!ueYCkK*bDa(xnV*|(_d zcq^-GyQSTxjI5ORuhXvQ&RxDVs%`ypn{$-yP5EAOa;j~!;ZI)s|K0JtUG()6vxeKc%fUW+{Klic%K#7`b?*?LBmd?#HSW-rJUF0pt0u}R!txvi_e z%6)7>V19==ccyG!+&pM#uceM%Cr-FA@o@W6R=GKP@_K0gsx!IWUV|rhZ9SqWS2C|f z;U=?3PAWL_o5SYe^Uo~ZB5v z7fqXGyMNYP^ZG>w^zolP$JY1C{Rd@BH?fOuR3$pkZw0NJ6kZo@Tejmn?mueImgcxN zxA~g0rGL+UZ%C`9>)j6x@Elh!)c3-{_3JJASD3W5TIH76$~(=;>QKzT`lH0f3%8iB zuYakuRla?3uR`*S^*u1^Qi&gVzBibAy{XHAN=t^nUdg@Rwdtf;>n$hqSU0E_G&|{B zn8m`ob(=RIWflBoeXYAKL-xJ=Vs-ZH(HnzGS*^}asc~&usB#JS;KbQOSIoP%H(&Qf zHSI_3?zX?q!|vU`W{X}3R0kALA7Hf7wbOH(e@3oTNkA~*Ng{6;OBbTrwxyj$;? zAM;oT>~`GcQr>BQ^z?+pMoSBCYTF>R&nIfiARl<=zOim~(XT-V;GcZ}ci<)yd>*_Sh$( zR$CV>E|I5NZtLCEFAd}BQJePU>$C++c79q|azWQ^&!1h5J4MY+{cYxjs#OpX1e?|* z)lIUjIi8B(h!K5@UE}gRs<(dV?f}2;^X8tJ^4H-%L96Ma5 zS@UjZo<9rjcWvv(?Iqe);Br@*TXfyT&Pg>dt$bMDaeX$I&BeHugU^iWIPmkXvR3=% zPgy(r+wq;bj}JfIyjTEvs z)$>vFy;ooS$E|VM!3Ve#BYSr5PwnLCJB7br^+F{i{>uH_beb~Gc2pxN|)4|}cH@@MNU1()|O!g-w`IlA!nR|hVY*!tH) z%fHHm9IajM+?Q?_XB@4N&By!niH!wY_UuJK6v=j|lwTu@4)f1!i7e|rrd+Rfwk7ix zT1{=$Gs`^ZT~31Y{|Q};F6KmW9}AMU^%zw>?vo*wr^j*Z}x~$ z&CpKTJ~0!mKFbZkecKsK}Q=u z$gy`w-NB}drg=D(Ubtn*HD9xQg({f+zPb}F0UtM2Cx47u{%i+{Y=;@!JmVN|hSlF!cS>k`+ve@3!SaULUP?^~$Xq6Gt^| zc=pu6v!;voPd{e1xa=C6;kI8c-FAF>xZ%~JiLcyV_u0DSlWFy*e;sRE&7 zA!l6|e_h+0O3aIghl(6L;ZUP#;oCE(t*&)u^2ax?T7*ofR=jqf)p7k-O^p6As#48! zGh(RRzi4JV_lAG|zxQ3_o;-UtZ)||A)x6skhDAKP-SYUx^JZ=9osIQ))Un%d-7Xz< ze~Dg|>WM=|zlbAlW`j(6cq5xTjE|VeK$3B>8MJ#-Gcu9 z-s7Bq#JG)9?dHrcF@06rlB=9&jH+;V-iiHA&1bAXzTr3Lz`O^;Iw#Gkkau+}u3p&> zH6jy_4?R=wW~2i(qzAY5JofF&;ib1-oBtbEA*;j7h4UJ~2<=QoOr+Vf6 zRQ&midSRQJzaY^+AlAt?u*Qno(=0|D{$uq1Lj}3A=c_+zf3?AMzxsKrg}4r$CR9jB{Cn(I zpB=TQM!ecO#IH)Pty#G9XD`_NnD2Aq+~uQPa(DYLU_oSP`KY|X&8yA1!FAYCy58Uy zrb}jf*RA?BaIDktVp#@`A6TYs4bHN1_U1PZXJ65kUK$p?EaBO~MLDWgoZIxOOB<6O z2dyHv75cl%tGoYob}7EEsnd>panml(u6Q!UX5;Qd#ke)Snw-C~iA2#Owqplx4TxOR zdqH4mdDl&eRkG)-T5)Zcw*O==zkjTkNB3?U+Iy~R z%8i=Vw9d%h9|mk~<@)9M8JCkgBYS-=_omtUxNcM5{Pp1IxRBKoeDf8wIbH2THTy{o z>h-^P?^4GlLl8>9P4tW$?enI`hKasb3T1f86ePzhRv&F<<)UFl{sa@Agr#%Xj_O*`!B< z^JXPVY^d9$=+R0eOyV1s8~UK|d>?9BHWjd0w$1XY`BT5UZnFoPj*073vwx?GIqUA} zv|`(e+1LJRRPf!EyKWutlQ4DkL12LAlyT3#^&0BA(uJ#>)jFcUN(b|%W&FJxH0;!p zx{{pNu1$SBFMpkx-y6|@{Og7C7b>59-halGpGJ)h>{T6Dg$l*(es zeIE{bmhQH@$l8ZiNngLT^qyGO_vYE!6aC7ro?u&=s=GzMp4N5+JgsgnUmAM*UgINK z22Cu}aUcOm!7mzVh`*cUmzA}hrHeScl9QR5`|b*)cK!oFD_ zf;;B^wshLvdDr*5KJedUtTw+;MYSH<^2V|AnxK z%Gq=NQE_cIpxm>QOY`4{)t%K*=Uu)Av@o_=E=Wmy~RexxO4zIW6&7SbA&iAjV zo*|wqN|;TnU^d?5{GcM`{5eRrqy0IEmXdG-*E%mj`%#& zwsf9jUy^cM+xz|8zwhgO9Q<Ytvch><<2Ka?9sEO!ry*WnZotHNKslkDhp+ox`XNW#-+qW0T6|dtC4C z5AOn`>ZtQ={(>cD3j?^Vh3gFsi5NGo=Z`Xfw~8)aZrID>ABR1CTmMSQTqY%gEBkf2 zUZm;FBl|BMzQ4I{)oOW6xa-GWzNDVHXZXcqU2@OM`scnTZrwdQ%xnGfbjiKz|0zwf0F7Yp<;w;P{p$<0otNzuDzBusx)nUFs|aOlHz9)WrPEbDTFGs{_`8P{{(?auM@77RD-7yD>_|7kQ- zJGD0~&yp<5|ERd2&bwaqDrI|QmbJ>joEvkWZu_Z*XMLBDJfy&w@~XuZvpH90+f2FB z>|x=(k=G-_CXSAux^di)Iv*l$=iYVV*o=9N>}yS&cqwM?wtRVR_4AlYg4)}#{lQ-G z4tQ@>kKdNlxvrZg$%C_I{Z{9qkQ7Flf zTXLK}_MrRv4Hs^EJbiq2Vy7AhmiAm1`?mZ%^N*i5Rjt=GBx2>hl;?ilxX&C@et1~ay z@@x=r@^Z=EOP5&`C_L+*O*{MbIi2mFY8*G%=ky$_*`?hb-`~nxEjy`Eh=oqOT$XLI zDgI-GLzWANdM1s0xVdhQvQIAD+4J(yYwzIT_^43-I#GikJic1rrB`GN&w)KmSFgKR zl(TN!a9)CY_?})K5relLBB7!8ik#6of){_VEt#v(rYr|+3$LGORcHFPKYC9p_Q+#a z!~M7ZHDCN?Q~d=2%l{a3YTe$GtHY`_FZWL^uECms!k!Ih_lKdc z)A-DSS=~zy9#o@u($3vEnlBi;HKhBzExDJ~DG_KhJhyesl3pYrIgGVAxWfI=Yv&>N zr}()!`uX15-aTppHIvy^_cwh;osh)`+eDA9&&QqVxT#2=cH2dJ+UJ~mXUgPWQ%6_t zB)VRN3(C5t*N~VMC7)e-`F)aIu}7zJ6yJa6!n%8R7kBNMXNhSGoBTD;1zc))wO3G= zJD)YaGXGU16pXhj>fWJ8Hp^nO z|FsJV^x55^r`gK3)w<=+IX9+|FNdRKmK*m%g`WB^~j97aN!uKKMbKK#L_O+HGh!x(JtR?qSd3BM))w znx5Y4appc2Dig8nx@`YDEoY^g3@T{dfrnkseK6~!#^DnKSK9AZCn+riZUnIqD zI2&#opX1WVz((q4xja4kj|jZb zG;-3ovt~CdZs^sn+5?-&LyN<5R0vvY+M<-*_TkxWdaZ7D&Mj+Ay7Ajo@0tsy zxBq+Z=_=I*n7;Tt_P5=yOZ16Y$&K!?@aW#h@s}@L?YP-ySqoC|-X5_sx>-eTjb+zS z*}Gd^bqT%tw1fTVk<<2m+;m{&r~h|p=HXDkUmu?tYiJB#gt3f$NwS9##=ghcWnWVi z%@DGT8M2Li?Dze=Ov)tGHIp=-OdA)CO zE~txSm-Cy=S6NQ(k>+frX%-=yojCzzIYL|nV_&=U{dSEo(2C~qsO92s!1?kdV9ksm zi7V#lecuYyRd|(7Bu^H<=L29@cnItFWTWa#F`8OOhkjkph z=Q8Wk3%bkK&K5P^iY4FY{uO0c=91ST-2d2-?q*XIH4 zn~m%53}FOd7C1ri7DtTp3|PgcxL5~p_$ zLp$3ZiU`7$X3-ntc7h0=7Yvs|Q>Na_<4+qt&l+8E{ zroisLP;*Ap7U_d*+4gzF;H73cu&_~pukw4oJ-$ezxtHMU9i_G*Q~VSVD$xMTmYM!~ zY_~4|@A>6XeU@*uoMzt(lRh7}{3}SB@D+AbY4RHB~nTUvkKOjV`l56{C zG|pvjTpjq@Jifo+c+x}!MNgIInf@%2+e5&EJ^TlVsI%^?=jBKptb8nQDg0|IJbtGZ zcpT;IJTzJp%pwh0KbS;6#3Ro7ck z&lDSC3H`NEmrU8gOzHX~h^8QKhoE#T-p=l-ip_#vHrUl?1}WIr+$yVgwcUx~ePlNUHM%TIm{j_Oiw-&uS0K72bW2s!p9 z>p^U7-PHKDw#@m3Cjtro=Q#1dxi>_lQRD%SVgr^{LR>RvSF4)!xdNiCgCS zdFE&IFbyAd8(11-8{^e^(aL+1r@}%n?mCHDq}@e8JW}Q?kRYMd$tZt|Ahyz`ozbqU z?m2V`HdS4C_rZNoh{l|0(W`j@tu}7=g~9B*LSZ&t)&|4}FB}~uS*ghg38O0jF*Hmu zEyRz0*!&$nPOiP$@&@nX@!dBeXkQ5Z-5u-G-dsC5u$5S^^*?eX+3NXCPgY;Rdaztb&ID7I>!L&MtY3??APFmwblhx|0HO5f$%L@3 zyk~zN^<@(hWNIjfj1tlqxE6A)7WeZ5`k=6HB*qy_;$^ZjRU01}?=|OwB37h?ruW8? zhC*us73~&V<4hafxG}cuDCJ^<$ZUFg~Q@)dHLmX%DRb^X15cnSNj7zC2 zo^JSJFOc*Zj4{em%wjkM6oCcqlX*`(p5T4geC=}JM)$App;e92XyN#bfk3-7ld9Kf zmX}!=9C&r!^2+F+DOtKb-B^#`wU?_Kt)%5R$w-Uhjv2@j} zS`XWq(-!Hj6u1d}A~@R>Dt9qK-DCB@CDqnSbzg~{jSKRg%~N-Ib#XyZy3jWx)H)?| zj28grP`k*5C(nJ z&iuwT%rI)gsE^{A-dkxPb%*D+ci4^4a7radcd$xIB0jc}@E*`F3E&ox zABGM8nux}wS9@i?9I3iFN4sqdVz%Ycg0V;P`Cva=rTddoanK?zsI2{dcqA9Koa{3Ej%h?>=vhZ?74j36VaplW)ZpP#7N3LEjQ zU`t7!*cg9Wexqq^Q#07i2f+^hn=`L;k2JoqU^<0atjC+I>qXlzR1@YR zaMyuhDL>`U7L%`Be*DjZ|8#a9e(_(san>m>%;Rd#uazc9HsRckmti4r4K+Az`bX;= zpGCs4wn$5!j%*7i7q zf+U13J>K}|By zOe{|EPrpv|y^6|V9^rWY$OZ6tzbiMl@Ox(p+uVW-KIZW!J&zdAVxAo7P`xAuO@%E7 zidN@{9BaVM0Kz|{L<%mZftc+zd)&$dieB{$qw}nnVv$L=McE4@M7+hIvR=UoDtE)n z6XLEEAAR0EdujDAk|_|xn8JuGt3?1}N>9Wm>XAP?QH?M4J>CSO+cII`0({>;$I7wu zHoDzm6I7(v9Ts&o8DXc_==yMao(6OBU8ztWZRXLkPwr-rKEmuq3u0yUqb&h|Y$fIF z@*DOAp#A4*0{QCdxmx{XF88kTy=q}%EI;QKrJ9G}75nX0$r1X}t}AsEYZT3KQPsy^ ze#9C6b9&X%V`KTz#l6>Ae36X`Pkk%!Vdw`B%qRJ)9n6tQ98}(iIw|-;;wdE)Sgl6N zmCkWsZ8>Nvrlm3F77yw@)gCI_p+#5q16=VWB2IWZce^{1k4aeM)UXK3LQZk750K1< z>av9&_^;X_QZJdC3Q8mTQr|_Jn?lCD6_`q;A$&|d`sA~^i}o7B4fxb6+Q4|iW3w|U z#P+k+TQ~JI?fKhl%&k(E%}veN`bD=U;6MCp*j0Gm6vMCZ==*$9Guaro?35sIQD298 z`<0FxC-A!#cW`H5*=@+TWU4+>+Iiay#=5k@wu_;E72efX;4w`+OkSX5LG}pCRFjs8 zp^oO{@Q92PHDm|^Yft<&6F%kAYZ)~94`e}QKZFr8l-jQ3d&6^um*7h8pCz1VnJ_~n zJuZfLCjNGYp#EN^`c>!JA{Z-Cnhf1VBDG?iLpuP>PC`YmGY)gl!y*n2q4)I*NNhq#oH}K(RiPvX7 z85;}^!&N@V=@-$#nLz_=C!vDcM?Vr!X^hihKVZjZ$*?Bh%Hk?JUvgkK2M!Sm?46~` zwM;l6l1^(vV~f=C6I2yy_bb_>1pCi|Rqmugy%;)G|Mrs^y$c`3A~pSYUD=5c{)c-L zIfwHJw+43g;LwDW4yF@CdX%!Sa${db!>|h^P;L~uv~Ff#ix@R{k=o0U^Ltv9PYY%i zYsa&Bgogx{Cn#1+>7?8r`*4A#-!gu~im7P~tbVLi zd$TwK>SH?prXx8z!N0zj({)ZnCmi(;KQ6D%)ms&YL8wTlb6xaely2cV$O$<0yzJ=E zn!vntmSCzBeHMz5GAPQ|r4%8-N*N<6+x*D`xn_x?MHyD9BzSk0 zogWVI>Ny^*eN ziHIa_u`HiwM|z2(u<0ip2Ljs~k{415uo*};loKla`%gSZ*87i=+eQWRcz!ah0zbTe zTStshV~Lq8`Tj4zxxp|e>!&0*2TZR|_70l)`8MyKYB3-Fgjg8lVxkw52z7{;Hl{6& z8Dg*_Kl#h4?B2F0W$74~(fgzB+k-bm_>#?1KUMLL02f20TB`3x(@*(Lg-vmjQ(p5A zs1?0sI!3Bl@H68sM3jn15hQbwP(0dPdIuXc>d)z5mH}tA3G7n`u~5nkp~IVFPb`LcD_G7KB8@IY-7}9 H;7$Br^o4}Z literal 118807 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�}i+ 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 H7!m&ia8liC literal 26813 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 diff --git a/build/icons/512x512.png b/build/icons/512x512.png index 762a3ed50fc255f661a5205ab03264160a146aad..2c953f6efd12d7c8e8b597e8bb6ea7aca598bedf 100644 GIT binary patch literal 10880 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 H7!m&ia8liC literal 26813 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 diff --git a/src/renderer/components/icon/logo-full.svg b/src/renderer/components/icon/logo-full.svg index b3b553f865..9529b61e9a 100644 --- a/src/renderer/components/icon/logo-full.svg +++ b/src/renderer/components/icon/logo-full.svg @@ -1 +1,17 @@ - + + + + + + + + + + + + + + diff --git a/src/renderer/components/layout/sidebar.scss b/src/renderer/components/layout/sidebar.scss index f863d374cd..46cf9c7d15 100644 --- a/src/renderer/components/layout/sidebar.scss +++ b/src/renderer/components/layout/sidebar.scss @@ -47,11 +47,12 @@ width: 28px; height: 28px; margin-left: 2px; - margin-top: 3px; + margin-top: 2px; margin-right: 10px; svg { --size: 28px; + padding: 2px; } } From a4eff11ee29914d4ce2798dd44c7b9ccf36cf222 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Tue, 8 Sep 2020 10:42:53 +0300 Subject: [PATCH 05/13] Refresh input values on cluster change (#814) Signed-off-by: Alex Andreev --- .../components/cluster-home-dir-setting.tsx | 14 ++++++++-- .../components/cluster-name-setting.tsx | 14 ++++++++-- .../components/cluster-prometheus-setting.tsx | 28 ++++++++++++------- .../components/cluster-proxy-setting.tsx | 14 ++++++++-- .../cluster-manager/clusters-menu.tsx | 2 -- 5 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/renderer/components/+cluster-settings/components/cluster-home-dir-setting.tsx b/src/renderer/components/+cluster-settings/components/cluster-home-dir-setting.tsx index f998035b44..acb23da08a 100644 --- a/src/renderer/components/+cluster-settings/components/cluster-home-dir-setting.tsx +++ b/src/renderer/components/+cluster-settings/components/cluster-home-dir-setting.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { observable } from "mobx"; -import { observer } from "mobx-react"; +import { observable, autorun } from "mobx"; +import { observer, disposeOnUnmount } from "mobx-react"; import { Cluster } from "../../../../main/cluster"; import { Input } from "../../input"; import { SubTitle } from "../../layout/sub-title"; @@ -11,7 +11,15 @@ interface Props { @observer export class ClusterHomeDirSetting extends React.Component { - @observable directory = this.props.cluster.preferences.terminalCWD || ""; + @observable directory = ""; + + componentDidMount() { + disposeOnUnmount(this, + autorun(() => { + this.directory = this.props.cluster.preferences.terminalCWD || ""; + }) + ); + } save = () => { this.props.cluster.preferences.terminalCWD = this.directory; diff --git a/src/renderer/components/+cluster-settings/components/cluster-name-setting.tsx b/src/renderer/components/+cluster-settings/components/cluster-name-setting.tsx index 8e2f8a2afa..a11f8aed6e 100644 --- a/src/renderer/components/+cluster-settings/components/cluster-name-setting.tsx +++ b/src/renderer/components/+cluster-settings/components/cluster-name-setting.tsx @@ -1,8 +1,8 @@ import React from "react"; import { Cluster } from "../../../../main/cluster"; import { Input } from "../../input"; -import { observable } from "mobx"; -import { observer } from "mobx-react"; +import { observable, autorun } from "mobx"; +import { observer, disposeOnUnmount } from "mobx-react"; import { SubTitle } from "../../layout/sub-title"; import { isRequired } from "../../input/input.validators"; @@ -12,7 +12,15 @@ interface Props { @observer export class ClusterNameSetting extends React.Component { - @observable name = this.props.cluster.preferences.clusterName || ""; + @observable name = ""; + + componentDidMount() { + disposeOnUnmount(this, + autorun(() => { + this.name = this.props.cluster.preferences.clusterName; + }) + ); + } save = () => { this.props.cluster.preferences.clusterName = this.name; diff --git a/src/renderer/components/+cluster-settings/components/cluster-prometheus-setting.tsx b/src/renderer/components/+cluster-settings/components/cluster-prometheus-setting.tsx index 729090629d..a7f42a7c85 100644 --- a/src/renderer/components/+cluster-settings/components/cluster-prometheus-setting.tsx +++ b/src/renderer/components/+cluster-settings/components/cluster-prometheus-setting.tsx @@ -1,11 +1,11 @@ import React from "react"; -import { observer } from "mobx-react"; +import { observer, disposeOnUnmount } from "mobx-react"; import { prometheusProviders } from "../../../../common/prometheus-providers"; import { Cluster } from "../../../../main/cluster"; import { SubTitle } from "../../layout/sub-title"; import { Select, SelectOption } from "../../select"; import { Input } from "../../input"; -import { observable, computed } from "mobx"; +import { observable, computed, autorun } from "mobx"; const options: SelectOption[] = [ { value: "", label: "Auto detect" }, @@ -27,14 +27,22 @@ export class ClusterPrometheusSetting extends React.Component { } componentDidMount() { - const { prometheus, prometheusProvider } = this.props.cluster.preferences; - if (prometheus) { - const prefix = prometheus.prefix || ""; - this.path = `${prometheus.namespace}/${prometheus.service}:${prometheus.port}${prefix}`; - } - if (prometheusProvider) { - this.provider = prometheusProvider.type; - } + disposeOnUnmount(this, + autorun(() => { + const { prometheus, prometheusProvider } = this.props.cluster.preferences; + if (prometheus) { + const prefix = prometheus.prefix || ""; + this.path = `${prometheus.namespace}/${prometheus.service}:${prometheus.port}${prefix}`; + } else { + this.path = ""; + } + if (prometheusProvider) { + this.provider = prometheusProvider.type; + } else { + this.provider = ""; + } + }) + ); } parsePrometheusPath = () => { diff --git a/src/renderer/components/+cluster-settings/components/cluster-proxy-setting.tsx b/src/renderer/components/+cluster-settings/components/cluster-proxy-setting.tsx index 1b94992e5b..f7b4327c52 100644 --- a/src/renderer/components/+cluster-settings/components/cluster-proxy-setting.tsx +++ b/src/renderer/components/+cluster-settings/components/cluster-proxy-setting.tsx @@ -1,6 +1,6 @@ import React from "react"; -import { observable } from "mobx"; -import { observer } from "mobx-react"; +import { observable, autorun } from "mobx"; +import { observer, disposeOnUnmount } from "mobx-react"; import { Cluster } from "../../../../main/cluster"; import { Input } from "../../input"; import { isUrl } from "../../input/input.validators"; @@ -12,7 +12,15 @@ interface Props { @observer export class ClusterProxySetting extends React.Component { - @observable proxy = this.props.cluster.preferences.httpsProxy || ""; + @observable proxy = ""; + + componentDidMount() { + disposeOnUnmount(this, + autorun(() => { + this.proxy = this.props.cluster.preferences.httpsProxy || ""; + }) + ); + } save = () => { this.props.cluster.preferences.httpsProxy = this.proxy; diff --git a/src/renderer/components/cluster-manager/clusters-menu.tsx b/src/renderer/components/cluster-manager/clusters-menu.tsx index 07780830ff..b8d7a232b6 100644 --- a/src/renderer/components/cluster-manager/clusters-menu.tsx +++ b/src/renderer/components/cluster-manager/clusters-menu.tsx @@ -22,8 +22,6 @@ import { clusterIpc } from "../../../common/cluster-ipc"; import { clusterViewURL, getMatchedClusterId } from "./cluster-view.route"; import { DragDropContext, Droppable, Draggable, DropResult, DroppableProvided, DraggableProvided } from "react-beautiful-dnd"; -// fixme: allow to rearrange clusters with drag&drop - interface Props { className?: IClassName; } From 295333d05589b7eca53209f33b211ef929ec56d5 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 8 Sep 2020 08:44:34 -0400 Subject: [PATCH 06/13] add progress bar for webpack compilation (#794) Signed-off-by: Sebastian Malton Co-authored-by: Sebastian Malton --- package.json | 2 ++ webpack.dll.ts | 2 ++ webpack.main.ts | 2 ++ webpack.renderer.ts | 2 ++ yarn.lock | 23 +++++++++++++++++++++++ 5 files changed, 31 insertions(+) diff --git a/package.json b/package.json index 1d4cb78c76..10ca92667e 100644 --- a/package.json +++ b/package.json @@ -240,6 +240,7 @@ "@types/material-ui": "^0.21.7", "@types/md5-file": "^4.0.2", "@types/mini-css-extract-plugin": "^0.9.1", + "@types/progress-bar-webpack-plugin": "^2.1.0", "@types/react": "^16.9.35", "@types/react-router-dom": "^5.1.5", "@types/react-select": "^3.0.13", @@ -295,6 +296,7 @@ "nodemon": "^2.0.4", "patch-package": "^6.2.2", "postinstall-postinstall": "^2.1.0", + "progress-bar-webpack-plugin": "^2.1.0", "raw-loader": "^4.0.1", "react": "^16.13.1", "react-dom": "^16.13.1", diff --git a/webpack.dll.ts b/webpack.dll.ts index 000ba0af21..3a50cacf12 100755 --- a/webpack.dll.ts +++ b/webpack.dll.ts @@ -1,6 +1,7 @@ import path from "path"; import webpack, { LibraryTarget } from "webpack"; import { isDevelopment, buildDir } from "./src/common/vars"; +import ProgressBarPlugin from "progress-bar-webpack-plugin"; export const library = "dll" export const libraryTarget: LibraryTarget = "commonjs2" @@ -25,6 +26,7 @@ export default function (): webpack.Configuration { libraryTarget, }, plugins: [ + new ProgressBarPlugin(), new webpack.DllPlugin({ name: library, path: manifestPath, diff --git a/webpack.main.ts b/webpack.main.ts index 06c52f47dd..c9536da63d 100755 --- a/webpack.main.ts +++ b/webpack.main.ts @@ -3,6 +3,7 @@ import webpack from "webpack"; import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin" import { isDevelopment, isProduction, mainDir, buildDir } from "./src/common/vars"; import nodeExternals from "webpack-node-externals"; +import ProgressBarPlugin from "progress-bar-webpack-plugin"; export default function (): webpack.Configuration { console.info('WEBPACK:main', require("./src/common/vars")) @@ -48,6 +49,7 @@ export default function (): webpack.Configuration { ] }, plugins: [ + new ProgressBarPlugin(), new ForkTsCheckerPlugin(), ] } diff --git a/webpack.renderer.ts b/webpack.renderer.ts index b6c35535ce..74978bd152 100755 --- a/webpack.renderer.ts +++ b/webpack.renderer.ts @@ -5,6 +5,7 @@ import HtmlWebpackPlugin from "html-webpack-plugin"; import MiniCssExtractPlugin from "mini-css-extract-plugin"; import TerserPlugin from "terser-webpack-plugin"; import ForkTsCheckerPlugin from "fork-ts-checker-webpack-plugin" +import ProgressBarPlugin from "progress-bar-webpack-plugin"; export default function (): webpack.Configuration { console.info('WEBPACK:renderer', require("./src/common/vars")) @@ -129,6 +130,7 @@ export default function (): webpack.Configuration { }, plugins: [ + new ProgressBarPlugin(), new ForkTsCheckerPlugin(), // todo: fix remain warnings about circular dependencies diff --git a/yarn.lock b/yarn.lock index 75569f4bef..289d240438 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2006,6 +2006,21 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.1.tgz#b6e98083f13faa1e5231bfa3bdb1b0feff536b6d" integrity sha512-boy4xPNEtiw6N3abRhBi/e7hNvy3Tt8E9ZRAQrwAGzoCGZS/1wjo9KY7JHhnfnEsG5wSjDbymCozUM9a3ea7OQ== +"@types/progress-bar-webpack-plugin@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@types/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz#f95b7e1199b5f5e8156321d2411f6fb06c833559" + integrity sha512-HCyeEuuFzsXvIkbchGKJUhXRBGio7BlvVn0ULuBRE50UofuFy2Q8HvR+Q8C2w+QlBUoM+AjerGJU8DhyqYVw7g== + dependencies: + "@types/progress" "*" + "@types/webpack" "*" + +"@types/progress@*": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/progress/-/progress-2.0.3.tgz#7ccbd9c6d4d601319126c469e73b5bb90dfc8ccc" + integrity sha512-bPOsfCZ4tsTlKiBjBhKnM8jpY5nmIll166IPD58D92hR7G7kZDfx5iB9wGF4NfZrdKolebjeAr3GouYkSGoJ/A== + dependencies: + "@types/node" "*" + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -9341,6 +9356,14 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +progress-bar-webpack-plugin@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/progress-bar-webpack-plugin/-/progress-bar-webpack-plugin-2.1.0.tgz#f7f8c8c461f40b87a8ff168443f494289b07ee65" + integrity sha512-UtlZbnxpYk1wufEWfhIjRn2U52zlY38uvnzFhs8rRxJxC1hSqw88JNR2Mbpqq9Kix8L1nGb3uQ+/1BiUWbigAg== + dependencies: + chalk "^3.0.0" + progress "^2.0.3" + progress@^2.0.0, progress@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" From 7294c11b38e351c72be7606a3fdc3c695861133b Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 9 Sep 2020 16:16:48 +0300 Subject: [PATCH 07/13] Remove explicit yarn install call from make build task (#835) Signed-off-by: Lauri Nevala --- Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/Makefile b/Makefile index 8123e75e07..e492aa012c 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,6 @@ test-app: yarn test build: install-deps download-bins - yarn install ifeq "$(DETECTED_OS)" "Windows" yarn dist:win else From 763b07b7fca986515baf599ae226d05d99cd4d10 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Wed, 9 Sep 2020 23:07:36 +0300 Subject: [PATCH 08/13] v3.6.0-rc.2 (#841) Signed-off-by: Lauri Nevala --- package.json | 2 +- static/RELEASE_NOTES.md | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 10ca92667e..dd1d778e06 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "kontena-lens", "productName": "Lens", "description": "Lens - The Kubernetes IDE", - "version": "3.6.0-rc.1", + "version": "3.6.0-rc.2", "main": "static/build/main.js", "copyright": "© 2020, Mirantis, Inc.", "license": "MIT", diff --git a/static/RELEASE_NOTES.md b/static/RELEASE_NOTES.md index d0553e542a..64f4c386a1 100644 --- a/static/RELEASE_NOTES.md +++ b/static/RELEASE_NOTES.md @@ -2,7 +2,12 @@ Here you can find description of changes we've built into each release. While we try our best to make each upgrade automatic and as smooth as possible, there may be some cases where you might need to do something to ensure the application works smoothly. So please read through the release highlights! -## 3.6.0-rc.1 (current version) +## 3.6.0-rc.2 (current version) +- Refresh input values on cluster change +- Update logo +- Fix margins in cluster menu + +## 3.6.0-rc.1 - Allow user to configure directory where Kubectl binaries are downloaded - Allow user to configure path to Kubectl binary, instead of using bundled Kubectl - Log application logs also to log file From 8d1f0efe8004a13711f95a378086e7ee71ccc685 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Wed, 9 Sep 2020 16:41:25 -0400 Subject: [PATCH 09/13] remove make-syncronous and file-type calls from migration (#844) * remove make-syncronous and file-type calls from migration Signed-off-by: Sebastian Malton Co-authored-by: Sebastian Malton --- package.json | 1 - src/common/cluster-store_test.ts | 8 +++---- src/migrations/cluster-store/3.6.0-beta.1.ts | 12 +---------- .../components/cluster-icon-setting.tsx | 4 ++-- yarn.lock | 21 ------------------- 5 files changed, 7 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index dd1d778e06..4aa73fdacc 100644 --- a/package.json +++ b/package.json @@ -187,7 +187,6 @@ "jsonpath": "^1.0.2", "lodash": "^4.17.15", "mac-ca": "^1.0.4", - "make-synchronous": "^0.1.1", "marked": "^1.1.0", "md5-file": "^5.0.0", "mobx": "^5.15.5", diff --git a/src/common/cluster-store_test.ts b/src/common/cluster-store_test.ts index cee18078bc..2810883690 100644 --- a/src/common/cluster-store_test.ts +++ b/src/common/cluster-store_test.ts @@ -33,7 +33,7 @@ describe("empty config", () => { id: "foo", preferences: { terminalCWD: "/tmp", - icon: "data:image/jpeg;base64, iVBORw0KGgoAAAANSUhEUgAAA1wAAAKoCAYAAABjkf5", + icon: "data:;base64,iVBORw0KGgoAAAANSUhEUgAAA1wAAAKoCAYAAABjkf5", clusterName: "minikube" }, kubeConfigPath: ClusterStore.embedCustomKubeConfig("foo", "fancy foo config"), @@ -285,7 +285,7 @@ describe("pre 2.6.0 config with a cluster icon", () => { const storedClusterData = clusterStore.clustersList[0]; expect(storedClusterData.hasOwnProperty('icon')).toBe(false); expect(storedClusterData.preferences.hasOwnProperty('icon')).toBe(true); - expect(storedClusterData.preferences.icon.startsWith("data:image/jpeg;base64,")).toBe(true); + expect(storedClusterData.preferences.icon.startsWith("data:;base64,")).toBe(true); }) }) @@ -364,6 +364,6 @@ describe("pre 3.6.0-beta.1 config with an existing cluster", () => { it("migrates to modern format with icon not in file", async () => { const { icon } = clusterStore.clustersList[0].preferences; - expect(icon.startsWith("data:image/jpeg;base64, ")).toBe(true); + expect(icon.startsWith("data:;base64,")).toBe(true); }) -}) \ No newline at end of file +}) diff --git a/src/migrations/cluster-store/3.6.0-beta.1.ts b/src/migrations/cluster-store/3.6.0-beta.1.ts index 18ce07a638..412c77ab96 100644 --- a/src/migrations/cluster-store/3.6.0-beta.1.ts +++ b/src/migrations/cluster-store/3.6.0-beta.1.ts @@ -7,11 +7,6 @@ import { migration } from "../migration-wrapper"; import fse from "fs-extra" import { ClusterModel, ClusterStore } from "../../common/cluster-store"; import { loadConfig } from "../../common/kube-helpers"; -import makeSynchronous from "make-synchronous" - -const AsyncFunction = Object.getPrototypeOf(async function () { return }).constructor; -const getFileTypeFnString = `return require("file-type").fromBuffer(fileData)`; -const getFileType = new AsyncFunction("fileData", getFileTypeFnString); export default migration({ version: "3.6.0-beta.1", @@ -48,13 +43,8 @@ export default migration({ printLog(`migrating ${cluster.preferences.icon} for ${cluster.preferences.clusterName}`) const iconPath = cluster.preferences.icon.replace("store://", "") const fileData = fse.readFileSync(path.join(userDataPath, iconPath)); - const { mime = "" } = makeSynchronous(getFileType)(fileData); - if (!mime) { - printLog(`mime type not detected for ${cluster.preferences.clusterName}'s icon: ${iconPath}`) - } - - cluster.preferences.icon = `data:${mime};base64, ${fileData.toString('base64')}`; + cluster.preferences.icon = `data:;base64,${fileData.toString('base64')}`; } else { delete cluster.preferences?.icon; } diff --git a/src/renderer/components/+cluster-settings/components/cluster-icon-setting.tsx b/src/renderer/components/+cluster-settings/components/cluster-icon-setting.tsx index 04b7ef1fc6..fb35778f6c 100644 --- a/src/renderer/components/+cluster-settings/components/cluster-icon-setting.tsx +++ b/src/renderer/components/+cluster-settings/components/cluster-icon-setting.tsx @@ -28,7 +28,7 @@ export class ClusterIconSetting extends React.Component { try { if (file) { const buf = Buffer.from(await file.arrayBuffer()); - cluster.preferences.icon = `data:${file.type};base64, ${buf.toString('base64')}`; + cluster.preferences.icon = `data:${file.type};base64,${buf.toString('base64')}`; } else { // this has to be done as a seperate branch (and not always) because `cluster` // is observable and triggers an update loop. @@ -73,4 +73,4 @@ export class ClusterIconSetting extends React.Component { ); } -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 289d240438..c7d43c4472 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7811,14 +7811,6 @@ make-plural@^6.2.1: resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.2.1.tgz#2790af1d05fb2fc35a111ce759ffdb0aca1339a3" integrity sha512-AmkruwJ9EjvyTv6AM8MBMK3TAeOJvhgTv5YQXzF0EP2qawhpvMjDpHvsdOIIT0Vn+BB0+IogmYZ1z+Ulm/m0Fg== -make-synchronous@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/make-synchronous/-/make-synchronous-0.1.1.tgz#0169f6ec769c3cf8948d66790da262740c1209e7" - integrity sha512-Y4SxxqhaoyMDokJQ0AZz0E+bLhRkOSR7Z/IQoTKPdS6HYi3aobal2kMHoHHoqBadPWjf07P4K1FQLXOx3wf9Yw== - dependencies: - subsume "^3.0.0" - type-fest "^0.16.0" - makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -10929,14 +10921,6 @@ style-loader@^1.2.1: loader-utils "^2.0.0" schema-utils "^2.6.6" -subsume@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/subsume/-/subsume-3.0.0.tgz#22c92730f441ad72ee9af4bdad42dc4ff830cfaf" - integrity sha512-6n/UfV8UWKwJNO8OAOiKntwEMihuBeeoJfzpL542C+OuvT4iWG9SwjrXkOmsxjb4SteHUsos9SvrdqZ9+ICwTQ== - dependencies: - escape-string-regexp "^2.0.0" - unique-string "^2.0.0" - sumchecker@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42" @@ -11445,11 +11429,6 @@ type-fest@^0.13.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - type-fest@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" From e11cbc19fed9f52ddcee1bd71d386d07bf820668 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Thu, 10 Sep 2020 09:31:23 +0300 Subject: [PATCH 10/13] Fixing Dialog Escape keypress behavior (#831) * Replacing dialog keypress target Signed-off-by: Alex Andreev * Adding explanatory comments Signed-off-by: Alex Andreev --- src/common/cluster-store.ts | 3 +-- src/renderer/components/dialog/dialog.tsx | 5 +++-- src/renderer/components/drawer/drawer.tsx | 1 + src/renderer/components/layout/sidebar.scss | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/common/cluster-store.ts b/src/common/cluster-store.ts index 45bcad4d6f..fcee67cb8f 100644 --- a/src/common/cluster-store.ts +++ b/src/common/cluster-store.ts @@ -1,4 +1,3 @@ -import { WorkspaceId, workspaceStore } from "./workspace-store"; import path from "path"; import { app, ipcRenderer, remote } from "electron"; import { unlink } from "fs-extra"; @@ -13,7 +12,7 @@ import { saveToAppFiles } from "./utils/saveToAppFiles"; import { KubeConfig } from "@kubernetes/client-node"; import _ from "lodash"; import move from "array-move"; -import { is } from "immer/dist/internal"; +import type { WorkspaceId } from "./workspace-store"; export interface ClusterIconUpload { clusterId: string; diff --git a/src/renderer/components/dialog/dialog.tsx b/src/renderer/components/dialog/dialog.tsx index 071c6aa811..5a4ce48f4e 100644 --- a/src/renderer/components/dialog/dialog.tsx +++ b/src/renderer/components/dialog/dialog.tsx @@ -92,7 +92,8 @@ export class Dialog extends React.PureComponent { this.props.onOpen(); if (!this.props.pinned) { if (this.elem) this.elem.addEventListener('click', this.onClickOutside); - window.addEventListener('keydown', this.onEscapeKey); + // Using document.body target to handle keydown event before Drawer does + document.body.addEventListener('keydown', this.onEscapeKey); } } @@ -100,7 +101,7 @@ export class Dialog extends React.PureComponent { this.props.onClose(); if (!this.props.pinned) { if (this.elem) this.elem.removeEventListener('click', this.onClickOutside); - window.removeEventListener('keydown', this.onEscapeKey); + document.body.removeEventListener('keydown', this.onEscapeKey); } } diff --git a/src/renderer/components/drawer/drawer.tsx b/src/renderer/components/drawer/drawer.tsx index c4c1a3894a..d76e99f5c0 100644 --- a/src/renderer/components/drawer/drawer.tsx +++ b/src/renderer/components/drawer/drawer.tsx @@ -40,6 +40,7 @@ export class Drawer extends React.Component { }); componentDidMount() { + // Using window target for events to make sure they will be catched after other places (e.g. Dialog) window.addEventListener("mousedown", this.onMouseDown) window.addEventListener("click", this.onClickOutside) window.addEventListener("keydown", this.onEscapeKey) diff --git a/src/renderer/components/layout/sidebar.scss b/src/renderer/components/layout/sidebar.scss index 46cf9c7d15..7b1406fb7b 100644 --- a/src/renderer/components/layout/sidebar.scss +++ b/src/renderer/components/layout/sidebar.scss @@ -40,7 +40,7 @@ div.logo-text { position: absolute; left: 42px; - top: 11.5px; + top: 11px; } .logo-icon { From fd3eb411798aeb5b8f294c09fe1a5c6af5462e56 Mon Sep 17 00:00:00 2001 From: Alex Andreev Date: Thu, 10 Sep 2020 11:35:17 +0300 Subject: [PATCH 11/13] Setting new workspace name restrictions (#832) * Preventing to create empty and existent workspaces Signed-off-by: Alex Andreev * Autofocusing name input Signed-off-by: Alex Andreev * Save workspace when hitting Enter Signed-off-by: Alex Andreev * Refactoring of save workspace process Signed-off-by: Alex Andreev --- src/common/workspace-store.ts | 13 ++++-- src/common/workspace-store_test.ts | 44 +++++++++++++++++++ .../components/+workspaces/workspaces.tsx | 34 ++++++++++---- 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/common/workspace-store.ts b/src/common/workspace-store.ts index 43afb0d5c6..752a53f41b 100644 --- a/src/common/workspace-store.ts +++ b/src/common/workspace-store.ts @@ -51,6 +51,10 @@ export class WorkspaceStore extends BaseStore { return this.workspaces.get(id); } + getByName(name: string): Workspace { + return this.workspacesList.find(workspace => workspace.name === name); + } + @action setActive(id = WorkspaceStore.defaultId, { redirectToLanding = true, resetActiveCluster = true } = {}) { if (id === this.currentWorkspaceId) return; @@ -68,13 +72,16 @@ export class WorkspaceStore extends BaseStore { @action saveWorkspace(workspace: Workspace) { - const id = workspace.id; + const { id, name } = workspace; const existingWorkspace = this.getById(id); + if (!name.trim() || this.getByName(name.trim())) { + return; + } if (existingWorkspace) { Object.assign(existingWorkspace, workspace); - } else { - this.workspaces.set(id, workspace); } + this.workspaces.set(id, workspace); + return workspace; } @action diff --git a/src/common/workspace-store_test.ts b/src/common/workspace-store_test.ts index 55e9672663..232f0b013a 100644 --- a/src/common/workspace-store_test.ts +++ b/src/common/workspace-store_test.ts @@ -92,6 +92,50 @@ describe("workspace store tests", () => { expect(ws.workspaces.size).toBe(2); }) + + it("cannot create workspace with existent name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "someid", + name: "default", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) + + it("cannot create workspace with empty name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "random", + name: "", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) + + it("cannot create workspace with ' ' name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "random", + name: " ", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) + + it("trim workspace name", () => { + const ws = WorkspaceStore.getInstance(); + + ws.saveWorkspace({ + id: "random", + name: "default ", + }); + + expect(ws.workspacesList.length).toBe(1); // default workspace only + }) }) describe("for a non-empty config", () => { diff --git a/src/renderer/components/+workspaces/workspaces.tsx b/src/renderer/components/+workspaces/workspaces.tsx index 96007a95fa..a2e7dbf74f 100644 --- a/src/renderer/components/+workspaces/workspaces.tsx +++ b/src/renderer/components/+workspaces/workspaces.tsx @@ -12,6 +12,7 @@ import { Icon } from "../icon"; import { Input } from "../input"; import { cssNames, prevDefault } from "../../utils"; import { Button } from "../button"; +import { isRequired, Validator } from "../input/input.validators"; @observer export class Workspaces extends React.Component { @@ -41,9 +42,9 @@ export class Workspaces extends React.Component { saveWorkspace = (id: WorkspaceId) => { const draft = toJS(this.editingWorkspaces.get(id)); - if (draft) { + const workspace = workspaceStore.saveWorkspace(draft); + if (workspace) { this.clearEditing(id); - workspaceStore.saveWorkspace(draft); } } @@ -90,6 +91,15 @@ export class Workspaces extends React.Component { }) } + onInputKeypress = (evt: React.KeyboardEvent, workspaceId: WorkspaceId) => { + if (evt.key == 'Enter') { + // Trigget input validation + evt.currentTarget.blur(); + evt.currentTarget.focus(); + this.saveWorkspace(workspaceId); + } + } + render() { return ( @@ -102,11 +112,15 @@ export class Workspaces extends React.Component { const isDefault = workspaceStore.isDefault(workspaceId); const isEditing = this.editingWorkspaces.has(workspaceId); const editingWorkspace = this.editingWorkspaces.get(workspaceId); - const className = cssNames("workspace flex gaps align-center", { + const className = cssNames("workspace flex gaps", { active: isActive, editing: isEditing, default: isDefault, }); + const existenceValidator: Validator = { + message: () => `Workspace '${name}' already exists`, + validate: value => !workspaceStore.getByName(value.trim()) + } return (
{!isEditing && ( @@ -139,23 +153,27 @@ export class Workspaces extends React.Component { placeholder={_i18n._(t`Name`)} value={editingWorkspace.name} onChange={v => editingWorkspace.name = v} + onKeyPress={(e) => this.onInputKeypress(e, workspaceId)} + validators={[isRequired, existenceValidator]} + autoFocus /> editingWorkspace.description = v} - /> - Cancel} - onClick={() => this.clearEditing(workspaceId)} + onKeyPress={(e) => this.onInputKeypress(e, workspaceId)} /> Save} onClick={() => this.saveWorkspace(workspaceId)} /> + Cancel} + onClick={() => this.clearEditing(workspaceId)} + /> )}
From e0059856216df0d875b7431ace8571a50eac2c82 Mon Sep 17 00:00:00 2001 From: Lauri Nevala Date: Thu, 10 Sep 2020 15:15:00 +0300 Subject: [PATCH 12/13] Fix cluster's apiUrl (#846) * Fix cluster's apiUrl Signed-off-by: Lauri Nevala --- src/common/cluster-store_test.ts | 6 ++++++ src/main/cluster.ts | 6 ++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/common/cluster-store_test.ts b/src/common/cluster-store_test.ts index 2810883690..d7d6df4d2a 100644 --- a/src/common/cluster-store_test.ts +++ b/src/common/cluster-store_test.ts @@ -31,6 +31,7 @@ describe("empty config", () => { it("adds new cluster to store", async () => { const cluster = new Cluster({ id: "foo", + contextName: "minikube", preferences: { terminalCWD: "/tmp", icon: "data:;base64,iVBORw0KGgoAAAANSUhEUgAAA1wAAAKoCAYAAABjkf5", @@ -54,6 +55,7 @@ describe("empty config", () => { it("check if store can contain multiple clusters", () => { const prodCluster = new Cluster({ id: "prod", + contextName: "prod", preferences: { clusterName: "prod" }, @@ -62,6 +64,7 @@ describe("empty config", () => { }); const devCluster = new Cluster({ id: "dev", + contextName: "dev", preferences: { clusterName: "dev" }, @@ -142,11 +145,13 @@ describe("config with existing clusters", () => { { id: 'cluster1', kubeConfig: 'foo', + contextName: 'foo', preferences: { terminalCWD: '/foo' } }, { id: 'cluster2', kubeConfig: 'foo2', + contextName: 'foo2', preferences: { terminalCWD: '/foo2' } } ] @@ -339,6 +344,7 @@ describe("pre 3.6.0-beta.1 config with an existing cluster", () => { { id: 'cluster1', kubeConfig: 'kubeconfig content', + contextName: 'cluster', preferences: { icon: "store://icon_path", } diff --git a/src/main/cluster.ts b/src/main/cluster.ts index 8f17216c18..d160496cdf 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -77,13 +77,15 @@ export class Cluster implements ClusterModel { constructor(model: ClusterModel) { this.updateModel(model); + const kubeconfig = this.getKubeconfig() + if (kubeconfig.getContextObject(this.contextName)) { + this.apiUrl = kubeconfig.getCluster(kubeconfig.getContextObject(this.contextName).cluster).server + } } @action updateModel(model: ClusterModel) { Object.assign(this, model); - this.apiUrl = this.getKubeconfig().getCurrentCluster()?.server; - this.contextName = this.contextName || this.preferences.clusterName; } @action From 7722f443ebb6c7d5382a368976e7bbe74f0baf56 Mon Sep 17 00:00:00 2001 From: Roman Date: Fri, 11 Sep 2020 12:02:25 +0300 Subject: [PATCH 13/13] [FIX]: Cluster dashboard not rendered (#848) * Cluster dashboard not rendered, fix #811 Signed-off-by: Roman * refactoring Signed-off-by: Roman * actual fix Signed-off-by: Roman * reverted back reconnect check in cluster.activate() Signed-off-by: Roman * fix: cluster.activate() should not start reconnect on init (if not accessible) Signed-off-by: Roman --- src/common/cluster-ipc.ts | 19 +++++-------- src/common/cluster-store.ts | 18 ++++++++----- src/main/cluster-manager.ts | 20 +++++--------- src/main/cluster.ts | 7 ++--- src/main/window-manager.ts | 4 +-- src/renderer/bootstrap.tsx | 4 +-- src/renderer/components/app.tsx | 4 +-- .../cluster-manager/cluster-manager.tsx | 9 ++++--- .../cluster-manager/cluster-status.tsx | 6 ++--- .../cluster-manager/cluster-view.route.ts | 9 +++---- .../components/cluster-manager/lens-views.ts | 27 ++++++++++++------- 11 files changed, 66 insertions(+), 61 deletions(-) diff --git a/src/common/cluster-ipc.ts b/src/common/cluster-ipc.ts index e8f681cd7f..b8f9f5f84b 100644 --- a/src/common/cluster-ipc.ts +++ b/src/common/cluster-ipc.ts @@ -3,21 +3,14 @@ import { ClusterId, clusterStore } from "./cluster-store"; import { tracker } from "./tracker"; export const clusterIpc = { - initView: createIpcChannel({ - channel: "cluster:init", - handle: async (clusterId: ClusterId, frameId: number) => { - const cluster = clusterStore.getById(clusterId); - if (cluster) { - cluster.frameId = frameId; // save cluster's webFrame.routingId to be able to send push-updates - return cluster.pushState(); - } - }, - }), - activate: createIpcChannel({ channel: "cluster:activate", - handle: (clusterId: ClusterId) => { - return clusterStore.getById(clusterId)?.activate(); + handle: (clusterId: ClusterId, frameId?: number) => { + const cluster = clusterStore.getById(clusterId); + if (cluster) { + if (frameId) cluster.frameId = frameId; // save cluster's webFrame.routingId to be able to send push-updates + return cluster.activate(true); + } }, }), diff --git a/src/common/cluster-store.ts b/src/common/cluster-store.ts index fcee67cb8f..4fb4d15aea 100644 --- a/src/common/cluster-store.ts +++ b/src/common/cluster-store.ts @@ -63,7 +63,7 @@ export class ClusterStore extends BaseStore { static embedCustomKubeConfig(clusterId: ClusterId, kubeConfig: KubeConfig | string): string { const filePath = ClusterStore.getCustomKubeConfigPath(clusterId); const fileContents = typeof kubeConfig == "string" ? kubeConfig : dumpConfigYaml(kubeConfig); - saveToAppFiles(filePath, fileContents, { mode: 0o600}); + saveToAppFiles(filePath, fileContents, { mode: 0o600 }); return filePath; } @@ -209,11 +209,17 @@ export class ClusterStore extends BaseStore { export const clusterStore = ClusterStore.getInstance(); -export function getHostedClusterId(): ClusterId { - const clusterHost = location.hostname.match(/^(.*?)\.localhost/); - if (clusterHost) { - return clusterHost[1] - } +export function getClusterIdFromHost(hostname: string): ClusterId { + const subDomains = hostname.split(":")[0].split("."); + return subDomains.slice(-2)[0]; // e.g host == "%clusterId.localhost:45345" +} + +export function getClusterFrameUrl(clusterId: ClusterId) { + return `//${clusterId}.${location.host}`; +} + +export function getHostedClusterId() { + return getClusterIdFromHost(location.hostname); } export function getHostedCluster(): Cluster { diff --git a/src/main/cluster-manager.ts b/src/main/cluster-manager.ts index af1e0d5657..ff5eaae32d 100644 --- a/src/main/cluster-manager.ts +++ b/src/main/cluster-manager.ts @@ -1,7 +1,7 @@ import "../common/cluster-ipc"; import type http from "http" import { autorun } from "mobx"; -import { ClusterId, clusterStore } from "../common/cluster-store" +import { clusterStore, getClusterIdFromHost } from "../common/cluster-store" import { Cluster } from "./cluster" import logger from "./logger"; import { apiKubePrefix } from "../common/vars"; @@ -38,26 +38,20 @@ export class ClusterManager { }) } - protected getCluster(id: ClusterId) { - return clusterStore.getById(id); - } - getClusterForRequest(req: http.IncomingMessage): Cluster { let cluster: Cluster = null // lens-server is connecting to 127.0.0.1:/ if (req.headers.host.startsWith("127.0.0.1")) { const clusterId = req.url.split("/")[1] - if (clusterId) { - cluster = this.getCluster(clusterId) - if (cluster) { - // we need to swap path prefix so that request is proxied to kube api - req.url = req.url.replace(`/${clusterId}`, apiKubePrefix) - } + const cluster = clusterStore.getById(clusterId) + if (cluster) { + // we need to swap path prefix so that request is proxied to kube api + req.url = req.url.replace(`/${clusterId}`, apiKubePrefix) } } else { - const id = req.headers.host.split(".")[0] - cluster = this.getCluster(id) + const clusterId = getClusterIdFromHost(req.headers.host); + cluster = clusterStore.getById(clusterId) } return cluster; diff --git a/src/main/cluster.ts b/src/main/cluster.ts index d160496cdf..80bd208a40 100644 --- a/src/main/cluster.ts +++ b/src/main/cluster.ts @@ -2,7 +2,7 @@ import type { ClusterId, ClusterModel, ClusterPreferences } from "../common/clus import type { IMetricsReqParams } from "../renderer/api/endpoints/metrics.api"; import type { WorkspaceId } from "../common/workspace-store"; import type { FeatureStatusMap } from "./feature" -import { action, computed, intercept, observable, reaction, toJS, when } from "mobx"; +import { action, computed, observable, reaction, toJS, when } from "mobx"; import { apiKubePrefix } from "../common/vars"; import { broadcastIpc } from "../common/ipc"; import { ContextHandler } from "./context-handler" @@ -126,13 +126,13 @@ export class Cluster implements ClusterModel { this.eventDisposers.length = 0; } - async activate() { + async activate(init = false) { logger.info(`[CLUSTER]: activate`, this.getMeta()); await this.whenInitialized; if (!this.eventDisposers.length) { this.bindEvents(); } - if (this.disconnected || !this.accessible) { + if (this.disconnected || (!init && !this.accessible)) { await this.reconnect(); } await this.refresh(); @@ -411,6 +411,7 @@ export class Cluster implements ClusterModel { id: this.id, name: this.contextName, initialized: this.initialized, + ready: this.ready, online: this.online, accessible: this.accessible, disconnected: this.disconnected, diff --git a/src/main/window-manager.ts b/src/main/window-manager.ts index 6f7ab6478a..be5a95e47a 100644 --- a/src/main/window-manager.ts +++ b/src/main/window-manager.ts @@ -1,9 +1,9 @@ +import type { ClusterId } from "../common/cluster-store"; import { clusterStore } from "../common/cluster-store"; import { BrowserWindow, dialog, ipcMain, shell, webContents } from "electron" import windowStateKeeper from "electron-window-state" import { observable } from "mobx"; import { initMenu } from "./menu"; -import type { ClusterId } from "../common/cluster-store"; export class WindowManager { protected mainView: BrowserWindow; @@ -42,7 +42,7 @@ export class WindowManager { }); // track visible cluster from ui - ipcMain.on("cluster-view:change", (event, clusterId: ClusterId) => { + ipcMain.on("cluster-view:current-id", (event, clusterId: ClusterId) => { this.activeClusterId = clusterId; }); diff --git a/src/renderer/bootstrap.tsx b/src/renderer/bootstrap.tsx index 0fcb216cd9..80c27cb418 100644 --- a/src/renderer/bootstrap.tsx +++ b/src/renderer/bootstrap.tsx @@ -4,7 +4,7 @@ import { render } from "react-dom"; import { isMac } from "../common/vars"; import { userStore } from "../common/user-store"; import { workspaceStore } from "../common/workspace-store"; -import { clusterStore, getHostedClusterId } from "../common/cluster-store"; +import { clusterStore } from "../common/cluster-store"; import { i18nStore } from "./i18n"; import { themeStore } from "./theme.store"; import { App } from "./components/app"; @@ -35,4 +35,4 @@ export async function bootstrap(App: AppComponent) { } // run -bootstrap(getHostedClusterId() ? App : LensApp); +bootstrap(process.isMainFrame ? LensApp : App); diff --git a/src/renderer/components/app.tsx b/src/renderer/components/app.tsx index 23e71e2be9..a60d794168 100755 --- a/src/renderer/components/app.tsx +++ b/src/renderer/components/app.tsx @@ -43,8 +43,8 @@ export class App extends React.Component { const clusterId = getHostedClusterId(); logger.info(`[APP]: Init dashboard, clusterId=${clusterId}, frameId=${frameId}`) await Terminal.preloadFonts() - await clusterIpc.initView.invokeFromRenderer(clusterId, frameId); - await getHostedCluster().whenInitialized; + await clusterIpc.activate.invokeFromRenderer(clusterId, frameId); + await getHostedCluster().whenReady; // cluster.refresh() is done at this point } get startURL() { diff --git a/src/renderer/components/cluster-manager/cluster-manager.tsx b/src/renderer/components/cluster-manager/cluster-manager.tsx index 6011549e8c..db0026bf75 100644 --- a/src/renderer/components/cluster-manager/cluster-manager.tsx +++ b/src/renderer/components/cluster-manager/cluster-manager.tsx @@ -1,7 +1,7 @@ import "./cluster-manager.scss" import React from "react"; import { Redirect, Route, Switch } from "react-router"; -import { reaction } from "mobx"; +import { comparer, reaction } from "mobx"; import { disposeOnUnmount, observer } from "mobx-react"; import { ClustersMenu } from "./clusters-menu"; import { BottomBar } from "./bottom-bar"; @@ -23,11 +23,14 @@ export class ClusterManager extends React.Component { fireImmediately: true }), reaction(() => [ + getMatchedClusterId(), // refresh when active cluster-view changed hasLoadedView(getMatchedClusterId()), // refresh when cluster's webview loaded getMatchedCluster()?.available, // refresh on disconnect active-cluster + getMatchedCluster()?.ready, // refresh when cluster ready-state change ], refreshViews, { - fireImmediately: true - }) + fireImmediately: true, + equals: comparer.shallow, + }), ]) } diff --git a/src/renderer/components/cluster-manager/cluster-status.tsx b/src/renderer/components/cluster-manager/cluster-status.tsx index 1f5d52f814..b0fae210dd 100644 --- a/src/renderer/components/cluster-manager/cluster-status.tsx +++ b/src/renderer/components/cluster-manager/cluster-status.tsx @@ -38,7 +38,7 @@ export class ClusterStatus extends React.Component { error: res.error, }); }) - if (!this.cluster.initialized || this.cluster.disconnected) { + if (this.cluster.disconnected) { await this.refreshCluster(); } } @@ -63,7 +63,7 @@ export class ClusterStatus extends React.Component { if (!hasErrors || this.isReconnecting) { return ( <> - +
             

{this.isReconnecting ? "Reconnecting..." : "Connecting..."}

{authOutput.map(({ data, error }, index) => { @@ -75,7 +75,7 @@ export class ClusterStatus extends React.Component { } return ( <> - +

{cluster.preferences.clusterName}

diff --git a/src/renderer/components/cluster-manager/cluster-view.route.ts b/src/renderer/components/cluster-manager/cluster-view.route.ts index d2e39cbb0c..e1fb0d1f54 100644 --- a/src/renderer/components/cluster-manager/cluster-view.route.ts +++ b/src/renderer/components/cluster-manager/cluster-view.route.ts @@ -2,7 +2,7 @@ import { reaction } from "mobx"; import { ipcRenderer } from "electron"; import { matchPath, RouteProps } from "react-router"; import { buildURL, navigation } from "../../navigation"; -import { clusterStore, getHostedClusterId } from "../../../common/cluster-store"; +import { clusterStore } from "../../../common/cluster-store"; import { clusterSettingsRoute } from "../+cluster-settings/cluster-settings.route"; export interface IClusterViewRouteParams { @@ -34,11 +34,10 @@ export function getMatchedCluster() { } if (ipcRenderer) { - // Refresh global menu depending on active route's type (common/cluster view) - const isMainView = !getHostedClusterId(); - if (isMainView) { + if (process.isMainFrame) { + // Keep track of active cluster-id for handling IPC/menus/etc. reaction(() => getMatchedClusterId(), clusterId => { - ipcRenderer.send("cluster-view:change", clusterId); + ipcRenderer.send("cluster-view:current-id", clusterId); }, { fireImmediately: true }) diff --git a/src/renderer/components/cluster-manager/lens-views.ts b/src/renderer/components/cluster-manager/lens-views.ts index 9ae08c5e4e..370ed665c3 100644 --- a/src/renderer/components/cluster-manager/lens-views.ts +++ b/src/renderer/components/cluster-manager/lens-views.ts @@ -1,5 +1,5 @@ import { observable, when } from "mobx"; -import { ClusterId, clusterStore } from "../../../common/cluster-store"; +import { ClusterId, clusterStore, getClusterFrameUrl } from "../../../common/cluster-store"; import { getMatchedCluster } from "./cluster-view.route" import logger from "../../../main/logger"; @@ -21,29 +21,38 @@ export async function initView(clusterId: ClusterId) { } logger.info(`[LENS-VIEW]: init dashboard, clusterId=${clusterId}`) const cluster = clusterStore.getById(clusterId); - await cluster.whenReady; const parentElem = document.getElementById("lens-views"); const iframe = document.createElement("iframe"); iframe.name = cluster.contextName; - iframe.setAttribute("src", `//${clusterId}.${location.host}`) - iframe.addEventListener("load", async () => { + iframe.setAttribute("src", getClusterFrameUrl(clusterId)) + iframe.addEventListener("load", () => { logger.info(`[LENS-VIEW]: loaded from ${iframe.src}`) lensViews.get(clusterId).isLoaded = true; - }) + }, { once: true }); lensViews.set(clusterId, { clusterId, view: iframe }); parentElem.appendChild(iframe); - // auto-clean when cluster removed + await autoCleanOnRemove(clusterId, iframe); +} + +export async function autoCleanOnRemove(clusterId: ClusterId, iframe: HTMLIFrameElement) { await when(() => !clusterStore.getById(clusterId)); logger.info(`[LENS-VIEW]: remove dashboard, clusterId=${clusterId}`) - parentElem.removeChild(iframe) lensViews.delete(clusterId) + // Keep frame in DOM to avoid possible bugs when same cluster re-created after being removed. + // In that case for some reasons `webFrame.routingId` returns some previous frameId (usage in app.tsx) + // Issue: https://github.com/lensapp/lens/issues/811 + iframe.dataset.meta = `${iframe.name} was removed at ${new Date().toLocaleString()}`; + iframe.removeAttribute("src") + iframe.removeAttribute("name") } export function refreshViews() { const cluster = getMatchedCluster(); lensViews.forEach(({ clusterId, view, isLoaded }) => { - const isVisible = cluster && cluster.available && cluster.id === clusterId; - view.style.display = isLoaded && isVisible ? "flex" : "none" + const isCurrent = clusterId === cluster?.id; + const isReady = cluster?.available && cluster?.ready; + const isVisible = isCurrent && isLoaded && isReady; + view.style.display = isVisible ? "flex" : "none" }) }