From a08bb4228f612f39b05c1e9bcc4358d7ec8d2159 Mon Sep 17 00:00:00 2001 From: ZonaHe Date: Thu, 16 Nov 2023 18:02:58 +0800 Subject: [PATCH 1/2] feat: UI overhaul (#347) * refactor(global): generate menu tree; init sidebar menu (#344) use sidebar as menu #343 * feat: new query modal (#346) * feat: init new query modal * feat: use tabs for dataview * feat(query): support drag and fullscreen * feat: table manager (#349) * feat(tables): init table manager and support details load-more * feat: fetch DB details info * style(tables): basic detail style * feat(tables): support details refreshing * style: table style * style(tables): columns basic style * style(tables): details style * fix(tables): search table name * feat(tables): format timestamp for details * fix(tables): add quote for table name in query * feat(tables): find ttl for details * style(tables): details refresh and code * refactor: clean code * refactor(tables): types for table detail * feat(logs): init new logs (#350) * feat(logs): init new logs * fix(editor): insert sql code and focus editor * style(logs): edit style * style(editor): new style * style: new ui * feat(promql): replace code from logs * fix: clear code * style: new ui * style: edit ui * style: table and select bg style * style(tables): fix new ui * style(query): modal position * style: buttons hover color * style: select and button * style: script style * feat(global): new env and role permission * refactor: update icons --- .env.development | 1 + .env.production | 3 +- .env.staging | 1 + .env.cloud => .env.test | 1 + .eslintrc-auto-import.json | 4 +- index.html | 2 +- package.json | 7 +- src/App.vue | 13 +- src/assets/images/logo-text.png | Bin 0 -> 34779 bytes src/assets/images/logo-text.webp | Bin 8338 -> 0 bytes src/assets/style/button.less | 2 +- src/assets/style/dataView.less | 127 ++-- src/assets/style/editor.less | 2 +- src/assets/style/form.less | 25 - src/assets/style/global.less | 74 +-- src/assets/style/layout.less | 1 - src/assets/style/select.less | 28 +- src/assets/style/tableList.less | 10 - src/components/global-setting/index.vue | 39 +- .../global-setting/settings-form.vue | 5 +- src/components/guide-modal/index.vue | 8 +- .../components/code-editor.vue | 26 +- src/components/navbar/index.vue | 180 ++++-- src/components/short-cut/index.vue | 30 +- src/components/text-copyable.vue | 21 +- src/components/time-select/index.vue | 4 +- src/config/settings.json | 4 +- src/hooks/permission.ts | 5 + src/hooks/query-code.ts | 40 +- src/hooks/sider-tabs.ts | 31 +- src/layout/default-layout.vue | 18 +- src/locale/en-US.ts | 2 + src/router/guard/userLoginInfo.ts | 6 +- src/router/routes/modules/dashboard.ts | 13 +- src/store/modules/app/types.ts | 2 +- src/store/modules/code-run/index.ts | 10 +- src/store/modules/database/index.ts | 19 +- src/store/modules/database/types.ts | 14 +- src/store/modules/user/index.ts | 2 +- src/views/dashboard/locale/en-US.ts | 8 +- .../data-view/components/data-grid.vue | 1 - .../dashboard/modules/data-view/index.vue | 31 +- src/views/dashboard/modules/log.vue | 144 +++-- src/views/dashboard/modules/logs-layout.vue | 96 +++ src/views/dashboard/modules/logs.vue | 29 +- .../dashboard/modules/query-modal/index.vue | 223 +++++++ src/views/dashboard/modules/scripts-list.vue | 2 +- src/views/dashboard/modules/table-list.vue | 12 +- src/views/dashboard/modules/table-manager.vue | 577 ++++++++++++++++++ src/views/dashboard/playground/index.vue | 4 +- src/views/dashboard/query/editor.vue | 91 ++- src/views/dashboard/query/index.vue | 21 +- 52 files changed, 1613 insertions(+), 406 deletions(-) rename .env.cloud => .env.test (87%) create mode 100644 src/assets/images/logo-text.png delete mode 100644 src/assets/images/logo-text.webp create mode 100644 src/views/dashboard/modules/logs-layout.vue create mode 100644 src/views/dashboard/modules/query-modal/index.vue create mode 100644 src/views/dashboard/modules/table-manager.vue diff --git a/.env.development b/.env.development index e90d1ecc..7c9830b7 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,3 @@ VITE_CLOUD_URL='https://dev.greptime-cloud-frontend.pages.dev' VITE_API_BASE_URL='https://api-preview.greptime.cloud' +VITE_ROLE='admin' diff --git a/.env.production b/.env.production index b377e6b7..4b694810 100644 --- a/.env.production +++ b/.env.production @@ -1,2 +1,3 @@ VITE_CLOUD_URL='https://dev.greptime-cloud-frontend.pages.dev' -VITE_API_BASE_URL='https://api.greptime.cloud' +VITE_API_BASE_URL='https://api-preview.greptime.cloud' +VITE_ROLE='admin' \ No newline at end of file diff --git a/.env.staging b/.env.staging index 228121c5..4a4bb1c0 100644 --- a/.env.staging +++ b/.env.staging @@ -1,2 +1,3 @@ VITE_CLOUD_URL='https://console.greptime.cloud' VITE_API_BASE_URL='https://api.greptime.cloud' +VITE_ROLE='cloud' \ No newline at end of file diff --git a/.env.cloud b/.env.test similarity index 87% rename from .env.cloud rename to .env.test index e90d1ecc..776515e0 100644 --- a/.env.cloud +++ b/.env.test @@ -1,2 +1,3 @@ VITE_CLOUD_URL='https://dev.greptime-cloud-frontend.pages.dev' VITE_API_BASE_URL='https://api-preview.greptime.cloud' +VITE_ROLE='cloud' \ No newline at end of file diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index ed15fefb..d6322732 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -102,6 +102,8 @@ "Ref": true, "VNode": true, "toValue": true, - "useWorkbenchStore": true + "useWorkbenchStore": true, + "WritableComputedRef": true, + "stringType": true } } diff --git a/index.html b/index.html index eca6ae20..bb1a440e 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ - +
diff --git a/package.json b/package.json index 66d930ca..653438c2 100644 --- a/package.json +++ b/package.json @@ -7,15 +7,14 @@ "license": "Apache-2.0", "scripts": { "dev": "vite --config ./config/vite.config.dev.ts", - "dev:cloud": "vite --mode cloud --base /dashboard/ --config ./config/vite.config.dev.ts ", - "dev:staging": "vite --mode staging --base /dashboard/ --config ./config/vite.config.dev.ts ", + "cloud": "VITE_ROLE=cloud vite --config ./config/vite.config.dev.ts", "build": "vite build --config ./config/vite.config.prod.ts && vue-tsc --noEmit", "build:docker": "vite build --config ./config/vite.config.prod.ts --base /dashboard/ && vue-tsc --noEmit", - "build:cloud": "vite build --config ./config/vite.config.prod.ts --mode cloud --base /dashboard/ && vue-tsc --noEmit", + "build:test": "vite build --config ./config/vite.config.prod.ts --mode test --base /dashboard/ && vue-tsc --noEmit", "build:staging": "vite build --config ./config/vite.config.prod.ts --mode staging --base /dashboard/ && vue-tsc --noEmit", "report": "cross-env REPORT=true npm run build", "preview": "npm run build && vite preview --host --config ./config/vite.config.base.ts", - "preview:cloud": "npm run build:cloud && vite preview --host --config ./config/vite.config.base.ts", + "preview:cloud": "VITE_ROLE=cloud npm run build && vite preview --host --config ./config/vite.config.base.ts", "type:check": "vue-tsc --noEmit --skipLibCheck", "lint-staged": "npx lint-staged", "prepare": "husky install", diff --git a/src/App.vue b/src/App.vue index 61c8e23d..c820a23d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -24,18 +24,21 @@ }) const { setRole } = useUserStore() - const { isCloud, host, username, password, database, guideModalVisible, codeType } = storeToRefs(useAppStore()) + const { host, username, password, database, guideModalVisible, codeType } = storeToRefs(useAppStore()) const { fetchDatabases, updateSettings } = useAppStore() const { getTables, getScriptsTable } = useDataBaseStore() host.value = window.location.origin - // TODO: is there a better way to do this? + const role = import.meta.env.VITE_ROLE || 'admin' + setRole(role) + + if (role === 'playground') { + updateSettings({ navbar: false }) + } + if (import.meta.env.MODE === 'development' || import.meta.env.MODE === 'production') { // Assuming local greptimeDB is up and running fetchDatabases() - } else { - isCloud.value = true - setRole('cloud') } diff --git a/src/assets/images/logo-text.png b/src/assets/images/logo-text.png new file mode 100644 index 0000000000000000000000000000000000000000..5660934411e1030e9d18272ec5ed53147b13e97b GIT binary patch literal 34779 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 Y-{8#LL1oC)O(sY*uFhyDs$)>vKb7r2&;S4c literal 0 HcmV?d00001 diff --git a/src/assets/images/logo-text.webp b/src/assets/images/logo-text.webp deleted file mode 100644 index 33f570439edf84f9eab55e43985f8151a7fa294b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8338 zcmV;DAZ_1LNk&GBAOHYYMM6+kP&il$0000O0000-0RV3R09H^qOc@{m053gg@-te*_|80=VzRKxI!10VE=BU{3f@7ZB*pN_Zg+*itcHtKOk623C2Bf%8-p z{MnBE|LdzM>2RlVcXzMcecavM-FWw}0IjqOB^9lEEb!L_Bk2kPmj#;r`p z0$ldM39^Hk6>y#f1c%zz5qdgUfkSs&*1*5wuz+V7NLqUD>_=xgY`~XbZ8}Qr*Z~!( zakm{fx5SnZ+}b-m9c^k_W(l`MvWN%@5C9NtquciW8L@2}wQbwBZQHhOD@kYDwrxR_ zY`dnkHsegVDla5);sfl~|L<6m(&oPIv#qA(>sM9x{wx0==l{R=R&~AiX6vlAVf+@= zdEl*wmZsJs1FbbAfU7Jl4iR9kUJq*zF=!}{1V-3s<>?%7Nnn(nk zXc*kJkad`J(Av|M23wAbgLO9oWHOTh36zVw78&4H0$B9gm|9B)K{=eSEg(T9I^Xn<2@nbKA8W+bi2E+qP}n zw$Zk28_CX$WJE>8_mu5TLay1~*|u%lwr$(CZQHhO+fEWBxosp>10gIp?%W(L z^xwhu+mvOCgi_w?ZLfB^4>?S!Dr4Cyp|q5c-e=jSNqSf6iST?9ijzn+ks!qK2O|hb zJAu#=9xFUFGDtBI6Jq&OC?k<(0tpNES^g5rZi*444d*P_XZf4T^3S~W0jwr7NFOF= z(S7BbEdMf+PhmF23sQ!IMMCI4%YUr6$xK*5l%)ozq0}NFWS`}Kfw;*?n1PX$TiR*_ zJIP;bdpZ}YS$YWBXW6dFvV&??#7&Zrz)lKJ(WcV@OM=-4_Am@(EPAYECnNKzW?&_8 zNm}hTq0@#Ap+;n8R*sB5qqS5umGgqhvvPu%CW2jJybK9nr-<>281@KaQX^jW;~*bU zAML+It~3&MV4Iv_aAc+3rp4L`%W0?`t!#u%+}Z|-A@~w;;(wIrBk{G9wn41Ftz}~FnYt<JuHhO8NPG8{|vP&p`B6PJN={C@wHBZ5iX3>3je#r>qkAE$8#2mxeZLJ=Id)`6Xl&Tl zt+w}lpZJ4}pA3-(YpcJdv00h^^OXocXwuf&Nh41?iR3mhT!jR0#P|?;v8lmEv<+&N zCP`kOg(MQuUa>)3a_6J1Hr z^LgYytx4>HVa^c5HGSJKU0KqP<$Da&XoWVJp+$1<5{`v!%Lnjbj#eWM3GV%*O+&I( z-`RSkQfBBn#L#5}ZTdf}lBA!sYZ2ou04VDPIgHl5`wBV`*pZd$G3@>11SH!a73|YP z#6ydsu`pw4G}7}E8Oacl<7a>&hMn=ZY)_K|0q%(&tJpu)RQVbb(SrGfytmxNL^NRVQ& zVE~!!Az-vJ1M-|5B5lL^fy!0Nop;_j+B%15&^`cI-w2!3vn(&Q)I9*;m!|1repSn< z;D(Y=MONK10Dc$^Ah+?!OIT=!ne3+Nv;MR(j+!#W}ckn% z7e|JFQ7TY-<|aZC>YCy1u{F{Q218o*=xUjc8&b+ z7XT>hddqJW5e@AZZk<=sD*DpM#}CHj?Tx8iD2&hKjM{ML?HW|uA-h9+0IZZ~*=yOS zDa{AT9gVxldjt9gMkv8sSGfvuNVz_rgP2`B&v`;-k37q2zbAmn$7dz}lSF;{bCF6K zu}cvlVtiK8jH>Mog@~!R(-r_USWlMcrS@UIOy3PZ?E{!g9i_B&urPpiQyEb4kGgIy zT0faw<%>iV8$qG9;Z;_~+(hDOF4l#j&q~+w$T3|jrWSny8U}~;b{^~!h)o`II;b7u z-g7c0_+PG{0B>`G@hwlnHAO6CI{uNEbs0|KG53EpyU5%Z@3zE6FqJ)BgfQ@&rN%aj1-w)!5Xi zaldt>^MQ3DsMkCfkvxKk7*4J&b`kjmeNP9_d0vwCQWzpJ_l=|IB01`79HUqYpXI7D zM>7WVR0TKN@jsaPKANdURVtF76PLoU&*yZ;@|J)RXep{1!G*7tD*lvhw48Hymz|?_xRt3rm1F%lsXt;Wt*6}ZqTgZ~?k)-Fh3ewgRk(93E3IxF`Xqm^vX)O)!O zyYtQ+hZa2@BWfEq1Aqpfu6-H?E{Yb7rM%faH$8a>K0C00Ucs z`SVVUiaK=iEc*n2xsNkSS+QUOZKr*IXE&YeY2y_DK%jI#rhk7Kf*5ZA_)&{yUK)K@ zA~9qC9y`~=FaC~XO)LTtI(l)6Hu(h-wr`v^KWW>0CRfWqIC8 z{hJ>DzV; z50PQ8Z3NVbNsFDzb{VLbT_gS@HRF!CE^P~R9QR}DnrfzAt>?3+qLn?QC_! zL!phyTGjk#Vx@j)Rqc17&`>B8TMe^Wj{VFJm8vLwnB7&`R8WbWH>zr%+4777C{X0b*Dv=@2iPe2 z019=*H87l@SZwZ~dNGBM6r|lT$JBm}gA_$ESh_%(0}vP|uBfW9_jDcr>xUmsV)L>jh(!Qi z+$w_?dBH7gp{|fE2uVc+rP(A8sN%UAp8cxQrAM++_J@@~c}IpOd3E)O#b{)WDqgv( z9pHi2bc6pI zfH|vjUNEDzo0w;r7q{pDAn>i7ciwrM{dtHP#!I?vQA5s&=>-Di=R&)L_WC#Y~`dcP3DV zJwq-iCRQxeI0IR=K)eQn9!?Dlfb;=H8HHzow(3(d`go6|U@+JvK}qX$Geibtupp6+ z$bo?Ex^jpzhe)+ruhs#SjGBbI{H0nD**J_+KS4}0&tb^ZF2+mRO&D#QeCAxzca_#- z`(dl`g@^8r;QhGO=>E*XkE^Om88@3zYA~8n*?=pfTv*8XL9-G=p7qi-l+gj$ud{0u z*QBNhQT;;fRsq8cY9uN-WiKa_$w`#F8kD;wsF`CyAstZMZU^z<6$?F{WKR_PUCFM> z7@B$z**KCrF!k04TIOs_V^J*29EtIk6{^fd#fR?p;iV5#?|)^A4aN_ejig^~eLvW8cMMBurPxjZ&8irp|59RQExGF!328m8fUNZmSWOdcnhPaW zODuQ-SkJlLUtoD^qlyUvs)RPJvz}F`=3TbCGGrZMNH7#UsuaF*wUx*!h3$nSV`dBX zLvS}_+N`+($UPbe48d;;6ufxm(kO|9d)-DEvkFw*%0+g=4#SXh`KOrfzte%tBN^$n z%B%LBtUxo;Z5SwAqUbox?eV~0HpmJ_QGb*nA>iKy&!?yWns!;xRHMrC?<=YeStbt7 zu$QsD1G=V#I9}0vY>Nyn>7Car|CU*sz^V;)sA-Xu5@Z=P)3n{d`1Z-|uu4&`wF1qO64TU-#WUv0;>9kvrdvq}c3KN<68onr3x(YStP z8m75_x#7?wsi zP5e_mHKF5f(gYN~@0w1cF+bcCifSoT(|R7*g144pVz{kmC z2nBh+y{SN|b}S_|+Y6|y&jiSs#o%Dj2+jLAzPBa=Q&W>xpk`tJVn()`l-x5VpI{zm ziA2Ip)p`x9J>>rhJY=wNg-j&(Fc}ev71*S=0rp!AK^bmW!mu%0QzvUp$?F&l?K)>B=#p?J z)@=%8DtJnyIquwXwAeRi547wH5E2>Fz;e|$Y^w~YNhD8;ywIYjGsH`s4U^*0FkRs^j&UsnkT1o4xV--1TSYt?kUZ`s7M_4r;f;j(OvO1hE)@{@5{rY)pGTK^psR zx1gBX(Hw~U(08{FY0V#p;8TuiSZB*(g(`eiJ#6-H57U`nm4@vCM&~{~G2QO>026xC z(w#66u%4d*wnRdoK&I%Ei`#YRe;Ak`#2s*FEds02BzL9++aE=eNs@J2wgUbI)r!Hy zUj1e~Em&-~29lnrH{=XkcKMlplrbJ{`g(?gtG?S<=&k*p0A>PZ1_1a`|HWo_SssSK zx)^0hu)Sd8^Yw^$3OnM~xL{MpGec-h3pOZgJg;m;g+dyX1_A*F4^j8z;vd*HH90L z;ftjbBa!62aQqm?Lo>$}C}VCNMhQ*RL~YnA=dddJ(y(gLWOAo{q+-oAVGQ)9Mb}5RY%9Zg2>a|KfuaW@TyYu zRduUJdc(q^56X6OO9t9D?k^LKk0iI=tBe~RvEExBCkwjQdq>9K*iNjhn`N!{jy2yh z6-Ct}6o7nv6XR{)({XfO9_G{lcKwF6fJ=;K$;y!0jpdT`csz~r5f~R;lY|>uI{Ifb zW^TV1+8?hRF-@dq99$XDMs$OkYRAdG&zK~c#Bq3dgp6$tq}PJ8{V#x(Nh5)Oa@}L= zsZ)LB{N$>v$R1ohm2Al#B)R<&ZJO(PdKQq7&dOz@^&s^qkr4Vt^%Uob%CNL1H`w0Y`hB$@X@o*)9vneogJ z(%}nvk=2Mj$(2Y7-zg~_AU&rG0P}00h4#Z79OV6;g~$tAbf*~&*8AzaJj~B!Kg`g> zQQ%5zXAw1~zxVSM^8AssG`uH5oG^YrYjB=Ij^kDi3Iq&r(rz(cT^F-o;0flbfR9F_ zNQl1jozN74wC0QhuLuS`r#`NdQvTuo0cDeO!^a6B7cyROjQv^irq=!}^P445M#R56 zf*-dU$$67E4|m?tGA#$0704=kDx-N`chI5hN%uX>y?`lPPJf0--W>M$= z9qZvZQ7v*g8mD=YUNE6h{#5|{MyeVES=EqKWbJ(N3Vsapr--pHtqCXbzPCm8uiEcB zSU5-4E@}gS7Y1RgUY6&jvTh6*rA%XMBQWC(Ndh;?yU@fU>?gMF$hoH=^_{^Hh4_F} zvfR0Vhc1sr+C_WB*J;Zl-G$@B8TA9BI4>7pE$4#k$U$RPCD1$C=|sR;qnZ%{O&aSc zus$w*6*D-oW#s{Qik|O?yj&B#?rrLR>S%5gNZsGqPrcsHdabf7FTGuZ)CSHZl2y?>b4wcF+3)dweOn8Pb3WO*3lqF9Y_A%?j2p zArJFt@S{l5vsv@Zv11Sl@3yYqgfJZD9h2s?e@v}6rg?@nOj4Qy0VN7BaV#D~ng~{Lw%pI=d+zHTM zD&r5+%>Dgyi}&}tqibtvMBW&pkmQB8u8)f@f<>uw9AkFsxI7P8OQJhyG<3y=n=R>15BbdOXmeaTfhwA_euRXn~RM&VU7>q{e z1YM_iEYm73Th(7R%@>Zxc~3dUeM{tmC3a|&@M_~Cjebk>0<4)nhGq@h>Q-Bnt`Iwe zJ)Aepec81&&YSe@FGc=)Vw}w9CG93!+36a58m68+-2Xr;tslIuZ1fM(E^)`6{X??z zcBtWU@qTOU`Gl^j>@Js!_hXBN7(b5pMx!aOHxzRc%kSq3g)0e&w#y}|Cv7Cfo{q^O ztYfA8%vZ)=uxaO?9yW)VB8IDddOpPf;`O&|wh;2%c#!+(1DQwz1~ZY&*PB*e%3w8yglUPiLWt(zuw}vAsl(y^kO&;%!pEtwFqoSYbDgp2l#^tv^*G~qk;D%E%{{MN z$$4e+w2RLx6XR0|arlR`C}qbs;wH7B`vW*@va>Pz%dAOEK}0^x+V*J4FUNlaIA>^T zX5u%SF`{V+5;Jq~P&PNYuEanHL||c=+?Ov4iHR0iO{66%O7X|z#A_>_pC2#ZCw_9N zaeiJa(|o1dnR#ts2x!qp<#es5vLYOX*rt)QBg=-W(H@hF>`jr z)1zY5OlZA&4!>0{$Rx%Wh(eMF?s^VnTCi|JJ7$aUw^PeXa7D1j@KA)Gt9wW`4dR)4 ze5pBprA87f8SQv=44PYCggkACt}pVQKxz);X_HaQ0U+?+(e4M-hFC81`A^|*uu+D$a--3(lAgT1G*DHrvVcC8>+ z?UfI*?gLB2c=FlkdN)%_d^m{77|BeOo6yZqL`GvJARvFEjD38+R-!~=oYPJEL^L1g zxJ8ayv;Gn>UfT7Sk|<;~sURO6Fg>2V8!=zkko&ZTxB?iFqvz#MqJUFV>w%pwemyW{ ziF4d~U~->EFqDh(-|`ZE?S*M;h(1uVt*gD`79wbY`g9A4)TfjF7>eQVP#B7+Y-2<2 z%R|P#osn!^5yLTVuX>5wLJ}GG6}5q|wrqQ;)$4c8$1bPT8VS~Tt*{N$e%^}pWH%&H zPj-hUR^~NufVd45vj^0wk8R2N#61T^fsP(o5LkErldK=W+ z76rmC@fQ$NQT=yO^H;hhxx~F60XvScG>+Wx5v02YFqzLoz`A%2iqrFI{*MhSV=}o z0000*cxh$;08LE*DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ c1ONa40RR92NT34%1ONa40RR91Z~y=R0QfBHX#fBK diff --git a/src/assets/style/button.less b/src/assets/style/button.less index dafc0bba..9f7909ad 100644 --- a/src/assets/style/button.less +++ b/src/assets/style/button.less @@ -2,7 +2,7 @@ padding: 7px 14px; font-size: 14px; line-height: 16px; - border-radius: 6px; + border-radius: 4px; } .arco-btn-primary[type='button'] { diff --git a/src/assets/style/dataView.less b/src/assets/style/dataView.less index 08f7b7f1..33e734ed 100644 --- a/src/assets/style/dataView.less +++ b/src/assets/style/dataView.less @@ -72,71 +72,6 @@ } } -.arco-table-border .arco-table-container { - border: 1px solid var(--light-border-color) !important; - border-radius: 8px; -} - -.arco-table-border.arco-table-empty .arco-table-container { - border: 0 !important; -} - -.arco-table { - border: 0; - - .arco-table-th-title { - height: 22px; - } - - .arco-table-tr:last-of-type { - .arco-table-td:first-of-type { - border-radius: 0 0 0 8px; - } - - .arco-table-td:last-of-type { - border-radius: 0 0 8px; - } - - .arco-table-td:only-of-type { - border-radius: 0 0 8px 8px; - } - } - - .arco-table-cell { - padding: 8px 15px; - } - - .arco-table-tr .arco-table-th { - color: var(--main-font-color); - font-weight: 600; - font-size: 14px; - background: var(--th-bg-color); - border-bottom: 1px solid transparent; - border-radius: 6px 6px 0 0; - } - - .arco-table-td { - font-size: 14px; - border-top: 1px solid var(--light-border-color); - border-bottom: 0; - } - - .arco-table-tr-empty .arco-table-td { - border: 0; - } - - .arco-table-td-content { - color: var(--main-font-color); - opacity: 0.8; - } -} - -.arco-table-hover:not(.arco-table-dragging) - .arco-table-tr:not(.arco-table-tr-empty, .arco-table-tr-summary):hover - .arco-table-td:not(.arco-table-col-fixed-left, .arco-table-col-fixed-right) { - background-color: var(--light-brand-color) !important; -} - .chart-form { align-items: center; @@ -148,6 +83,10 @@ margin-right: 24px; margin-bottom: 0; } + + .arco-form-item-label-col { + width: 97px; + } } .arco-table-pagination { @@ -158,7 +97,7 @@ height: 22px; margin: 0; padding: 0; - color: var(--font-color-40); + color: var(--third-font-color); font-weight: 600; font-size: 13px; line-height: 22px; @@ -237,7 +176,7 @@ font-size: 11px !important; } -.arco-table.data-table { +.arco-table.arco-table-border.data-table { .arco-pagination-total { color: var(--hover-font-color); font-size: 13px; @@ -255,4 +194,58 @@ font-size: 13px; } } + + .arco-table-container { + border-color: var(--border-color); + border-radius: 4px; + + .arco-table-content { + border-bottom: 1px solid var(--border-color); + border-radius: 4px; + } + } + + .arco-table-cell { + padding: 8px 15px; + } + + .arco-table-th { + color: var(--small-font-color); + font-weight: 400; + line-height: 21px; + + .arco-table-cell { + padding: 6px 15px; + } + + .arco-table-th-title { + display: flex; + } + } + + .arco-table-td { + color: var(--small-font-color); + line-height: 17px; + border-color: var(--border-color); + } + + .arco-table-tr .arco-table-th { + background-color: var(--th-bg-color); + border-color: var(--border-color); + border-bottom: none; + } + + tbody .arco-table-tr:last-of-type { + border-bottom: 1px solid var(--border-color); + + .arco-table-td { + border: none; + } + } +} + +.arco-table-hover:not(.arco-table-dragging) + .arco-table-tr:not(.arco-table-tr-empty, .arco-table-tr-summary):hover + .arco-table-td:not(.arco-table-col-fixed-left, .arco-table-col-fixed-right) { + background-color: var(--light-brand-color) !important; } diff --git a/src/assets/style/editor.less b/src/assets/style/editor.less index e1d74404..fe1dc417 100644 --- a/src/assets/style/editor.less +++ b/src/assets/style/editor.less @@ -1,7 +1,7 @@ .editor-card { .ͼo { background: var(--main-font-color); - font-size: 14px; + font-size: 12px; .cm-gutters { color: #fdfcff; diff --git a/src/assets/style/form.less b/src/assets/style/form.less index dd1f64d6..6c402000 100644 --- a/src/assets/style/form.less +++ b/src/assets/style/form.less @@ -48,7 +48,6 @@ height: 100%; background-color: transparent; border: 1px solid var(--border-color); - border-radius: 6px; } .arco-input-wrapper:hover { @@ -92,30 +91,6 @@ } } -.arco-drawer { - height: calc(100% - 52px); - margin-top: 52px; - border-radius: 10px 0 0 10px; - box-shadow: 0 4px 10px 0 var(--border-color); - - .arco-drawer-header { - height: 58px; - padding: 0 20px; - border-bottom: 0; - - .arco-drawer-title { - display: flex; - align-items: center; - font-weight: 600; - font-size: 18px; - } - } - - .arco-drawer-body { - padding: 8px 20px; - } -} - .drawer-icon { width: 20px; height: 20px; diff --git a/src/assets/style/global.less b/src/assets/style/global.less index aafe7608..7aba76cf 100644 --- a/src/assets/style/global.less +++ b/src/assets/style/global.less @@ -18,7 +18,8 @@ :root { --main-bg-color: rgba(244, 246, 254, 1); - --th-bg-color: rgba(248, 249, 253, 1); + --list-hover-color: rgba(231, 230, 233, 1); + --th-bg-color: rgba(231, 230, 233, 0.5); --card-bg-color: rgba(255, 255, 255, 1); --hover-bg-color: rgba(255, 255, 255, 0.6); --white-font-color: rgba(252, 253, 255, 1); @@ -27,25 +28,25 @@ --brand-color: rgba(131, 34, 255, 1); --hover-brand-color: rgba(163, 118, 255, 1); --light-brand-color: rgba(163, 118, 255, 0.1); - --tree-select-brand-color: rgba(163, 118, 255, 0.2); + --tree-select-brand-color: rgba(163, 118, 255, 0.1); --main-font-color: rgba(23, 12, 44, 1); + --small-font-color: rgba(88, 82, 101, 1); + --third-font-color: rgba(170, 166, 178, 1); --tooltip-bg-color: rgba(23, 12, 44, 0.9); - --small-font-color: rgba(23, 12, 44, 0.8); --hover-font-color: rgba(23, 12, 44, 0.6); - --font-color-40: rgba(23, 12, 44, 0.4); - --border-color: rgba(23, 12, 44, 0.2); + --border-color: rgba(209, 206, 213, 1); --light-border-color: rgba(23, 12, 44, 0.07); --grey-bg-color: rgba(23, 12, 44, 0.04); - --success-color: rgba(36, 201, 128, 1); + --success-color: rgba(32, 195, 123, 1); --success-bg-color: rgba(233, 249, 242, 1); - --warning-color: rgba(232, 176, 14, 1); + --warning-color: rgba(220, 174, 40, 1); --warning-bg-color: rgba(252, 247, 230, 1); - --danger-color: rgba(239, 60, 104, 1); + --danger-color: rgba(234, 50, 95, 1); --danger-bg-color: #fdebef; --danger-bg-hover-color: rgba(239, 60, 104, 0.2); --switch-unchecked-color: rgba(36, 201, 128, 1); --editor-active-line-color: rgba(252, 253, 255, 0.14); - --box-shadow-color: rgba(0, 0, 0, 0.15); + --box-shadow-color: rgba(83, 82, 87, 0.4); } html, @@ -117,27 +118,11 @@ body { } .menu-dropdown { - .arco-dropdown { + .arco-dropdown-option { padding: 0; - border: 0; - border-radius: 6px; - box-shadow: 0 2px 10px 0 var(--box-shadow-color); - - .arco-dropdown-option { - padding: 0; - } - - .arco-dropdown-option:not(.arco-dropdown-option-disabled):hover { - background-color: transparent; - } - - .arco-dropdown-option-content { - width: 100%; - height: 32px; - line-height: 32px; - border-radius: 6px; - } + } + .arco-dropdown { .arco-link { justify-content: flex-start; width: 100%; @@ -149,18 +134,7 @@ body { .arco-link:hover { color: var(--small-font-color); - background-color: var(--light-brand-color); - } - - .arco-btn-text[type='button'] { - justify-content: start; - width: 100%; - color: var(--small-font-color); - font-size: 13px; - } - - .arco-btn-text[type='button']:hover { - background-color: var(--grey-bg-color); + background-color: var(--main-bg-color); } } } @@ -240,9 +214,9 @@ body { } .arco-select-dropdown { - padding: 0; + padding: 4px 0; border: 0; - border-radius: 6px; + border-radius: 4px; box-shadow: 0 2px 10px 0 var(--box-shadow-color); .arco-select-option { @@ -251,7 +225,7 @@ body { font-size: 13px; line-height: 32px; text-align: left; - border-radius: 6px; + border-radius: 0; .arco-checkbox-icon { width: 12px; @@ -276,11 +250,11 @@ body { } .arco-select-option-active { - background-color: var(--light-brand-color); + background-color: var(--main-bg-color); } .arco-select-option:not(.arco-select-dropdown .arco-select-option-disabled):hover { - background-color: var(--light-brand-color); + background-color: var(--main-bg-color); } } @@ -298,7 +272,7 @@ body { .arco-input-wrapper { background: var(--grey-bg-color); - border-radius: 6px; + border-radius: 4px; .arco-input[disabled] { -webkit-text-fill-color: var(--hover-font-color); @@ -390,6 +364,14 @@ body { color: var(--warning-color); } +.brand-color { + color: var(--brand-color); +} + +.icon-color { + color: var(--third-font-color); +} + .arco-spin-icon { color: var(--brand-color); } diff --git a/src/assets/style/layout.less b/src/assets/style/layout.less index 97ccac89..0131c4aa 100644 --- a/src/assets/style/layout.less +++ b/src/assets/style/layout.less @@ -3,7 +3,6 @@ padding: 16px 0 16px 16px; > .arco-layout-sider-light { - min-width: 321px; background: transparent; box-shadow: none; } diff --git a/src/assets/style/select.less b/src/assets/style/select.less index 4cf681a6..aba7e893 100644 --- a/src/assets/style/select.less +++ b/src/assets/style/select.less @@ -2,7 +2,7 @@ padding-right: 8px; padding-left: 8px; background: var(--grey-bg-color); - border-radius: 6px; + border-radius: 4px; } .arco-select-view-single:hover { @@ -20,7 +20,7 @@ padding-left: 8px; background: var(--grey-bg-color); border: 1px solid transparent; - border-radius: 6px; + border-radius: 4px; .arco-select-view-inner .arco-select-view-tag { background: var(--grey-bg-color); @@ -50,10 +50,22 @@ background: var(--warning-bg-color); border: 1px solid var(--warning-color); } - .arco-select-dropdown { - .arco-select-option-active, - .arco-select-option:not(.arco-select-dropdown .arco-select-option-disabled):hover { - background-color: var(--grey-bg-color); - } - } +} + +.arco-dropdown { + padding: 4px 0; + border: 0; + border-radius: 4px; + box-shadow: 0 2px 10px 0 var(--box-shadow-color); +} + +.arco-dropdown-option:not(.arco-dropdown-option-disabled):hover { + background-color: transparent; +} + +.arco-dropdown-option-content { + width: 100%; + height: 32px; + line-height: 32px; + border-radius: 0; } diff --git a/src/assets/style/tableList.less b/src/assets/style/tableList.less index c033a40f..5a0a9c6a 100644 --- a/src/assets/style/tableList.less +++ b/src/assets/style/tableList.less @@ -10,10 +10,6 @@ line-height: 42px !important; } - .arco-scrollbar { - height: calc(100vh - 220px); - } - .arco-tree { margin: 0 16px; } @@ -37,12 +33,6 @@ border-radius: 4px; } - .right { - display: flex; - width: 15px; - padding-left: 2px; - } - .data-type { display: none; padding-left: 3px; diff --git a/src/components/global-setting/index.vue b/src/components/global-setting/index.vue index 4f666ff1..bbbc6f62 100644 --- a/src/components/global-setting/index.vue +++ b/src/components/global-setting/index.vue @@ -1,25 +1,23 @@ @@ -35,3 +34,29 @@ a-tabs.result-tabs.logs-tab(type="rounded") clearLogs(props.types) } + + diff --git a/src/views/dashboard/modules/query-modal/index.vue b/src/views/dashboard/modules/query-modal/index.vue new file mode 100644 index 00000000..71f28dae --- /dev/null +++ b/src/views/dashboard/modules/query-modal/index.vue @@ -0,0 +1,223 @@ + + + + + + + diff --git a/src/views/dashboard/modules/scripts-list.vue b/src/views/dashboard/modules/scripts-list.vue index 7093d0c5..893003bc 100644 --- a/src/views/dashboard/modules/scripts-list.vue +++ b/src/views/dashboard/modules/scripts-list.vue @@ -10,7 +10,7 @@ a-spin(style="width: 100%" :loading="scriptsLoading") svg.icon use(href="#create") .icon-space.pointer(@click="refreshScripts") - svg.icon + svg.icon.brand-color use(href="#refresh") a-scrollbar.tree-scrollbar a-tree.script-tree( diff --git a/src/views/dashboard/modules/table-list.vue b/src/views/dashboard/modules/table-list.vue index 56f69e3d..a09ee80f 100644 --- a/src/views/dashboard/modules/table-list.vue +++ b/src/views/dashboard/modules/table-list.vue @@ -6,7 +6,7 @@ a-spin(style="width: 100%" :loading="tablesLoading") svg.icon use(href="#search") .icon-space.pointer(@click="refreshTables") - svg.icon + svg.icon.brand-color use(href="#refresh") a-tree.table-tree( v-if="tablesTreeData && tablesTreeData.length > 0" @@ -18,7 +18,8 @@ a-spin(style="width: 100%" :loading="tablesLoading") :data="tablesTreeData" :load-more="loadMore" :animation="false" - :virtual-list-props="{ height: 'calc(100vh - 220px)' }" + :virtual-list-props="{ height: 'calc(100vh - 160px)' }" + :field-names="{ children: 'columns' }" ) template(#icon="node") a-tooltip(:content="node.node.iconType") @@ -53,11 +54,10 @@ a-spin(style="width: 100%" :loading="tablesLoading") a-button(type="text" @click="copy(nodeData.title)") Copy name template(#switcher-icon) IconDown - .tree-scrollbar(v-else) - EmptyStatus + EmptyStatus.empty(v-else) - + + + + diff --git a/src/views/dashboard/playground/index.vue b/src/views/dashboard/playground/index.vue index f5cb44fc..dd62c16f 100644 --- a/src/views/dashboard/playground/index.vue +++ b/src/views/dashboard/playground/index.vue @@ -17,10 +17,10 @@ a-layout.layout import { getPlaygroundInfo } from '@/api/playground' import parseMD from 'parse-md' // data - const { isCloud } = storeToRefs(useAppStore()) const appStore = useAppStore() const router = useRouter() const { getGistFiles } = useGist() + const { role } = storeToRefs(useUserStore()) const refreshPlaygroundModal = ref() const currentFile = ref('') @@ -42,7 +42,7 @@ a-layout.layout onMounted(async () => { const { gistId } = router.currentRoute.value.query - if (appStore.lifetime === 'temporary' && isCloud.value) { + if (appStore.lifetime === 'temporary' && role.value !== 'admin') { try { const data = await getPlaygroundInfo(appStore.dbId) } catch (error) { diff --git a/src/views/dashboard/query/editor.vue b/src/views/dashboard/query/editor.vue index 590f84c2..e6802a3f 100644 --- a/src/views/dashboard/query/editor.vue +++ b/src/views/dashboard/query/editor.vue @@ -1,5 +1,5 @@ + + + + diff --git a/src/views/dashboard/query/index.vue b/src/views/dashboard/query/index.vue index 466a5c4d..6aef5586 100644 --- a/src/views/dashboard/query/index.vue +++ b/src/views/dashboard/query/index.vue @@ -1,12 +1,9 @@ + + From 4a883b582eed200bcdefe3bce318ff22bcf3256b Mon Sep 17 00:00:00 2001 From: ZonaHe Date: Fri, 17 Nov 2023 16:15:21 +0800 Subject: [PATCH 2/2] feat: show query results in success message (#352) * feat: show query results in success message * style: tooltip position for log code * style(logs): add transition --- src/assets/style/global.less | 24 ++++++++++++------ src/store/modules/code-run/index.ts | 27 +++++++++++++++------ src/store/modules/log/types.ts | 11 ++++++--- src/views/dashboard/locale/en-US.ts | 4 +-- src/views/dashboard/modules/log.vue | 8 +++--- src/views/dashboard/modules/logs-layout.vue | 13 +++++++++- 6 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/assets/style/global.less b/src/assets/style/global.less index 7aba76cf..dfdd9ffa 100644 --- a/src/assets/style/global.less +++ b/src/assets/style/global.less @@ -81,27 +81,37 @@ body { border: 1px solid; border-radius: 6px; + .arco-message-icon { + line-height: 22px; + } + .arco-message-content { - display: -webkit-box; - overflow: hidden; color: var(--main-font-color); - font-size: 14px; line-height: 22px; - text-overflow: ellipsis; - -webkit-line-clamp: 3; - line-clamp: 2; - -webkit-box-orient: vertical; } } .arco-message-success { + align-items: flex-start; background-color: var(--success-bg-color); border-color: var(--success-color); + + .arco-message-content { + white-space: pre; + } } .arco-message-error { background-color: var(--danger-bg-color); border-color: var(--danger-color); + + .arco-message-content { + display: -webkit-box; + overflow: hidden; + text-overflow: ellipsis; + -webkit-line-clamp: 3; + -webkit-box-orient: vertical; + } } .arco-tooltip-content { diff --git a/src/store/modules/code-run/index.ts b/src/store/modules/code-run/index.ts index d166714e..a44da1fa 100644 --- a/src/store/modules/code-run/index.ts +++ b/src/store/modules/code-run/index.ts @@ -54,16 +54,14 @@ const useCodeRunStore = defineStore('codeRun', () => { // TODO: try something better let oneResult = {} as ResultType const res: HttpResponse = await API_MAP[type](codeInfo) - Message.success({ - content: i18n.global.t('dashboard.runSuccess'), - duration: 2 * 1000, - }) + const resultsInLog: Array = [] res.output.forEach((oneRes: OutputType) => { if (Reflect.has(oneRes, 'records')) { const rowLength = oneRes.records.rows.length resultsInLog.push({ - records: rowLength, + type: 'select', + rowCount: rowLength, }) if (rowLength >= 0) { const pageType = CODE_TO_PAGE[type] @@ -91,15 +89,28 @@ const useCodeRunStore = defineStore('codeRun', () => { } if (Reflect.has(oneRes, 'affectedrows')) { resultsInLog.push({ - affectedRows: oneRes.affectedrows, + type: 'affect', + rowCount: oneRes.affectedrows, }) } }) + + const message = resultsInLog + .map((result: ResultInLog) => { + return i18n.global.tc(`dashboard.${result.type}`, result.rowCount, { rowCount: result.rowCount }) + }) + .join(`;\n`) + + Message.success({ + content: message, + duration: 2 * 1000, + }) + const oneLog: Log = { type, ...res, codeInfo, - results: resultsInLog, + message, } if (type === 'promql') { oneLog.promInfo = { @@ -109,7 +120,7 @@ const useCodeRunStore = defineStore('codeRun', () => { Query: codeInfo, } } - // TODO: try something better + return { log: oneLog, lastResult: oneResult, diff --git a/src/store/modules/log/types.ts b/src/store/modules/log/types.ts index 6944918c..77a42c49 100644 --- a/src/store/modules/log/types.ts +++ b/src/store/modules/log/types.ts @@ -1,11 +1,14 @@ +export interface ResultInLog { + type: string + rowCount: number +} + export interface Log { - results?: ResultInLog[] sql?: string error?: string name?: string type: string - promInfo?: {} + promInfo?: object codeInfo: string + message: string } - -export interface ResultInLog {} diff --git a/src/views/dashboard/locale/en-US.ts b/src/views/dashboard/locale/en-US.ts index a8be539d..7ee8e6bc 100644 --- a/src/views/dashboard/locale/en-US.ts +++ b/src/views/dashboard/locale/en-US.ts @@ -18,11 +18,11 @@ export default { 'dashboard.yType': 'Y-Axis Types', 'dashboard.xType': 'X-Axis Type', 'dashboard.groupBy': 'Group By', - 'dashboard.select': 'Select {records} row | Select {records} rows', + 'dashboard.select': 'Selected {rowCount} row | Selected {rowCount} rows', 'dashboard.pleaseSelect': 'Please select...', 'dashboard.draw': 'Draw', 'dashboard.error': 'Error', - 'dashboard.affected': 'Affected {record} row | Affected {record} rows', + 'dashboard.affect': 'Affected {rowCount} row | Affected {rowCount} rows', 'dashboard.executeTime': 'Execute: {time} ms', 'dashboard.executed': 'Executed {length} statement | Executed {length} statements', 'dashboard.network': 'Network: {time} ms', diff --git a/src/views/dashboard/modules/log.vue b/src/views/dashboard/modules/log.vue index 7a99897d..14ab92bc 100644 --- a/src/views/dashboard/modules/log.vue +++ b/src/views/dashboard/modules/log.vue @@ -6,9 +6,9 @@ a-list-item.smaller-divider icon-play-arrow.icon-color a-space(direction="vertical" fill :size="0") .code - a-tooltip(v-if="log.error" :content="log.error") + a-tooltip(v-if="log.error" position="tl" :content="log.error") div {{ log.error }} - a-popover(v-else-if="log.type !== 'python'" content-class="code-popup") + a-popover(v-else-if="log.type !== 'python'" content-class="code-popup" position="tl") template(#content) a-list(size="small" :split="false" :bordered="false") a-list-item(v-if="log.type === 'promql'" v-for="(value, name) in log.promInfo") @@ -26,9 +26,7 @@ a-list-item.smaller-divider .start-time | {{ log.startTime }} a-space.result(v-if="!log.error" fill :size="4") - a-space(v-if="hasExecutionTime" :size="0") - template(#split) ; - span(v-for="(oneResult, index) of log.results" :key="index") {{ oneResult.records >= 0 ? $tc('dashboard.select', oneResult.records, { records: oneResult.records }) : $tc('dashboard.affected', oneResult.affectedRows, { record: oneResult.affectedRows }) }} + span(v-if="hasExecutionTime") {{ log.message }} .total-time(v-if="hasExecutionTime") a-popover(content-class="total-time-popover") template(#content) diff --git a/src/views/dashboard/modules/logs-layout.vue b/src/views/dashboard/modules/logs-layout.vue index 91aeb32d..d85781e8 100644 --- a/src/views/dashboard/modules/logs-layout.vue +++ b/src/views/dashboard/modules/logs-layout.vue @@ -16,7 +16,8 @@ a-card.logs-card(:bordered="false") :bordered="false" :class="{ 'empty-list': !logs.length }" ) - Log(v-for="log of logs" :key="log" :log="log") + TransitionGroup(name="list") + Log(v-for="log of logs" :key="log" :log="log") template(#empty) EmptyStatus.empty-log @@ -93,4 +94,14 @@ a-card.logs-card(:bordered="false") flex-direction: column; height: 50vh; } + + .list-enter-active, + .list-leave-active { + transition: all 0.5s ease; + } + .list-enter-from, + .list-leave-to { + opacity: 0; + transform: translateX(30px); + }