You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

273 lines
10 KiB

import dash
import time
import uuid
from dash.dependencies import Input, Output, State, ALL, MATCH
from dash.exceptions import PreventUpdate
import feffery_utils_components as fuc
from server import app
from api.role import get_allocated_user_list_api, get_unallocated_user_list_api, auth_user_select_all_api, auth_user_cancel_api
@app.callback(
[Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'data', allow_duplicate=True),
Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'pagination', allow_duplicate=True),
Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'key'),
Output({'type': 'allocate_user-list-table', 'index': MATCH}, 'selectedRowKeys')],
[Input({'type': 'allocate_user-search', 'index': MATCH}, 'nClicks'),
Input({'type': 'allocate_user-refresh', 'index': MATCH}, 'nClicks'),
Input({'type': 'allocate_user-list-table', 'index': MATCH}, 'pagination'),
Input({'type': 'allocate_user-operations-container', 'index': MATCH}, 'data')],
[State({'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value'),
State({'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value'),
State('allocate_user-role_id-container', 'data'),
State('allocate_user-button-perms-container', 'data')],
prevent_initial_call=True
)
def get_allocate_user_table_data(search_click, refresh_click, pagination, operations, user_name, phonenumber, role_id, button_perms):
"""
使用模式匹配回调MATCH模式,根据不同类型获取角色已分配用户列表及未分配用户列表(进行表格相关增删查改操作后均会触发此回调)
"""
query_params = dict(
role_id=int(role_id),
user_name=user_name,
phonenumber=phonenumber,
page_num=1,
page_size=10
)
triggered_id = dash.ctx.triggered_id
if triggered_id.type == 'allocate_user-list-table':
query_params = dict(
role_id=int(role_id),
user_name=user_name,
phonenumber=phonenumber,
page_num=pagination['current'],
page_size=pagination['pageSize']
)
if search_click or refresh_click or pagination or operations:
table_info = {}
if triggered_id.index == 'allocated':
table_info = get_allocated_user_list_api(query_params)
if triggered_id.index == 'unallocated':
table_info = get_unallocated_user_list_api(query_params)
if table_info.get('code') == 200:
table_data = table_info['data']['rows']
table_pagination = dict(
pageSize=table_info['data']['page_size'],
current=table_info['data']['page_num'],
showSizeChanger=True,
pageSizeOptions=[10, 30, 50, 100],
showQuickJumper=True,
total=table_info['data']['total']
)
for item in table_data:
if item['status'] == '0':
item['status'] = dict(tag='正常', color='blue')
else:
item['status'] = dict(tag='停用', color='volcano')
item['key'] = str(item['user_id'])
if triggered_id.index == 'allocated':
item['operation'] = [
{
'content': '取消授权',
'type': 'link',
'icon': 'antd-close-circle'
} if 'system:role:edit' in button_perms else {},
]
return [table_data, table_pagination, str(uuid.uuid4()), None]
return [dash.no_update, dash.no_update, dash.no_update, dash.no_update]
raise PreventUpdate
# 重置分配用户搜索表单数据回调
app.clientside_callback(
'''
(reset_click) => {
if (reset_click) {
return [null, null, {'type': 'reset'}]
}
return window.dash_clientside.no_update;
}
''',
[Output({'type': 'allocate_user-user_name-input', 'index': MATCH}, 'value'),
Output({'type': 'allocate_user-phonenumber-input', 'index': MATCH}, 'value'),
Output({'type': 'allocate_user-operations-container', 'index': MATCH}, 'data')],
Input({'type': 'allocate_user-reset', 'index': MATCH}, 'nClicks'),
prevent_initial_call=True
)
# 隐藏/显示分配用户搜索表单回调
app.clientside_callback(
'''
(hidden_click, hidden_status) => {
if (hidden_click) {
return [
!hidden_status,
hidden_status ? '隐藏搜索' : '显示搜索'
]
}
return window.dash_clientside.no_update;
}
''',
[Output({'type': 'allocate_user-search-form-container', 'index': MATCH}, 'hidden'),
Output({'type': 'allocate_user-hidden-tooltip', 'index': MATCH}, 'title')],
Input({'type': 'allocate_user-hidden', 'index': MATCH}, 'nClicks'),
State({'type': 'allocate_user-search-form-container', 'index': MATCH}, 'hidden'),
prevent_initial_call=True
)
@app.callback(
Output({'type': 'allocate_user-operation-button', 'index': 'delete'}, 'disabled'),
Input({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'selectedRowKeys'),
prevent_initial_call=True
)
def change_allocated_user_delete_button_status(table_rows_selected):
"""
根据选择的表格数据行数控制取批量消授权按钮状态回调
"""
outputs_list = dash.ctx.outputs_list
if outputs_list:
if table_rows_selected:
return False
return True
raise PreventUpdate
@app.callback(
[Output('allocate_user-modal', 'visible'),
Output({'type': 'allocate_user-search', 'index': 'unallocated'}, 'nClicks')],
Input('allocate_user-add', 'nClicks'),
State({'type': 'allocate_user-search', 'index': 'unallocated'}, 'nClicks'),
prevent_initial_call=True
)
def allocate_user_modal(add_click, unallocated_user):
"""
分配用户弹框中添加用户按钮回调
"""
if add_click:
return [True, unallocated_user + 1 if unallocated_user else 1]
raise PreventUpdate
@app.callback(
[Output({'type': 'allocate_user-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True),
Output({'type': 'allocate_user-operations-container', 'index': 'unallocated'}, 'data', allow_duplicate=True),
Output('api-check-token', 'data', allow_duplicate=True),
Output('global-message-container', 'children', allow_duplicate=True)],
Input('allocate_user-modal', 'okCounts'),
[State({'type': 'allocate_user-list-table', 'index': 'unallocated'}, 'selectedRowKeys'),
State('allocate_user-role_id-container', 'data')],
prevent_initial_call=True
)
def allocate_user_add_confirm(add_confirm, selected_row_keys, role_id):
"""
添加用户确认回调,实现给角色分配用户操作
"""
if add_confirm:
if selected_row_keys:
params = {'user_ids': ','.join(selected_row_keys), 'role_ids': role_id}
add_button_info = auth_user_select_all_api(params)
if add_button_info['code'] == 200:
return [
{'type': 'delete'},
{'type': 'delete'},
{'timestamp': time.time()},
fuc.FefferyFancyMessage('授权成功', type='success')
]
return [
dash.no_update,
dash.no_update,
{'timestamp': time.time()},
fuc.FefferyFancyMessage('授权失败', type='error')
]
return [
dash.no_update,
dash.no_update,
dash.no_update,
fuc.FefferyFancyMessage('请选择用户', type='error')
]
raise PreventUpdate
@app.callback(
[Output('allocate_user-delete-text', 'children'),
Output('allocate_user-delete-confirm-modal', 'visible'),
Output('allocate_user-delete-ids-store', 'data')],
[Input({'type': 'allocate_user-operation-button', 'index': ALL}, 'nClicks'),
Input({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'nClicksButton')],
[State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'selectedRowKeys'),
State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'clickedContent'),
State({'type': 'allocate_user-list-table', 'index': 'allocated'}, 'recentlyButtonClickedRow')],
prevent_initial_call=True
)
def allocate_user_delete_modal(operation_click, button_click,
selected_row_keys, clicked_content, recently_button_clicked_row):
"""
显示取消授权二次确认弹窗回调
"""
trigger_id = dash.ctx.triggered_id
if trigger_id.type == 'allocate_user-operation-button' or (
trigger_id.type == 'allocate_user-list-table' and clicked_content == '取消授权'):
if trigger_id.type == 'allocate_user-operation-button':
user_ids = ','.join(selected_row_keys)
else:
if clicked_content == '取消授权':
user_ids = recently_button_clicked_row['key']
else:
return dash.no_update
return [
f'是否确认取消用户id为{user_ids}的授权?',
True,
user_ids
]
raise PreventUpdate
@app.callback(
[Output({'type': 'allocate_user-operations-container', 'index': 'allocated'}, 'data', allow_duplicate=True),
Output('api-check-token', 'data', allow_duplicate=True),
Output('global-message-container', 'children', allow_duplicate=True)],
Input('allocate_user-delete-confirm-modal', 'okCounts'),
[State('allocate_user-delete-ids-store', 'data'),
State('allocate_user-role_id-container', 'data')],
prevent_initial_call=True
)
def allocate_user_delete_confirm(delete_confirm, user_ids_data, role_id):
"""
取消授权弹窗确认回调,实现取消授权操作
"""
if delete_confirm:
params = {'user_ids': user_ids_data, 'role_ids': role_id}
delete_button_info = auth_user_cancel_api(params)
if delete_button_info['code'] == 200:
return [
{'type': 'delete'},
{'timestamp': time.time()},
fuc.FefferyFancyMessage('取消授权成功', type='success')
]
return [
dash.no_update,
{'timestamp': time.time()},
fuc.FefferyFancyMessage('取消授权失败', type='error')
]
raise PreventUpdate