diff --git a/public/static/css/default.css b/public/static/css/default.css
index 8c5e853..e9deb48 100644
--- a/public/static/css/default.css
+++ b/public/static/css/default.css
@@ -494,3 +494,7 @@
.full-width {
width: 100%;
}
+
+.bold {
+ font-weight: bold;
+}
\ No newline at end of file
diff --git a/public/static/css/white.css b/public/static/css/white.css
index 6d1c140..f824a49 100644
--- a/public/static/css/white.css
+++ b/public/static/css/white.css
@@ -113,7 +113,7 @@
background-color: white;
border-radius: 0.8rem;
margin-bottom: 2rem;
- box-shadow: 0 5px 30px 0 rgb(31 38 135 / 10%);
+ box-shadow: 0 5px 30px 0 rgb(31 38 135 / 10%);
}
.container-padding {
@@ -182,6 +182,7 @@
font-size: 1.4rem;
line-height: 2rem;
display: block;
+ overflow-wrap: break-word;
}
.theme-default #item-rows .hr {
@@ -370,7 +371,7 @@
.theme-default .pane-title {
color: black;
- line-height: 4rem;
+ font-size: 1.6rem;
}
.theme-default #pane-settings {
@@ -382,9 +383,14 @@
}
.theme-default .user-form {
- border: dashed 2px #ccc;
- padding: 1rem;
+ font-size: 1.4rem;
+ padding: 1rem 0;
margin-top: 1rem;
+ border-bottom: dashed 1px #000;
+}
+
+.theme-default .more {
+ border: dashed 1px #ccc;
}
.theme-default .role-list-item {
diff --git a/src/client/web/src/components/control/tabs.tsx b/src/client/web/src/components/control/tabs.tsx
index e636890..83e4a47 100644
--- a/src/client/web/src/components/control/tabs.tsx
+++ b/src/client/web/src/components/control/tabs.tsx
@@ -14,7 +14,7 @@ import { colorClass } from "../visual/colors";
const defaultIconProps: IconProps = {
name: "RiFolder2Fill",
size: "1.6rem",
- color: `${colorClass("1")}-font`,
+ color: `${colorClass("cyan1")}-font`,
};
export interface Props {
diff --git a/src/client/web/src/components/pane_admin.tsx b/src/client/web/src/components/pane_admin.tsx
index bbe1d3d..4e6d789 100644
--- a/src/client/web/src/components/pane_admin.tsx
+++ b/src/client/web/src/components/pane_admin.tsx
@@ -2,6 +2,8 @@ import * as React from "react";
import { List, Map, Set } from "immutable";
import FileSize from "filesize";
+import { RiMore2Fill } from "@react-icons/all-files/ri/RiMore2Fill";
+
import { alertMsg, confirmMsg } from "../common/env";
import { ICoreState, MsgProps, UIProps } from "./core_state";
import { User, Quota } from "../client";
@@ -39,6 +41,7 @@ export interface UserFormState {
newPwd2: string;
role: string;
quota: Quota;
+ folded: boolean;
}
export class UserForm extends React.Component<
@@ -59,6 +62,7 @@ export class UserForm extends React.Component<
uploadSpeedLimit: p.quota.uploadSpeedLimit,
downloadSpeedLimit: p.quota.downloadSpeedLimit,
},
+ folded: true,
};
}
@@ -150,25 +154,40 @@ export class UserForm extends React.Component<
});
};
+ toggle = () => {
+ this.setState({ folded: !this.state.folded });
+ };
+
render() {
+ const foldedClass = this.state.folded ? "hidden" : "";
+ const foldIconColor = this.state.folded ? "black-font" : "cyan1-font";
+
return (
-
- {`${this.props.msg.pkg.get("user.name")}: `}
- {this.props.name}
-
-
- {`${this.props.msg.pkg.get("user.id")}: `}
- {this.props.id}
-
+ {`${this.props.msg.pkg.get(
+ "user.name"
+ )}: `}
+ {this.props.name}
+ {`${this.props.msg.pkg.get(
+ "user.id"
+ )}: `}
+ {this.props.id}
,
- ,
+
+
+
+
+ ,
])}
childrenStyles={List([
{ alignItems: "flex-start", flexBasis: "70%" },
@@ -178,130 +197,134 @@ export class UserForm extends React.Component<
])}
/>
-
+ ,
+
+
+ {`${this.props.msg.pkg.get("downloadLimit")} (${FileSize(
+ this.state.quota.downloadSpeedLimit,
+ { round: 0 }
+ )})`}
+
+
+
+ ,
- ,
- ])}
- childrenStyles={List([
- { alignItems: "flex-start", flexBasis: "70%" },
- {
- justifyContent: "flex-end",
- flexBasis: "30%",
- },
- ])}
- />
+ ,
+ ])}
+ childrenStyles={List([
+ { alignItems: "flex-start", flexBasis: "70%" },
+ {
+ justifyContent: "flex-end",
+ flexBasis: "30%",
+ },
+ ])}
+ />
-
+
-
-
-
-
-
-
- {this.props.msg.pkg.get("settings.pwd.new2")}
+
+
+ {this.props.msg.pkg.get("settings.pwd.new2")}
+
+
-
-
-
,
+
,
- ,
- ])}
- childrenStyles={List([
- { alignItems: "flex-start", flexBasis: "70%" },
- {
- justifyContent: "flex-end",
- },
- ])}
- />
+ ,
+ ])}
+ childrenStyles={List([
+ { alignItems: "flex-start", flexBasis: "70%" },
+ {
+ justifyContent: "flex-end",
+ },
+ ])}
+ />
+
);
}
@@ -343,19 +366,14 @@ export class AdminPane extends React.Component {
};
addRole = async () => {
- return updater()
- .addRole(this.state.newRole)
- .then((status: string) => {
- if (status !== "") {
- alertMsg(this.props.msg.pkg.get("add.fail"));
- } else {
- alertMsg(this.props.msg.pkg.get("add.ok"));
- }
- return updater().listRoles();
- })
- .then(() => {
- this.props.update(updater().updateAdmin);
- });
+ const status = await updater().addRole(this.state.newRole);
+ if (status !== "") {
+ alertMsg(this.props.msg.pkg.get("add.fail"));
+ } else {
+ alertMsg(this.props.msg.pkg.get("add.ok"));
+ await updater().listRoles();
+ this.props.update(updater().updateAdmin);
+ }
};
delRole = async (role: string) => {
@@ -363,19 +381,14 @@ export class AdminPane extends React.Component {
return;
}
- return updater()
- .delRole(role)
- .then((status: string) => {
- if (status !== "") {
- this.props.msg.pkg.get("delete.fail");
- } else {
- this.props.msg.pkg.get("delete.ok");
- }
- return updater().listRoles();
- })
- .then(() => {
- this.props.update(updater().updateAdmin);
- });
+ const status = await updater().delRole(role);
+ if (status !== "") {
+ this.props.msg.pkg.get("delete.fail");
+ } else {
+ this.props.msg.pkg.get("delete.ok");
+ await updater().listRoles();
+ this.props.update(updater().updateAdmin);
+ }
};
addUser = async () => {
@@ -384,33 +397,29 @@ export class AdminPane extends React.Component {
return;
}
- return updater()
- .addUser({
- id: "", // backend will fill it
- name: this.state.newUserName,
- pwd: this.state.newUserPwd1,
- role: this.state.newUserRole,
- quota: undefined,
- usedSpace: "0",
- preferences: undefined,
- })
- .then((status: string) => {
- if (status !== "") {
- alertMsg(this.props.msg.pkg.get("add.fail"));
- } else {
- alertMsg(this.props.msg.pkg.get("add.ok"));
- }
- this.setState({
- newUserName: "",
- newUserPwd1: "",
- newUserPwd2: "",
- newUserRole: "",
- });
- return updater().listUsers();
- })
- .then(() => {
- this.props.update(updater().updateAdmin);
+ const status = await updater().addUser({
+ id: "", // backend will fill it
+ name: this.state.newUserName,
+ pwd: this.state.newUserPwd1,
+ role: this.state.newUserRole,
+ quota: undefined,
+ usedSpace: "0",
+ preferences: undefined,
+ });
+
+ if (status !== "") {
+ alertMsg(this.props.msg.pkg.get("add.fail"));
+ } else {
+ alertMsg(this.props.msg.pkg.get("add.ok"));
+ this.setState({
+ newUserName: "",
+ newUserPwd1: "",
+ newUserPwd2: "",
+ newUserRole: "",
});
+ await updater().listUsers();
+ this.props.update(updater().updateAdmin);
+ }
};
render() {
@@ -464,7 +473,9 @@ export class AdminPane extends React.Component {
{this.props.msg.pkg.get("user.add")},
+
+ {this.props.msg.pkg.get("user.add")}
+
,
,
@@ -472,6 +483,8 @@ export class AdminPane extends React.Component {
childrenStyles={List([{}, { justifyContent: "flex-end" }])}
/>
+
+
{this.props.msg.pkg.get("user.name")}
{
+
{this.props.msg.pkg.get("admin.users")}
,
,
])}
/>
+
+
+
{userList}
@@ -533,11 +549,15 @@ export class AdminPane extends React.Component {
{this.props.msg.pkg.get("role.add")},
+
+ {this.props.msg.pkg.get("role.add")}
+
,
,
])}
/>
+
+
{
childrenStyles={List([{}, { justifyContent: "flex-end" }])}
/>
+
-
-
+
+
{this.props.msg.pkg.get("admin.roles")}
,
,
])}
/>
+
+
+
{roleList}
@@ -698,7 +721,7 @@ export class BgCfg extends React.Component {
{this.props.msg.pkg.get("cfg.bg")},
+ {this.props.msg.pkg.get("cfg.bg")}
,