AccountForm.vue 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <form>
  3. <p><b>Schema version</b>: {{account.version}}</p>
  4. <field
  5. v-for="field in fields"
  6. v-if="dependencyChecksOut(field.fieldId)"
  7. :name="field.name"
  8. :minEntries="field.minEntries"
  9. :maxEntries="field.maxEntries"
  10. :initialEntries="account.fields[field.fieldId]"
  11. :autosuggest="autosuggest"
  12. :key="field.fieldId"
  13. :ref="field.fieldId"
  14. :onChange="onFieldChange(field.fieldId)"
  15. :fieldTypes="field.fieldTypes"/>
  16. <button @click="submit()" type="button" class="button">
  17. Submit
  18. </button>
  19. </form>
  20. </template>
  21. <script>
  22. import Field from '../components/Field.vue';
  23. import io from "../../io.js";
  24. export default {
  25. components: { Field },
  26. data: function() {
  27. return {
  28. fields: [],
  29. account: {},
  30. autosuggest: {},
  31. dependencies: {}
  32. };
  33. },
  34. methods: {
  35. submit() {
  36. let account = JSON.parse(JSON.stringify(this.account));
  37. let fields = JSON.parse(JSON.stringify(this.templateAccount)).fields;
  38. Object.keys(account.fields).forEach(fieldId => {
  39. if (this.$refs[fieldId]) fields[fieldId] = this.$refs[fieldId][0].entries;
  40. });
  41. account.fields = fields;
  42. this.onSubmit(account);
  43. },
  44. dependencyChecksOut(fieldId) {
  45. if (!this.dependencies[fieldId]) return true;
  46. let dependency = this.dependencies[fieldId];
  47. let dependencyFieldId = dependency.fieldId;
  48. if (!this.dependencyChecksOut(dependencyFieldId)) return false;
  49. let dependencyEval = dependency.eval.replace("{fields}", "this.account.fields");
  50. return eval(dependencyEval);
  51. },
  52. onFieldChange(fieldId) {
  53. return () => {
  54. this.account.fields[fieldId] = this.$refs[fieldId][0].entries;
  55. };
  56. }
  57. },
  58. props: {
  59. onSubmit: Function,
  60. initialAccount: Object
  61. },
  62. mounted() {
  63. io.getSocket(socket => {
  64. this.socket = socket;
  65. socket.emit("accountSchema.getLatest", res => {
  66. this.fields = res.schema.fields;
  67. this.dependencies = res.schema.dependencies;
  68. if (!this.initialAccount) {
  69. this.account.fields = {};
  70. this.account.version = res.schema.version;
  71. this.fields.forEach(field => {
  72. let defaultObject = {};
  73. field.fieldTypes.forEach(fieldType => {
  74. if (fieldType.type === "text" || fieldType.type === "select") defaultObject[fieldType.fieldTypeId] = "";
  75. else if (fieldType.type === "checkbox") defaultObject[fieldType.fieldTypeId] = false;
  76. });
  77. this.account.fields[field.fieldId] = [];
  78. for(let i = 0; i < field.minEntries; i++) {
  79. this.account.fields[field.fieldId].push(defaultObject);
  80. }
  81. });
  82. this.templateAccount = this.account;
  83. } else {
  84. this.account = this.initialAccount;
  85. this.templateAccount = this.initialAccount;
  86. }
  87. });
  88. socket.emit("util.getAutosuggest", res => {
  89. this.autosuggest = res.autosuggest;
  90. });
  91. });
  92. }
  93. };
  94. </script>
  95. <style lang="scss" scoped>
  96. form {
  97. width: 400px;
  98. }
  99. </style>