antares/src/renderer/store/modules/workspaces.store.js

139 lines
4.9 KiB
JavaScript
Raw Normal View History

'use strict';
2020-05-18 18:06:32 +02:00
import Connection from '@/ipc-api/Connection';
import { uidGen } from 'common/libs/uidGen';
2020-06-05 21:00:15 +02:00
2020-08-10 18:09:33 +02:00
function remapStructure (structure) { // TODO: move to main process and add fields (for autocomplete purpose)
2020-05-31 17:56:33 +02:00
const databases = structure.map(table => table.TABLE_SCHEMA)
.filter((value, index, self) => self.indexOf(value) === index);
return databases.map(db => {
return {
2020-06-05 21:00:15 +02:00
name: db,
2020-05-31 17:56:33 +02:00
tables: structure.filter(table => table.TABLE_SCHEMA === db)
};
});
}
export default {
namespaced: true,
strict: true,
state: {
workspaces: [],
2020-05-18 18:06:32 +02:00
selected_workspace: null
},
getters: {
getSelected: state => {
2020-05-18 18:06:32 +02:00
if (state.selected_workspace) return state.selected_workspace;
if (state.workspaces.length) return state.workspaces[0].uid;
return null;
},
2020-05-20 18:00:14 +02:00
getWorkspace: state => uid => {
const workspace = state.workspaces.filter(workspace => workspace.uid === uid);
return workspace.length ? workspace[0] : {};
},
getConnected: state => {
return state.workspaces
.filter(workspace => workspace.connected)
.map(workspace => workspace.uid);
}
},
mutations: {
SELECT_WORKSPACE (state, uid) {
2020-05-18 18:06:32 +02:00
state.selected_workspace = uid;
},
2020-05-19 18:06:05 +02:00
ADD_CONNECTED (state, { uid, structure }) {
2020-05-20 18:00:14 +02:00
state.workspaces = state.workspaces.map(workspace => workspace.uid === uid ? { ...workspace, structure, connected: true } : workspace);
},
REMOVE_CONNECTED (state, uid) {
2020-05-20 18:00:14 +02:00
state.workspaces = state.workspaces.map(workspace => workspace.uid === uid ? { ...workspace, structure: {}, connected: false } : workspace);
},
2020-05-31 17:56:33 +02:00
REFRESH_STRUCTURE (state, { uid, structure }) {
2020-05-20 18:00:14 +02:00
state.workspaces = state.workspaces.map(workspace => workspace.uid === uid ? { ...workspace, structure } : workspace);
2020-05-18 18:06:32 +02:00
},
ADD_WORKSPACE (state, workspace) {
state.workspaces.push(workspace);
2020-06-05 21:00:15 +02:00
},
CHANGE_BREADCRUMBS (state, { uid, breadcrumbs }) {
state.workspaces = state.workspaces.map(workspace => workspace.uid === uid ? { ...workspace, breadcrumbs } : workspace);
},
NEW_TAB (state, uid) {
const newTab = {
uid: uidGen(),
2020-06-12 18:10:45 +02:00
selected: false,
type: 'query'
2020-06-05 21:00:15 +02:00
};
state.workspaces = state.workspaces.map(workspace => {
if (workspace.uid === uid) {
return {
...workspace,
tabs: [...workspace.tabs, newTab]
};
}
else
return workspace;
});
2020-06-12 18:10:45 +02:00
},
SELECT_TAB (state, { uid, tab }) {
state.workspaces = state.workspaces.map(workspace => workspace.uid === uid ? { ...workspace, selected_tab: tab } : workspace);
}
},
actions: {
selectWorkspace ({ commit }, uid) {
commit('SELECT_WORKSPACE', uid);
},
2020-05-19 18:06:05 +02:00
async connectWorkspace ({ dispatch, commit }, connection) {
try {
const { status, response } = await Connection.connect(connection);
if (status === 'error')
dispatch('notifications/addNotification', { status, message: response }, { root: true });
else
2020-05-31 17:56:33 +02:00
commit('ADD_CONNECTED', { uid: connection.uid, structure: remapStructure(response) });
2020-05-19 18:06:05 +02:00
}
catch (err) {
dispatch('notifications/addNotification', { status: 'error', message: err.stack }, { root: true });
}
},
2020-05-20 18:00:14 +02:00
async refreshStructure ({ dispatch, commit }, uid) {
try {
const { status, response } = await Connection.refresh(uid);
if (status === 'error')
dispatch('notifications/addNotification', { status, message: response }, { root: true });
else
2020-05-31 17:56:33 +02:00
commit('REFRESH_STRUCTURE', { uid, structure: remapStructure(response) });
2020-05-20 18:00:14 +02:00
}
catch (err) {
dispatch('notifications/addNotification', { status: 'error', message: err.stack }, { root: true });
}
},
2020-06-05 21:00:15 +02:00
removeConnected ({ commit }, uid) {
2020-05-18 18:06:32 +02:00
Connection.disconnect(uid);
commit('REMOVE_CONNECTED', uid);
2020-06-13 18:14:32 +02:00
commit('SELECT_TAB', { uid, tab: 0 });
2020-05-18 18:06:32 +02:00
},
2020-06-05 21:00:15 +02:00
addWorkspace ({ commit, dispatch, getters }, uid) {
2020-05-18 18:06:32 +02:00
const workspace = {
uid,
2020-05-19 18:06:05 +02:00
connected: false,
2020-06-13 18:14:32 +02:00
selected_tab: 0,
2020-06-12 18:10:45 +02:00
tabs: [{ uid: 1, type: 'table' }],
2020-06-05 21:00:15 +02:00
structure: {},
breadcrumbs: {}
2020-05-18 18:06:32 +02:00
};
2020-06-05 21:00:15 +02:00
2020-05-18 18:06:32 +02:00
commit('ADD_WORKSPACE', workspace);
2020-06-05 21:00:15 +02:00
2020-06-12 18:10:45 +02:00
if (getters.getWorkspace(uid).tabs.length < 2)
2020-06-05 21:00:15 +02:00
dispatch('newTab', uid);
},
changeBreadcrumbs ({ commit, getters }, payload) {
commit('CHANGE_BREADCRUMBS', { uid: getters.getSelected, breadcrumbs: payload });
},
newTab ({ commit }, uid) {
commit('NEW_TAB', uid);
2020-06-12 18:10:45 +02:00
},
selectTab ({ commit }, payload) {
commit('SELECT_TAB', payload);
}
}
};