diff --git a/public/data/example.csv b/public/data/example.csv
index 02933b0..f5ec04f 100644
--- a/public/data/example.csv
+++ b/public/data/example.csv
@@ -1,3 +1,3 @@
-id,displayname,password,is_guest,admin,deactivated
+id,displayname,password,is_guest,admin,deactivated,locked
@testuser22:example.org,Jane Doe,secretpassword,false,true,false
-,John Doe,,false,false,false
+,John Doe,,false,false,false,false
diff --git a/src/components/ImportFeature.js b/src/components/ImportFeature.js
index 27bddc1..df89a8d 100644
--- a/src/components/ImportFeature.js
+++ b/src/components/ImportFeature.js
@@ -42,6 +42,7 @@ const optionalFields = [
"guest",
"admin",
"deactivated",
+ "locked",
"avatar_url",
"password",
].sort();
@@ -143,6 +144,7 @@ const FilePicker = props => {
is_guest: 0,
admin: 0,
deactivated: 0,
+ locked: 0,
password: 0,
avatar_url: 0,
id: 0,
@@ -171,7 +173,7 @@ const FilePicker = props => {
delete line.is_admin;
}
- ["is_guest", "admin", "deactivated"].forEach(f => {
+ ["is_guest", "admin", "deactivated", "locked"].forEach(f => {
if (line[f] === "true") {
stats[f]++;
line[f] = true; // we need true booleans instead of strings
diff --git a/src/components/users.js b/src/components/users.js
index 70e60e9..b930079 100644
--- a/src/components/users.js
+++ b/src/components/users.js
@@ -154,6 +154,11 @@ const UserFilter = props => (
source="deactivated"
alwaysOn
/>
+
);
@@ -179,7 +184,7 @@ export const UserList = props => {
}
- filterDefaultValues={{ guests: true, deactivated: false }}
+ filterDefaultValues={{ guests: true, deactivated: false, locked: false }}
sort={{ field: "name", order: "ASC" }}
actions={}
bulkActionButtons={}
@@ -196,6 +201,7 @@ export const UserList = props => {
+
{
+ const errors = {};
+
+ if (values.deactivated && values.locked) {
+ errors.locked = "resources.users.action.update.locked_and_deactivated";
+ }
+
+ return errors;
+};
+
export function generateRandomUser() {
const homeserver = localStorage.getItem("home_server");
const user_id =
@@ -348,7 +364,7 @@ export const UserEdit = props => {
const translate = useTranslate();
return (
} actions={}>
- }>
+ } validate={validateForm}>
}
@@ -377,6 +393,7 @@ export const UserEdit = props => {
source="deactivated"
helperText="resources.users.helper.deactivate"
/>
+
diff --git a/src/i18n/de.js b/src/i18n/de.js
index 0b77fd2..ea726e2 100644
--- a/src/i18n/de.js
+++ b/src/i18n/de.js
@@ -108,8 +108,10 @@ const de = {
is_guest: "Gast",
admin: "Server Administrator",
deactivated: "Deaktiviert",
+ locked: "Gesperrt",
guests: "Zeige Gäste",
show_deactivated: "Zeige deaktivierte Benutzer",
+ show_locked: "Zeige gesperrte Benutzer",
user_id: "Suche Benutzer",
displayname: "Anzeigename",
password: "Passwort",
@@ -132,6 +134,10 @@ const de = {
},
action: {
erase: "Lösche Benutzerdaten",
+ update: {
+ locked_and_deactivated:
+ "Ein Benutzer kann nicht deaktiviert und gesperrt werden.",
+ },
},
},
rooms: {
diff --git a/src/i18n/en.js b/src/i18n/en.js
index 6bdb033..9ae7551 100644
--- a/src/i18n/en.js
+++ b/src/i18n/en.js
@@ -107,8 +107,10 @@ const en = {
is_guest: "Guest",
admin: "Server Administrator",
deactivated: "Deactivated",
+ locked: "locked",
guests: "Show guests",
show_deactivated: "Show deactivated users",
+ show_locked: "Show locked users",
user_id: "Search user",
displayname: "Displayname",
password: "Password",
@@ -129,6 +131,9 @@ const en = {
},
action: {
erase: "Erase user data",
+ update: {
+ locked_and_deactivated: "A user cannot be deactivated and locked.",
+ },
},
},
rooms: {
diff --git a/src/synapse/dataProvider.js b/src/synapse/dataProvider.js
index db57ec7..78df693 100644
--- a/src/synapse/dataProvider.js
+++ b/src/synapse/dataProvider.js
@@ -35,6 +35,7 @@ const resourceMap = {
is_guest: !!u.is_guest,
admin: !!u.admin,
deactivated: !!u.deactivated,
+ locked: !!u.locked,
// need timestamp in milliseconds
creation_ts_ms: u.creation_ts * 1000,
}),
@@ -355,6 +356,7 @@ const dataProvider = {
name,
guests,
deactivated,
+ locked,
search_term,
destination,
valid,
@@ -371,6 +373,7 @@ const dataProvider = {
destination: destination,
guests: guests,
deactivated: deactivated,
+ locked: locked,
valid: valid,
order_by: field,
dir: getSearchOrder(order),
diff --git a/src/synapse/dataProvider.test.js b/src/synapse/dataProvider.test.js
index a6563b7..e462bc1 100644
--- a/src/synapse/dataProvider.test.js
+++ b/src/synapse/dataProvider.test.js
@@ -19,6 +19,7 @@ describe("dataProvider", () => {
admin: 0,
user_type: null,
deactivated: 0,
+ locked: 0,
displayname: "User One",
},
{
@@ -28,6 +29,7 @@ describe("dataProvider", () => {
admin: 1,
user_type: null,
deactivated: 0,
+ locked: 0,
displayname: "User Two",
},
],
@@ -66,6 +68,7 @@ describe("dataProvider", () => {
avatar_url: "mxc://localhost/user1",
admin: false,
deactivated: false,
+ locked: false,
})
);