Skip to content

Commit

Permalink
Toggle advanced settings
Browse files Browse the repository at this point in the history
  • Loading branch information
oharsta committed Sep 27, 2023
1 parent 33b9e55 commit 220f633
Show file tree
Hide file tree
Showing 6 changed files with 88 additions and 39 deletions.
2 changes: 2 additions & 0 deletions client/src/locale/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ const en = {
edit: "Edit role {{name}}",
urn: "URN",
advanced: "Advanced settings",
showAdvancedSettings: "Show advanced invite settings",
hideAdvancedSettings: "Hide advanced invite settings",
override: "Override of settings allowed?",
manage: "Service",
manageMetaData: "SURFconext entity",
Expand Down
2 changes: 2 additions & 0 deletions client/src/locale/nl.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,8 @@ const nl = {
edit: "Bewerk rol {{name}}",
urn: "URN",
advanced: "Advanced settings",
showAdvancedSettings: "Toon geadvanceerde uitnodiging instellingen",
hideAdvancedSettings: "Verberg geadvanceerde uitnodiging instellingen",
override: "Kunnen de instellingen worden veranderd bij een uitnodiging?",
manage: "Dienst",
manageMetaData: "Entity",
Expand Down
89 changes: 57 additions & 32 deletions client/src/pages/InvitationForm.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import {useAppStore} from "../stores/AppStore";
import I18n from "../locale/I18n";
import {allowedAuthoritiesForInvitation, AUTHORITIES, isUserAllowed, markAndFilterRoles} from "../utils/UserRole";
import {ReactComponent as UserIcon} from "@surfnet/sds/icons/functional-icons/id-2.svg";
import {ReactComponent as UpIcon} from "@surfnet/sds/icons/functional-icons/arrow-up-2.svg";
import {ReactComponent as DownIcon} from "@surfnet/sds/icons/functional-icons/arrow-down-2.svg";
import {newInvitation, rolesByApplication} from "../api";
import {Button, ButtonType, Checkbox, Loader} from "@surfnet/sds";
import "./InvitationForm.scss";
import {UnitHeader} from "../components/UnitHeader";
import InputField from "../components/InputField";
import {isEmpty} from "../utils/Utils";
import {isEmpty, stopEvent} from "../utils/Utils";
import ErrorIndicator from "../components/ErrorIndicator";
import SelectField from "../components/SelectField";
import {DateField} from "../components/DateField";
Expand All @@ -29,6 +31,7 @@ export const InvitationForm = () => {
invites: [],
intendedAuthority: AUTHORITIES.GUEST
});
const [displayAdvancedSettings, setDisplayAdvancedSettings] = useState(false);
const {user, setFlash, config} = useAppStore(state => state);
const [loading, setLoading] = useState(true);
const [initial, setInitial] = useState(true);
Expand Down Expand Up @@ -78,6 +81,12 @@ export const InvitationForm = () => {
}
}
}

const toggleDisplayAdvancedSettings = e => {
stopEvent(e);
setDisplayAdvancedSettings(!displayAdvancedSettings);
}

const submit = () => {
setInitial(false);
if (isValid()) {
Expand Down Expand Up @@ -126,6 +135,7 @@ export const InvitationForm = () => {
setSelectedRoles([])
setInvitation({...invitation, enforceEmailEquality: false, eduIDOnly: false})
} else {
debugger;
const newSelectedOptions = Array.isArray(selectedOptions) ? [...selectedOptions] : [selectedOptions];
setSelectedRoles(newSelectedOptions);
const enforceEmailEquality = newSelectedOptions.some(role => role.enforceEmailEquality);
Expand Down Expand Up @@ -190,45 +200,60 @@ export const InvitationForm = () => {
{(!initial && isEmpty(selectedRoles)) &&
<ErrorIndicator msg={I18n.t("invitations.requiredRole")}/>}

<DateField value={invitation.roleExpiryDate}
onChange={e => setInvitation({...invitation, roleExpiryDate: e})}
showYearDropdown={true}
pastDatesAllowed={config.pastDateAllowed}
allowNull={invitation.intendedAuthority !== AUTHORITIES.GUEST}
minDate={futureDate(1, invitation.expiryDate)}
name={I18n.t("invitations.roleExpiryDate")}
toolTip={I18n.t("tooltips.roleExpiryDateTooltip")}/>

<Checkbox name={I18n.t("invitations.enforceEmailEquality")}
value={invitation.enforceEmailEquality || false}
info={I18n.t("invitations.enforceEmailEquality")}
readOnly={true}
tooltip={I18n.t("tooltips.enforceEmailEqualityTooltip")}
/>

<Checkbox name={I18n.t("invitations.eduIDOnly")}
value={invitation.eduIDOnly || false}
info={I18n.t("invitations.eduIDOnly")}
readOnly={true}
tooltip={I18n.t("tooltips.eduIDOnlyTooltip")}
/>

<InputField value={invitation.message}
onChange={e => setInvitation({...invitation, message: e.target.value})}
placeholder={I18n.t("invitations.messagePlaceholder")}
name={I18n.t("invitations.message")}
large={true}
multiline={true}/>

<DateField value={invitation.expiryDate}
onChange={e => setInvitation({...invitation, expiryDate: e})}
showYearDropdown={true}
pastDatesAllowed={config.pastDateAllowed}
minDate={futureDate(1)}
maxDate={futureDate(30)}
name={I18n.t("invitations.expiryDate")}
toolTip={I18n.t("tooltips.expiryDateTooltip")}/>
{!displayAdvancedSettings &&
<a className="advanced-settings" href="/#" onClick={e => toggleDisplayAdvancedSettings(e)}>
{I18n.t("roles.showAdvancedSettings")}
<DownIcon/>
</a>
}

{displayAdvancedSettings &&
<div className="advanced-settings-container" >
<a className="advanced-settings" href="/#" onClick={e => toggleDisplayAdvancedSettings(e)}>
{I18n.t("roles.hideAdvancedSettings")}
<UpIcon/>
</a>
<DateField value={invitation.expiryDate}
onChange={e => setInvitation({...invitation, expiryDate: e})}
showYearDropdown={true}
pastDatesAllowed={config.pastDateAllowed}
minDate={futureDate(1)}
maxDate={futureDate(30)}
name={I18n.t("invitations.expiryDate")}
toolTip={I18n.t("tooltips.expiryDateTooltip")}/>

<Checkbox name={I18n.t("invitations.enforceEmailEquality")}
value={invitation.enforceEmailEquality || false}
info={I18n.t("invitations.enforceEmailEquality")}
readOnly={true}
tooltip={I18n.t("tooltips.enforceEmailEqualityTooltip")}
/>

<Checkbox name={I18n.t("invitations.eduIDOnly")}
value={invitation.eduIDOnly || false}
info={I18n.t("invitations.eduIDOnly")}
readOnly={true}
tooltip={I18n.t("tooltips.eduIDOnlyTooltip")}
/>

<DateField value={invitation.roleExpiryDate}
onChange={e => setInvitation({...invitation, roleExpiryDate: e})}
showYearDropdown={true}
disabled={selectedRoles.some(role => !role.overrideSettingsAllowed)}
pastDatesAllowed={config.pastDateAllowed}
allowNull={invitation.intendedAuthority !== AUTHORITIES.GUEST}
minDate={futureDate(1, invitation.expiryDate)}
name={I18n.t("invitations.roleExpiryDate")}
toolTip={I18n.t("tooltips.roleExpiryDateTooltip")}/>

</div>}
<section className="actions">
<Button type={ButtonType.Secondary}
txt={I18n.t("forms.cancel")}
Expand Down
15 changes: 15 additions & 0 deletions client/src/pages/InvitationForm.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,21 @@
.invitation-form {
@include page;
@include form;

.advanced-settings, .advanced-settings-container {
grid-column-start: first;
}

a.advanced-settings {
margin-top: 32px;
display: flex;
align-items: center;
svg {
width: 24px;
height: auto;
margin-left: 15px;
}
}
}


Expand Down
3 changes: 0 additions & 3 deletions client/src/pages/Login.scss
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,6 @@
img {
width: 310px;
height: auto;
&:hover {
filter: drop-shadow(0 0 12em var(--sds--palette--main-color--400));
}
&.spin {
animation: logo-spin 1 0.5s linear;
}
Expand Down
16 changes: 12 additions & 4 deletions server/src/main/java/access/api/InvitationController.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,8 @@

import java.time.Instant;
import java.time.Period;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;

import static access.SwaggerOpenIdConfig.OPEN_ID_SCHEME_NAME;
Expand Down Expand Up @@ -88,6 +86,16 @@ public ResponseEntity<Map<String, Integer>> newInvitation(@Validated @RequestBod
Authority intendedAuthority = invitationRequest.getIntendedAuthority();
UserPermissions.assertValidInvitation(user, intendedAuthority, requestedRoles);

boolean isOverrideSettingsAllowed = requestedRoles.stream().allMatch(Role::isOverrideSettingsAllowed);
if (!isOverrideSettingsAllowed) {
invitationRequest.setEduIDOnly(requestedRoles.stream().anyMatch(Role::isEduIDOnly));
invitationRequest.setEnforceEmailEquality(requestedRoles.stream().anyMatch(Role::isEnforceEmailEquality));
if (intendedAuthority.equals(Authority.GUEST)) {
Integer defaultExpiryDays = requestedRoles.stream().max(Comparator.comparingInt(Role::getDefaultExpiryDays)).get().getDefaultExpiryDays();
invitationRequest.setRoleExpiryDate(Instant.now().plus(defaultExpiryDays, ChronoUnit.DAYS));
}
}

List<Invitation> invitations = invitationRequest.getInvites().stream()
.filter(emailFormatValidator::isValid)
.map(invitee -> new Invitation(
Expand Down

0 comments on commit 220f633

Please sign in to comment.