折腾:
【未解决】剧本编写系统中优化全部剧本列表页
期间,需要去
给页面中添加 剧本组和剧本成员列表
且支持从 全部剧本列表 页传入 group_id或 group_id,author_id
分别去匹配到对应的剧本组和 组成员
经过一番折腾,用代码:
现在已经可以支持显示剧本组和剧本成员列表了:
import React, { PureComponent, Fragment } from 'react'; import { connect } from 'dva'; import { Row, Col, Card, Form, Input, Button, Divider, Popconfirm, Tooltip, Select, } from 'antd'; 。。。 import { isString, isNumber } from '../../utils/utils'; const queryString = require('query-string'); const FormItem = Form.Item; const { Option } = Select; @connect(({ script, topic, user, functionGroup, loading }) => ({ // @connect(({ script, topic, user, functionGroup }) => ({ script, topic, currentUser: user.currentUser, // currentUserFunctionGroupList: user.currentUserFunctionGroupList, functionGroup, loading: loading.models.script, })) @Form.create() export default class AllScriptList extends PureComponent { state = { formValues: {}, currentPage: 1, pageSize: 20, first_level_topic: [], second_level_topic: [], groupList: [], groupMemberList: [], }; componentWillMount() { console.log(`AllScriptList componentWillMount`) console.log(`this.props=`, this.props) const { currentUser} = this.props; console.log(`currentUser=`, currentUser) // const { functionGroup, members } = this.props; const { functionGroup: { functionGroup, functionGroups, members } } = this.props; console.log(`functionGroups=`, functionGroups) console.log(`functionGroup=`, functionGroup) console.log(`members=`, members) } componentDidMount() { console.log(`AllScriptList componentDidMount`) const { dispatch, currentUser} = this.props; console.log(`currentUser=`, currentUser) const { functionGroup: { functionGroups } } = this.props; console.log(`functionGroups=`, functionGroups) dispatch({ type: 'user/fetchCurrent', }).then(() => { }); // topic select 取所有的 topic const params = { page_size: 1000, }; dispatch({ type: 'topic/fetch', payload: params, }); // }).then( () => { // console.log("topic fetch callback: this=", this) // this.fetchFunctionGroupCallback(this) // }); const queryParamDict = this.generateQueryParamDict() this.updateScriptList(queryParamDict) // this.updateFunctionGroupsList(queryParamDict, this.fetchFunctionGroupCallback) this.updateFunctionGroupsList(this.fetchFunctionGroupCallback) // this.updateFunctionGroupsList(queryParamDict) // this.updateFunctionGroupsList() } onSecondLevelTopicChange(topicList, value) { const { form } = this.props; form.setFieldsValue({ second_level_topic: value || '', }); this.setState({ second_level_topic: value || '', }); } onFirstLevelTopicChange(topicList, value) { const { form } = this.props; form.setFieldsValue({ topic: value, // second_level_topic: topicList[value][0] || '', second_level_topic: '', // when first topic change, clear second topic }); this.setState({ first_level_topic: topicList[value], // second_level_topic: topicList[value][0] || '', second_level_topic: '', // when first topic change, clear second topic }); } 。。。 onGroupMemberListChange(groupMemberList, value) { console.log("onGroupMemberListChange: groupMemberList=", groupMemberList, ", value=", value) const { form } = this.props; form.setFieldsValue({ author_id: value || '', }); } onGroupListChange(groupList, value) { console.log("onGroupListChange: groupList=", groupList, ", value=", value) const { form } = this.props; form.setFieldsValue({ group_id: value, author_id: '', // when group change, clear author }); const curGroupMemberList = this.getGroupMemberList(groupList, value) this.setState({ groupMemberList: curGroupMemberList, }); } updateScriptList(payload = {}){ console.log("updateScriptList: payload=", payload) const { dispatch } = this.props dispatch({ type: 'script/fetch', // payload: payload, payload, }); } generateQueryParamDict(){ const parsedQueryString = queryString.parse(this.props.location.search); console.log(`generateQueryParamDict: parsedQueryString=`, parsedQueryString) const queryParamDict = {} if (parsedQueryString) { const authorId = parsedQueryString.author_id; const groupId = parsedQueryString.group_id; console.log(`authorId=${authorId}, groupId=${groupId}`) if (authorId){ queryParamDict.author_id = authorId } if (groupId){ queryParamDict.group_id = groupId } } console.log(`queryParamDict=`, queryParamDict) return queryParamDict } // updateFunctionGroupsList(queryParamDict = {}, callback=undefined){ updateFunctionGroupsList(callback=undefined){ // console.log("updateFunctionGroupsList: queryParamDict=", queryParamDict, ", callback=", callback) console.log("updateFunctionGroupsList: callback=", callback) // Note: here only get SCRIPT function group, omit ADMIN function group const FUNCTION_GROUP_FUNCTION_SCRIPT = "1" // const curQueryParamDict = queryParamDict // curQueryParamDict.function = FUNCTION_GROUP_FUNCTION_SCRIPT const curQueryParamDict = { "function": FUNCTION_GROUP_FUNCTION_SCRIPT, } // // Note: when get group list, not consider group_id // if (curQueryParamDict.group_id) { // delete curQueryParamDict.group_id // } console.log(`curQueryParamDict=`, curQueryParamDict) if(callback) { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }).then(callback(this)); }else { this.props.dispatch({ type: 'functionGroup/fetch', payload: curQueryParamDict, }) } } /* eslint-disable class-methods-use-this */ fetchFunctionGroupCallback(curThis){ // console.log(`fetchFunctionGroupCallback: this=`, this) console.log(`fetchFunctionGroupCallback: curThis=`, curThis) const { functionGroup: { functionGroups } } = curThis.props; console.log(`fetchFunctionGroupCallback: functionGroups=`, functionGroups) if (functionGroups.results){ const functionGroupList = functionGroups.results console.log("functionGroupList=", functionGroupList) curThis.updateGroupAndMember(functionGroupList) } } /* eslint-disable class-methods-use-this */ getGroupMemberList(groupList, selectedGroupId) { console.log("getGroupMemberList: groupList=", groupList, ", selectedGroupId=", selectedGroupId) let selectedGroupIdInt = 0 if (isString(selectedGroupId)) { selectedGroupIdInt = parseInt(selectedGroupId, 10) } else if (isNumber(selectedGroupId)) { selectedGroupIdInt = selectedGroupId } console.log("selectedGroupIdInt=", selectedGroupIdInt) let curGroupMemberList = [] let curGroup for (const eachGroup of groupList){ console.log("eachGroup=", eachGroup) if (eachGroup.id === selectedGroupIdInt){ curGroup = eachGroup curGroupMemberList = eachGroup.members console.log("found curGroup=", curGroup, ", curGroupMemberList=", curGroupMemberList) break } } return curGroupMemberList } updateGroupAndMember(functionGroupList) { console.log("updateGroupAndMember: this", this) const queryParamDict = this.generateQueryParamDict() console.log(`before setFieldsValue queryParamDict=`, queryParamDict) const curGroupId = queryParamDict.group_id const curAuthorId = queryParamDict.author_id console.log(`curGroupId=${curGroupId}, curAuthorId=${curAuthorId}`) this.setState({ groupList: functionGroupList || [], }); this.props.form.setFieldsValue({ group_id: curGroupId || "", }); const { formValues } = this.state; console.log(`formValues=`, formValues) const newFormValues = { group_id: curGroupId || "", // author_id: curAuthorId || "", ...formValues, }; console.log(`newFormValues=`, newFormValues) this.setState({ formValues: newFormValues, }); if (curGroupId) { // const curGroupIdInt = parseInt(curGroupId, 10) // console.log("curGroupIdInt=", curGroupIdInt) const curGroupMemberList = this.getGroupMemberList(functionGroupList, curGroupId) if (curGroupMemberList) { console.log("set curGroupMemberList=", curGroupMemberList) this.setState({ groupMemberList: curGroupMemberList, }); if (curAuthorId) { console.log("now to set curAuthorId=", curAuthorId) this.props.form.setFieldsValue({ author_id: curAuthorId || "", }); const { aboveFormValues } = this.state; console.log(`aboveFormValues=`, aboveFormValues) const newAboveFormValues = { author_id: curAuthorId || "", ...aboveFormValues, }; console.log(`newAboveFormValues=`, newAboveFormValues) this.setState({ formValues: newAboveFormValues, }); } } } } renderSimpleForm() { const { getFieldDecorator } = this.props.form; const topicList = this.props.topic.topics; const firstLevelOptions = Object.keys(topicList).map(first => <Option key={first}>{first}</Option>); const secondLevelOptions = this.state.first_level_topic.map(second => <Option key={second}>{second}</Option>); console.log("renderSimpleForm") console.log("groupList=", this.state.groupList) console.log("groupMemberList=", this.state.groupMemberList) const groupOptions = this.state.groupList.map(eachGroup => <Option key={eachGroup.id}>{eachGroup.name}</Option>); const authorOptions = this.state.groupMemberList.map(eachAuthor => <Option key={eachAuthor.id}>{eachAuthor.username}</Option>); const selectFormItemLayout = { labelCol: { xs: { span: 24 }, sm: { span: 7 }, }, wrapperCol: { xs: { span: 36 }, sm: { span: 18 }, md: { span: 16 }, }, }; return ( <Form onSubmit={this.handleSearch} layout="inline"> <Row gutter={{ md: 8, lg: 24, xl: 48 }}> <Col md={8} sm={18}> <FormItem label="剧本组"> {getFieldDecorator('group_id')( <Select showSearch optionFilterProp="children" filterOption={(input, option) => option.props.children.indexOf(input) >= 0} onChange={this.onGroupListChange.bind(this, this.state.groupList)} style={{ width: '100%' }} placeholder="剧本组" > {groupOptions} </Select> )} </FormItem> </Col> <Col md={6} sm={18}> <FormItem label="作者"> {getFieldDecorator('author_id')( <Select showSearch optionFilterProp="children" filterOption={(input, option) => option.props.children.indexOf(input) >= 0} onChange={this.onGroupMemberListChange.bind(this, this.state.groupMemberList)} style={{ width: '100%' }} placeholder="作者" > {authorOptions} </Select> )} </FormItem> </Col> 。。。 </Row> </Form> ); } render() { const { script: { scripts }, loading } = this.props; const { currentPage, pageSize } = this.state; console.log("this.currentUser=", this.currentUser) const columns = [ { title: '序号', dataIndex: 'no', rowKey: 'no', fixed: 'left', render(text, record, index) { const no = (currentPage - 1) * pageSize return no + index + 1; }, }, { title: '剧本组', dataIndex: 'joinedScriptGroup.groupName', rowKey: 'joinedScriptGroup.groupName', }, { title: '作者', dataIndex: 'author', rowKey: 'author', }, { title: 'Place', dataIndex: 'place', rowKey: 'place', width: 80, },。。。 }, ]; return ( <PageHeaderLayout title="组员剧本列表"> <Card bordered={false}> <div className={styles.tableList}> <div className={styles.tableListForm}>{this.renderSimpleForm()}</div> <SimpleTable loading={loading} data={scripts} columns={columns} scroll={{ x: 1800 }} onChange={this.handleStandardTableChange} /> </div> </Card> </PageHeaderLayout> ); } }
其中:
获取所有的组,是调用后端Django接口:
127.0.0.1 – – [03/Aug/2018 09:06:24] “OPTIONS /api/v1/function_groups/?function=1 HTTP/1.1” 200
得到的,所有组的列表的
是通过给FunctionGroupViewSet添加了list接口实现的:
class FunctionGroupViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.RetrieveModelMixin, PutOnlyUpdateModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet): """ 功能组,有组长 """ queryset = FunctionGroup.objects.all() serializer_class = FunctionGroupSerializer permission_classes = (IsAuthenticated, IsUserFunctionAdmin) filter_backends = (OrderingFilter, SearchFilter) ordering_fields = ('created_at', ) ordering = ('-created_at', ) search_fields = ('name', 'description') def list(self, request, *args, **kwargs): """ 获取 function group 的列表 """ logger.info("FunctionGroupViewSet list: request=%s", request) function = request.query_params.get('function', '') group_id = request.query_params.get('group_id', '') logger.info("function=%s,group_id=%s", function, group_id) filter_condition = Q() if function: filter_condition = filter_condition & Q(function=function) if group_id: filter_condition = filter_condition & Q(id=group_id) logger.debug("filter_condition=%s", filter_condition) filteredFunctionGroup = FunctionGroup.objects.filter(filter_condition) logger.debug("filteredFunctionGroup=%s", filteredFunctionGroup) pagedFunctionGroup = self.paginate_queryset(filteredFunctionGroup) logger.info("pagedFunctionGroup=%s", pagedFunctionGroup) functionGroupSerializer = FunctionGroupSerializer(pagedFunctionGroup, many=True) logger.debug("functionGroupSerializer=%s", functionGroupSerializer) functionGroupSerializedData = functionGroupSerializer.data logger.debug("functionGroupSerializedData=%s", functionGroupSerializedData) respData = None if pagedFunctionGroup is not None: respData = self.get_paginated_response(functionGroupSerializedData) else: respData = Response(functionGroupSerializedData, status=status.HTTP_200_OK) logger.debug("respData=%s", respData) return respData
只传入group_id:
转载请注明:在路上 » 【已解决】全部剧本列表中添加剧本组和组成员列表