summary history files

desktop/frontend/src/views/CreateTransaction.vue
<script>
import { CreateTransaction } from 'wailsjs/go/services/transactionService.js'
import { CreateSplit } from 'wailsjs/go/services/splitsService.js'
import { GetAccounts } from 'wailsjs/go/services/accountService.js'
import VueDatePicker from '@vuepic/vue-datepicker'
import '@vuepic/vue-datepicker/dist/main.css'
import { ref } from 'vue'

export default {
  components: { VueDatePicker },
  setup() {
    const date = ref(new Date());
    const format = (date) => {
      const day = date.getDate();
      const month = date.getMonth() + 1;
      const year = date.getFullYear();
      return `${day}/${month}/${year}`;
    }

    return {
      date,
      format,
    }
  },
  created() {
    this.$watch(
      () => this.$route.params,
      () => {
        this.getAccounts()
      },
      { immediate: true },
    )
  },
  data() {
    return {
      transaction: {
        memo: null,
      },
      splits: [
        {
          account: {
            id: null,
          },
          amount: 0.00,
        },
        {
          account: {
            id: null,
          },
          amount: 0.00,
        },
      ],
      accounts: [],
    }
  },
  computed: {
    amountInverse() {
      return this.transaction.amount * -1;
    },
  },
  beforeRouteUpdate: function(to, from, next) {
    this.accounts = this.getAccounts();
    next();
  },
  methods: {
    async getAccounts() {
      let accounts = [];
      const { success, msg, data } = await GetAccounts()
      if (!success) {
          $message.error(msg)
          return
      }
      for (const account of data) {
        accounts.push({
          id: account.id,
          name: account.name,
          description: account.description,
          account_type: {
            id: account.account_type.id,
            name: account.account_type.name,
          },
        })
      }
      this.accounts = accounts
    },

    async createTransaction() {
      const transactionResponse = await CreateTransaction(this.transaction.memo, this.date)

      let transaction = transactionResponse.data

      this.splits.forEach((split, index) => {
        CreateSplit(transaction.id, split.account.id, split.amount)
      });

      if (!transactionResponse.success) {
        $message.error(transactionResponse.msg)
      } else {
        $message.success(transactionResponse.msg)
        this.$router.push({name: 'get-transaction', params: { id: transaction.id }})
      }
      return
    },

  },
}
</script>

<template>
    <!-- Page Wrapper -->
    <div id="wrapper">
      <Sidebar/>
      <slot/>

        <!-- Content Wrapper -->
        <div id="content-wrapper" class="d-flex flex-column">

            <!-- Main Content -->
            <div id="content">

                <Topbar/>
                <slot/>


                <!-- Begin Page Content -->
                <div class="container-fluid">

                    <div class="card shadow mb-4">
                        <div class="card-header py-3">
                            <h6 class="m-0 font-weight-bold text-primary">Create Transaction</h6>
                        </div>
                        <div class="card-body">
                            <form v-on:submit.prevent="createTransaction">
                                <div class="mb-3">
                                    <label class="small mb-1">
                                      Date
                                    </label>
                                    <VueDatePicker v-model="date" :format="format" :preview-format="format" :enable-time-picker="false"></VueDatePicker>
                                </div>

                                <div class="mb-3">
                                    <label class="small mb-1">
                                      Memo
                                    </label>
                                    <input class="form-control" type="text" required v-model="transaction.memo">
                                </div>

                                <div class="row gx-3 mb-3">
                                    <!-- Form Group (increase account)-->
                                    <div class="col-md-6">
                                        <label class="small mb-1" for="inputFirstName">Account</label>
                                        <div class="mb-3">
                                            <select class="form-select" aria-label="Type" v-model="splits[0].account.id">
                                                <option selected="" disabled="">Select an account:</option>
                                                <option v-for="account in accounts" :value="account.id">{{ account.name }}</option>
                                            </select>
                                        </div>
                                    </div>

                                    <!-- Form Group (increase amount)-->
                                    <div class="col-md-6">
                                        <label class="small mb-1">Amount</label>
                                        <input class="form-control" v-model="splits[0].amount" name="amount" type="number" value="0.00" step="any">
                                    </div>
                                </div>

                                <!-- <div v-for="(split, index) in splits" :key="index" v-show="splits.length >= 2"> -->
                                <div class="row gx-3 mb-3" v-show="splits[0].amount != '0.00' && splits[0].account.id != null">
                                  <!-- Form Group (increase account)-->
                                  <div class="col-md-6">
                                      <label class="small mb-1" for="inputFirstName">Account</label>
                                      <div class="mb-3">
                                          <select class="form-select" aria-label="Type" v-model="splits[1].account.id">
                                              <option selected="" disabled="">Select an account:</option>
                                              <option v-for="account in accounts" :value="account.id">{{ account.name }}</option>
                                          </select>
                                      </div>
                                  </div>

                                  <!-- Form Group (increase amount)-->
                                  <div class="col-md-6">
                                      <label class="small mb-1">Amount</label>
                                      <input class="form-control" v-model="splits[1].amount" name="amount" type="number" step="any">
                                  </div>

                                </div>
                                <!-- </div> -->

                                <div class="row gx-3 jjmb-3">
                                  <div class="col-md-6" v-show="splits[1].amount != '0.00' && splits[0].amount != '0.00' && splits[0].account.id != null && splits[1].account.id != null && (splits[0].amount + splits[1].amount == 0)">
                                    <button class="btn btn-primary" type="submit">Create</button>
                                  </div>
                                </div>
                            </form>
                        </div>
                    </div>
                </div>
                <!-- /.container-fluid -->

            </div>
            <!-- End of Main Content -->

            <!-- Footer -->
            <footer class="sticky-footer bg-white">
            </footer>
            <!-- End of Footer -->

        </div>
        <!-- End of Content Wrapper -->

    </div>
    <!-- End of Page Wrapper -->
</template>