Skip to content

Commit

Permalink
WIP for #967
Browse files Browse the repository at this point in the history
  • Loading branch information
oharsta committed Oct 24, 2023
1 parent 947f381 commit 75d4f97
Show file tree
Hide file tree
Showing 18 changed files with 243 additions and 76 deletions.
27 changes: 27 additions & 0 deletions client/src/components/CollaborationUnits.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import React from "react";
import "./CollaborationUnits.scss";
import I18n from "../locale/I18n";
import SelectField from "./SelectField";

export const CollaborationUnits = ({selectedUnits, allUnits, setUnits, label = I18n.t("units.collaboration")}) => {


const selectedUnitsChanged = selectedOptions => {
if (selectedOptions === null) {
setUnits([]);
} else {
const newSelectedOptions = Array.isArray(selectedOptions) ? [...selectedOptions] : [selectedOptions];
setUnits(newSelectedOptions);
}
}

return (<SelectField value={selectedUnits}
options={allUnits
.filter(unit => !selectedUnits.find(selectedUnit => selectedUnit.value === unit.value))}
name={label}
isMulti={true}
placeholder={I18n.t("units.unitsPlaceHolder")}
onChange={selectedUnitsChanged}/>

);
}
Empty file.
2 changes: 1 addition & 1 deletion client/src/components/DateField.scss
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
min-width: 210px;
color: black;
position: relative;
font-weight: bold;
font-weight: 600;
}

span.tool-tip-section {
Expand Down
1 change: 0 additions & 1 deletion client/src/components/EmailField.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ export default function EmailField({
if (isEmpty(e.key) && isEmpty(e.target.value)) {
return;
}
debugger; // eslint-disable-line no-debugger
const email = e.target.value;
const invalidEmails = [];
const delimiters = [",", " ", ";", "\n", "\t"];
Expand Down
28 changes: 27 additions & 1 deletion client/src/components/InputField.scss
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@

}

div.input-field-link {
div.input-field-link{
margin-left: 10px;
display: flex;
border-radius: 4px;
Expand Down Expand Up @@ -163,6 +163,32 @@
}
}

div.input-field-delete {
border: 1px solid var(--sds--color--gray--400);
font-size: 20px;
color: var(--sds--color--gray--400);
cursor: pointer;

&:hover {
background-color: var(--sds--color--gray--100);
}


a {
padding: 8px 12px;
}

svg {

color: var(--sds--color--gray--400);
cursor: pointer;

&:hover {
color: var(--sds--color--red--400);
}
}
}


span.no-input {
margin-bottom: 6px;
Expand Down
94 changes: 54 additions & 40 deletions client/src/components/OrganisationUnits.jsx
Original file line number Diff line number Diff line change
@@ -1,58 +1,64 @@
import React, {useEffect, useRef, useState} from "react";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {Tooltip} from "@surfnet/sds";
import React, {useRef, useState} from "react";
import "./OrganisationUnits.scss";
import {isEmpty, removeDuplicates, splitListSemantically, stopEvent} from "../utils/Utils";
import {isEmpty, splitListSemantically, stopEvent} from "../utils/Utils";
import I18n from "../locale/I18n";
import {unitUsage} from "../api";
import ConfirmationDialog from "./ConfirmationDialog";
import {ReactComponent as TrashIcon} from "@surfnet/sds/icons/functional-icons/bin.svg";
import {current} from "immer";
import ErrorIndicator from "./redesign/ErrorIndicator";
import SpinnerField from "./redesign/SpinnerField";

export const OrganisationUnits = ({units, setUnits, readOnly}) => {
export const OrganisationUnits = ({units, setUnits}) => {

const [duplicate, setDuplicate] = useState(-1);
const [references, setReferences] = useState({});
const [loading, setLoading] = useState(false);
const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);
const [confirmationDialogAction, setConfirmationDialogAction] = useState(false);
const [removalIndex, setRemovalIndex] = useState(-1);

const inputRef = useRef(null);


useEffect(() => {
const focusAfterAdd = () => {
inputRef.current && inputRef.current.focus();
});
}

const cancelRemoval = () => {
setReferences({});
setConfirmationDialogOpen(false);
setRemovalIndex(-1);
}

const internalOnChange = index => e => {
const name = e.target.value;
if (units.filter(unit => unit.name.toLowerCase() === name.toLowerCase()).length > 1) {
const value = e.target.value;
if (units.filter(unit => unit.name.toLowerCase() === value.toLowerCase()).length > 1) {
setDuplicate(index);
return stopEvent(e);
} else {
setDuplicate(-1);
const unit = units[index];
unit.name = name;
units.splice(index, 1, unit);
setUnits([...units]);
const newUnits = [...units];
const unit = newUnits[index];
unit.name = value;
newUnits.splice(index, 1, unit);
setUnits(newUnits);
}
}

const doRemoveUnit = index => {
units.splice(index, 1);
setUnits(...units);
setUnits([...units]);
}

const hasReferences = res => {
return !isEmpty(res.collaborations) || !isEmpty(res.invitations)
|| !isEmpty(res.collaboration_requests);
}

const removeAfterConfirmation = () => {
doRemoveUnit(removalIndex);
setConfirmationDialogOpen(false);
setReferences({});
}

const removeUnit = index => e => {
stopEvent(e);
const unit = units[index];
Expand All @@ -61,12 +67,8 @@ export const OrganisationUnits = ({units, setUnits, readOnly}) => {
unitUsage(unit).then(res => {
setReferences(res);
if (hasReferences(res)) {
setRemovalIndex(index);
setConfirmationDialogOpen(true);
setConfirmationDialogAction(() => {
doRemoveUnit(index);
setReferences({});
setConfirmationDialogOpen(false);
});
}
setLoading(false);
})
Expand All @@ -78,7 +80,8 @@ export const OrganisationUnits = ({units, setUnits, readOnly}) => {

const addUnit = e => {
stopEvent(e);
setUnits(...units.concat({name: ""}));
setUnits([...units.concat({name: ""})]);
setTimeout(() => focusAfterAdd(), 250);
}

const renderConfirmation = () => {
Expand All @@ -101,33 +104,44 @@ export const OrganisationUnits = ({units, setUnits, readOnly}) => {
);
}

if (loading) {
return <SpinnerField/>
}

return (
<div className="organisation-units">
<div className="organisation-units sds--text-field ">
<ConfirmationDialog isOpen={confirmationDialogOpen}
cancel={cancelRemoval}
confirm={confirmationDialogAction}
confirm={() => removeAfterConfirmation()}
question={I18n.t("units.confirmation")}
closeTimeoutMS={0}
isWarning={true}>
{confirmationDialogOpen && renderConfirmation()}
</ConfirmationDialog>
<label>{I18n.t("units.label")}</label>

{units.map((unit, index) =>
<div className="inner-input-field" key={index}>
<input type="text"
value={unit.name}
onChange={internalOnChange}
onBlur={onBlur}
ref={ref => (index + 1) === units.length ? inputRef : null}
className={`sds--text-field--input`}
/>
<div className={`input-field-link`}>
<a href={"#"} onClick={removeUnit(index)}>
<TrashIcon/>
</a>
</div>
</div>)
{units.map((unit, index) => {
const refProps = (index + 1) === units.length ? {ref: inputRef} : {};
return (
<div className={`input-field ${index === 0 ? "first" : ""}`} key={index}>
<div className="inner-input-field">
<input type="text"
value={unit.name}
onChange={internalOnChange(index)}
className={`sds--text-field--input`}
{...refProps}
/>
<div className={`input-field-link input-field-delete`}>
<a href={"#"} onClick={removeUnit(index)}>
<TrashIcon/>
</a>
</div>
{duplicate === index &&
<ErrorIndicator msg={"error"} standalone={true}/>
}
</div>
</div>)
})
}
<a className={"add-unit"} href="#" onClick={addUnit}>
{I18n.t("units.add")}
Expand Down
5 changes: 5 additions & 0 deletions client/src/components/OrganisationUnits.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,9 @@ div.organisation-units {
display: flex;
position: relative;
flex-direction: column;
margin-top: 15px;

a.add-unit {
margin-top: 15px;
}
}
Loading

0 comments on commit 75d4f97

Please sign in to comment.