SelectUserView.js 6.79 KB
import React, {Component} from 'react';
import {Image, Text, TouchableOpacity, View, StyleSheet, Alert} from 'react-native';
import {xnBorderWidth} from "../utils/utils";

/**
 * 选择用户组件
 */
export default class SelectUserView extends Component {

    constructor(props) {
        super(props);
        this.state = {
            usersList: []
        }
        // 传入参数
        this.attrData = this.props.attrData;
        // json解析后的传入参数
        this.extendData = (this.attrData.data && this.attrData.data.length > 0) ? JSON.parse(this.attrData.data) : {};
    }

    // 添加用户(通过自定义的'Employee'页面)
    addUser = () => {
        this.props.navigation.navigate("Employee", {
            status: "add", callback: (data) => {
                let usersList = this.state.usersList || [];
                let object = {};
                object.objectName = data.name;
                object.objectId = data.userId;
                object.objectAvatar = data.avatar||'';
                object.type = "USER";
                usersList.push(object);
                this.attrData.value = JSON.stringify(usersList);
                this.setState({usersList});
            }
        })
    };

    deleteUser = (v, i) => {
        Alert.alert(
            '删除',
            '确定删除?',
            [
                {text: '取消', onPress: () => console.log('Cancel Pressed'), style: 'cancel'},
                {
                    text: '确定', onPress: () => {
                        let userList = this.state.usersList;
                        userList.splice(i, 1);
                        this.attrData.value = JSON.stringify(usersList);
                        this.setState({usersList});
                    }
                },
            ]
        )

    }

    // 用户UI绘制
    _renderUser = (v, i) => {
        return (
            <View style={styles.addItem} key={i}>
                <View style={styles.addItemLayout}>
                    <View style={[styles.addItemImg, {backgroundColor: global.homeColor}]}>
                        {!v.avatar && <Text
                            style={styles.addItemImageText}>{v.objectName.length > 2 ? v.objectName.substring(v.objectName.length - 2) : v.objectName}</Text>}
                        {v.avatar &&
                        <Image style={styles.addItemImage} source={{uri: v.avatar}} resizeMode="contain"></Image>}
                    </View>
                    <View style={styles.addItemName}><Text style={styles.addItemNameText}>{v.objectName}</Text></View>
                    <TouchableOpacity style={styles.addItemDelete} onPress={(v) => {
                        this.deleteUser(v, i)
                    }}>
                        <Image style={styles.addItemDeleteIcon} source={require('../img/delete.png')}
                               resizeMode="contain"/>
                    </TouchableOpacity>
                </View>
            </View>
        )
    };

    render() {

        const { name, code, type, description, isRequired, value } = this.attrData;
        // 用户选择组件属性
        // userType: 用户类型 固定:USER=用户|EMPLOYEE=员工|SUPPLIER=供应商|ISV=开发者
        // minValue: 最少人数  maxValue: 最多人数,默认不限制
        const { userType, minValue, maxValue } = this.extendData;
        // 限制添加用户
        let enabledAddUser = true;
        if (maxValue && value && maxValue <= value.length) {
            enabledAddUser = false
        }

        return (
            // 最外层的样式区域
            <View style={{
                // 高度
                //minHeight: 130,
                // 左内边距
                paddingLeft: 10,
                // 右内边距
                paddingRight: 15,
                // 背景色
                backgroundColor: '#fff',
                // 上内边距
                paddingTop: 6,
            }}>
                {/*标题显示区域*/}
                <View style={{flexDirection: 'row'}}>
                    {/*是否必须UI设定*/}
                    {isRequired && <Text style={{color: "#FF3030"}}>* </Text>}
                    {!isRequired && <Text style={{color: "#fff"}}>* </Text>}
                    {/*标题设定*/}
                    <Text style={{fontSize: 16, color: "#000",}}>{name}:</Text>
                </View>
                <View style={styles.addList}>
                    {/*显示选择的用户*/}
                    {value && value.length > 0 && JSON.parse(value).map((v, i) => this._renderUser(v, i))}
                    {/*添加用户区域*/}
                    {enabledAddUser &&
                    <View style={styles.addItem}>
                        {/*用于触发添加操作*/}
                        <TouchableOpacity style={styles.addItemLayout} onPress={() => {
                            this.addUser()
                        }}>
                            {/*"+"号*/}
                            <View style={[styles.addItemImg, styles.addItemImgOp]}><Image
                                style={{width: 12, height: 12}} source={require('../img/add-icon.png')}
                                resizeMode="contain"/></View>
                            <View style={styles.addItemName}><Text
                                style={[styles.addItemNameText, styles.addItemNameTextOp]}>添加</Text></View>
                        </TouchableOpacity>
                    </View>}
                </View>
            </View>
        );
    }
}

const styles = StyleSheet.create({
    addList: {
        flexDirection: "row",
        paddingTop: 10,
        flexWrap: "wrap",
    },
    addItem: {
        width: 50,
        //height: 70,
        marginLeft: 10,
        marginBottom: 10,
        justifyContent: "center",
        flexDirection: "row",
    },
    addItemLayout: {
        //height: 70,
        width: 50,
    },
    addItemImg: {
        height: 50,
        width: 50,
        justifyContent: "center",
        alignItems: "center",
        borderRadius: 3,
        backgroundColor: "#39f",
    },
    addItemImageText: {
        color: "#fff",
        fontSize: 10,
    },
    addItemImage: {
        height: 50,
        width: 50,
    },
    addItemName: {
        //height: 20,
        width: 50,
        justifyContent: "center",
        flexDirection: "row",
    },
    addItemNameText: {
        fontSize: 12,
        color: "#333333",
        textAlign: "center",
        padding: 3,
    },
    addItemDelete: {
        position: "absolute",
        width: 14,
        height: 14,
        right: 2,
        top: 3,
    },
    addItemDeleteIcon: {
        width: 10,
        height: 10
    },
    addItemImgOp: {
        borderWidth: xnBorderWidth(),
        borderColor: "#ddd",
        backgroundColor: "transparent",
    },
    addItemNameTextOp: {
        color: "#999",

    },
})