就在剛剛已經把我們整個頁面完成囉
好的 再來就說一些細節部分了
首先是 container.MyBoxPage
(state) => ({
    IsLogin: state.getIn(['InitReducer', 'IsLogin']),
    CompID: state.getIn(['InitReducer', 'CurrentUser', 'CompID']),
    UserID: state.getIn(['InitReducer', 'CurrentUser', 'UserID']),
    Token: state.getIn(['InitReducer', 'Token']),
    MyBoxList: state.getIn(['MyBoxReducers', 'MyBoxList']),
    EventTags: state.getIn(['InitReducer', 'EventTags']),
    CusTags: state.getIn(['InitReducer', 'CusTags']),
    TimeZone: state.getIn(['InitReducer', 'CurrentComp', 'TimeZone']),
    AllCompMember: state.getIn(['InitReducer', 'AllCompMember']),
    AllDiscs: state.getIn(['InitReducer', 'AllDiscs'])
}),
All... 的部分 還有 EventTags&CusTags 就是我們說 只會用ID 去Filter 資料出來的部分
然後 為了讓每個區段的討論組資料可以更簡單地顯示 & 後續開關顯示控制的部分
我修改了 GroupBy的方法 修正的邏輯就是讓 每個陣列的第一個物件 有包含一個 DiscID(過濾討論組名稱)
& Visible(要不要顯示討論組下的主題)
function groupBy(collection, property) {
	var i = 0,
		val, index,
		values = [],
		result = [];
	for (; i < collection.length; i++) {
		val = collection[i][property];
		index = values.indexOf(val);
		if (index > -1)
			result[index].push(collection[i]);
		else {
			values.push(val);
			result.push([{
				'DiscID': val,
				'Visible': true
			}, collection[i]]);
		}
	}
	return result;
}
OK 因為Group By 的方法變了 所以我們的 Component render方法也要做個修正
<Table.Body key={_discIndex}>
<Table.Row>
  <Table.Cell colSpan='10' style={{borderTop:'1px solid lightgrey'}}>
    <h2 style={styles.discTitle}>
      {this.renderDiscName(_discItem.getIn(['0', 'DiscID']))}
    </h2>
    <Icon style={styles.discArrow} 
          color='grey' 
          name=
          {
            _discItem.getIn(['0', 'Visible']) == true ? 
            'chevron down':'chevron up'
          }
          size='large'
          onClick={() => this.props.onChangeDiscVisible(_discIndex, _discItem.getIn(['0', 'DiscID']))}>
    </Icon>
  </Table.Cell>
</Table.Row>                    
{
  _discItem.map((_subjItem, _subjIndex) => 
    { 
      /*過濾掉第一個物件 第一個物件是group by 產生出的討論組ID 和 判斷收放討論組區塊的參數*/
      return (
        _subjIndex > 0 && _discItem.getIn(['0', 'Visible']) &&
        <Table.Row key={_subjIndex}>
            <Responsive as={Table.Cell} colSpan='1' collapsing minWidth={767}>
              <IsIns  subjid={_subjItem.get('SubjID')}
                      discid={_subjItem.get('DiscID')}
                      visible={_subjItem.get('Visible')}>
              </IsIns>
            </Responsive>
            <Responsive as={Table.Cell} colSpan='1' collapsing minWidth={767}>
              <IsFav  subjid={_subjItem.get('SubjID')}
                      discid={_subjItem.get('DiscID')}
                      isfav={_subjItem.get('fav_data') == null ? 0 : 1}>
              </IsFav>
            </Responsive>
            <Table.Cell colSpan='1'>
              {this.renderSubjTitle(_subjItem.getIn(['subject_data', 'SubjTagID']), _subjItem.getIn(['subject_data', 'CusTagID']), _subjItem.getIn(['subject_data', 'Title']),_subjItem.getIn(['subject_data', 'CreatedOn']), _subjItem.getIn(['subject_data', 'Progress']), _subjItem.get('isRead'))}
            </Table.Cell>
            <Table.Cell colSpan='1'>
              <Icon style={{cursor:'pointer'}} color='grey' name='external share' size='large'></Icon>
            </Table.Cell>
            <Table.Cell colSpan='1'>
              <p style={{margin:0}}>{this.renderUserName(_subjItem.getIn(['subject_data', 'CreatedBy']))}</p>
              <p>{this.renderUserCreatedTime(_subjItem.getIn(['subject_data', 'CreatedOn']))}</p>
            </Table.Cell>
            <Table.Cell colSpan='1'>
              <div style={styles.replyCountWrap}>
                {
                  _subjItem.getIn(['subject_data', 'ReplyCount']) == 0 ? 
                  <div></div> : 
                  <div>
                    <Icon style={{display:'block'}} color='grey' name='chat' size='big'>
                    </Icon>
                    <label style={styles.replyCountLabel}>
                      {_subjItem.getIn(['subject_data', 'ReplyCount'])}
                    </label>
                  </div>
                }
              </div>
            </Table.Cell>
            <Table.Cell colSpan='1'>
              <p style={{margin:0}}>{this.renderUserName(_subjItem.getIn(['subject_data', 'ModifiedBy']))}</p>
              <p>{this.renderUserCreatedTime(_subjItem.getIn(['subject_data', 'ModifiedOn']))}</p>
            </Table.Cell>
        </Table.Row>
      )
    })
}
</Table.Body>
最後 來看一下 我們如何過濾出我們要的資料
包括 討論組名稱 標籤 標題 人名
先看討論組整包資料的長相
然後 來看過濾的方法
renderDiscName(_discid)
{
console.log("DiscID : ", _discid);
console.log(this.props.AllDiscs);
let _discEntity = this.props.AllDiscs.filter(x => x.get('DiscID') == _discid).get('0');
return _discEntity == undefined ? "" : _discEntity.getIn(['discussion_info', 'DiscName']);
}
再來 看點特別的 轉換主題的方法
renderSubjTitle(_eventtagid, _custagid, _title, _createdon, _progress, _isread)
{
let _eventTagName = _eventtagid == null ? "" : this.props.EventTags.filter(x => x.get('SubjTagID') == _eventtagid).getIn(['0', 'SubjTagName']) + " - ";
let _cusTagName = _custagid == null ? "" : this.props.CusTags.filter(x => x.get('SubjTagID') == _custagid).getIn(['0', 'SubjTagName']) + " - ";
let _progressIcon = null;
let _createdOnAddTimeZone = new Date(_createdon).setHours(new Date(_createdon).getHours() + this.props.TimeZone);
let _createdOnString = " - " + this.renderCreatedTime(_createdOnAddTimeZone);
switch (_progress) {
  case 2 :
    _progressIcon = <Icon color='green' name='wait' size='small'></Icon>;
    break;
  case 5 :
    _progressIcon = <Icon color='red' name='repeat' size='small'></Icon>;
    break;
  case 9 :
    _progressIcon = <Icon color='green' name='checkmark' size='small'></Icon>;
    break;
  default :
}
return (
    <span>
      {_eventTagName}
      {_cusTagName}
      {_title}
      {_createdOnString}
      {_progressIcon}
    </span>
)
}
這個的重點 就是你也可以回傳 不只是string的東西~
OK 下一篇我們來看 動畫開關的控制 在 render map Array object 我們是如何去控制的