import { find, findIndex, get, size } from 'lodash' import { defineStore } from 'pinia' const useTabStore = defineStore('tab', { /** * @typedef {Object} TabItem * @property {string} name connection name * @property {boolean} blank is blank tab * @property {string} [title] tab title * @property {string} [icon] tab icon * @property {string[]} selectedKeys * @property {string} [type] key type * @property {Object|Array} [value] key value * @property {string} [server] server name * @property {int} [db] database index * @property {string} [key] current key name * @property {int} [ttl] ttl of current key */ /** * * @returns {{tabList: TabItem[], activatedTab: string, activatedIndex: number}} */ state: () => ({ nav: 'server', asideWidth: 300, tabList: [], activatedTab: '', activatedIndex: 0, // current activated tab index }), getters: { /** * get current tab list item * @returns {TabItem[]} */ tabs() { // if (isEmpty(this.tabList)) { // this.newBlankTab() // } return this.tabList }, /** * get current activated tab item * @returns {TabItem|null} */ currentTab() { return get(this.tabs, this.activatedIndex) // let current = find(this.tabs, {name: this.activatedTab}) // if (current == null) { // current = this.tabs[0] // } // return current }, currentSelectedKeys() { const tab = this.currentTab() return get(tab, 'selectedKeys', []) }, }, actions: { /** * * @param idx * @param {boolean} [switchNav] * @private */ _setActivatedIndex(idx, switchNav) { this.activatedIndex = idx if (switchNav === true) { this.nav = idx >= 0 ? 'browser' : 'server' } else { if (idx < 0) { this.nav = 'server' } } }, /** * update or insert a new tab if not exists with the same name * @param {string} server * @param {number} [db] * @param {number} [type] * @param {number} [ttl] * @param {string} [key] * @param {*} [value] */ upsertTab({ server, db, type, ttl, key, value }) { let tabIndex = findIndex(this.tabList, { name: server }) if (tabIndex === -1) { this.tabList.push({ name: server, server, db, type, ttl, key, value, }) tabIndex = this.tabList.length - 1 } const tab = this.tabList[tabIndex] tab.blank = false // tab.title = db !== undefined ? `${server}/db${db}` : `${server}` tab.title = server tab.server = server tab.db = db tab.type = type tab.ttl = ttl tab.key = key tab.value = value this._setActivatedIndex(tabIndex, true) // this.activatedTab = tab.name }, /** * update ttl by tag * @param {string} server * @param {number} db * @param {string} key * @param {number} ttl */ updateTTL({ server, db, key, ttl }) { let tab = find(this.tabList, { name: server, db, key }) if (tab == null) { return } tab.ttl = ttl }, /** * set tab's content to empty * @param {string} name */ emptyTab(name) { const tab = find(this.tabList, { name }) if (tab != null) { tab.key = null tab.value = null } }, switchTab(tabIndex) { // const len = size(this.tabList) // if (tabIndex < 0 || tabIndex >= len) { // tabIndex = 0 // } // this.activatedIndex = tabIndex // const tabIndex = findIndex(this.tabList, {name}) // if (tabIndex === -1) { // return // } // this.activatedIndex = tabIndex }, /** * * @param {number} tabIndex * @returns {*|null} */ removeTab(tabIndex) { const len = size(this.tabs) // ignore remove last blank tab if (len === 1 && this.tabs[0].blank) { return null } if (tabIndex < 0 || tabIndex >= len) { return null } const removed = this.tabList.splice(tabIndex, 1) // update select index if removed index equal current selected this.activatedIndex -= 1 if (this.activatedIndex < 0) { if (this.tabList.length > 0) { this._setActivatedIndex(0, false) } else { this._setActivatedIndex(-1, false) } } else { this._setActivatedIndex(this.activatedIndex, false) } return size(removed) > 0 ? removed[0] : null }, /** * * @param {string} tabName */ removeTabByName(tabName) { const idx = findIndex(this.tabs, { name: tabName }) if (idx !== -1) { this.removeTab(idx) } }, /** * */ removeAllTab() { this.tabList = [] this._setActivatedIndex(-1, false) }, /** * * @param {string} server * @param {string|string[]} keys */ setSelectedKeys(server, keys = null) { let tab = find(this.tabList, { name: server }) if (tab != null) { if (keys == null) { // select nothing tab.selectedKeys = [server] } else if (typeof keys === 'string') { tab.selectedKeys = [keys] } else { tab.selectedKeys = keys } } }, }, }) export default useTabStore