Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }