group accounts improvements
This commit is contained in:
parent
05037f60be
commit
f7118a39df
|
@ -26,7 +26,8 @@ class Api::V1::Groups::AccountsController < Api::BaseController
|
||||||
def update
|
def update
|
||||||
authorize @group, :update_account?
|
authorize @group, :update_account?
|
||||||
|
|
||||||
GroupAccount.where(group: @group, account_id: current_account.id).update(group_account_params)
|
@account = @group.accounts.find(params[:account_id])
|
||||||
|
GroupAccount.where(group: @group, account: @account).update(group_account_params)
|
||||||
render_empty
|
render_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,10 @@ export const GROUP_REMOVE_STATUS_REQUEST = 'GROUP_REMOVE_STATUS_REQUEST';
|
||||||
export const GROUP_REMOVE_STATUS_SUCCESS = 'GROUP_REMOVE_STATUS_SUCCESS';
|
export const GROUP_REMOVE_STATUS_SUCCESS = 'GROUP_REMOVE_STATUS_SUCCESS';
|
||||||
export const GROUP_REMOVE_STATUS_FAIL = 'GROUP_REMOVE_STATUS_FAIL';
|
export const GROUP_REMOVE_STATUS_FAIL = 'GROUP_REMOVE_STATUS_FAIL';
|
||||||
|
|
||||||
|
export const GROUP_UPDATE_ROLE_REQUEST = 'GROUP_UPDATE_ROLE_REQUEST';
|
||||||
|
export const GROUP_UPDATE_ROLE_SUCCESS = 'GROUP_UPDATE_ROLE_SUCCESS';
|
||||||
|
export const GROUP_UPDATE_ROLE_FAIL = 'GROUP_UPDATE_ROLE_FAIL';
|
||||||
|
|
||||||
export const fetchGroup = id => (dispatch, getState) => {
|
export const fetchGroup = id => (dispatch, getState) => {
|
||||||
if (!me) return;
|
if (!me) return;
|
||||||
|
|
||||||
|
@ -521,4 +525,43 @@ export function groupRemoveStatusFail(groupId, id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function updateRole(groupId, id, role) {
|
||||||
|
return (dispatch, getState) => {
|
||||||
|
if (!me) return;
|
||||||
|
|
||||||
|
dispatch(updateRoleRequest(groupId, id));
|
||||||
|
|
||||||
|
api(getState).patch(`/api/v1/groups/${groupId}/accounts?account_id=${id}`, { role }).then(response => {
|
||||||
|
dispatch(updateRoleSuccess(groupId, id));
|
||||||
|
}).catch(error => {
|
||||||
|
dispatch(updateRoleFail(groupId, id, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function updateRoleRequest(groupId, id) {
|
||||||
|
return {
|
||||||
|
type: GROUP_REMOVED_ACCOUNTS_CREATE_REQUEST,
|
||||||
|
groupId,
|
||||||
|
id,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function updateRoleSuccess(groupId, id) {
|
||||||
|
return {
|
||||||
|
type: GROUP_REMOVED_ACCOUNTS_CREATE_SUCCESS,
|
||||||
|
groupId,
|
||||||
|
id,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export function updateRoleFail(groupId, id, error) {
|
||||||
|
return {
|
||||||
|
type: GROUP_REMOVED_ACCOUNTS_CREATE_FAIL,
|
||||||
|
groupId,
|
||||||
|
id,
|
||||||
|
error,
|
||||||
|
};
|
||||||
};
|
};
|
|
@ -8,14 +8,18 @@ import LoadingIndicator from '../../../components/loading_indicator';
|
||||||
import {
|
import {
|
||||||
fetchMembers,
|
fetchMembers,
|
||||||
expandMembers,
|
expandMembers,
|
||||||
|
updateRole,
|
||||||
|
createRemovedAccount,
|
||||||
} from '../../../actions/groups';
|
} from '../../../actions/groups';
|
||||||
import { FormattedMessage } from 'react-intl';
|
import { FormattedMessage } from 'react-intl';
|
||||||
import AccountContainer from '../../../containers/account_container';
|
import AccountContainer from '../../../containers/account_container';
|
||||||
import Column from '../../ui/components/column';
|
import Column from '../../ui/components/column';
|
||||||
import ScrollableList from '../../../components/scrollable_list';
|
import ScrollableList from '../../../components/scrollable_list';
|
||||||
|
import DropdownMenuContainer from '../../../containers/dropdown_menu_container';
|
||||||
|
|
||||||
const mapStateToProps = (state, { params: { id } }) => ({
|
const mapStateToProps = (state, { params: { id } }) => ({
|
||||||
group: state.getIn(['groups', id]),
|
group: state.getIn(['groups', id]),
|
||||||
|
relationships: state.getIn(['group_relationships', id]),
|
||||||
accountIds: state.getIn(['user_lists', 'groups', id, 'items']),
|
accountIds: state.getIn(['user_lists', 'groups', id, 'items']),
|
||||||
hasMore: !!state.getIn(['user_lists', 'groups', id, 'next']),
|
hasMore: !!state.getIn(['user_lists', 'groups', id, 'next']),
|
||||||
});
|
});
|
||||||
|
@ -47,9 +51,9 @@ class GroupMembers extends ImmutablePureComponent {
|
||||||
}, 300, { leading: true });
|
}, 300, { leading: true });
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { accountIds, hasMore, group } = this.props;
|
const { accountIds, hasMore, group, relationships, dispatch } = this.props;
|
||||||
|
|
||||||
if (!group || !accountIds) {
|
if (!group || !accountIds || !relationships) {
|
||||||
return (
|
return (
|
||||||
<Column>
|
<Column>
|
||||||
<LoadingIndicator />
|
<LoadingIndicator />
|
||||||
|
@ -65,7 +69,23 @@ class GroupMembers extends ImmutablePureComponent {
|
||||||
onLoadMore={this.handleLoadMore}
|
onLoadMore={this.handleLoadMore}
|
||||||
emptyMessage={<FormattedMessage id='group.members.empty' defaultMessage='This group does not has any members.' />}
|
emptyMessage={<FormattedMessage id='group.members.empty' defaultMessage='This group does not has any members.' />}
|
||||||
>
|
>
|
||||||
{accountIds.map(id => <AccountContainer key={id} id={id} withNote={false} />)}
|
{accountIds.map(id => {
|
||||||
|
let menu = [];
|
||||||
|
|
||||||
|
if (relationships.get('admin')) {
|
||||||
|
menu = [
|
||||||
|
{ text: 'Remove from group', action: () => dispatch(createRemovedAccount(group.get('id'), id)) },
|
||||||
|
{ text: 'Make administrator', action: () => dispatch(updateRole(group.get('id'), id, 'admin')) },
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="group-account-wrapper" key={id}>
|
||||||
|
<AccountContainer id={id} withNote={false} actionIcon="none" onActionClick={() => true} />
|
||||||
|
{menu.length > 0 && <DropdownMenuContainer items={menu} icon='ellipsis-h' size={18} direction='right' />}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})}
|
||||||
</ScrollableList>
|
</ScrollableList>
|
||||||
</Column>
|
</Column>
|
||||||
);
|
);
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
@import 'gabsocial/components/compose-form';
|
@import 'gabsocial/components/compose-form';
|
||||||
@import 'gabsocial/components/group-card';
|
@import 'gabsocial/components/group-card';
|
||||||
@import 'gabsocial/components/group-detail';
|
@import 'gabsocial/components/group-detail';
|
||||||
|
@import 'gabsocial/components/group-accounts';
|
||||||
@import 'gabsocial/components/group-form';
|
@import 'gabsocial/components/group-form';
|
||||||
@import 'gabsocial/components/group-sidebar-panel';
|
@import 'gabsocial/components/group-sidebar-panel';
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
.group-account-wrapper {
|
||||||
|
position: relative;
|
||||||
|
|
||||||
|
& > div > .icon-button {
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
top: 50%;
|
||||||
|
transform: translateY(-50%);
|
||||||
|
}
|
||||||
|
}
|
|
@ -23,7 +23,7 @@
|
||||||
# in_reply_to_account_id :bigint(8)
|
# in_reply_to_account_id :bigint(8)
|
||||||
# poll_id :bigint(8)
|
# poll_id :bigint(8)
|
||||||
# group_id :integer
|
# group_id :integer
|
||||||
# quote_id :bigint(8)
|
# quote_of_id :bigint(8)
|
||||||
#
|
#
|
||||||
|
|
||||||
class Status < ApplicationRecord
|
class Status < ApplicationRecord
|
||||||
|
|
10
db/schema.rb
10
db/schema.rb
|
@ -93,7 +93,7 @@ ActiveRecord::Schema.define(version: 2019_08_04_115634) do
|
||||||
t.bigint "account_id"
|
t.bigint "account_id"
|
||||||
t.string "image_file_name"
|
t.string "image_file_name"
|
||||||
t.string "image_content_type"
|
t.string "image_content_type"
|
||||||
t.integer "image_file_size"
|
t.bigint "image_file_size"
|
||||||
t.datetime "image_updated_at"
|
t.datetime "image_updated_at"
|
||||||
t.datetime "created_at", null: false
|
t.datetime "created_at", null: false
|
||||||
t.datetime "updated_at", null: false
|
t.datetime "updated_at", null: false
|
||||||
|
@ -157,10 +157,10 @@ ActiveRecord::Schema.define(version: 2019_08_04_115634) do
|
||||||
t.string "actor_type"
|
t.string "actor_type"
|
||||||
t.boolean "discoverable"
|
t.boolean "discoverable"
|
||||||
t.string "also_known_as", array: true
|
t.string "also_known_as", array: true
|
||||||
t.boolean "is_pro", default: false, null: false
|
|
||||||
t.datetime "pro_expires_at"
|
|
||||||
t.datetime "silenced_at"
|
t.datetime "silenced_at"
|
||||||
t.datetime "suspended_at"
|
t.datetime "suspended_at"
|
||||||
|
t.boolean "is_pro", default: false, null: false
|
||||||
|
t.datetime "pro_expires_at"
|
||||||
t.boolean "is_verified", default: false, null: false
|
t.boolean "is_verified", default: false, null: false
|
||||||
t.boolean "is_donor", default: false, null: false
|
t.boolean "is_donor", default: false, null: false
|
||||||
t.boolean "is_investor", default: false, null: false
|
t.boolean "is_investor", default: false, null: false
|
||||||
|
@ -658,8 +658,8 @@ ActiveRecord::Schema.define(version: 2019_08_04_115634) do
|
||||||
create_table "status_pins", force: :cascade do |t|
|
create_table "status_pins", force: :cascade do |t|
|
||||||
t.bigint "account_id", null: false
|
t.bigint "account_id", null: false
|
||||||
t.bigint "status_id", null: false
|
t.bigint "status_id", null: false
|
||||||
t.datetime "created_at", default: -> { "CURRENT_TIMESTAMP" }, null: false
|
t.datetime "created_at", default: -> { "now()" }, null: false
|
||||||
t.datetime "updated_at", default: -> { "CURRENT_TIMESTAMP" }, null: false
|
t.datetime "updated_at", default: -> { "now()" }, null: false
|
||||||
t.index ["account_id", "status_id"], name: "index_status_pins_on_account_id_and_status_id", unique: true
|
t.index ["account_id", "status_id"], name: "index_status_pins_on_account_id_and_status_id", unique: true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue