Skip to content

Commit

Permalink
Do not remount everything when closing room edit
Browse files Browse the repository at this point in the history
  • Loading branch information
ThiefMaster committed May 17, 2019
1 parent 67c4297 commit e55fceb
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 18 deletions.
13 changes: 9 additions & 4 deletions indico/modules/rb/client/js/common/rooms/RoomEditModal.jsx
Expand Up @@ -411,6 +411,7 @@ class RoomEditModal extends React.Component {
roomEquipment: null,
submitState: '',
wasEverDirty: false,
wasEverSaved: false,
closing: false,
};

Expand Down Expand Up @@ -519,21 +520,22 @@ class RoomEditModal extends React.Component {

handleCloseModal = async () => {
const {
onClose,
afterCreation, onClose,
actions: {fetchEquipmentTypes, fetchRoom, fetchRoomDetails, fetchRoomPermissions}
} = this.props;
const {wasEverSaved} = this.state;
// eslint-disable-next-line react/destructuring-assignment
const roomId = this.newRoom ? this.state.newRoomId : this.props.roomId;
this.setState({closing: true});
if (roomId !== null) {
if (roomId !== null && wasEverSaved) {
await Promise.all([
fetchEquipmentTypes(),
fetchRoom(roomId),
fetchRoomPermissions(roomId),
fetchRoomDetails(roomId, true)
]);
}
onClose();
onClose(wasEverSaved || afterCreation);
};

handleSubmit = async (data, form) => {
Expand Down Expand Up @@ -561,7 +563,10 @@ class RoomEditModal extends React.Component {

// reload room so the form gets new initialValues
await this.fetchRoomData(roomId);
this.setState({submitState});
this.setState({
wasEverSaved: true,
submitState,
});
return camelizeKeys(submitError);
};

Expand Down
8 changes: 6 additions & 2 deletions indico/modules/rb/client/js/common/rooms/selectors.js
Expand Up @@ -12,7 +12,9 @@ import {RequestState} from 'indico/utils/redux';
import {getAllUserRoomPermissions, isUserRBAdmin} from '../user/selectors';


export const hasLoadedEquipmentTypes = ({rooms}) => rooms.requests.equipmentTypes.state === RequestState.SUCCESS;
export const hasLoadedEquipmentTypes = ({rooms}) => (
rooms.requests.equipmentTypes.state === RequestState.SUCCESS || rooms.requests.equipmentTypes.reloading
);
export const getAllEquipmentTypes = ({rooms}) => rooms.equipmentTypes;
const getUsedEquipmentTypes = createSelector(
getAllEquipmentTypes,
Expand Down Expand Up @@ -94,7 +96,9 @@ export const getAllRooms = createSelector(
}
);

export const hasLoadedRooms = ({rooms}) => rooms.requests.rooms.state === RequestState.SUCCESS;
export const hasLoadedRooms = ({rooms}) => (
rooms.requests.rooms.state === RequestState.SUCCESS || rooms.requests.rooms.reloading
);
export const getRoom = (state, {roomId}) => getAllRooms(state)[roomId];

const getAllAvailabilities = ({rooms}) => rooms.availability;
Expand Down
18 changes: 15 additions & 3 deletions indico/modules/rb/client/js/modules/admin/AdminLocationRooms.jsx
Expand Up @@ -17,12 +17,13 @@ import * as adminSelectors from './selectors';
import {RoomEditModal} from '../../common/rooms';

import './AdminLocationRooms.module.scss';
import * as adminActions from './actions';


const SearchBar = searchBarFactory('admin', adminSelectors);


function AdminLocationRooms({location, isFetching, filters: {text}}) {
function AdminLocationRooms({location, isFetching, fetchRooms, filters: {text}}) {
const [adding, setAdding] = useState(false);

if (isFetching) {
Expand All @@ -42,6 +43,13 @@ function AdminLocationRooms({location, isFetching, filters: {text}}) {
});
}

const handleCloseModal = saved => {
if (saved) {
fetchRooms();
}
setAdding(false);
};

return (
<>
<Header as="h2" styleName="header">
Expand All @@ -66,7 +74,7 @@ function AdminLocationRooms({location, isFetching, filters: {text}}) {
</Message>
)}
{adding && (
<RoomEditModal locationId={location.id} onClose={() => setAdding(false)} />
<RoomEditModal locationId={location.id} onClose={handleCloseModal} />
)}
</>
);
Expand All @@ -75,6 +83,7 @@ function AdminLocationRooms({location, isFetching, filters: {text}}) {
AdminLocationRooms.propTypes = {
location: PropTypes.object,
isFetching: PropTypes.bool.isRequired,
fetchRooms: PropTypes.func.isRequired,
filters: PropTypes.exact({
text: PropTypes.string,
}).isRequired,
Expand All @@ -90,5 +99,8 @@ export default connect(
isFetching: adminSelectors.isFetchingLocations(state),
location: adminSelectors.getLocation(state, {locationId}),
filters: adminSelectors.getFilters(state),
})
}),
{
fetchRooms: adminActions.fetchRooms,
}
)(AdminLocationRooms);
17 changes: 14 additions & 3 deletions indico/modules/rb/client/js/modules/admin/AdminRoomItem.jsx
Expand Up @@ -17,10 +17,17 @@ import * as adminActions from './actions';
import './AdminRoomItem.module.scss';


function AdminRoomItem({room, deleteRoom}) {
function AdminRoomItem({room, deleteRoom, fetchRooms}) {
const [editing, setEditing] = useState(false);
const [deleting, setDeleting] = useState(false);

const handleCloseModal = saved => {
if (saved) {
fetchRooms();
}
setEditing(false);
};

return (
<Item key={room.id} styleName="room-item">
<Item.Image size="small" styleName="room-item-image">
Expand All @@ -42,7 +49,7 @@ function AdminRoomItem({room, deleteRoom}) {
</Item.Description>
</Item.Content>
{editing && (
<RoomEditModal roomId={room.id} onClose={() => setEditing(false)} />
<RoomEditModal roomId={room.id} onClose={handleCloseModal} />
)}
<Confirm header={Translate.string('Confirm deletion')}
content={Translate.string('Are you sure you want to delete this room?')}
Expand All @@ -59,9 +66,13 @@ function AdminRoomItem({room, deleteRoom}) {
AdminRoomItem.propTypes = {
room: PropTypes.object.isRequired,
deleteRoom: PropTypes.func.isRequired,
fetchRooms: PropTypes.func.isRequired,
};

export default connect(
null,
{deleteRoom: adminActions.deleteRoom}
{
deleteRoom: adminActions.deleteRoom,
fetchRooms: adminActions.fetchRooms,
}
)(AdminRoomItem);
8 changes: 6 additions & 2 deletions indico/modules/rb/client/js/modules/admin/selectors.js
Expand Up @@ -43,8 +43,12 @@ export const getLocation = createSelector(
}
);

const _isFetchingLocations = ({admin}) => admin.requests.locations.state === RequestState.STARTED;
const _isFetchingRooms = ({admin}) => admin.requests.rooms.state === RequestState.STARTED;
const _isFetchingLocations = ({admin}) => (
admin.requests.locations.state === RequestState.STARTED && !admin.requests.locations.reloading
);
const _isFetchingRooms = ({admin}) => (
admin.requests.rooms.state === RequestState.STARTED && !admin.requests.rooms.reloading
);
export const isFetchingLocations = state => _isFetchingLocations(state) || _isFetchingRooms(state);
export const getFilters = ({admin}) => admin.filters;

Expand Down
13 changes: 9 additions & 4 deletions indico/web/client/js/utils/redux.js
Expand Up @@ -64,15 +64,20 @@ export const RequestState = {


export function requestReducer(requestAction, successAction, errorAction) {
const initialState = {state: RequestState.NOT_STARTED, error: null};
const initialState = {state: RequestState.NOT_STARTED, error: null, reloading: false};
return (state = initialState, action) => {
switch (action.type) {
case requestAction:
return {...state, state: RequestState.STARTED, error: null};
return {
...state,
state: RequestState.STARTED,
error: null,
reloading: state.state === RequestState.SUCCESS
};
case successAction:
return {...state, state: RequestState.SUCCESS, error: null};
return {...state, state: RequestState.SUCCESS, error: null, reloading: false};
case errorAction:
return {...state, state: RequestState.ERROR, error: action.error};
return {...state, state: RequestState.ERROR, error: action.error, reloading: false};
default:
return state;
}
Expand Down

0 comments on commit e55fceb

Please sign in to comment.