AccountForm.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  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. :readonly="readonly"
  16. :fieldTypes="field.fieldTypes"/>
  17. <button @click="submit()" type="button" class="button" v-if="!readonly">
  18. Submit
  19. </button>
  20. </form>
  21. </template>
  22. <script>
  23. import Field from '../components/Field.vue';
  24. import io from "../../io.js";
  25. export default {
  26. components: { Field },
  27. data: function() {
  28. return {
  29. fields: [],
  30. account: {},
  31. schema: {},
  32. autosuggest: {},
  33. dependencies: {}
  34. };
  35. },
  36. methods: {
  37. submit() {
  38. let account = JSON.parse(JSON.stringify(this.account));
  39. let fields = JSON.parse(JSON.stringify(this.templateAccount)).fields;
  40. Object.keys(account.fields).forEach(fieldId => {
  41. if (this.$refs[fieldId]) fields[fieldId] = this.$refs[fieldId][0].entries;
  42. });
  43. account.fields = fields;
  44. this.onSubmit(account);
  45. },
  46. dependencyChecksOut(fieldId) {
  47. if (!this.dependencies[fieldId]) return true;
  48. let dependency = this.dependencies[fieldId];
  49. let dependencyFieldId = dependency.fieldId;
  50. if (!this.dependencyChecksOut(dependencyFieldId)) return false;
  51. let dependencyEval = dependency.eval.replace("{fields}", "this.account.fields");
  52. try {
  53. return eval(dependencyEval);
  54. } catch(err) {
  55. console.log("Eval error", err);
  56. return false;
  57. }
  58. return false;
  59. },
  60. onFieldChange(fieldId) {
  61. return () => {
  62. this.$set(this.account.fields, fieldId, this.$refs[fieldId][0].entries);
  63. };
  64. },
  65. initializeAccount() {
  66. if (!this.initialAccount) {
  67. this.$set(this.account, "fields", {});
  68. this.$set(this.account, "version", this.schema.version);
  69. this.fields.forEach(field => {
  70. let defaultObject = {};
  71. field.fieldTypes.forEach(fieldType => {
  72. if (fieldType.type === "text" || fieldType.type === "select") defaultObject[fieldType.fieldTypeId] = "";
  73. else if (fieldType.type === "checkbox") defaultObject[fieldType.fieldTypeId] = false;
  74. });
  75. this.$set(this.account.fields, field.fieldId, []);
  76. for(let i = 0; i < field.minEntries; i++) {
  77. this.account.fields[field.fieldId].push(defaultObject);
  78. }
  79. });
  80. this.templateAccount = this.account;
  81. } else {
  82. this.account = this.initialAccount;
  83. this.templateAccount = this.initialAccount;
  84. }
  85. }
  86. },
  87. props: {
  88. onSubmit: Function,
  89. initialAccount: Object,
  90. readonly: Boolean
  91. },
  92. mounted() {
  93. io.getSocket(socket => {
  94. this.socket = socket;
  95. if (this.initialAccount) {
  96. socket.emit("accountSchema.getByVersion", this.initialAccount.version, res => {
  97. this.fields = res.schema.fields;
  98. this.dependencies = (res.schema.dependencies) ? res.schema.dependencies : {};
  99. this.initializeAccount();
  100. });
  101. } else {
  102. socket.emit("accountSchema.getLatest", res => {
  103. this.fields = res.schema.fields;
  104. this.schema = res.schema;
  105. this.dependencies = (res.schema.dependencies) ? res.schema.dependencies : {};
  106. this.initializeAccount();
  107. });
  108. }
  109. socket.emit("util.getAutosuggest", res => {
  110. this.autosuggest = res.autosuggest;
  111. });
  112. });
  113. }
  114. };
  115. </script>
  116. <style lang="scss" scoped>
  117. form {
  118. width: 400px;
  119. }
  120. </style>