clarify group member editing UI (disallow deletes for S only)
This commit is contained in:
@@ -24,14 +24,14 @@ export default class ChipInput extends React.Component {
|
|||||||
static deriveStateFromProps(props) {
|
static deriveStateFromProps(props) {
|
||||||
return {
|
return {
|
||||||
placeholder: props.chips ? '' : props.prompt,
|
placeholder: props.chips ? '' : props.prompt,
|
||||||
sortedChips: ChipInput.sortChips(props.chips, props.required),
|
sortedChips: ChipInput.sortChips(props.chips, props.staticMembers),
|
||||||
chipIndex: ChipInput.indexChips(props.chips)
|
chipIndex: ChipInput.indexChips(props.chips)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidUpdate(prevProps, prevState) {
|
componentDidUpdate(prevProps, prevState) {
|
||||||
if (prevProps.chips != this.props.chips ||
|
if (prevProps.chips != this.props.chips ||
|
||||||
prevProps.required != this.props.required ||
|
prevProps.staticMembers != this.props.staticMembers ||
|
||||||
prevProps.prompt != this.props.prompt) {
|
prevProps.prompt != this.props.prompt) {
|
||||||
this.setState(ChipInput.deriveStateFromProps(this.props));
|
this.setState(ChipInput.deriveStateFromProps(this.props));
|
||||||
}
|
}
|
||||||
@@ -56,7 +56,7 @@ export default class ChipInput extends React.Component {
|
|||||||
const required = [];
|
const required = [];
|
||||||
const normal = [];
|
const normal = [];
|
||||||
chips.map(function(item) {
|
chips.map(function(item) {
|
||||||
if (item.user === keep) {
|
if (keep.includes(item.user)) {
|
||||||
required.push(item);
|
required.push(item);
|
||||||
} else {
|
} else {
|
||||||
normal.push(item);
|
normal.push(item);
|
||||||
@@ -95,8 +95,8 @@ export default class ChipInput extends React.Component {
|
|||||||
handleKeyDown(e) {
|
handleKeyDown(e) {
|
||||||
if (e.key === 'Backspace') {
|
if (e.key === 'Backspace') {
|
||||||
if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {
|
if (this.state.input.length == 0 && this.state.sortedChips.length > 0) {
|
||||||
var at = this.state.sortedChips.length - 1;
|
const at = this.state.sortedChips.length - 1;
|
||||||
if (this.state.sortedChips[at].user !== this.props.required) {
|
if (this.state.sortedChips[at].user !== this.props.staticMembers) {
|
||||||
this.removeChipAt(at);
|
this.removeChipAt(at);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ export default class ChipInput extends React.Component {
|
|||||||
title={item.public ? item.public.fn : undefined}
|
title={item.public ? item.public.fn : undefined}
|
||||||
noAvatar={this.props.avatarDisabled}
|
noAvatar={this.props.avatarDisabled}
|
||||||
topic={item.user}
|
topic={item.user}
|
||||||
required={item.user === this.props.required}
|
required={this.props.staticMembers.includes(item.user)}
|
||||||
invalid={item.invalid}
|
invalid={item.invalid}
|
||||||
index={count}
|
index={count}
|
||||||
key={item.user} />
|
key={item.user} />
|
||||||
|
|||||||
@@ -23,8 +23,10 @@ class GroupManager extends React.Component {
|
|||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
|
// Array of topic members
|
||||||
members: props.members,
|
members: props.members,
|
||||||
index: GroupManager.indexMembers(props.members),
|
index: GroupManager.indexMembers(props.members),
|
||||||
|
staticMembers: GroupManager.staticMembers(props.members, props.keepInitialMembers, props.requiredMember),
|
||||||
contactFilter: '',
|
contactFilter: '',
|
||||||
noContactsMessage: props.intl.formatMessage(messages.no_contacts),
|
noContactsMessage: props.intl.formatMessage(messages.no_contacts),
|
||||||
selectedContacts: GroupManager.selectedContacts(props.members)
|
selectedContacts: GroupManager.selectedContacts(props.members)
|
||||||
@@ -39,15 +41,25 @@ class GroupManager extends React.Component {
|
|||||||
|
|
||||||
static indexMembers(members) {
|
static indexMembers(members) {
|
||||||
let index = {};
|
let index = {};
|
||||||
members.map(function(m) {
|
members.map((m) => {
|
||||||
index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed
|
index[m.user] = {delta: 0, present: true}; // Delta: 0 unchanged, +1 added, -1 removed
|
||||||
});
|
});
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static staticMembers(members, keepInitial, requiredMember) {
|
||||||
|
let stat = [];
|
||||||
|
members.map((m) => {
|
||||||
|
if (keepInitial || m.user == requiredMember) {
|
||||||
|
stat.push(m.user);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
static selectedContacts(members) {
|
static selectedContacts(members) {
|
||||||
let sel = [];
|
let sel = [];
|
||||||
members.map(function(m) {
|
members.map((m) => {
|
||||||
sel.push(m.user);
|
sel.push(m.user);
|
||||||
});
|
});
|
||||||
return sel;
|
return sel;
|
||||||
@@ -66,31 +78,31 @@ class GroupManager extends React.Component {
|
|||||||
status = {delta: 1, present: true};
|
status = {delta: 1, present: true};
|
||||||
}
|
}
|
||||||
|
|
||||||
var m = this.state.members.slice();
|
let m = this.state.members.slice();
|
||||||
m.push(this.props.contacts[index]);
|
m.push(this.props.contacts[index]);
|
||||||
|
|
||||||
var sel = GroupManager.selectedContacts(m);
|
const sel = GroupManager.selectedContacts(m);
|
||||||
|
|
||||||
var i = this.state.index;
|
const i = this.state.index;
|
||||||
i[userId] = status;
|
i[userId] = status;
|
||||||
|
|
||||||
this.setState({members: m, index: i, selectedContacts: sel});
|
this.setState({members: m, index: i, selectedContacts: sel});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMemberRemoved(userId, index) {
|
handleMemberRemoved(userId, index) {
|
||||||
var status = this.state.index[userId];
|
const status = this.state.index[userId];
|
||||||
if (!status || !status.present) {
|
if (!status || !status.present) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
status.present = false;
|
status.present = false;
|
||||||
status.delta -= 1;
|
status.delta -= 1;
|
||||||
|
|
||||||
var m = this.state.members.slice();
|
let m = this.state.members.slice();
|
||||||
m.splice(index, 1);
|
m.splice(index, 1);
|
||||||
|
|
||||||
var sel = GroupManager.selectedContacts(m);
|
const sel = GroupManager.selectedContacts(m);
|
||||||
|
|
||||||
var i = this.state.index;
|
const i = this.state.index;
|
||||||
i[userId] = status;
|
i[userId] = status;
|
||||||
|
|
||||||
this.setState({members: m, index: i, selectedContacts: sel});
|
this.setState({members: m, index: i, selectedContacts: sel});
|
||||||
@@ -107,7 +119,7 @@ class GroupManager extends React.Component {
|
|||||||
|
|
||||||
static doContactFiltering(filter, values) {
|
static doContactFiltering(filter, values) {
|
||||||
if (filter) {
|
if (filter) {
|
||||||
for (var i=0; i<values.length; i++) {
|
for (let i=0; i<values.length; i++) {
|
||||||
if (values[i].indexOf(filter) >= 0) {
|
if (values[i].indexOf(filter) >= 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -154,7 +166,7 @@ class GroupManager extends React.Component {
|
|||||||
<div className="panel-form-row">
|
<div className="panel-form-row">
|
||||||
<ChipInput
|
<ChipInput
|
||||||
chips={this.state.members}
|
chips={this.state.members}
|
||||||
required={this.props.requiredMember}
|
staticMembers={this.state.staticMembers}
|
||||||
prompt="add members"
|
prompt="add members"
|
||||||
filterFunc={this.handleContactFilter}
|
filterFunc={this.handleContactFilter}
|
||||||
onChipRemoved={this.handleMemberRemoved} />
|
onChipRemoved={this.handleMemberRemoved} />
|
||||||
|
|||||||
Reference in New Issue
Block a user