gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit cb2f84e551727bd1852ed5fd93777289d3439bbf
parent a312238e7909c6451e608a91c326ad250dda875c
Author: f0x52 <f0x@cthu.lu>
Date:   Sat, 11 Mar 2023 10:49:44 +0100

[frontend/fix] Mobile css tweaks (#1605)

* mobile css tweaks

* bulk process list mobile css
Diffstat:
Mweb/source/css/base.css | 4++--
Mweb/source/settings/admin/federation/import-export/export-format-table.jsx | 42++++++++++++++++++++++--------------------
Mweb/source/settings/admin/federation/import-export/form.jsx | 12++++++++++--
Mweb/source/settings/admin/federation/import-export/process.jsx | 37++++++++++++++++++++-----------------
Mweb/source/settings/components/form/mutation-button.jsx | 4++--
Mweb/source/settings/style.css | 135++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
6 files changed, 149 insertions(+), 85 deletions(-)

diff --git a/web/source/css/base.css b/web/source/css/base.css @@ -66,8 +66,8 @@ body { display: grid; min-height: 100vh; - grid-template-columns: auto minmax(auto, 50rem) auto; - grid-template-columns: auto min(92%, 50rem) auto; + grid-template-columns: 1fr minmax(auto, 50rem) 1fr; + grid-template-columns: 1fr min(92%, 50rem) 1fr; grid-template-rows: auto 1fr auto; } diff --git a/web/source/settings/admin/federation/import-export/export-format-table.jsx b/web/source/settings/admin/federation/import-export/export-format-table.jsx @@ -22,26 +22,28 @@ const React = require("react"); module.exports = function ExportFormatTable() { return ( - <table className="export-format-table"> - <thead> - <tr> - <th rowSpan={2} /> - <th colSpan={2}>Includes</th> - <th colSpan={2}>Importable by</th> - </tr> - <tr> - <th>Domain</th> - <th>Public comment</th> - <th>GoToSocial</th> - <th>Mastodon</th> - </tr> - </thead> - <tbody> - <Format name="Text" info={[true, false, true, false]} /> - <Format name="JSON" info={[true, true, true, false]} /> - <Format name="CSV" info={[true, true, true, true]} /> - </tbody> - </table> + <div className="export-format-table-wrapper without-border"> + <table className="export-format-table"> + <thead> + <tr> + <th rowSpan={2} /> + <th colSpan={2}>Includes</th> + <th colSpan={2}>Importable by</th> + </tr> + <tr> + <th>Domain</th> + <th>Public comment</th> + <th>GoToSocial</th> + <th>Mastodon</th> + </tr> + </thead> + <tbody> + <Format name="Text" info={[true, false, true, false]} /> + <Format name="JSON" info={[true, true, true, false]} /> + <Format name="CSV" info={[true, true, true, true]} /> + </tbody> + </table> + </div> ); }; diff --git a/web/source/settings/admin/federation/import-export/form.jsx b/web/source/settings/admin/federation/import-export/form.jsx @@ -77,7 +77,8 @@ module.exports = function ImportExportForm({ form, submitParse, parseResult }) { result={parseResult} showError={false} /> - <label className="button"> + <label className="button with-icon"> + <i class="fa fa-fw " aria-hidden="true" /> Import file <input type="file" @@ -93,7 +94,14 @@ module.exports = function ImportExportForm({ form, submitParse, parseResult }) { onClick={() => submitExport("export")} result={exportResult} showError={false} /> - <MutationButton label="Export to file" type="button" onClick={() => submitExport("export-file")} result={exportResult} showError={false} /> + <MutationButton + label="Export to file" + wrapperClassName="export-file-button" + type="button" + onClick={() => submitExport("export-file")} + result={exportResult} + showError={false} + /> <div className="export-file"> <span> as diff --git a/web/source/settings/admin/federation/import-export/process.jsx b/web/source/settings/admin/federation/import-export/process.jsx @@ -127,11 +127,13 @@ function ImportList({ list, data: blockedInstances }) { } /> } - <DomainCheckList - field={form.domains} - blockedInstances={blockedInstances} - commentType={showComment.value} - /> + <div className="checkbox-list-wrapper"> + <DomainCheckList + field={form.domains} + blockedInstances={blockedInstances} + commentType={showComment.value} + /> + </div> <TextArea field={form.privateComment} @@ -182,7 +184,6 @@ function DomainCheckList({ field, blockedInstances, commentType }) { field={field} header={<> <b>Domain</b> - <b></b> <b> {commentType == "public_comment" && "Public comment"} {commentType == "private_comment" && "Private comment"} @@ -287,16 +288,18 @@ function DomainEntry({ entry, onChange, extraProps: { alreadyExists, comment } } return ( <> - <TextInput - field={domainField} - onChange={(e) => { - domainField.onChange(e); - onChange({ domain: e.target.value, checked: true }); - }} - /> - <span id="icon" onClick={clickIcon}> - <DomainEntryIcon alreadyExists={alreadyExists} suggestion={entry.suggest} onChange={onChange} /> - </span> + <div className="domain-input"> + <TextInput + field={domainField} + onChange={(e) => { + domainField.onChange(e); + onChange({ domain: e.target.value, checked: true }); + }} + /> + <span id="icon" onClick={clickIcon}> + <DomainEntryIcon alreadyExists={alreadyExists} suggestion={entry.suggest} onChange={onChange} /> + </span> + </div> <p>{comment}</p> </> ); @@ -320,7 +323,7 @@ function DomainEntryIcon({ alreadyExists, suggestion }) { return ( <> - <i className={`fa ${icon}`} aria-hidden="true" title={text}></i> + <i className={`fa fa-fw ${icon}`} aria-hidden="true" title={text}></i> <span className="sr-only">{text}</span> </> ); diff --git a/web/source/settings/components/form/mutation-button.jsx b/web/source/settings/components/form/mutation-button.jsx @@ -21,7 +21,7 @@ const React = require("react"); const { Error } = require("../error"); -module.exports = function MutationButton({ label, result, disabled, showError = true, className = "", ...inputProps }) { +module.exports = function MutationButton({ label, result, disabled, showError = true, className = "", wrapperClassName = "", ...inputProps }) { let iconClass = ""; const targetsThisButton = result.action == inputProps.name; // can also both be undefined, which is correct @@ -33,7 +33,7 @@ module.exports = function MutationButton({ label, result, disabled, showError = } } - return (<div> + return (<div className={wrapperClassName}> {(showError && targetsThisButton && result.error) && <Error error={result.error} /> } diff --git a/web/source/settings/style.css b/web/source/settings/style.css @@ -27,6 +27,7 @@ body { .content { grid-column: 1 / span 3; /* stretch entire width, to fit panel + sidebar nav */ + width: 100%; } section { @@ -51,7 +52,7 @@ section { display: flex; flex-direction: column; gap: 0.5rem; - margin: 2rem 0; + margin: 1rem 0; h2 { margin: 0; @@ -72,6 +73,7 @@ section { &.without-border { border-left: 0; + padding-left: 0; } } } @@ -668,7 +670,7 @@ span.form-info { } } -button.with-icon { +button.with-icon, .button.with-icon { display: flex; align-content: center; padding-right: calc(0.5rem + $fa-fw); @@ -694,35 +696,56 @@ button.with-padding { } .suspend-import-list { + .checkbox-list-wrapper { + overflow-x: auto; + display: grid; + gap: 1rem; + } + .checkbox-list { - .entry { - grid-template-columns: auto 25ch auto 1fr; - grid-template-rows: auto 1fr; - p { - grid-column: 4; - grid-row: 1 / span 2; + .header { + input[type="checkbox"] { + align-self: start; + height: 1.5rem; } } - } - .entry { - #icon { - margin-left: -0.5rem; - align-self: center; - } + .entry { + gap: 0; + width: 100%; + grid-template-columns: auto minmax(25ch, 2fr) minmax(40ch, 1fr); + grid-template-rows: auto 1fr; - #icon .already-blocked { - color: $green1; - } + input[type="checkbox"] { + margin-right: 1rem; + } - #icon .suggest-changes { - color: $orange2; - } + .domain-input { + margin-right: 0.5rem; + display: grid; + grid-template-columns: 1fr $fa-fw; + gap: 0.5rem; - p { - align-self: center; - margin: 0; + #icon { + align-self: center; + + .already-blocked { + color: $green1; + } + + .suggest-changes { + color: $orange2; + } + } + } + + p { + align-self: center; + margin: 0; + grid-column: 4; + grid-row: 1 / span 2; + } } } } @@ -750,6 +773,27 @@ button.with-padding { } } +@media screen and (max-width: 35rem) { + .import-export { + .button-grid { + grid-template-columns: auto auto; + + b { /* filler item */ + display: none; + } + + & > * { + grid-column: 1 / span 2; + justify-self: start; + } + + .export-file-button, .export-file { + grid-column: span 1; + } + } + } +} + .update-hints { background: $list-entry-alternate-bg; border: 0.1rem solid $border-accent; @@ -769,29 +813,36 @@ button.with-padding { } } -.export-format-table { - width: 100%; - background: $list-entry-alternate-bg; - border-collapse: collapse; +.export-format-table-wrapper { + overflow-x: auto; - th, td { - border: 0.1rem solid $gray1; - padding: 0.3rem; - } - - th { - background: $list-entry-bg; + &, th, td { + border: 0.1rem solid $gray1 !important; } - td { - text-align: center; - - .fa-check { - color: $green1; + .export-format-table { + background: $list-entry-alternate-bg; + border-style: hidden; + border-collapse: collapse; + + th, td { + padding: 0.3rem; } - - .fa-times { - color: $error3; + + th { + background: $list-entry-bg; + } + + td { + text-align: center; + + .fa-check { + color: $green1; + } + + .fa-times { + color: $error3; + } } } }