diff --git a/src/components/sites/manageGroupExercisesSite/groupExercisesSite.tsx b/src/components/sites/manageGroupExercisesSite/groupExercisesSite.tsx index 92aa8ab1fe9aecb32c46d99af457a7eed19de101..8c0f9db8a72532770cc77d19e5acfed837895175 100644 --- a/src/components/sites/manageGroupExercisesSite/groupExercisesSite.tsx +++ b/src/components/sites/manageGroupExercisesSite/groupExercisesSite.tsx @@ -89,7 +89,7 @@ class GroupExercisesSite extends React.Component<Props, any> { async componentWillMount(): Promise<void> { try { - await this.props.loadManageGroupExercisesSite() + await this.props.loadManageGroupExercisesSite(false) } catch (err) { ErrorHelper.makeServerErrorDialog(err, this.props.langId, 'Error', 'Could not load site data') } diff --git a/src/components/sites/manageOwnExercisesSite/ownExercisesSite.tsx b/src/components/sites/manageOwnExercisesSite/ownExercisesSite.tsx index dd3a6db5b9e47e3c5f0a3f7e9f73dbbbbac24d13..ed7373200e34ede272b30c9212a55e19dd9ca030 100644 --- a/src/components/sites/manageOwnExercisesSite/ownExercisesSite.tsx +++ b/src/components/sites/manageOwnExercisesSite/ownExercisesSite.tsx @@ -74,7 +74,7 @@ class OwnExercisesSite extends React.Component<Props, any> { async componentWillMount(): Promise<void> { try { - await this.props.loadOwnExercisesSite() + await this.props.loadOwnExercisesSite(false) } catch(err) { ErrorHelper.makeServerErrorDialog(err, this.props.langId, 'Error', 'Could not load site data') } diff --git a/src/constants.ts b/src/constants.ts index 283668023e20845a124661a1865ce5400c6f738e..927696fc6a5b96e975af9cbe1d6ffb1e3c5af031 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -13,7 +13,7 @@ import Logger from './helpers/logger' * y - breaking changes / new features * z - fixes, small changes */ -export const versionString = '2.9.15' +export const versionString = '2.10.0' export const supportMail = 'yapex@informatik.uni-halle.de' diff --git a/src/state/actions/exerciseEditorSite/exerciseEditorSiteActions.ts b/src/state/actions/exerciseEditorSite/exerciseEditorSiteActions.ts index 915f6b7aa84c69c5cc0279d397161f748a81312f..3550f3fdb694da76134f3f831d0b8ee621d2c0c7 100644 --- a/src/state/actions/exerciseEditorSite/exerciseEditorSiteActions.ts +++ b/src/state/actions/exerciseEditorSite/exerciseEditorSiteActions.ts @@ -58,7 +58,7 @@ export function loadExerciseEditor(exerciseId: number | null, resetIds: boolean, await dispatch(getTestTypesAsync()) await dispatch(getTagsAsync()) - await dispatch(getGroupsForExercisesAsync()) + await dispatch(getGroupsForExercisesAsync(true)) await dispatch(getPLangsAsync()) if (exerciseId !== null) { diff --git a/src/state/actions/manageGroupExercisesSite/groupExercisesCrudSiteActions.ts b/src/state/actions/manageGroupExercisesSite/groupExercisesCrudSiteActions.ts index 9c069f7fdcbd422310dc4dffca3ed987ff2ff357..27e16354fe0f0169ae0b3ba378a2eae9efc42447 100644 --- a/src/state/actions/manageGroupExercisesSite/groupExercisesCrudSiteActions.ts +++ b/src/state/actions/manageGroupExercisesSite/groupExercisesCrudSiteActions.ts @@ -68,9 +68,12 @@ export function _deleteGroupExercisesAsync(exerciseId: number, groupId: number): } -export function getGroupsForExercisesAsync(): GET_groupsForExercisesAction { +export function getGroupsForExercisesAsync(resetPaginationState: boolean): GET_groupsForExercisesAction { return { type: ActionType.GET_groupsForExercises, - payload: delay(getGroupsWithAccessibleExercises()) + payload: delay(getGroupsWithAccessibleExercises()), + meta: { + resetPaginationState + } } -} \ No newline at end of file +} diff --git a/src/state/actions/manageGroupExercisesSite/groupExercisesSiteActions.ts b/src/state/actions/manageGroupExercisesSite/groupExercisesSiteActions.ts index c2ff0333ae23e07d654a343842a15a2835049494..db60a03c502bb5f2af3ab89db0077330884963ba 100644 --- a/src/state/actions/manageGroupExercisesSite/groupExercisesSiteActions.ts +++ b/src/state/actions/manageGroupExercisesSite/groupExercisesSiteActions.ts @@ -38,17 +38,17 @@ export function setIsTagsFilterDisplayed(isTagsFilterDisplayed: boolean): SET_is } } -export function loadManageGroupExercisesSite(): AwaitActions { +export function loadManageGroupExercisesSite(resetPaginationState: boolean): AwaitActions { return async (dispatch, getState) => { - dispatch(resetManageGroupExercisesSite()) + dispatch(resetManageGroupExercisesSite(resetPaginationState)) // dispatch(resetTagsFilter()) //in most cases we go back from release and then we want to still have the filter await dispatch(loadManageTagsSite()) //load the groups - await dispatch(getGroupsForExercisesAsync()) + await dispatch(getGroupsForExercisesAsync(resetPaginationState)) //the load for every group the exercises (paginated) const groups = getState().manageGroupExercisesState.groups @@ -65,9 +65,10 @@ export function loadManageGroupExercisesSite(): AwaitActions { } } -export function resetManageGroupExercisesSite(): ResetAction { +export function resetManageGroupExercisesSite(resetPaginationState: boolean): ResetAction { return { - type: ActionType.RESET + type: ActionType.RESET, + resetPaginationState } } diff --git a/src/state/actions/manageOwnExercisesSite/ownExercisesSiteActions.ts b/src/state/actions/manageOwnExercisesSite/ownExercisesSiteActions.ts index d35e2e624f61aad6c6f8713e79fda50d60b44934..30eb297e3359f24b495163d51bd6edb069a43b3b 100644 --- a/src/state/actions/manageOwnExercisesSite/ownExercisesSiteActions.ts +++ b/src/state/actions/manageOwnExercisesSite/ownExercisesSiteActions.ts @@ -68,10 +68,10 @@ export function setIsTagsFilterDisplayed(isTagsFilterDisplayed: boolean): SET_is } } -export function loadOwnExercisesSite(): AwaitActions { +export function loadOwnExercisesSite(resetPaginationState: boolean): AwaitActions { return async (dispatch, getState) => { - dispatch(resetOwnExercisesSite()) + dispatch(resetOwnExercisesSite(resetPaginationState)) // dispatch(resetTagsFilter()) //in most cases we go back from release and then we want to still have the filter @@ -81,9 +81,10 @@ export function loadOwnExercisesSite(): AwaitActions { } } -export function resetOwnExercisesSite(): ResetAction { +export function resetOwnExercisesSite(resetPaginationState: boolean): ResetAction { return { - type: ActionType.RESET + type: ActionType.RESET, + resetPaginationState } } diff --git a/src/state/actions/ownOrGroupExerciseActions/releasesSiteActions/exerciseReleasesSiteActions.ts b/src/state/actions/ownOrGroupExerciseActions/releasesSiteActions/exerciseReleasesSiteActions.ts index 3638fd44a3866f76640b524dac9c369b81db89d0..474a23a01273302b1a1ee292df164c2931a6b337 100644 --- a/src/state/actions/ownOrGroupExerciseActions/releasesSiteActions/exerciseReleasesSiteActions.ts +++ b/src/state/actions/ownOrGroupExerciseActions/releasesSiteActions/exerciseReleasesSiteActions.ts @@ -108,10 +108,10 @@ export function loadExerciseReleasesSite(exerciseId: number, comesFromOwnExercis } } -export function resetExerciseReleasesSite(resetSiteLocalExercises: boolean): ResetAction { +export function resetExerciseReleasesSite(resetPaginationState: boolean): ResetAction { return { type: ActionType.RESET, - resetSiteLocalExercises + resetPaginationState } } diff --git a/src/state/reducers/allAccessibleExercises/closedExercisesSite/closedExercisesSiteReducer.ts b/src/state/reducers/allAccessibleExercises/closedExercisesSite/closedExercisesSiteReducer.ts index 1cda48bcfa38122b2bbc7f303d5eccab9481c83e..f8d51f3c14d05ed77bfdf3838f2302c7ad596da0 100644 --- a/src/state/reducers/allAccessibleExercises/closedExercisesSite/closedExercisesSiteReducer.ts +++ b/src/state/reducers/allAccessibleExercises/closedExercisesSite/closedExercisesSiteReducer.ts @@ -40,7 +40,8 @@ export const initial: State = { closedExercisePreviewsViaCode: [], paginationViaCode: { ...getInitialPaginationData(), - orderByProp: 'displayName' + orderByProp: 'lastUpdatedAt', + isOrderByDesc: true }, isLoadingViaCode: false, diff --git a/src/state/reducers/allAccessibleExercises/openExercisesSite/openExercisesSiteReducer.ts b/src/state/reducers/allAccessibleExercises/openExercisesSite/openExercisesSiteReducer.ts index f86192a5acd5e1b85dfd7185699679f2f2bddecd..be5bf2ec7e0e89f420bb1a08d12db513ba2a29c3 100644 --- a/src/state/reducers/allAccessibleExercises/openExercisesSite/openExercisesSiteReducer.ts +++ b/src/state/reducers/allAccessibleExercises/openExercisesSite/openExercisesSiteReducer.ts @@ -41,7 +41,8 @@ export const initial: State = { openExercisePreviewsViaCode: [], paginationViaCode: { ...getInitialPaginationData(), - orderByProp: 'displayName' + orderByProp: 'lastUpdatedAt', + isOrderByDesc: true }, isLoadingViaCode: false, openExercisePreviewsViaVisibility: [], diff --git a/src/state/reducers/manageGroupExercisesSite/getGroupsForExercisesCrudReducer.ts b/src/state/reducers/manageGroupExercisesSite/getGroupsForExercisesCrudReducer.ts index 94811368d5f861736c04cee7eaab9a2fce41e4d4..e1f9cdcfa49ddf07c10078c1888aaea6b65950c7 100644 --- a/src/state/reducers/manageGroupExercisesSite/getGroupsForExercisesCrudReducer.ts +++ b/src/state/reducers/manageGroupExercisesSite/getGroupsForExercisesCrudReducer.ts @@ -8,31 +8,41 @@ import {getInitialPaginationData} from '../../../constants' import {FrontendSettingsManager, frontendSettings_syncDisplaySortingItems} from '../../../helpers/frontendSettingsManager' import {orderBy} from 'lodash-es' +interface Meta { + /** + * really annoying if you go back and have to search/sort again... + */ + readonly resetPaginationState: boolean +} export interface GET_groupsForExercisesAction - extends ActionBase, ReduxPromiseAction<ReadonlyArray<UserGroupFromBackend>, GET_groupsForExercises_PENDINGAction, GET_groupsForExercises_FULFILLEDAction, GET_groupsForExercises_REJECTEDAction> { + extends ActionBase, ReduxPromiseAction<ReadonlyArray<UserGroupFromBackend>, GET_groupsForExercises_PENDINGAction, GET_groupsForExercises_FULFILLEDAction, GET_groupsForExercises_REJECTEDAction, Meta> { readonly type: ActionType.GET_groupsForExercises readonly payload: Promise<ReadonlyArray<UserGroupFromBackend>> + readonly meta: Meta } //automatically dispatched by redux promise middleware export interface GET_groupsForExercises_PENDINGAction extends ActionBase { readonly type: ActionType.GET_groupsForExercises_PENDING + readonly meta: Meta } //automatically dispatched by redux promise middleware export interface GET_groupsForExercises_FULFILLEDAction - extends ActionBase, ReduxPromiseFulfilledAction<ReadonlyArray<UserGroupFromBackend>> { + extends ActionBase, ReduxPromiseFulfilledAction<ReadonlyArray<UserGroupFromBackend>, Meta> { readonly type: ActionType.GET_groupsForExercises_FULFILLED readonly payload: ReadonlyArray<UserGroupFromBackend> + readonly meta: Meta } //automatically dispatched by redux promise middleware export interface GET_groupsForExercises_REJECTEDAction - extends ActionBase, ReduxPromiseRejectedAction<void> { + extends ActionBase, ReduxPromiseRejectedAction<void, Meta> { readonly type: ActionType.GET_groupsForExercises_REJECTED readonly payload: any + readonly meta: Meta } @@ -88,6 +98,27 @@ export function reducer(state: State = initial, action: AllActions): State { pageSize = getInitialPaginationData().pageSize } + if (!action.meta.resetPaginationState) { + + const oldGroupWithEx = state.groupExercises.find(x => p.id === x.userGroup.id) + + if (oldGroupWithEx) { + return { + userGroup: p, + pagination: { + ...getInitialPaginationData(), + orderByProp: oldGroupWithEx.pagination.orderByProp, + isOrderByDesc: oldGroupWithEx.pagination.isOrderByDesc, + searchText: oldGroupWithEx.pagination.searchText, + currentPage: oldGroupWithEx.pagination.currentPage, + pageSize: pageSize + }, + exercisePreviews: [] as any, + isLoading: true + } + } + } + return { userGroup: p, pagination: { diff --git a/src/state/reducers/manageGroupExercisesSite/groupExercisesSiteReducer.ts b/src/state/reducers/manageGroupExercisesSite/groupExercisesSiteReducer.ts index 905240ce041cbcd1d2431c2028f6629892c36f36..686e1c4b57f3cb160cdd81777b5e3caf9ba7d52e 100644 --- a/src/state/reducers/manageGroupExercisesSite/groupExercisesSiteReducer.ts +++ b/src/state/reducers/manageGroupExercisesSite/groupExercisesSiteReducer.ts @@ -91,6 +91,10 @@ export interface SET_groupsOrderAction extends ActionBase { export interface ResetAction extends ActionBase { readonly type: ActionType.RESET + /** + * really annoying if you go back and have to search/sort again... + */ + readonly resetPaginationState: boolean } export type AllActions = @@ -230,12 +234,35 @@ export function reducer(state: State = initial, action: AllActions): State { ) } - case ActionType.RESET: - case ActionTypeGlobal.RESET_Global: + case ActionTypeGlobal.RESET_Global: { return { ...initial, isTagsFilterDisplayed: FrontendSettingsManager.getFrontendSettings().groupExercisesSiteTagsFilterIsDisplayed, } + } + case ActionType.RESET: { + + if (!action.resetPaginationState) { + return { + ...initial, + isTagsFilterDisplayed: FrontendSettingsManager.getFrontendSettings().groupExercisesSiteTagsFilterIsDisplayed, + groupExercises: state.groupExercises.map(value => + ({ + ...value, + pagination: { + ...value.pagination, + } + }) + ) + } + } + + return { + ...initial, + isTagsFilterDisplayed: FrontendSettingsManager.getFrontendSettings().groupExercisesSiteTagsFilterIsDisplayed, + } + } + default: notExhaustive(action) diff --git a/src/state/reducers/manageOwnExercisesSite/ownExercisesSiteReducer.ts b/src/state/reducers/manageOwnExercisesSite/ownExercisesSiteReducer.ts index b431e4c81efc47318a396a07226f656e78c1d0f3..9c49c3ce7fd3ac41890d2d6e8e46a82cc173749c 100644 --- a/src/state/reducers/manageOwnExercisesSite/ownExercisesSiteReducer.ts +++ b/src/state/reducers/manageOwnExercisesSite/ownExercisesSiteReducer.ts @@ -76,6 +76,10 @@ export interface SET_isTagsFilterDisplayedAction extends ActionBase { export interface ResetAction extends ActionBase { readonly type: ActionType.RESET + /** + * really annoying if you go back and have to search/sort again... + */ + readonly resetPaginationState: boolean } export type AllActions = @@ -161,8 +165,7 @@ export function reducer(state: State = initial, action: AllActions): State { } } - case ActionType.RESET: - case ActionTypeGlobal.RESET_Global: + case ActionTypeGlobal.RESET_Global: { return { ...initial, isTagsFilterDisplayed: FrontendSettingsManager.getFrontendSettings().ownExercisesSiteTagsFilterIsDisplayed, @@ -171,6 +174,31 @@ export function reducer(state: State = initial, action: AllActions): State { pageSize: FrontendSettingsManager.getFrontendSettings().ownExercisesPageSize } } + } + case ActionType.RESET: { + + if (!action.resetPaginationState) { + return { + ...initial, + sortByKey: state.sortByKey, + sortDirection: state.sortDirection, + + pagination: { + ...state.pagination + } + } + } + + return { + ...initial, + isTagsFilterDisplayed: FrontendSettingsManager.getFrontendSettings().ownExercisesSiteTagsFilterIsDisplayed, + pagination: { + ...initial.pagination, + pageSize: FrontendSettingsManager.getFrontendSettings().ownExercisesPageSize + } + } + } + default: notExhaustive(action) diff --git a/src/state/reducers/ownOrGroupExerciseReducers/exerciseReleasesSite/releaseSiteReducer.ts b/src/state/reducers/ownOrGroupExerciseReducers/exerciseReleasesSite/releaseSiteReducer.ts index 91072f5160009ac79e2caa72dcfacd4192510faa..3982e958c3828e3e728d680a1ea75a6869424d5d 100644 --- a/src/state/reducers/ownOrGroupExerciseReducers/exerciseReleasesSite/releaseSiteReducer.ts +++ b/src/state/reducers/ownOrGroupExerciseReducers/exerciseReleasesSite/releaseSiteReducer.ts @@ -132,7 +132,10 @@ export interface SET_isChangeDialogDisplayedAction extends ActionBase { export interface ResetAction extends ActionBase { readonly type: ActionType.RESET - readonly resetSiteLocalExercises: boolean + /** + * really annoying if you go back and have to search/sort again... + */ + readonly resetPaginationState: boolean } export type AllActions = @@ -248,8 +251,30 @@ export function reducer(state: State = initial, action: AllActions): State { } } - case ActionType.RESET: - case ActionTypeGlobal.RESET_Global: + case ActionTypeGlobal.RESET_Global: { + return { + ...initial, + pagination: { + ...initial.pagination, + pageSize: FrontendSettingsManager.getFrontendSettings().releasesViewPageSize + } + } + } + case ActionType.RESET: { + + if (!action.resetPaginationState) { + return { + ...initial, + sortByKey: state.sortByKey, + sortDirection: state.sortDirection, + + //...this might be bad if the server side changed (e.g. deleted/added exercises) + pagination: { + ...state.pagination + } + } + } + return { ...initial, pagination: { @@ -257,6 +282,9 @@ export function reducer(state: State = initial, action: AllActions): State { pageSize: FrontendSettingsManager.getFrontendSettings().releasesViewPageSize } } + } + + default: notExhaustive(action)