private static MvcHtmlString DoFieldsInfoAwareEditor <TModel, TValue>( HtmlHelper <TModel> html, Expression <Func <TModel, TValue> > expression, ModelFieldsAccessibility fieldsInfo, Func <MvcHtmlString> displayDelegate ) { string property = html.PropertyName(expression); if (!fieldsInfo.IsVisible(property)) { return(MvcHtmlString.Empty); } ViewDataDictionary viewData = html.ViewDataContainer.ViewData; List <string> dataKeysToRemove = new List <string>(); Dictionary <string, object> dataPrevValues = new Dictionary <string, object>(); // "Hide" current fields info from new editor viewData.PrepareChangeReversal(FormConstants.FieldsInfoKey, dataKeysToRemove, dataPrevValues); viewData.Remove(FormConstants.FieldsInfoKey); // Augment new additionalViewData with information from fieldsInfo if (fieldsInfo.IsComplex(property)) { viewData[FormConstants.FieldsInfoKey] = fieldsInfo.GetSubFieldInfo(property); } else if (!fieldsInfo.CanBeChangedByUser(property)) { viewData.PrepareChangeReversal(FormConstants.DisabledKey, dataKeysToRemove, dataPrevValues); viewData[FormConstants.DisabledKey] = true; } // Render the editor MvcHtmlString result = displayDelegate(); // Reverse the changes to ViewData dataKeysToRemove.ForEach(s => viewData.Remove(s)); dataPrevValues.ForEach(pair => viewData[pair.Key] = pair.Value); return(result); }
public static ModelFieldsAccessibility GetWhatCanBeEditedCouncil(Election election) { if (!CanEdit(election)) { throw new Exception( $"Cannot call {nameof(GetWhatCanBeEditedCouncil)} when the election isn't editable" ); } bool isCouncil = election.Type == ElectionType.StudentCouncil; // Mark everything editable by default ModelFieldsAccessibility fieldsInfo = isCouncil ? CouncilElectionForm.DefaultCouncilFieldsInfo(ModelFieldsAccessibility.Kind.Editable) : ElectionForm.DefaultFieldsInfo(ModelFieldsAccessibility.Kind.Editable); if (!ShowResultsAdmin(election)) { fieldsInfo.MarkNotShown(nameof(ElectionForm.ResultsText)); } if (election.State == ElectionState.Disabled) { // Everything (expect ResultsText) can be edited return(fieldsInfo); } if (election.State == ElectionState.PreNominations || IsAfter(election, ElectionState.PreNominations)) { if (isCouncil) { fieldsInfo.MarkNotEditable(nameof(CouncilElectionForm.Roles)); } fieldsInfo .GetSubFieldInfo(nameof(ElectionForm.Nominations)) .MarkNotEditable(nameof(ElectionPhaseForm.BeginsAt)); if (election.State == ElectionState.PreNominations) { return(fieldsInfo); } } if (election.State == ElectionState.Nominations || IsAfter(election, ElectionState.Nominations)) { fieldsInfo.MarkNotShown(nameof(ElectionForm.NominationsStartedEmail)); // Eligibility is not refreshed automatically after nominations have started fieldsInfo.MarkNotShown(nameof(ElectionForm.DisableAutomaticEligibility)); if (election.State == ElectionState.Nominations) { return(fieldsInfo); } } if (election.State == ElectionState.PreVoting || IsAfter(election, ElectionState.PreVoting)) { fieldsInfo.MarkNotShown(nameof(ElectionForm.Nominations)); if (isCouncil) { fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.NominationsAlmostOverEmail)); } fieldsInfo.MarkNotShown(nameof(ElectionForm.PostNominationsEmail)); if (election.State == ElectionState.PreVoting) { return(fieldsInfo); } } if (election.State == ElectionState.Voting || IsAfter(election, ElectionState.Voting)) { if (isCouncil) { fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.VotingStartedEmail)); } fieldsInfo .GetSubFieldInfo(nameof(ElectionForm.Voting)) .MarkNotEditable(nameof(ElectionPhaseForm.BeginsAt)); if (election.State == ElectionState.Voting) { return(fieldsInfo); } } if (election.State == ElectionState.Closed || IsAfter(election, ElectionState.Closed)) { if (isCouncil) { fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.Roles)); } fieldsInfo.MarkNotShown(nameof(ElectionForm.Voting)); if (isCouncil) { fieldsInfo.MarkNotShown(nameof(CouncilElectionForm.VotingAlmostOverEmail)); } fieldsInfo.MarkNotShown(nameof(ElectionForm.PostVotingEmail)); if (election.State == ElectionState.Closed) { return(fieldsInfo); } } return(fieldsInfo); }