Add antenna tag editor

This commit is contained in:
KMY 2023-08-22 07:35:09 +09:00
parent f20da7bf74
commit 45fb44353c
7 changed files with 336 additions and 2 deletions

View file

@ -95,6 +95,26 @@ export const ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_REQUEST = 'ANTENNA_EDITOR_REM
export const ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_SUCCESS = 'ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_SUCCESS';
export const ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_FAIL = 'ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_FAIL';
export const ANTENNA_EDITOR_FETCH_TAGS_REQUEST = 'ANTENNA_EDITOR_FETCH_TAGS_REQUEST';
export const ANTENNA_EDITOR_FETCH_TAGS_SUCCESS = 'ANTENNA_EDITOR_FETCH_TAGS_SUCCESS';
export const ANTENNA_EDITOR_FETCH_TAGS_FAIL = 'ANTENNA_EDITOR_FETCH_TAGS_FAIL';
export const ANTENNA_EDITOR_ADD_TAG_REQUEST = 'ANTENNA_EDITOR_ADD_TAG_REQUEST';
export const ANTENNA_EDITOR_ADD_TAG_SUCCESS = 'ANTENNA_EDITOR_ADD_TAG_SUCCESS';
export const ANTENNA_EDITOR_ADD_TAG_FAIL = 'ANTENNA_EDITOR_ADD_TAG_FAIL';
export const ANTENNA_EDITOR_ADD_EXCLUDE_TAG_REQUEST = 'ANTENNA_EDITOR_ADD_EXCLUDE_TAG_REQUEST';
export const ANTENNA_EDITOR_ADD_EXCLUDE_TAG_SUCCESS = 'ANTENNA_EDITOR_ADD_EXCLUDE_TAG_SUCCESS';
export const ANTENNA_EDITOR_ADD_EXCLUDE_TAG_FAIL = 'ANTENNA_EDITOR_ADD_EXCLUDE_TAG_FAIL';
export const ANTENNA_EDITOR_REMOVE_TAG_REQUEST = 'ANTENNA_EDITOR_REMOVE_TAG_REQUEST';
export const ANTENNA_EDITOR_REMOVE_TAG_SUCCESS = 'ANTENNA_EDITOR_REMOVE_TAG_SUCCESS';
export const ANTENNA_EDITOR_REMOVE_TAG_FAIL = 'ANTENNA_EDITOR_REMOVE_TAG_FAIL';
export const ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_REQUEST = 'ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_REQUEST';
export const ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_SUCCESS = 'ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_SUCCESS';
export const ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_FAIL = 'ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_FAIL';
export const ANTENNA_ADDER_RESET = 'ANTENNA_ADDER_RESET';
export const ANTENNA_ADDER_SETUP = 'ANTENNA_ADDER_SETUP';
@ -739,6 +759,139 @@ export const removeExcludeKeywordFromAntennaFail = (antennaId, keyword, error) =
error,
});
export const fetchAntennaTags = antennaId => (dispatch, getState) => {
dispatch(fetchAntennaTagsRequest(antennaId));
api(getState).get(`/api/v1/antennas/${antennaId}/tags`, { params: { limit: 0 } }).then(({ data }) => {
dispatch(fetchAntennaTagsSuccess(antennaId, data));
}).catch(err => dispatch(fetchAntennaTagsFail(antennaId, err)));
};
export const fetchAntennaTagsRequest = id => ({
type: ANTENNA_EDITOR_FETCH_TAGS_REQUEST,
id,
});
export const fetchAntennaTagsSuccess = (id, tags) => ({
type: ANTENNA_EDITOR_FETCH_TAGS_SUCCESS,
id,
tags,
});
export const fetchAntennaTagsFail = (id, error) => ({
type: ANTENNA_EDITOR_FETCH_TAGS_FAIL,
id,
error,
});
export const addTagToAntenna = (antennaId, tag) => (dispatch, getState) => {
dispatch(addTagToAntennaRequest(antennaId, tag));
api(getState).post(`/api/v1/antennas/${antennaId}/tags`, { tags: [tag] })
.then(() => dispatch(addTagToAntennaSuccess(antennaId, tag)))
.catch(err => dispatch(addTagToAntennaFail(antennaId, tag, err)));
};
export const addTagToAntennaRequest = (antennaId, tag) => ({
type: ANTENNA_EDITOR_ADD_TAG_REQUEST,
antennaId,
tag,
});
export const addTagToAntennaSuccess = (antennaId, tag) => ({
type: ANTENNA_EDITOR_ADD_TAG_SUCCESS,
antennaId,
tag,
});
export const addTagToAntennaFail = (antennaId, tag, error) => ({
type: ANTENNA_EDITOR_ADD_TAG_FAIL,
antennaId,
tag,
error,
});
export const removeTagFromAntenna = (antennaId, tag) => (dispatch, getState) => {
dispatch(removeTagFromAntennaRequest(antennaId, tag));
api(getState).delete(`/api/v1/antennas/${antennaId}/tags`, { params: { tags: [tag] } })
.then(() => dispatch(removeTagFromAntennaSuccess(antennaId, tag)))
.catch(err => dispatch(removeTagFromAntennaFail(antennaId, tag, err)));
};
export const removeTagFromAntennaRequest = (antennaId, tag) => ({
type: ANTENNA_EDITOR_REMOVE_TAG_REQUEST,
antennaId,
tag,
});
export const removeTagFromAntennaSuccess = (antennaId, tag) => ({
type: ANTENNA_EDITOR_REMOVE_TAG_SUCCESS,
antennaId,
tag,
});
export const removeTagFromAntennaFail = (antennaId, tag, error) => ({
type: ANTENNA_EDITOR_REMOVE_TAG_FAIL,
antennaId,
tag,
error,
});
export const addExcludeTagToAntenna = (antennaId, tag) => (dispatch, getState) => {
dispatch(addExcludeTagToAntennaRequest(antennaId, tag));
api(getState).post(`/api/v1/antennas/${antennaId}/exclude_tags`, { tags: [tag] })
.then(() => dispatch(addExcludeTagToAntennaSuccess(antennaId, tag)))
.catch(err => dispatch(addExcludeTagToAntennaFail(antennaId, tag, err)));
};
export const addExcludeTagToAntennaRequest = (antennaId, tag) => ({
type: ANTENNA_EDITOR_ADD_EXCLUDE_TAG_REQUEST,
antennaId,
tag,
});
export const addExcludeTagToAntennaSuccess = (antennaId, tag) => ({
type: ANTENNA_EDITOR_ADD_EXCLUDE_TAG_SUCCESS,
antennaId,
tag,
});
export const addExcludeTagToAntennaFail = (antennaId, tag, error) => ({
type: ANTENNA_EDITOR_ADD_EXCLUDE_TAG_FAIL,
antennaId,
tag,
error,
});
export const removeExcludeTagFromAntenna = (antennaId, tag) => (dispatch, getState) => {
dispatch(removeExcludeTagFromAntennaRequest(antennaId, tag));
api(getState).delete(`/api/v1/antennas/${antennaId}/exclude_tags`, { params: { tags: [tag] } })
.then(() => dispatch(removeExcludeTagFromAntennaSuccess(antennaId, tag)))
.catch(err => dispatch(removeExcludeTagFromAntennaFail(antennaId, tag, err)));
};
export const removeExcludeTagFromAntennaRequest = (antennaId, tag) => ({
type: ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_REQUEST,
antennaId,
tag,
});
export const removeExcludeTagFromAntennaSuccess = (antennaId, tag) => ({
type: ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_SUCCESS,
antennaId,
tag,
});
export const removeExcludeTagFromAntennaFail = (antennaId, tag, error) => ({
type: ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_FAIL,
antennaId,
tag,
error,
});
export const resetAntennaAdder = () => ({
type: ANTENNA_ADDER_RESET,
});

View file

@ -25,7 +25,12 @@ import {
removeKeywordFromAntenna,
addKeywordToAntenna,
removeExcludeKeywordFromAntenna,
addExcludeKeywordToAntenna
addExcludeKeywordToAntenna,
fetchAntennaTags,
removeTagFromAntenna,
addTagToAntenna,
removeExcludeTagFromAntenna,
addExcludeTagToAntenna,
} from 'mastodon/actions/antennas';
import { addColumn, removeColumn, moveColumn } from 'mastodon/actions/columns';
import { fetchLists } from 'mastodon/actions/lists';
@ -48,8 +53,10 @@ const messages = defineMessages({
placeholder: { id: 'antennas.select.placeholder', defaultMessage: 'Select list' },
addDomainLabel: { id: 'antennas.add_domain_placeholder', defaultMessage: 'New domain' },
addKeywordLabel: { id: 'antennas.add_keyword_placeholder', defaultMessage: 'New keyword' },
addTagLabel: { id: 'antennas.add_tag_placeholder', defaultMessage: 'New tag' },
addDomainTitle: { id: 'antennas.add_domain', defaultMessage: 'Add domain' },
addKeywordTitle: { id: 'antennas.add_keyword', defaultMessage: 'Add keyword' },
addTagTitle: { id: 'antennas.add_tag', defaultMessage: 'Add tag' },
accounts: { id: 'antennas.accounts', defaultMessage: '{count} accounts' },
domains: { id: 'antennas.domains', defaultMessage: '{count} domains' },
tags: { id: 'antennas.tags', defaultMessage: '{count} tags' },
@ -62,6 +69,7 @@ const mapStateToProps = (state, props) => ({
lists: state.get('lists'),
domains: state.getIn(['antennas', props.params.id, 'domains']) || ImmutableMap(),
keywords: state.getIn(['antennas', props.params.id, 'keywords']) || ImmutableMap(),
tags: state.getIn(['antennas', props.params.id, 'tags']) || ImmutableMap(),
});
class AntennaSetting extends PureComponent {
@ -79,6 +87,7 @@ class AntennaSetting extends PureComponent {
lists: ImmutablePropTypes.map,
domains: ImmutablePropTypes.map,
keywords: ImmutablePropTypes.map,
tags: ImmutablePropTypes.map,
intl: PropTypes.object.isRequired,
};
@ -87,6 +96,8 @@ class AntennaSetting extends PureComponent {
excludeDomainName: '',
keywordName: '',
excludeKeywordName: '',
tagName: '',
excludeTagName: '',
rangeRadioValue: null,
contentRadioValue: null,
};
@ -118,6 +129,7 @@ class AntennaSetting extends PureComponent {
dispatch(fetchAntenna(id));
dispatch(fetchAntennaDomains(id));
dispatch(fetchAntennaKeywords(id));
dispatch(fetchAntennaTags(id));
dispatch(fetchLists());
}
@ -130,6 +142,7 @@ class AntennaSetting extends PureComponent {
dispatch(fetchAntennaKeywords(id));
dispatch(fetchAntennaDomains(id));
dispatch(fetchAntennaKeywords(id));
dispatch(fetchAntennaTags(id));
dispatch(fetchLists());
}
}
@ -238,6 +251,15 @@ class AntennaSetting extends PureComponent {
onKeywordRemove = (value) => this.props.dispatch(removeKeywordFromAntenna(this.props.params.id, value));
onTagNameChanged = (value) => this.setState({ tagName: value });
onTagAdd = () => {
this.props.dispatch(addTagToAntenna(this.props.params.id, this.state.tagName));
this.setState({ tagName: '' });
};
onTagRemove = (value) => this.props.dispatch(removeTagFromAntenna(this.props.params.id, value));
onExcludeDomainNameChanged = (value) => this.setState({ excludeDomainName: value });
onExcludeDomainAdd = () => {
@ -256,8 +278,17 @@ class AntennaSetting extends PureComponent {
onExcludeKeywordRemove = (value) => this.props.dispatch(removeExcludeKeywordFromAntenna(this.props.params.id, value));
onExcludeTagNameChanged = (value) => this.setState({ excludeTagName: value });
onExcludeTagAdd = () => {
this.props.dispatch(addExcludeTagToAntenna(this.props.params.id, this.state.excludeTagName));
this.setState({ excludeTagName: '' });
};
onExcludeTagRemove = (value) => this.props.dispatch(removeExcludeTagFromAntenna(this.props.params.id, value));
render () {
const { columnId, multiColumn, antenna, lists, domains, keywords, intl } = this.props;
const { columnId, multiColumn, antenna, lists, domains, keywords, tags, intl } = this.props;
const { id } = this.props.params;
const pinned = !!columnId;
const title = antenna ? antenna.get('title') : id;
@ -422,6 +453,19 @@ class AntennaSetting extends PureComponent {
<RadioPanel values={contentRadioValues} value={contentRadioValue} onChange={this.onContentRadioChanged} />
{contentRadioValue.get('value') === 'tags' && (
<TextList
onChange={this.onTagNameChanged}
onAdd={this.onTagAdd}
onRemove={this.onTagRemove}
value={this.state.tagName}
values={tags.get('tags') || ImmutableList()}
icon='hashtag'
label={intl.formatMessage(messages.addTagLabel)}
title={intl.formatMessage(messages.addTagTitle)}
/>
)}
{contentRadioValue.get('value') === 'keywords' && (
<TextList
onChange={this.onKeywordNameChanged}
@ -462,6 +506,17 @@ class AntennaSetting extends PureComponent {
label={intl.formatMessage(messages.addKeywordLabel)}
title={intl.formatMessage(messages.addKeywordTitle)}
/>
<h3><FormattedMessage id='antennas.exclude_tags' defaultMessage='Exclude tags' /></h3>
<TextList
onChange={this.onExcludeTagNameChanged}
onAdd={this.onExcludeTagAdd}
onRemove={this.onExcludeTagRemove}
value={this.state.excludeTagName}
values={tags.get('exclude_tags') || ImmutableList()}
icon='hashtag'
label={intl.formatMessage(messages.addTagLabel)}
title={intl.formatMessage(messages.addTagTitle)}
/>
</>
)}
</div>

View file

@ -19,6 +19,11 @@ import {
ANTENNA_EDITOR_ADD_EXCLUDE_KEYWORD_SUCCESS,
ANTENNA_EDITOR_REMOVE_EXCLUDE_KEYWORD_SUCCESS,
ANTENNA_EDITOR_FETCH_KEYWORDS_SUCCESS,
ANTENNA_EDITOR_ADD_TAG_SUCCESS,
ANTENNA_EDITOR_REMOVE_TAG_SUCCESS,
ANTENNA_EDITOR_ADD_EXCLUDE_TAG_SUCCESS,
ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_SUCCESS,
ANTENNA_EDITOR_FETCH_TAGS_SUCCESS,
} from '../actions/antennas';
const initialState = ImmutableMap();
@ -85,6 +90,16 @@ export default function antennas(state = initialState, action) {
return state.updateIn([action.antennaId, 'keywords', 'exclude_keywords'], keywords => (ImmutableList(keywords || [])).filterNot(keyword => keyword === action.keyword));
case ANTENNA_EDITOR_FETCH_KEYWORDS_SUCCESS:
return state.setIn([action.id, 'keywords'], ImmutableMap({ keywords: ImmutableList(action.keywords.keywords), exclude_keywords: ImmutableList(action.keywords.exclude_keywords) }));
case ANTENNA_EDITOR_ADD_TAG_SUCCESS:
return state.setIn([action.antennaId, 'tags_count'], state.getIn([action.antennaId, 'tags_count']) + 1).updateIn([action.antennaId, 'tags', 'tags'], tags => (ImmutableList(tags || [])).push(action.tag));
case ANTENNA_EDITOR_REMOVE_TAG_SUCCESS:
return state.setIn([action.antennaId, 'tags_count'], state.getIn([action.antennaId, 'tags_count']) - 1).updateIn([action.antennaId, 'tags', 'tags'], tags => (ImmutableList(tags || [])).filterNot(tag => tag === action.tag));
case ANTENNA_EDITOR_ADD_EXCLUDE_TAG_SUCCESS:
return state.updateIn([action.antennaId, 'tags', 'exclude_tags'], tags => (ImmutableList(tags || [])).push(action.tag));
case ANTENNA_EDITOR_REMOVE_EXCLUDE_TAG_SUCCESS:
return state.updateIn([action.antennaId, 'tags', 'exclude_tags'], tags => (ImmutableList(tags || [])).filterNot(tag => tag === action.tag));
case ANTENNA_EDITOR_FETCH_TAGS_SUCCESS:
return state.setIn([action.id, 'tags'], ImmutableMap({ tags: ImmutableList(action.tags.tags), exclude_tags: ImmutableList(action.tags.exclude_tags) }));
default:
return state;
}