credential.vue 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <template>
  2. <div class="bg-lightgray m-1 p-2 border rounded container-fluid">
  3. <modal :id="'credential'+this.data.credid+'editModal'" tabindex="-1" role="dialog" :aria-labelledby="'credential'+this.data.credid+'editModalLabel'">
  4. <h5 slot="header" class="modal-title" id="credentialeditModalLabel">
  5. Edit Credential
  6. </h5>
  7. <div slot="body">
  8. <div class="form-group">
  9. <label for="username">Username</label>
  10. <input type="text" :name="'username'+this.data.credid" :id="'username'+this.data.credid" class="form-control credential" v-model="this.data.creduser">
  11. </div>
  12. <div class="form-group">
  13. <label for="password">Password</label>
  14. <input type="text" :name="'password'+this.data.credid" :id="'password'+this.data.credid" class="form-control credential" v-model="this.data.credpass">
  15. <button type="button" class="btn btn-secondary" @click="getRandomPassword()">Generate Random</button>
  16. </div>
  17. <div class="form-group"></div>
  18. </div>
  19. <div slot="footer">
  20. <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
  21. <button type="button" class="btn btn-primary" @click="updateCredential()">Save</button>
  22. </div>
  23. </modal>
  24. <div class="row no-gutters">
  25. <div class="h5 col-3 text-left">{{this.data.creddesc}}</div>
  26. <div class="col-9 text-right">{{this.data.creddate}}</div>
  27. </div>
  28. <div class="row">
  29. <div class="col-lg-9">
  30. <div>
  31. <label for="username"><i class="fas fa-fw fa-user"></i></label>
  32. <input type="text" v-bind:id="'username' + this.data.credid" class="border-0 credential" v-bind:value=this.data.creduser readonly/>
  33. <button v-bind:id="'btn-username' + this.data.credid" class="btn-clip btn btn-sm btn-primary rounded-pill" v-bind:data-clipboard-target="'#username' + this.data.credid">
  34. <i class="far fa-clone"></i>
  35. </button>
  36. </div>
  37. <div>
  38. <label for="password"><i class="fas fa-fw fa-key"></i></label>
  39. <input type="text" v-bind:id="'password' + this.data.credid" class="border-0 credential" v-bind:value=this.data.credpass readonly/>
  40. <button v-bind:id="'btn-password' + this.data.credid" class="btn-clip btn btn-sm btn-primary rounded-pill" v-bind:data-clipboard-target="'#password' + this.data.credid">
  41. <i class="far fa-clone"></i>
  42. </button>
  43. </div>
  44. </div>
  45. <div class="btn-group col-lg-2 align-self-end w-25 w-lg-auto" role="group" aria-label="Edit and Delete">
  46. <button type="button" class="btn btn-sm btn-secondary p-lg-1" data-toggle="modal" :data-target="'#credential'+this.data.credid+'editModal'"><i class="fas fa-fw fa-edit"></i></button>
  47. <button type="button" class="btn btn-sm btn-danger p-lg-1"><i class="fas fa-fw fa-trash-alt"></i></button>
  48. </div>
  49. </div>
  50. </div>
  51. </template>
  52. <script>
  53. export default {
  54. props: ['credential'],
  55. data() {
  56. return {
  57. data: JSON.parse(this.credential)
  58. }
  59. },
  60. mounted() {
  61. Echo.channel('credentials')
  62. .listen('CredentialUpdated', (e) => {
  63. this.data = JSON.parse(e.data);
  64. });
  65. },
  66. methods: {
  67. rndStr(len) {
  68. let text = ""
  69. let chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%"
  70. for( let i=0; i < len; i++ ) {
  71. text += chars.charAt(Math.floor(Math.random() * chars.length))
  72. }
  73. return text
  74. },
  75. getRandomPassword() {
  76. this.data.credpass = this.rndStr(16);
  77. },
  78. updateCredential() {
  79. axios.put('/api/credentials/' + this.data.credid, this.data).then(response => {}).catch(error =>{console.error(error)});
  80. $('#credential'+this.data.credid+'editModal').modal('hide');
  81. }
  82. }
  83. }
  84. </script>