From baff7c67f983bab138b8dcee2d787891ae7da116 Mon Sep 17 00:00:00 2001 From: James Cole Date: Mon, 1 Apr 2024 15:41:16 +0200 Subject: [PATCH] Expand user group views and translations --- .../assets/v2/api/v2/model/user-group/get.js | 18 +- .../assets/v2/api/v2/model/user-group/post.js | 5 + .../assets/v2/api/v2/model/user-group/put.js | 28 ++ .../assets/v2/pages/administrations/create.js | 3 +- .../assets/v2/pages/administrations/edit.js | 121 +++++++ .../assets/v2/pages/administrations/index.js | 11 +- resources/lang/en_US/firefly.php | 3 + resources/lang/en_US/validation.php | 1 + .../views/v2/administrations/edit.blade.php | 57 ++++ .../views/v2/administrations/index.blade.php | 14 +- routes/api.php | 1 + routes/breadcrumbs.php | 17 + routes/web.php | 321 +++++++----------- 13 files changed, 376 insertions(+), 224 deletions(-) create mode 100644 resources/assets/v2/api/v2/model/user-group/put.js create mode 100644 resources/assets/v2/pages/administrations/edit.js create mode 100644 resources/views/v2/administrations/edit.blade.php diff --git a/resources/assets/v2/api/v2/model/user-group/get.js b/resources/assets/v2/api/v2/model/user-group/get.js index a585fba38c..3aed6dc5d9 100644 --- a/resources/assets/v2/api/v2/model/user-group/get.js +++ b/resources/assets/v2/api/v2/model/user-group/get.js @@ -23,15 +23,15 @@ import format from "date-fns/format"; export default class Get { - // /** - // * - // * @param identifier - // * @param params - // * @returns {Promise>} - // */ - // show(identifier, params) { - // return api.get('/api/v2/accounts/' + identifier, {params: params}); - // } + /** + * + * @param identifier + * @param params + * @returns {Promise>} + */ + show(identifier, params) { + return api.get('/api/v2/user-groups/' + identifier, {params: params}); + } /** * diff --git a/resources/assets/v2/api/v2/model/user-group/post.js b/resources/assets/v2/api/v2/model/user-group/post.js index 9ae5d03986..9b761ba000 100644 --- a/resources/assets/v2/api/v2/model/user-group/post.js +++ b/resources/assets/v2/api/v2/model/user-group/post.js @@ -25,4 +25,9 @@ export default class Post { let url = './api/v2/user-groups'; return api.post(url, submission); } + + use(groupId) { + let url = './api/v2/user-groups/' + groupId + '/use'; + return api.post(url, {}); + } } diff --git a/resources/assets/v2/api/v2/model/user-group/put.js b/resources/assets/v2/api/v2/model/user-group/put.js new file mode 100644 index 0000000000..27c4138c0e --- /dev/null +++ b/resources/assets/v2/api/v2/model/user-group/put.js @@ -0,0 +1,28 @@ +/* + * post.js + * Copyright (c) 2023 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 . + */ + +import {api} from "../../../../boot/axios"; + +export default class Put { + put(submission, params) { + let url = '/api/v2/user-groups/' + parseInt(params.id); + return api.put(url, submission); + } +} diff --git a/resources/assets/v2/pages/administrations/create.js b/resources/assets/v2/pages/administrations/create.js index fc9889467f..0def2cdce6 100644 --- a/resources/assets/v2/pages/administrations/create.js +++ b/resources/assets/v2/pages/administrations/create.js @@ -60,6 +60,7 @@ let administrations = function () { pageProperties: {}, submitForm() { + this.errors.title = []; (new Post()).post({title: this.title}).then(response => { if (this.formStates.returnHereButton) { this.notifications.success.show = true; @@ -73,7 +74,7 @@ let administrations = function () { window.location.href = './administrations?user_group_id=' + parseInt(response.data.data.id) + '&message=created'; } }).catch(error => { - console.error(error); + this.errors.title = error.response.data.errors.title; }); }, diff --git a/resources/assets/v2/pages/administrations/edit.js b/resources/assets/v2/pages/administrations/edit.js new file mode 100644 index 0000000000..ed944eaf7f --- /dev/null +++ b/resources/assets/v2/pages/administrations/edit.js @@ -0,0 +1,121 @@ +/* + * template.js + * Copyright (c) 2024 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 '../../boot/bootstrap.js'; +import dates from "../shared/dates.js"; +import Post from "../../api/v2/model/user-group/post.js"; +import i18next from "i18next"; +import Get from "../../api/v2/model/user-group/get.js"; +import Put from "../../api/v2/model/user-group/put.js"; + + +let administrations = function () { + return { + title: '', + id: 0, + errors: { + title: [] + }, + + // notifications + notifications: { + error: { + show: false, text: '', url: '', + }, success: { + show: false, text: '', url: '', + }, wait: { + show: false, text: '', + + } + }, + // state of the form is stored in formState: + formStates: { + isSubmitting: false, + returnHereButton: false, + saveAsNewButton: false, // edit form only + resetButton: false, + }, + + // form behaviour + formBehaviour: { + formType: 'update', // or 'update' + }, + changedTitle() { + + }, + + pageProperties: {}, + submitForm() { + console.log('submitForm'); + (new Put()).put({title: this.title}, {id: this.id}).then(response => { + if (this.formStates.returnHereButton) { + this.notifications.success.show = true; + this.notifications.success.text = i18next.t('firefly.updated_administration', {title: response.data.data.attributes.title}); + // TODO needs a better redirect. + this.notifications.success.url = './administrations'; + } + if (this.formStates.resetButton) { + this.title = ''; + } + if (!this.formStates.returnHereButton) { + // TODO needs a better redirect. + window.location.href = './administrations?user_group_id=' + parseInt(response.data.data.id) + '&message=updated'; + } + }).catch(error => { + this.errors.title = error.response.data.errors.title; + }); + + }, + cancelForm() { + window.location.href = './administrations'; + }, + init() { + const page = window.location.href.split('/'); + const groupId = parseInt(page[page.length - 1]); + (new Get()).show(groupId, {}).then(response => { + this.title = response.data.data.attributes.title; + this.id = parseInt(response.data.data.id); + }); + } + } +} + + +let comps = {administrations, dates}; + +function loadPage() { + Object.keys(comps).forEach(comp => { + console.log(`Loading page component "${comp}"`); + let data = comps[comp](); + Alpine.data(comp, () => data); + }); + Alpine.start(); +} + +// wait for load until bootstrapped event is received. +document.addEventListener('firefly-iii-bootstrapped', () => { + console.log('Loaded through event listener.'); + loadPage(); +}); +// or is bootstrapped before event is triggered. +if (window.bootstrapped) { + console.log('Loaded through window variable.'); + loadPage(); +} diff --git a/resources/assets/v2/pages/administrations/index.js b/resources/assets/v2/pages/administrations/index.js index 38f4b9901d..f3ade76986 100644 --- a/resources/assets/v2/pages/administrations/index.js +++ b/resources/assets/v2/pages/administrations/index.js @@ -27,6 +27,7 @@ import '@ag-grid-community/styles/ag-grid.css'; import '@ag-grid-community/styles/ag-theme-alpine.css'; import '../../css/grid-ff3-theme.css'; import Get from "../../api/v2/model/user-group/get.js"; +import Post from "../../api/v2/model/user-group/post.js"; let index = function () { return { @@ -53,6 +54,13 @@ let index = function () { this.notifications.wait.text = i18next.t('firefly.wait_loading_data') this.loadAdministrations(); }, + useAdministration(id) { + let groupId = parseInt(id); + // try to post "use", then reload administrations. + (new Post()).use(groupId).then(response => { + this.loadAdministrations(); + }); + }, loadAdministrations() { this.notifications.wait.show = true; @@ -73,16 +81,13 @@ let index = function () { membersVisible: current.attributes.can_see_members, members: [], }; - console.log('Processing group #' + group.id + ' (' + group.title + ')' ); let memberships = {}; for (let j = 0; j < current.attributes.members.length; j++) { let member = current.attributes.members[j]; - console.log('Found member ' + member.user_email, member.you, member.role); if ('owner' === member.role) { group.owner = i18next.t('firefly.administration_owner', {email: member.user_email}); } if (true === member.you && 'owner' === member.role) { - console.log('You are owner of group ' + group.title ); group.isOwner = true; } if (true === member.you) { diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 695a7bb6e4..f19dfb2635 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -1391,8 +1391,11 @@ return [ 'administration_you' => 'Your role: {{role}}', 'other_users_in_admin' => 'Other users in this administration', 'administrations_create_breadcrumb' => 'Create new financial administration', + 'administrations_page_create_sub_title' => 'Create new financial administration', 'basic_administration_information' => 'Basic administration information', 'new_administration_created' => 'New financial administration "{{title}}" has been created', + 'edit_administration_breadcrumb' => 'Edit financial administration ":title"', + 'administrations_page_edit_sub_title'=> 'Edit financial administration ":title"', // roles 'administration_role_owner' => 'Owner', diff --git a/resources/lang/en_US/validation.php b/resources/lang/en_US/validation.php index d98cc9faee..3f1b54bb83 100644 --- a/resources/lang/en_US/validation.php +++ b/resources/lang/en_US/validation.php @@ -264,6 +264,7 @@ return [ // no access to administration: 'no_access_user_group' => 'You do not have the correct access rights for this administration.', + 'administration_owner_rename' => 'You can\'t rename your standard administration.', ]; // Ignore this comment diff --git a/resources/views/v2/administrations/edit.blade.php b/resources/views/v2/administrations/edit.blade.php new file mode 100644 index 0000000000..4826f1dc31 --- /dev/null +++ b/resources/views/v2/administrations/edit.blade.php @@ -0,0 +1,57 @@ +@extends('layout.v2') +@section('scripts') + @vite(['resources/assets/v2/pages/administrations/edit.js']) +@endsection +@section('content') +
+ +
+ +
+
+
+
+

{{ __('firefly.basic_administration_information') }}

+
+
+ + @include('partials.form.title') +
+
+
+
+
+
+
+
+

+ {{ __('firefly.submission_options') }} +

+
+
+ @include('partials.form.submission-options') +
+ +
+
+
+
+
+ +@endsection diff --git a/resources/views/v2/administrations/index.blade.php b/resources/views/v2/administrations/index.blade.php index ce28f09c9f..8aef215a61 100644 --- a/resources/views/v2/administrations/index.blade.php +++ b/resources/views/v2/administrations/index.blade.php @@ -19,7 +19,11 @@
-

Administration ""

+

+ + Administration ""

    @@ -53,13 +57,13 @@