This commit is contained in:
James Cole
2021-03-22 06:45:13 +01:00
parent 7f48a1b6ee
commit abb0f3d2be
15 changed files with 836 additions and 2098 deletions

View File

@@ -26,7 +26,6 @@ namespace FireflyIII\Api\V1\Controllers\Autocomplete;
use FireflyIII\Api\V1\Controllers\Controller; use FireflyIII\Api\V1\Controllers\Controller;
use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest; use FireflyIII\Api\V1\Requests\Autocomplete\AutocompleteRequest;
use FireflyIII\Models\ObjectGroup;
use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBank;
use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Account\AccountRepositoryInterface;
use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface;
@@ -38,7 +37,7 @@ use Illuminate\Http\JsonResponse;
*/ */
class PiggyBankController extends Controller class PiggyBankController extends Controller
{ {
private AccountRepositoryInterface $accountRepository; private AccountRepositoryInterface $accountRepository;
private PiggyBankRepositoryInterface $piggyRepository; private PiggyBankRepositoryInterface $piggyRepository;
/** /**
@@ -76,19 +75,9 @@ class PiggyBankController extends Controller
/** @var PiggyBank $piggy */ /** @var PiggyBank $piggy */
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;
$groupTitle = null;
$groupId = null;
/** @var ObjectGroup $group */
$group = $piggy->objectGroups()->first();
if (null !== $group) {
$groupTitle = $group->title;
$groupId = (string)$group->id;
}
$response[] = [ $response[] = [
'id' => (string)$piggy->id, 'id' => (string)$piggy->id,
'name' => $piggy->name, 'name' => $piggy->name,
'object_group_id' => $groupId,
'object_group_title' => $groupTitle,
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_name' => $currency->name, 'currency_name' => $currency->name,
'currency_code' => $currency->code, 'currency_code' => $currency->code,
@@ -114,23 +103,13 @@ class PiggyBankController extends Controller
foreach ($piggies as $piggy) { foreach ($piggies as $piggy) {
$currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency; $currency = $this->accountRepository->getAccountCurrency($piggy->account) ?? $defaultCurrency;
$currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0'; $currentAmount = $this->piggyRepository->getRepetition($piggy)->currentamount ?? '0';
$groupTitle = null; $response[] = [
$groupId = null;
/** @var ObjectGroup $group */
$group = $piggy->objectGroups()->first();
if (null !== $group) {
$groupTitle = $group->title;
$groupId = (string)$group->id;
}
$response[] = [
'id' => (string)$piggy->id, 'id' => (string)$piggy->id,
'name' => $piggy->name, 'name' => $piggy->name,
'name_with_balance' => sprintf( 'name_with_balance' => sprintf(
'%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false), '%s (%s / %s)', $piggy->name, app('amount')->formatAnything($currency, $currentAmount, false),
app('amount')->formatAnything($currency, $piggy->targetamount, false), app('amount')->formatAnything($currency, $piggy->targetamount, false),
), ),
'object_group_id' => $groupId,
'object_group_title' => $groupTitle,
'currency_id' => $currency->id, 'currency_id' => $currency->id,
'currency_name' => $currency->name, 'currency_name' => $currency->name,
'currency_code' => $currency->code, 'currency_code' => $currency->code,

View File

@@ -387,7 +387,6 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface
/** /**
* @inheritDoc * @inheritDoc
* TODO need to sort by group order as well.
*/ */
public function searchPiggyBank(string $query, int $limit): Collection public function searchPiggyBank(string $query, int $limit): Collection
{ {

View File

@@ -27,9 +27,7 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<p v-if="links.length === 0"> <p v-if="links.length === 0">
<button class="btn btn-default btn-xs" :data-target="'#linkModal' + index" @click="resetModal" data-toggle="modal"><i class="fas fa-plus"></i> Add transaction <button class="btn btn-default btn-xs" data-target="#linkModal" @click="resetModal" data-toggle="modal"><i class="fas fa-plus"></i> Add transaction link</button>
link
</button>
</p> </p>
<ul v-if="links.length > 0" class="list-group"> <ul v-if="links.length > 0" class="list-group">
<li v-for="(transaction, index) in links" class="list-group-item" v-bind:key="index"> <li v-for="(transaction, index) in links" class="list-group-item" v-bind:key="index">
@@ -66,13 +64,13 @@
</li> </li>
</ul> </ul>
<div v-if="links.length > 0" class="form-text"> <div v-if="links.length > 0" class="form-text">
<button class="btn btn-default" @click="resetModal" :data-target="'#linkModal' + index" data-toggle="modal"><i class="fas fa-plus"></i></button> <button class="btn btn-default" @click="resetModal" data-target="#linkModal" data-toggle="modal"><i class="fas fa-plus"></i></button>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- modal --> <!-- modal -->
<div :id="'linkModal' + index" class="modal" tabindex="-1" :ref="'linkModal' + index"> <div id="linkModal" class="modal" tabindex="-1" ref="linkModal">
<div class="modal-dialog modal-lg"> <div class="modal-dialog modal-lg">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
@@ -307,7 +305,7 @@ export default {
} }
); );
}, },
resetModal: function () { resetModal: function() {
this.search(); this.search();
}, },
parseLinkTypes: function (data) { parseLinkTypes: function (data) {
@@ -334,7 +332,7 @@ export default {
} }
}, },
search: function () { search: function () {
if ('' === this.query) { if('' === this.query) {
this.searchResults = []; this.searchResults = [];
return; return;
} }
@@ -353,28 +351,11 @@ export default {
for (let ii in data.data[i].attributes.transactions) { for (let ii in data.data[i].attributes.transactions) {
if (data.data[i].attributes.transactions.hasOwnProperty(ii) && /^0$|^[1-9]\d*$/.test(ii) && ii <= 4294967294) { if (data.data[i].attributes.transactions.hasOwnProperty(ii) && /^0$|^[1-9]\d*$/.test(ii) && ii <= 4294967294) {
let current = data.data[i].attributes.transactions[ii]; let current = data.data[i].attributes.transactions[ii];
let copied = { current.transaction_group_id = parseInt(data.data[i].id);
transaction_journal_id: current.transaction_journal_id, current.selected = this.isJournalSelected(current.transaction_journal_id);
transaction_group_id: parseInt(data.data[i].id), current.link_type_id = this.getJournalLinkType(current.transaction_journal_id);
description: current.description, current.link_type_text = '';
type: current.type, this.searchResults.push(current);
amount: current.amount,
currency_code: current.currency_code,
source_id: current.source_id,
source_name: current.source_name,
destination_id: current.destination_id,
destination_name: current.destination_name,
selected: this.isJournalSelected(current.transaction_journal_id),
link_type_id: this.getJournalLinkType(current.transaction_journal_id),
link_type_text: '',
};
// current.transaction_group_id = parseInt(data.data[i].id);
// current.selected = this.isJournalSelected(current.transaction_journal_id);
// current.link_type_id = this.getJournalLinkType(current.transaction_journal_id);
// current.link_type_text = '';
this.searchResults.push(copied);
} }
} }
} }

View File

@@ -43,6 +43,7 @@ export default {
return { return {
notes: this.value, notes: this.value,
availableFields: this.customFields, availableFields: this.customFields,
emitEvent: true
} }
}, },
computed: { computed: {
@@ -55,13 +56,17 @@ export default {
}, },
watch: { watch: {
value: function (value) { value: function (value) {
this.emitEvent = false;
this.notes = value; this.notes = value;
}, },
customFields: function (value) { customFields: function (value) {
this.availableFields = value; this.availableFields = value;
}, },
notes: function (value) { notes: function (value) {
this.$emit('set-field', {field: 'notes', index: this.index, value: value}); if (true === this.emitEvent) {
this.$emit('set-field', {field: 'notes', index: this.index, value: value});
}
this.emitEvent = true;
} }
} }
} }

View File

@@ -33,16 +33,9 @@
name="piggy_bank_id[]" name="piggy_bank_id[]"
v-on:submit.prevent v-on:submit.prevent
> >
<optgroup v-for="group in this.piggyGroups" v-bind:key="group.title" :label="group.title"> <option v-for="piggy in this.piggyList" :label="piggy.name_with_balance" :value="piggy.id">{{ piggy.name_with_balance }}</option>
<option v-for="piggy in group.piggies" :label="piggy.name_with_balance" :value="piggy.id">{{ piggy.name_with_balance }}</option>
</optgroup>
</select> </select>
<!--
<span v-for="group in this.piggyList">"{{ group.title }}"<br>
</span>
-->
</div> </div>
<span v-if="errors.length > 0"> <span v-if="errors.length > 0">
<span v-for="error in errors" class="text-danger small">{{ error }}<br/></span> <span v-for="error in errors" class="text-danger small">{{ error }}<br/></span>
@@ -57,8 +50,7 @@ export default {
name: "TransactionPiggyBank", name: "TransactionPiggyBank",
data() { data() {
return { return {
piggyGroups: [], piggyList: [],
piggyList: {},
piggy_bank_id: this.value, piggy_bank_id: this.value,
emitEvent: true emitEvent: true
} }
@@ -68,33 +60,12 @@ export default {
}, },
methods: { methods: {
collectData() { collectData() {
// add empty group: this.piggyList.push(
this.piggyGroups.push(
{ {
id: 0, id: 0,
title: this.$t('firefly.default_group_title_name'), name_with_balance: this.$t('firefly.no_piggy_bank'),
piggies: []
} }
); );
// empty piggy list:
// this.piggyList['0'] = {
// title: this.$t('firefly.default_group_title_name'),
// piggies: [
// {
// id: 0,
// name_with_balance: this.$t('firefly.no_piggy_bank'),
// }
// ]
// };
// this.piggyList.push(
// {
// id: 0,
// name_with_balance: this.$t('firefly.no_piggy_bank'),
// }
// );
this.getPiggies(); this.getPiggies();
}, },
getPiggies() { getPiggies() {
@@ -104,67 +75,18 @@ export default {
} }
); );
}, },
groupExists: function (title) {
for (let i in this.piggyGroups) {
if (this.piggyGroups.hasOwnProperty(i) && /^0$|^[1-9]\d*$/.test(i) && i <= 4294967294) {
let current = this.piggyGroups[i];
if (current.title === title) {
return true;
}
}
}
return false;
},
getGroupIndex: function (groupId) {
for (let i in this.piggyGroups) {
if (this.piggyGroups.hasOwnProperty(i) && /^0$|^[1-9]\d*$/.test(i) && i <= 4294967294) {
let current = this.piggyGroups[i];
if (current.id === groupId) {
return i;
}
}
}
return 0;
},
parsePiggies(data) { parsePiggies(data) {
for (let key in data) { for (let key in data) {
if (data.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) { if (data.hasOwnProperty(key) && /^0$|^[1-9]\d*$/.test(key) && key <= 4294967294) {
let current = data[key]; let current = data[key];
let groupId = current.object_group_id ?? '0'; this.piggyList.push(
if ('0' !== groupId) { {
if (this.groupExists(current.object_group_title)) { id: parseInt(current.id),
let currentGroup = this.getGroupIndex(parseInt(current.object_group_id)); name_with_balance: current.name_with_balance
this.piggyGroups[currentGroup].piggies.push(current); }
} );
if (!this.groupExists(current.object_group_title)) {
this.piggyGroups.push(
{
id: parseInt(current.object_group_id),
title: current.object_group_title,
piggies: [current]
}
);
}
}
if ('0' === groupId) {
this.piggyGroups[0].piggies.push(current);
}
// //console.log('group id is ' + groupId);
// if ('0' !== groupId) {
// this.piggyList[groupId] = this.piggyList[groupId] ? this.piggyList[groupId] : {title: current.object_group_title, piggies: []};
// }
// this.piggyList[groupId].piggies.push(
// {
// id: parseInt(current.id),
// name_with_balance: current.name_with_balance
// }
// );
} }
} }
//console.log(this.piggyList);
}, },
}, },
watch: { watch: {

View File

@@ -20,7 +20,4 @@
// slightly darker blue to match the logo: // slightly darker blue to match the logo:
$blue: #1E6581 !default; $blue: #1E6581 !default;
// other green to match the logo:
$green: #64B624 !default;

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,23 +0,0 @@
{% extends './v2/layout/default' %}
{% block breadcrumbs %}
{{ Breadcrumbs.render }}
{% endblock %}
{% block content %}
<!-- Small boxes (Stat box) -->
<!-- Main row -->
<div id="transactions_edit"></div>
<!-- /.row (main row) -->
{% endblock %}
{% block styles %}
{% endblock %}
{% block scripts %}
<script type="text/javascript">
// this is a terrible hack.
var previousURL = '{{ previousUri }}';
</script>
<script src="v2/js/transactions/edit.js" nonce="{{ JS_NONCE }}"></script>
{% endblock %}