import Vue from 'vue' import axios from 'axios' export default { namespaced: true, state: { settings: { collapsedView: localStorage.getItem('settings.groups.collapsedView') === 'true' }, groupList: [], clientList: [], configList: [], tabChain: [], activeTab: 0, dialog: { show: false, info: {} }, adjustTabSlider: false }, mutations: { setCollapsedView (state, value) { state.settings.collapsedView = value localStorage.setItem('settings.groups.collapsedView', value) }, setGroupList: (state, list) => { state.groupList = list }, setClientList: (state, list) => { state.clientList = list }, setConfigList: (state, list) => { state.configList = list }, setActiveTab (state, index) { state.activeTab = index }, setShowAll (state, { index, value }) { state.tabChain[index].tabShowAll = value state.tabChain[index].autoGoto = false }, deleteFromTabChain (state, { index, count }) { state.tabChain.splice(index, count) }, adjustTabSlider (state) { state.adjustTabSlider = true }, setTab (state, { index, item }) { if (state.tabChain.length > index + 1 && (state.tabChain[index].tabType !== item.tabType || state.tabChain[index].id !== item.id)) { state.tabChain = state.tabChain.slice(0, index + 1) } state.tabChain.splice(index, 1, item) if (state.adjustTabSlider && index === state.activeTab) { state.adjustTabSlider = false window.dispatchEvent(new Event('resize')) } }, insertTab (state, { index, item }) { state.tabChain.splice(1, index - 1, item) if (state.adjustTabSlider && (index - 1) === state.activeTab) { state.adjustTabSlider = false window.dispatchEvent(new Event('resize')) } }, setTabLoading (state, index) { if (state.tabChain.length > index) Vue.set(state.tabChain[index], 'loading', true) }, setDialog (state, { show, info }) { if (info !== undefined) state.dialog.info = info if (show !== undefined) state.dialog.show = show } }, actions: { loadConfigList (context) { axios.get('/api/ipxeconfigs').then(result => { context.commit('setConfigList', result.data.map(x => ({ id: x.id, name: x.name || x.id }))) }) }, loadGroupList (context) { axios.get('/api/groups?path').then(response => { context.commit('setGroupList', Object.freeze(response.data)) }) }, loadClientList (context) { axios.get('/api/clients?path').then(response => { context.commit('setClientList', Object.freeze(response.data)) }) }, loadLists (context) { context.dispatch('loadGroupList') context.dispatch('loadClientList') context.dispatch('loadConfigList') }, async loadGroup (context, { id, name, tabIndex, switchTab, asParent, gotoInfo, autoGoto }) { const tabChain = context.state.tabChain const showAll = tabChain.length > tabIndex && tabChain[tabIndex].id === id && tabChain[tabIndex].tabShowAll const insert = asParent && tabChain.length > tabIndex && tabIndex >= 1 && tabChain[tabIndex - 1].id !== id if (asParent && tabChain.length > tabIndex && tabChain[tabIndex - 1].id === id) tabIndex -= 1 if (insert || tabChain.length <= tabIndex || tabChain[tabIndex].id !== id) { if (insert) context.commit('setActiveTab', 2) context.commit(insert ? 'insertTab' : 'setTab', { index: tabIndex, item: { id, name, tabType: 'group', tabShowAll: showAll, subgroups: [], clients: [] } }) } if (insert) tabIndex = 1 context.commit('setTabLoading', tabIndex) const srcTabIndex = context.state.activeTab if (switchTab) context.commit('setActiveTab', tabIndex) try { const res = await axios.get('/api/groups/' + id + (showAll ? '?all' : '')) res.data.tabType = 'group' res.data.tabShowAll = showAll res.data.subgroups = Object.freeze(res.data.subgroups) res.data.gotoInfo = asParent || gotoInfo res.data.autoGoto = autoGoto if (id > 0) { const configRes = await axios.get('/api/configloader/groups/' + id + '?list') res.data.configPath = configRes.data } context.commit('setTab', { index: tabIndex, item: res.data }) } catch (e) { if (switchTab) context.commit('setActiveTab', srcTabIndex) context.commit('deleteFromTabChain', { index: tabIndex, count: insert ? 1 : tabChain.length - tabIndex }) } }, async loadClient (context, { id, name, tabIndex, switchTab }) { if (context.state.tabChain.length <= tabIndex || context.state.tabChain[tabIndex].id !== id) { context.commit('setTab', { index: tabIndex, item: { id, name, tabType: 'client' } }) } const srcTabIndex = context.state.activeTab if (switchTab) context.commit('setActiveTab', tabIndex) try { const res = await axios.get('/api/clients/' + id) res.data.tabType = 'client' const configRes = await axios.get('/api/configloader/' + (res.data.uuid || '') + '?list') res.data.configPath = configRes.data context.commit('setTab', { index: tabIndex, item: res.data }) } catch (e) { if (switchTab) context.commit('setActiveTab', srcTabIndex) context.commit('deleteFromTabChain', { index: tabIndex, count: context.state.tabChain.length - tabIndex }) } }, reload (context) { context.dispatch('loadLists') context.state.tabChain.forEach((item, index) => { if (item.id === 'create') return if (item.tabType === 'group') context.dispatch('loadGroup', { id: item.id, tabIndex: index }) else if (item.tabType === 'client') context.dispatch('loadClient', { id: item.id, tabIndex: index }) }) }, saveGroup (context, { id, data, parents, ipranges, tabIndex, callback }) { const parentIds = parents.map(x => x.id) const url = id === 'create' ? '/api/groups' : '/api/groups/' + id axios.post(url, { data, parentIds, ipranges }).then(res => { if (res.data.id) { if (callback) callback(res.data.id) context.commit('setTab', { index: tabIndex, item: { ...context.state.tabChain[tabIndex], ...data, id: res.data.id, parents, ipranges } }) if (parentIds && tabIndex > 1 && !parentIds.includes(context.state.tabChain[tabIndex - 1].id)) { context.commit('deleteFromTabChain', { index: 1, count: tabIndex - 1 }) context.commit('setActiveTab', 1) } context.dispatch('reload') } }) }, saveClient (context, { id, data, groups, tabIndex, callback }) { const groupIds = groups.map(x => x.id) const url = id === 'create' ? '/api/clients' : '/api/clients/' + id axios.post(url, { data, groupIds }).then(res => { if (res.data.id) { if (callback) callback(res.data.id) context.commit('setTab', { index: tabIndex, item: { ...context.state.tabChain[tabIndex], ...data, id: res.data.id, groups } }) if (groupIds && tabIndex > 1 && !groupIds.includes(context.state.tabChain[tabIndex - 1].id)) { context.commit('deleteFromTabChain', { index: 1, count: tabIndex - 1 }) context.commit('setActiveTab', 1) } context.dispatch('reload') } }) }, deleteGroups (context, { selected, callback }) { const ids = selected.map(x => x.id) axios.post('/api/groups/?delete', { ids }).then(() => { var i = 1 while (i < context.state.tabChain.length) { if (context.state.tabChain[i].tabType === 'group' && ids.includes(context.state.tabChain[i].id)) { context.commit('deleteFromTabChain', { index: i, count: context.state.tabChain.length - i }) break } i++ } context.dispatch('reload') if (callback) callback() }) }, deleteClients (context, { selected, callback, backends }) { const ids = selected.map(x => x.id) const backendIds = backends.filter(x => x.selected).map(x => x.id) axios.post('/api/clients/?delete', { ids, backendIds }).then(() => { const index = context.state.tabChain.length - 1 const item = context.state.tabChain[index] if (item.tabType === 'client' && ids.includes(item.id)) context.commit('deleteFromTabChain', { index, count: 1 }) context.dispatch('reload') if (callback) callback() }) }, removeSubroups (context, { tabIndex, selected, callback }) { const id = context.state.tabChain[tabIndex].id const ids = selected.map(x => x.id) axios.post('/api/groups/' + id + '/subgroups/?delete', { ids }).then(() => { if (context.state.tabChain.length > tabIndex + 1 && context.state.tabChain[tabIndex + 1].tabType === 'group' && ids.includes(context.state.tabChain[tabIndex + 1].id)) { context.commit('deleteFromTabChain', { index: tabIndex + 1, count: context.state.tabChain.length - (tabIndex + 1) }) } context.dispatch('reload') if (callback) callback() }) }, removeClients (context, { tabIndex, selected, callback }) { const id = context.state.tabChain[tabIndex].id const ids = selected.map(x => x.id) axios.post('/api/groups/' + id + '/clients/?delete', { ids }).then(() => { if (context.state.tabChain.length > tabIndex + 1 && context.state.tabChain[tabIndex + 1].tabType === 'client' && ids.includes(context.state.tabChain[tabIndex + 1].id)) { context.commit('deleteFromTabChain', { index: tabIndex + 1, count: 1 }) } context.dispatch('reload') if (callback) callback() }) }, addSubgroups (context, { tabIndex, selected, callback }) { const id = context.state.tabChain[tabIndex].id const ids = selected.map(x => x.id) axios.post('/api/groups/' + id + '/subgroups', { ids }).then(() => { context.dispatch('reload') if (callback) callback() }) }, addClients (context, { tabIndex, selected, callback }) { const id = context.state.tabChain[tabIndex].id const ids = selected.map(x => x.id) axios.post('/api/groups/' + id + '/clients', { ids }).then(() => { context.dispatch('reload') if (callback) callback() }) } } }