Expand modal, add copyright.

This commit is contained in:
James Cole
2026-08-22 08:18:33 +02:00
parent 77b71d668f
commit 42ca152bfb
20 changed files with 377 additions and 65 deletions
@@ -1,5 +1,26 @@
<?php
/*
* UpdatesAccountInformation.php
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
/*
@@ -1,5 +1,26 @@
<?php
/*
* HandlesNewUserRegistration.php
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
declare(strict_types=1);
/*
+20
View File
@@ -1 +1,21 @@
/*
* app.css
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+20
View File
@@ -1 +1,21 @@
/*
* layout.css
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
@@ -52,6 +52,7 @@ import {onMapClick} from './shared/on-map-click.js';
import {onMapZoom} from "./shared/on-map-zoom.js";
import {clearLocation} from './shared/clear-location.js';
import bootstrap from "bootstrap/dist/js/bootstrap.bundle.js";
import {removeSplit} from "./shared/remove-split.js";
let create = function () {
@@ -62,6 +63,9 @@ let create = function () {
// transactions are stored in "entries":
entries: [],
// links are stored in "links" for each transaction journal.
links: [],
// maps are stored in this array so they can be referred to.
maps: [],
markers: [],
@@ -155,6 +159,7 @@ let create = function () {
showMessageOrRedirectUser: showMessageOrRedirectUser,
parseErrors: parseErrors,
addSplit:addSplit,
removeSplit: removeSplit,
clearSourceAccount: clearSourceAccount,
clearDestinationAccount: clearDestinationAccount,
detectTransactionType: detectTransactionType,
@@ -347,12 +352,7 @@ let create = function () {
});
},
removeSplit(index) {
this.entries.splice(index, 1);
// fall back to index 0
const triggerFirstTabEl = document.querySelector('#split-0-tab')
triggerFirstTabEl.click();
},
}
}
@@ -54,6 +54,7 @@ import 'leaflet/dist/leaflet.css';
import {onMapClick} from './shared/on-map-click.js';
import {onMapZoom} from './shared/on-map-zoom.js';
import {clearLocation} from './shared/clear-location.js';
import {removeSplit} from "./shared/remove-split.js";
const urls = getUrls();
@@ -65,6 +66,7 @@ let transactions = function () {
// transactions are stored in "entries":
entries: [],
originals: [],
links: [],
// maps are stored in this array so they can be referred to.
maps: [],
@@ -113,6 +115,7 @@ let transactions = function () {
// properties for the entire transaction group
groupProperties: {
transactionType: 'unknown',
titleErrors: [],
title: null,
editTitle: null,
id: null, totalAmount: 0,
@@ -152,6 +155,7 @@ let transactions = function () {
onMapClick: onMapClick,
onMapZoom: onMapZoom,
clearLocation: clearLocation,
removeSplit: removeSplit,
// part of the account selection auto-complete
@@ -24,6 +24,7 @@ import {addAllAutocompleteToForm} from "./add-autocomplete.js";
export function addSplit() {
console.log('addSplit()');
this.entries.push(createEmptySplit());
this.links.push([]);
this.disableSplitAccounts();
this.addAllAutocompleteToForm();
this.addTabListener();
@@ -1,3 +1,23 @@
/*
* clear-fields.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {getAccount} from "./create-empty-split.js";
export function clearSourceAccount(index) {
@@ -1,3 +1,23 @@
/*
* clear-location.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function clearLocation(e) {
let index = parseInt(e.currentTarget.dataset.index);
@@ -1,3 +1,23 @@
/*
* detect-transaction-type.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function detectTransactionType() {
const sourceType = this.entries[0].source_account.type ?? 'unknown';
const destType = this.entries[0].destination_account.type ?? 'unknown';
@@ -1,3 +1,23 @@
/*
* determine-amount-currency.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function determineAmountCurrency(code) {
let list = [];
let currency;
@@ -1,3 +1,23 @@
/*
* display-map.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function displayMap(index) {
index = parseInt(index);
// show location?
@@ -1,4 +1,24 @@
/*
* load-custom-fields.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import Preferences from '../../../api/preferences/index.js';
export function loadCustomFields() {
@@ -1,4 +1,24 @@
/*
* on-map-click.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import L from 'leaflet';
import markerIcon from "leaflet/dist/images/marker-icon.png";
import markerRetinaIcon from "leaflet/dist/images/marker-icon-2x.png";
@@ -1,4 +1,24 @@
/*
* on-map-zoom.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import L from 'leaflet';
import markerIcon from "leaflet/dist/images/marker-icon.png";
import markerRetinaIcon from "leaflet/dist/images/marker-icon-2x.png";
@@ -0,0 +1,27 @@
/*
* remove-split.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
export function removeSplit(index) {
this.entries.splice(index, 1);
this.links.splice(index, 1);
// fall back to index 0
const triggerFirstTabEl = document.querySelector('#split-0-tab')
triggerFirstTabEl.click();
};
@@ -1,4 +1,24 @@
/*
* render-map.js
* Copyright (c) 2026 james@firefly-iii.org
*
* This file is part of Firefly III (https://github.com/firefly-iii).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import L from 'leaflet';
import markerIcon from "leaflet/dist/images/marker-icon.png";
import markerRetinaIcon from "leaflet/dist/images/marker-icon-2x.png";
@@ -1,4 +1,5 @@
<div :class="{'tab-pane fade pt-2':true, 'show active': index ===0 }" :id="'split-'+index+'-pane'" role="tabpanel" :aria-labelledby="'split-'+index+'-tab'" tabindex="0" x-init="addedSplit()">
<div :class="{'tab-pane fade pt-2':true, 'show active': index ===0 }" :id="'split-'+index+'-pane'" role="tabpanel"
:aria-labelledby="'split-'+index+'-tab'" tabindex="0" x-init="addedSplit()">
<div class="row mb-2">
<div class="col-xl-6 col-lg-6 col-md-12 col-xs-12 mb-2">
<!-- BASIC TRANSACTION INFORMATION -->
@@ -135,4 +136,78 @@
</div>
</div>
<!-- Modal for links -->
<div class="modal modal-xl fade" :id="'linksModal_' + index" data-bs-backdrop="static" tabindex="-1"
aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Transaction relations</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="container-fluid">
<div class="row">
<div class="col">
<p><em class="text-info">
Bla bla bla explanation.
</em>
<template x-if="0 === links[index].length">
<em>This transaction has no relations to other transactions (yet).</em>
</template>
</p>
</div>
</div>
<template x-if="links[index].length > 0">
<div class="row">
<div class="col">
<table class="table table-sm table-bordered">
<tr>
<th colspan="2">Transaction relations</th>
</tr>
<tr>
<td>Pays for / is paid by <a href="#">#123: something else</a></td>
<td class="w-20">
switch,change, del
</td>
</tr>
</table>
</div>
</div>
</template>
<div class="row">
<div class="col">
<h5>Add a new relation</h5>
<div class="row">
<div class="col">
<input type="text" readonly class="form-control-plaintext" value="This transaction">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="First name" aria-label="First name">
</div>
<div class="col">
<input type="text" class="form-control" placeholder="Last name" aria-label="Last name">
</div>
<div class="col">
<input type="submit" class="btn btn-primary">
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<div class="row inline" style="width:100%;">
<div class="col align-middle d-flex align-items-center">
<em><small>Changes are saved automatically</small></em>
</div>
<div class="col text-end">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@@ -7,12 +7,8 @@
<div class="form-group">
<div class="form-control-plaintext">
<button class="btn btn-sm btn-outline-primary">Manage related transactions</button>
<button class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" :data-bs-target="'#linksModal_' + index" type="button">Manage related transactions</button>
</div>
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Launch demo modal
</button>
</div>
</div>
</div>
@@ -9,59 +9,6 @@
</template>
</div>
<!-- Modal -->
<div class="modal modal-lg fade" id="exampleModal" data-bs-backdrop="static" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Transaction relations</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="row">
<div class="col">
<p><em class="text-info">
Bla bla bla explanation
</em>
<em>This transaction has no relations to other transactions (yet)</em>
</p>
</div>
</div>
<div class="row">
<div class="col">
<p>This transaction is or will be...</p>
<table class="table table-sm table-bordered">
<tr>
<th colspan="2">Transaction relations</th>
</tr>
<tr>
<td>Related to <a href="#">#123: something else</a></td>
<td class="w-20">
switch,change, del
</td>
</tr>
</table>
</div>
</div>
<div class="row">
<div class="col">
<strong>Add a new relation</strong><br>
This transaction: [ -- relation --] [ -- transaction -- ] [ OK ]
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
</div>