function todosReducer(state:List<ITask>, action:IAction):List<ITask> { console.log(`todosReducer: Action(${JSON.stringify(action)})`); switch(action.type) { case Keys.AddTodo: var todos: List<ITask> = List<ITask>(state.concat([action.payload])); console.log(`todosReducer: todos(${JSON.stringify(todos)})`); return todos; case Keys.CompleteTodo: return List<ITask>(state.map((task:ITask) => { if (task.Id === action.payload.Id) { return new Task( task.Id, task.Title, task.Description, action.payload.Complete ); } else { return task; } })); case Keys.RemoveTodo: return List<ITask>(state.filter((task:ITask) => { return task.Id !== action.payload.Id; })) } return state || initialState.todos; }
getState(path: Array<string> | List<string> | string = List([])): any { let newPath: List<string>; if (typeof path === 'string') { newPath = List([path]); } else { newPath = fromJS(path); } return this.rootStore.state.getIn(this.path.concat(newPath)); }
/** * Function that intented to be used by the table plugin manager to * perform the sorting process. It supports sorting with mutiple sorter, * which will be performed in ASC order. * * NOTE: the sorting process will short circuit on any non-zero sorter * result. */ process(tableData: TableData, columns: List<ColumnDef>) { const columnSorters: Iterable<number, TableSorter> = columns .filterNot(s => _.isUndefined(s.sortable)) .map(columnDef => { const sorter = columnDef.sortable const selector = columnDef.field const type = columnDef.type const order = sorter.order const comparator = sorter.comparator || this.getComparator(type) return { order, selector, comparator } }) const sorters = this.sorters.concat(columnSorters) .filter(s => this.getSortOrder(s.order) !== NONE) if (sorters.size > 1 && !this.multiSortable) { if (process.env.NODE_ENV === 'development') { throw new Error(`[RCBOX] Found multiple sorter enabled while this` + `feature is disabled. To enable this feature, set 'multiSortable' ` + `property to 'true' on TableSortPlugin. Those unexpected sorters ` + `are: ${sorters.toJS()}`) } // NOTE: Returns unsorted table data as fallback to avoid uncertain // data will be used in production environment. return tableData } const sorted = tableData.sort((row1, row2) => { const reducer = (result: number, sorter: TableSorter) => { const { selector, comparator } = sorter const order = this.getSortOrder(sorter.order) const factor = order === DESC ? -1 : 1 return result !== 0 ? result : comparator(selector(row1), selector(row2)) * factor } return sorters.reduce(reducer, 0) }) return sorted }
function todosReducer(state:List<ITask>, action:IAction):List<ITask> { switch(action.key) { case Keys.AddTodo: return List<ITask>(state.concat([action.payload])) case Keys.CompleteTodo: return List<ITask>(state.map((task:ITask) => { if (task.Id === action.payload.Id) { return new Task( task.Id, task.Title, task.Description, action.payload.Complete ); } else { return task; } })); case Keys.RemoveTodo: return List<ITask>(state.filter((task:ITask) => { return task.Id !== action.payload.Id; })) } return state; }