summaryrefslogblamecommitdiffstats
path: root/webapp/src/store/groups.js
blob: 6c349f8ae9cd09d1bedc3785ac4db12a2e2f49ee (plain) (tree)
1
2
3
4
5
6
7
8
9
                     




                         


                                                                                     

                   
                   
                 
                 

                  
              

                          

              



                                                                  

                                                                
                                                                
                                                            



                                              
                                                                                         
                                                             
                                     

                                                                                                                                          
       
                                           



                                                               
      

                                               



                                                                     
      


                                                                                        
                                       
                                                      
                                                      


            
                              
                                                    

                                                                                                   
      







                                                                     
        
      


                                        
                                        
      
                                                                                                







                                                                                                                 
                                                                                               

          








                                                                                  
                                                
                                    



                                                                                           




                                                                                                                 
      








                                                                                                    

                                                                                                      



                                                                                                                  
       

                      
                                   
                                                       
                                        

                                                                                                            

        

                                                                              
                                                                       
                                                                  
                          
                                             









                                                  




                                                                                                          
         

        

                                                                    

                                                                         

                                             








                                                  




                                                                                                        
         
        
      
                                                    
                                         
                                                             



                                                                                                            
                 



                                  
                                

        
                                                               
                                         

                                                                          



                                                                                                                         
                                
        
      
                                                                

                                                    
                                                                                  


                                                                       


                                                                                                                              
                                

        
                                                               

                                                    
                                                                                


                                                                        


                                                                                 
                                

        
                                                              

                                                    
                                                                          
                                  
                                

        
                                                            

                                                    
                                                                        
                                  
                                
        


     
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').then(response => {
        context.commit('setGroupList', Object.freeze(response.data))
      })
    },
    loadClientList (context) {
      axios.get('/api/clients').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/test/group/' + 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/test/' + (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()
      })
    }
  }
}