_dGp`?GS%X~zkyS(ZzRAD>ZP;dK!i
zMWD|R28ToL%y-8L>DXrDY3L`C)Vn1Jq9km|j|1MZLnxXVGil{Tp)s=X%}S~&v*sB*
zmp>#aum*UeRzUd4rFi(KWA2|6FeaQICM|thQ(FRgi@XN#6@iF0>}S}}P(&1nV5
zjl+@0t6IIT+d1}yxa21?grmz1J%qzpNt}k?-mfn_YjRuemvOz|;82iP0b~)nu69XD
zATNhpmPNB*1r7%1+(GCkYyy_1(lwJAJQ*!p+l&$9A72H3!gekpSwosCsI)K@eA1_R
z^4@GGX~5GZ^5)FC2=r2KL>L~x%}YVp&rPFz&%W^Ko^{~}o8!Y~gN+w`dVZ!<>e6M`
z7Sm$1dqXA1t%^Xdu(a~kC_Dbca!->1herl@%Vm8tZ&J3?@-Y^^IU0ew&*IGV(ljI<
zh9Te12^^I*w-BfQIp7@ni5)1+j^CuI8S#N==NIeyxS-(Ux};YBj^CI#$EL*3kK5~m
zpBG9x_CBl6k#^+$>=%{1zB}d^>aoW@rrVRk6xbyz$atE#*uzeSiwgW2kWj+M%7aH5
zwS9<&$d)pfF=O;E*I-;M@o1}Oy?ym
zz{pUpLFh0k?`)pMvd!|EGzWSfC={rppk+cz%w0@5a@mV~Y#huG2Cn
zlY8$NxxR)!15u``{XWr(6+NxbvyINr141P-7;(YFU%VzE=`9i1wb@Ax#mW)7jyBOD
zOBTQuwi$Of#kvwA*lZf;YbEQKAz}DM#&5w-DpIQw0I|+YTqh6j1{X|mFi{!%e{J3W^WBa44aHk6)87=TwWDJVTdtH;=~C!(>V!OmM%Z4eMV*W
z-Wbn=_@lFL#TmHs-A7S~BH>+m+dGZV9g-%D{*uaOvS2?zvkOT(E)AA?WRaY;D~_WF
zeeG2rzd@$iSC%-=M9?IK4}8^K66m)sTZ*+Hi?nBNBl`FwJ;4|N#W2)&^seGN~v*o9b`uQJ*#
zj3en%aA}8dzyimR{G2Ge4FBec*2v|^=F{iR>Qa-COe1P@juJH7*oE_wFHDcOj+V){
z48U1Kt{2xfFG)8frl{h@T~pQ0ku}kud;4+I-G5!Tw`WN)Ucp#(p8{AyP6ZNKJ*mKg
zv5V71dF@xWxy3%`ipDjl;YJe&qJy&+B7+Ho7~6}ZbdVpvq!j?vzkVtD8>mYaXgRpD>When-ugw{
zTrLwJ(%CX{5|MHrK=o;Q9pR8^(djCc-@1{L@5NgjP>WqL5u8vCLXxM8#^r4i)T{v{
z{(5kC62CUhbYnIeixn05xaPI-3u}eTFcye=R6M!=&9f>
z-3@~mTP%ZUV0#E0@qH-IXP>IB#g?JdH}+ZXSM#Kdfy~8fQHjpMK_$3Aqw-z;fug!)
z)Nv>-_huJYa`+-sT=*q`;J$0YN`+K(H<5JvB17kvr_OSW&4)O3zdVw5z
zC9jZG7&5~v+=d~zCJDXP!I_TxP#VPY+hrt;78+vQ0Y5)KGOg{D;80b9xh6b@07zl$|Ki1q#Dnz0c9ixmJwC=UZ)
zRtF29fuXa|z8PtvOPb=UDaom;9LOzwo-6+K6C%DukoF1L>Rthf0vmp8lsyEok8ict
z53Ub}nlT2o8NMJk6mAuJ({miDG(bL{_E|oTkGO*Fhg7ve{SK>@YpI5G+WDNk&WvO1
zv*Ph0nbp>pM@BAetRg$}@uKh}X(T(fZrxXV9U(#yyFMco&gL>;VAhi*WSgx?Yrs*X
zys!&Ng}@pkwdpL9r{HOBDBAQQZYZ7up+&rKD+7p2t4p7S*okl`onBc@#40G1K|h=8
z8PkQip6=2*mp(K9-QD1>z6DYTqxo8vZ!VjoAP-pw)G^U9_SwjJn^RPugB>*qPnDrw
z&7eg&p!(0Hw{!H&ii|@`VU`|I&?@LY@@;I)5vyAWa
zIr^t{?X~hIa;M4frVo|BR>HVPJ3mN=54qZMk2X$}9XFq)1)SypHcl1p`#dKFCu_P6
zltj-Y*Uiu7vE)FtQN?S$;t9&{5DVcGjDLil#N&-@z0u?uKg!fVQn1(tc=xWb3+%x@
z+YhlZVV2PW#>O@q2yQSmiq%eqb+B(0$kPvhBzRQ^_4?b-ko&KHy9=s7`P9gfNErh(
z>+1v|rbo&kjoZfpxRK`2do@xzcWL
z5YXfO6?8pob|R#y@?1t$l&-UX>-l`#9k3wt4}VdxSiYd95P2T?LPkwS=s>AJ6;K!#
zjU3cZ+1fYrHt$haQh2}Q=^F8qx!N1@<5{izI7p_~t<>vP;0Eccu?6%=lZQ)4bXM<$
zedB%Tr1{DZO}*?DT+J{hD$MaM
zH1F@}>E%jp_pZo#t`jR4f?gZU4On0KgHcB4n?1`0&dI!xnY1=nu=9K$_E5{6rvG{E
zC;|gI{qut{#sRq1DC5!v@_a6mSMNNe|
IIg8N$12nRB^Z)<=
literal 0
HcmV?d00001
diff --git a/frontend/src/components/common/ToolbarControlWidget.vue b/frontend/src/components/common/ToolbarControlWidget.vue
new file mode 100644
index 0000000..bf89612
--- /dev/null
+++ b/frontend/src/components/common/ToolbarControlWidget.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/content/ContentLogPane.vue b/frontend/src/components/content/ContentLogPane.vue
index 15dcf93..717b782 100644
--- a/frontend/src/components/content/ContentLogPane.vue
+++ b/frontend/src/components/content/ContentLogPane.vue
@@ -90,7 +90,7 @@ defineExpose({
-
+
-
-
-
- {{ t.label }}
-
-
-
-
-import { ref } from 'vue'
-import { ConnectionType } from '@/consts/connection_type.js'
-import Close from '@/components/icons/Close.vue'
-import useConnectionStore from 'stores/connections.js'
+import ToggleServer from '@/components/icons/ToggleServer.vue'
+import useTabStore from 'stores/tab.js'
+import { computed } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { get, map } from 'lodash'
import { useThemeVars } from 'naive-ui'
-
-const emit = defineEmits(['switchTab', 'closeTab', 'update:modelValue'])
+import useConnectionStore from 'stores/connections.js'
const themeVars = useThemeVars()
+const i18n = useI18n()
+const tabStore = useTabStore()
+const connectionStore = useConnectionStore()
+
const props = defineProps({
- selectedIndex: {
- type: Number,
- default: 0,
- },
- modelValue: {
- type: Object,
- default: [
- {
- // label: 'tab1',
- // key: 'key',
- // bgColor: 'white',
- },
- ],
- },
- tabs: {
- type: Array,
- default: [
- {
- // label: 'tab1',
- // key: 'key',
- // bgColor: 'white',
- },
- ],
- },
+ backgroundColor: String,
})
-const connectionStore = useConnectionStore()
-const onCurrentSelectChange = ({ type, group = '', server = '', db = 0, key = '' }) => {
- console.log(`group: ${group}\n server: ${server}\n db: ${db}\n key: ${key}`)
- if (type === ConnectionType.RedisValue) {
- // load and update content value
- }
-}
-// watch(() => databaseStore.currentSelect, throttle(onCurrentSelectChange, 1000))
-
-const items = ref(props.modelValue)
-const selIndex = ref(props.selectedIndex)
-
-const onClickTab = (idx, key) => {
- if (idx !== selIndex.value) {
- selIndex.value = idx
- emit('update:modelValue', idx, key)
- }
+const onCloseTab = (tabIndex) => {
+ $dialog.warning(i18n.t('close_confirm'), () => {
+ const tab = get(tabStore.tabs, tabIndex)
+ if (tab != null) {
+ connectionStore.closeConnection(tab.name)
+ }
+ })
}
-const onCloseTab = (idx, key) => {
- emit('closeTab', idx, key)
-}
+const activeTabStyle = computed(() => ({
+ backgroundColor: themeVars.value.baseColor,
+ borderTopWidth: '1px',
+ borderTopColor: themeVars.value.borderColor,
+ borderBottomColor: themeVars.value.baseColor,
+ borderTopLeftRadius: themeVars.value.borderRadius,
+ borderTopRightRadius: themeVars.value.borderRadius,
+}))
+const inactiveTabStyle = computed(() => ({
+ borderWidth: '0 0 1px',
+ borderBottomColor: themeVars.value.borderColor,
+ borderTopLeftRadius: themeVars.value.borderRadius,
+ borderTopRightRadius: themeVars.value.borderRadius,
+}))
+
+const tab = computed(() =>
+ map(tabStore.tabs, (item) => ({
+ key: item.name,
+ label: item.title,
+ })),
+)
-
-
-
-
-
- {{ item.label }}
-
-
-
+ tabStore.switchTab(tabIndex)"
+ :theme-overrides="{
+ tabFontWeightActive: 800,
+ tabBorderRadius: 0,
+ tabGapSmallCard: 0,
+ tabGapMediumCard: 0,
+ tabGapLargeCard: 0,
+ tabColor: '#0000',
+ tabBorderColor: themeVars.borderColor,
+ }">
+ {}">
+
+
+ {{ t.label }}
+
+
+
-
+
diff --git a/frontend/src/components/content_value/ContentValueHash.vue b/frontend/src/components/content_value/ContentValueHash.vue
index 5b227ef..6f2916f 100644
--- a/frontend/src/components/content_value/ContentValueHash.vue
+++ b/frontend/src/components/content_value/ContentValueHash.vue
@@ -265,13 +265,15 @@ const onUpdateFilter = (filters, sourceColumn) => {
{{ $t('add_row') }}
-
+
{
{{ $t('add_row') }}
-
+
{
{{ $t('add_row') }}
-
+
{
{{ $t('add_row') }}
-
+
{
.value-wrapper {
overflow: hidden;
border-top: v-bind('themeVars.borderColor') 1px solid;
+ padding: 5px;
}
diff --git a/frontend/src/components/content_value/ContentValueZSet.vue b/frontend/src/components/content_value/ContentValueZSet.vue
index 8de676d..7978d5d 100644
--- a/frontend/src/components/content_value/ContentValueZSet.vue
+++ b/frontend/src/components/content_value/ContentValueZSet.vue
@@ -296,13 +296,15 @@ const onUpdateFilter = (filters, sourceColumn) => {
{{ $t('add_row') }}
-
+
+const props = defineProps({
+ size: {
+ type: [Number, String],
+ default: 12,
+ },
+})
+
+
+
+
+
+
+
diff --git a/frontend/src/components/icons/WindowMax.vue b/frontend/src/components/icons/WindowMax.vue
new file mode 100644
index 0000000..2786085
--- /dev/null
+++ b/frontend/src/components/icons/WindowMax.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/icons/WindowMin.vue b/frontend/src/components/icons/WindowMin.vue
new file mode 100644
index 0000000..e154809
--- /dev/null
+++ b/frontend/src/components/icons/WindowMin.vue
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/sidebar/BrowserTree.vue b/frontend/src/components/sidebar/BrowserTree.vue
index 5d18d55..95f7a44 100644
--- a/frontend/src/components/sidebar/BrowserTree.vue
+++ b/frontend/src/components/sidebar/BrowserTree.vue
@@ -50,14 +50,15 @@ const selectedKeys = computed(() => {
const data = computed(() => {
const dbs = get(connectionStore.databases, props.server, [])
- return [
- {
- key: `${props.server}`,
- label: props.server,
- type: ConnectionType.Server,
- children: dbs,
- },
- ]
+ return dbs
+ // return [
+ // {
+ // key: `${props.server}`,
+ // label: props.server,
+ // type: ConnectionType.Server,
+ // children: dbs,
+ // },
+ // ]
})
const backgroundColor = computed(() => {
@@ -368,6 +369,8 @@ const renderPrefix = ({ option }) => {
// render tree item label
const renderLabel = ({ option }) => {
switch (option.type) {
+ case ConnectionType.Server:
+ return h('b', {}, { default: () => option.label })
case ConnectionType.RedisDB:
const { name: server, db } = option
let { match: matchPattern, type: typeFilter } = connectionStore.getKeyFilter(server, db)
diff --git a/frontend/src/components/sidebar/NavMenu.vue b/frontend/src/components/sidebar/NavMenu.vue
index 1098410..ae0fb0a 100644
--- a/frontend/src/components/sidebar/NavMenu.vue
+++ b/frontend/src/components/sidebar/NavMenu.vue
@@ -32,7 +32,7 @@ const emit = defineEmits(['update:value'])
const iconSize = computed(() => Math.floor(props.width * 0.4))
const renderIcon = (icon) => {
- return () => h(NIcon, null, { default: () => h(icon, { strokeWidth: 4 }) })
+ return () => h(NIcon, null, { default: () => h(icon, { strokeWidth: 3 }) })
}
const connectionStore = useConnectionStore()
@@ -122,7 +122,7 @@ const openGithub = () => {
:render-label="renderContextLabel"
trigger="click"
@select="onSelectPreferenceMenu">
-
+
@@ -131,7 +131,7 @@ const openGithub = () => {