Vue

by David Marshall

HTML

<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script>
<div id="app">
  <h2>Mongo Gen:</h2>
  <ol>
    <li v-for="(role,ridx) in roles">
      <label>
        <input type="checkbox" @click="allRole(ridx)">
        {{role}}
      </label>
    </li>
  </ol>
  <input v-model="username" placeholder="username">
  <input v-model="email" placeholder="email">
  <div v-for="(site,sidx) in sites">
    <h3>{{site.name}}</h3>
    <input type="checkbox" @click="toggleSite(sidx)">
    <ol>
      <li v-for="(role,ridx) in roles">
        <label>
          <input type="checkbox" v-model="site.roles" :value="role">
          {{role}}
        </label>
      </li>
    </ol>
  </div>
  <span id="result">{{getQuery()}}</span>
</div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

del {
  color: rgba(0, 0, 0, 0.3);
}

Vue

new Vue({
  el: "#app",
  data: {
  	sites: [{name:'NSAG',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'NSAH',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'NSAP',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'NSAW',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'NSAS',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'NSAT',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'UDC',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}, {name:'F6',roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor']}],
    roles: ['Admin', 'Security Rep User','Security Rep Standard','Security Rep Super','Sponsor','Contractor','Visitor'],
    username:'',
    email:''
  },
  methods: {
  	getSites(){
    	return this.sites.filter(site=>site.roles.length>=1);
    },
    toggleSite(sidx){
    	if(this.sites[sidx].roles.length===this.roles.length){
      	this.sites[sidx].roles=[]
      }else{
      	this.sites[sidx].roles=[...this.roles]
      }
    },
    allRole(ridx){
    	this.sites.map(site=>{
      	if(!site.roles.includes(this.roles[ridx])){
        	site.roles.push(this.roles[ridx])
        }
        return site
      })
    },
    getQuery(){
    	return `db.users.update({${this.username==''?`email:'${this.email}'`:`sid:'${this.username}'`}},{$set:{sites:${JSON.stringify(this.getSites())}},$unset:{roles:1}})`
    }
  }
})