From 92de8fb396265d057f18aab4de0bc8aff4b90188 Mon Sep 17 00:00:00 2001 From: f0x52 Date: Sat, 19 Aug 2023 14:33:15 +0200 Subject: [feature] Instance rules (#2125) * init instance rules database model, admin api * expose instance rules in public instance api * public /api/v1/instance/rules route * GET ruleById * createRule route * createRule auth check * updateRule * deleteRule * list rules on about page * ruleGet auth * add about page ids for anchors * process and store adding violated rules to reports * admin api models for instance rules * instance rule edit frontend * change rule inputs to textareas * database fixes after rebase (#2124) * remove unused imports * fix db migration column name * fix tests * fix more tests * fix postgres error with wrongly used Ident * add some tests, fiddle with rule model a bit, fix postgres migration * swagger docs --------- Co-authored-by: tsmethurst --- web/source/css/base.css | 51 ++++++++ web/source/settings/admin/federation/detail.js | 35 +++-- web/source/settings/admin/settings.js | 127 ------------------- web/source/settings/admin/settings/index.jsx | 127 +++++++++++++++++++ web/source/settings/admin/settings/rules.jsx | 169 +++++++++++++++++++++++++ web/source/settings/index.js | 5 +- web/source/settings/lib/query/admin/index.js | 48 ++++++- web/source/settings/lib/query/base.js | 2 +- web/source/settings/lib/query/lib.js | 7 + 9 files changed, 427 insertions(+), 144 deletions(-) delete mode 100644 web/source/settings/admin/settings.js create mode 100644 web/source/settings/admin/settings/index.jsx create mode 100644 web/source/settings/admin/settings/rules.jsx (limited to 'web/source') diff --git a/web/source/css/base.css b/web/source/css/base.css index 87d2fcca7..5cd2cd047 100644 --- a/web/source/css/base.css +++ b/web/source/css/base.css @@ -542,6 +542,57 @@ label { } } +.instance-rules { + list-style-position: inside; + margin: 0; + padding: 0; + + a.rule { + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + color: $fg; + text-decoration: none; + background: $toot-bg; + padding: 1rem; + margin: 0.5rem 0; + border-radius: $br; + line-height: 2rem; + position: relative; + + &:hover { + color: $fg-accent; + + .edit-icon { + display: inline; + } + } + + .edit-icon { + display: none; + font-size: 1rem; + line-height: 1.5rem; + } + + li { + font-size: 1.75rem; + padding: 0; + margin: 0; + + h2 { + margin: 0; + margin-top: 0 !important; + display: inline-block; + font-size: 1.5rem; + } + } + + span { + color: $fg-reduced; + } + } +} + @media screen and (max-width: 30rem) { .domain-blocklist .entry { grid-template-columns: 1fr; diff --git a/web/source/settings/admin/federation/detail.js b/web/source/settings/admin/federation/detail.js index 344b9f9b6..a3bbfcac1 100644 --- a/web/source/settings/admin/federation/detail.js +++ b/web/source/settings/admin/federation/detail.js @@ -141,22 +141,29 @@ function DomainBlockForm({ defaultDomain, block = {}, baseUrl }) { {...disabledForm} /> - - - { - isExistingBlock && +
removeBlock(block.id)} - label="Remove" - result={removeResult} - className="button danger" + label="Suspend" + result={addResult} + showError={false} + {...disabledForm} /> - } + + { + isExistingBlock && + removeBlock(block.id)} + label="Remove" + result={removeResult} + className="button danger" + showError={false} + /> + } +
+ + {addResult.error && } + {removeResult.error && } ); diff --git a/web/source/settings/admin/settings.js b/web/source/settings/admin/settings.js deleted file mode 100644 index ec986a6c4..000000000 --- a/web/source/settings/admin/settings.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - GoToSocial - Copyright (C) GoToSocial Authors admin@gotosocial.org - SPDX-License-Identifier: AGPL-3.0-or-later - - 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 . -*/ - -"use strict"; - -const React = require("react"); - -const query = require("../lib/query"); - -const { - useTextInput, - useFileInput -} = require("../lib/form"); - -const useFormSubmit = require("../lib/form/submit"); - -const { - TextInput, - TextArea, - FileInput -} = require("../components/form/inputs"); - -const FormWithData = require("../lib/form/form-with-data"); -const MutationButton = require("../components/form/mutation-button"); - -module.exports = function AdminSettings() { - return ( - - ); -}; - -function AdminSettingsForm({ data: instance }) { - const form = { - title: useTextInput("title", { - source: instance, - validator: (val) => val.length <= 40 ? "" : "Instance title must be 40 characters or less" - }), - thumbnail: useFileInput("thumbnail", { withPreview: true }), - thumbnailDesc: useTextInput("thumbnail_description", { source: instance }), - shortDesc: useTextInput("short_description", { source: instance }), - description: useTextInput("description", { source: instance }), - contactUser: useTextInput("contact_username", { source: instance, valueSelector: (s) => s.contact_account?.username }), - contactEmail: useTextInput("contact_email", { source: instance, valueSelector: (s) => s.email }), - terms: useTextInput("terms", { source: instance }) - }; - - const [submitForm, result] = useFormSubmit(form, query.useUpdateInstanceMutation()); - - return ( -
-

Instance Settings

- - -
-

Instance thumbnail

-
- {form.thumbnailDesc.value - -
-
- - - -