Replaced the custom loading code with reacts build in suspense

This commit is contained in:
Colin Dawson 2026-03-18 16:39:21 +00:00
parent 7d77ffab73
commit 5e47c8839f
35 changed files with 195 additions and 440 deletions

View File

@ -1,17 +0,0 @@
import React from "react";
import LoadingPanel from "./LoadingPanel";
interface Loading2Props {
loaded: boolean;
children: React.ReactNode;
}
const Loading: React.FC<Loading2Props> = ({ loaded, children }) => {
if (!loaded) {
return <LoadingPanel />;
}
return <>{children}</>;
};
export default Loading;

View File

@ -13,7 +13,6 @@ import formsService, {
import parse, { HTMLReactParserOptions, domToReact } from "html-react-parser";
import { CustomField } from "../../modules/manager/customfields/services/customFieldsService";
import { toast } from "react-toastify";
import Loading from "./Loading";
import { renderCustomField } from "./formHelpers";
import { CustomFieldValue } from "../../modules/manager/glossary/services/glossaryService";
import { useTranslation } from "react-i18next";
@ -259,11 +258,7 @@ const TemplateFiller = forwardRef<TemplateFillerHandle, TemplateFillerProps>(
parsedDefinition = parseDefinition(template.definition, customFields);
else parsedDefinition = <></>;
return (
<Loading loaded={loaded}>
<div className="ck-content form-editor">{parsedDefinition}</div>
</Loading>
);
return <div className="ck-content form-editor">{parsedDefinition}</div>;
},
);

View File

@ -3,7 +3,6 @@ import Column from "../../components/common/columns";
import { Paginated } from "../../services/Paginated";
import AuditTable from "./components/auditTable";
import auditService, { AuditLogEntry } from "./services/auditService";
import Loading from "../../components/common/Loading";
import { useLocation, useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { Namespaces } from "../../i18n/i18n";
@ -13,7 +12,6 @@ export default function Audit() {
const params = useParams();
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<AuditLogEntry>>({
page: 1,
pageSize: 10,
@ -48,9 +46,6 @@ export default function Audit() {
if (result) {
setPagedData(result);
setLoaded(true);
} else {
setLoaded(false);
}
}, [
pagedData.page,
@ -67,12 +62,10 @@ export default function Audit() {
page,
pageSize,
}));
setLoaded(false);
};
const onSort = async (column: Column<AuditLogEntry>) => {
setSortColumn(column);
setLoaded(false);
};
const onSearch = async (name: string, value: string) => {
@ -81,7 +74,6 @@ export default function Audit() {
updated.set(name, value);
return updated;
});
setLoaded(false);
};
// Load data on mount and whenever page/sort/filter changes
@ -104,12 +96,10 @@ export default function Audit() {
label: t("Timing"),
order: "desc",
});
setLoaded(false);
}, [location.search, params.auditId, t]);
return (
<Loading loaded={loaded}>
<>
<div>
<AuditTable
data={pagedData}
@ -119,6 +109,6 @@ export default function Audit() {
onSearch={onSearch}
/>
</div>
</Loading>
</>
);
}

View File

@ -1,9 +1,10 @@
import React from "react";
import React, { Suspense } from "react";
import TopMenu from "./TopMenu";
import LeftMenu from "./LeftMenu";
import "../../../Sass/_frame.scss";
import Sticker from "./Sticker";
import LoadingPanel from "../../../components/common/LoadingPanel";
type MainFrameProps = {
title?: string | null;
@ -18,7 +19,9 @@ const Mainframe: React.FC<MainFrameProps> = ({ title, children }) => {
<div className="frame-leftMenu">
<LeftMenu />
</div>
<div className="frame-workArea">{children}</div>
<div className="frame-workArea">
<Suspense fallback={<LoadingPanel />}>{children}</Suspense>
</div>
</div>
<Sticker />
</div>

View File

@ -26,7 +26,6 @@ import {
CustomFieldValue,
SystemGlossaries,
} from "../glossary/services/glossaryService";
import Loading from "../../../components/common/Loading";
import { useFormWithGuard } from "../../../components/common/useFormRouter";
interface CustomFieldDetailsProps {
@ -359,7 +358,7 @@ const CustomFieldDetails: React.FC<CustomFieldDetailsProps> = ({
}
return (
<Loading loaded={form.state.loaded}>
<>
<h1>
{mode} {t("CustomField")}
</h1>
@ -637,7 +636,7 @@ const CustomFieldDetails: React.FC<CustomFieldDetailsProps> = ({
{isEditMode() && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -8,7 +8,6 @@ import customFieldsService, {
CustomField,
} from "./services/customFieldsService";
import Button, { ButtonType } from "../../../components/common/Button";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const initialPagedData: Paginated<CustomField> = {
@ -21,7 +20,6 @@ const initialPagedData: Paginated<CustomField> = {
const CustomFields: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<CustomField>>(initialPagedData);
@ -47,10 +45,7 @@ const CustomFields: React.FC = () => {
new Map<string, string>(),
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -66,10 +61,7 @@ const CustomFields: React.FC = () => {
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -83,11 +75,8 @@ const CustomFields: React.FC = () => {
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
};
@ -104,11 +93,8 @@ const CustomFields: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -128,7 +114,7 @@ const CustomFields: React.FC = () => {
);
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddField">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -145,7 +131,7 @@ const CustomFields: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -6,7 +6,6 @@ import { Paginated } from "../../../services/Paginated";
import DomainsTable from "./components/domainsTable";
import domainsService, { GetDomain } from "./serrvices/domainsService";
import Button, { ButtonType } from "../../../components/common/Button";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const initialPagedData: Paginated<GetDomain> = {
@ -19,7 +18,6 @@ const initialPagedData: Paginated<GetDomain> = {
const Domains: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<GetDomain>>(initialPagedData);
const [sortColumn, setSortColumn] = useState<Column<GetDomain>>({
@ -41,10 +39,7 @@ const Domains: React.FC = () => {
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -68,11 +63,8 @@ const Domains: React.FC = () => {
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
};
@ -89,11 +81,8 @@ const Domains: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -110,7 +99,7 @@ const Domains: React.FC = () => {
const translatedSortColumn = { ...sortColumn, label: t("Name") };
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddDomain">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -127,7 +116,7 @@ const Domains: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -6,7 +6,6 @@ import { useTranslation } from "react-i18next";
import { Namespaces } from "../../../../i18n/i18n";
import { MakeGeneralIdRef } from "../../../../utils/GeneralIdRef";
import roleService from "../serrvices/rolesService";
import Loading from "../../../../components/common/Loading";
import {
renderError,
renderButton,
@ -73,7 +72,6 @@ const AddUserToRole: React.FC<LocAddUserToRoleProps> = ({ isEditMode }) => {
if (redirect) return <Navigate to={redirect} />;
return (
<Loading loaded={loaded}>
<form onSubmit={handleSubmit}>
{renderError("_general", form.state.errors)}
{renderUserPicker(
@ -87,7 +85,6 @@ const AddUserToRole: React.FC<LocAddUserToRoleProps> = ({ isEditMode }) => {
{isEditMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
);
};

View File

@ -7,7 +7,6 @@ import { Namespaces } from "../../../../i18n/i18n";
import { InputType } from "../../../../components/common/Input";
import { MakeGeneralIdRef } from "../../../../utils/GeneralIdRef";
import domainsService from "../serrvices/domainsService";
import Loading from "../../../../components/common/Loading";
import {
renderError,
renderButton,
@ -161,7 +160,6 @@ const GeneralTab: React.FC<GeneralTabProps> = ({ isEditMode }) => {
if (redirect) return <Navigate to={redirect} />;
return (
<Loading loaded={loaded}>
<form onSubmit={handleSubmit}>
{renderError("_general", form.state.errors)}
{renderInput(
@ -245,7 +243,6 @@ const GeneralTab: React.FC<GeneralTabProps> = ({ isEditMode }) => {
{isEditMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
);
};
export default GeneralTab;

View File

@ -2,7 +2,6 @@ import React, { useEffect, useState } from "react";
import { useParams } from "react-router-dom";
import mailTemplatesService from "../serrvices/mailTemplatesService";
import HOCEmailTemplateEditor from "./EmailTemplateEditor";
import Loading from "../../../../components/common/Loading";
import { Namespaces } from "../../../../i18n/i18n";
import { useTranslation } from "react-i18next";
import { SelectableList } from "../../../../components/common/SelectableList";
@ -43,7 +42,6 @@ const MailTemplatesTabContent: React.FC<{
};
const MailTemplatesTab: React.FC = () => {
const [loaded, setLoaded] = useState(false);
const [currentMailType, setCurrentMailType] = useState<MailType | null>(null);
const [types, setTypes] = useState<MailType[]>([]);
@ -59,8 +57,6 @@ const MailTemplatesTab: React.FC = () => {
}
} catch (ex) {
console.error(ex);
} finally {
setLoaded(true);
}
};
@ -74,14 +70,12 @@ const MailTemplatesTab: React.FC = () => {
const { domainId } = useParams<{ domainId: string }>();
return (
<Loading loaded={loaded}>
<MailTemplatesTabContent
types={types}
currentMailType={currentMailType}
domainId={domainId}
onClick={onClick}
/>
</Loading>
);
};

View File

@ -9,7 +9,6 @@ import roleService, {
GetSecurityAccess,
} from "../serrvices/rolesService";
import RollAccessTable from "./RollAccessTable";
import Loading from "../../../../components/common/Loading";
const initialPagedData: Paginated<GetRoleSecurityAccess> = {
page: 1,
@ -33,7 +32,6 @@ interface RoleAccessEditorProps {
const RoleAccessEditor: React.FC<RoleAccessEditorProps> = ({ role }) => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [accessList, setAccessList] =
useState<Paginated<GetSecurityAccess>>(initialAccessList);
const [pagedData, setPagedData] =
@ -114,11 +112,8 @@ const RoleAccessEditor: React.FC<RoleAccessEditorProps> = ({ role }) => {
accessRightsResponse?.data,
);
if (nextPagedData) {
setLoaded(true);
setPagedData(nextPagedData);
}
} else {
setLoaded(false);
}
},
[accessList, compileAccessRightsPagedData, role?.id],
@ -173,14 +168,12 @@ const RoleAccessEditor: React.FC<RoleAccessEditorProps> = ({ role }) => {
const isAdministrator = role?.isAdministrator || role?.isSuperUser;
return (
<Loading loaded={loaded}>
<RollAccessTable
role={role?.id}
isAdministrator={isAdministrator}
data={pagedData}
onSave={handleSave}
/>
</Loading>
);
};

View File

@ -7,7 +7,6 @@ import { Namespaces } from "../../../../i18n/i18n";
import { InputType } from "../../../../components/common/Input";
import { MakeGeneralIdRef } from "../../../../utils/GeneralIdRef";
import roleService from "../serrvices/rolesService";
import Loading from "../../../../components/common/Loading";
import {
renderError,
renderButton,
@ -109,7 +108,7 @@ const RolesDetails: React.FC<RolesDetailsProps> = ({ isEditMode }) => {
if (isEditMode) mode = t("Edit");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("Role")}
</h1>
@ -133,7 +132,7 @@ const RolesDetails: React.FC<RolesDetailsProps> = ({ isEditMode }) => {
{isEditMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};
export default RolesDetails;

View File

@ -8,7 +8,6 @@ import { useParams } from "react-router-dom";
import roleService, { GetRoleResponse } from "../serrvices/rolesService";
import RolesTable from "./RolesTable";
import Button, { ButtonType } from "../../../../components/common/Button";
import Loading from "../../../../components/common/Loading";
import Permission from "../../../../components/common/Permission";
import { useHashSegment } from "../../../../utils/HashNavigationContext";
@ -39,7 +38,6 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
const hashRoleId = useHashSegment(
hashSegment !== undefined ? hashSegment : -1,
);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<GetRoleResponse>>(initialPagedData);
const [sortColumn, setSortColumn] = useState<Column<GetRoleResponse>>({
@ -68,10 +66,7 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
[domainGeneralIdRef, filters, sortColumn.key, sortColumn.order],
@ -112,11 +107,8 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
filters,
);
if (pagedDataResult) {
setLoaded(true);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
};
@ -134,11 +126,8 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -166,7 +155,7 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
const translatedSortColumn = { ...sortColumn, label: t("Name") };
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddRole">
<Button
id="btnAddRoleToDomain"
@ -190,7 +179,7 @@ const RolesEditor: React.FC<RolesEditorProps> = ({
canDelete={canDelete}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -7,7 +7,6 @@ import { MakeGeneralIdRef } from "../../../../utils/GeneralIdRef";
import UserRolesTable from "./UserRolesTable";
import roleService, { RoleUser } from "../serrvices/rolesService";
import Button, { ButtonType } from "../../../../components/common/Button";
import Loading from "../../../../components/common/Loading";
import Permission from "../../../../components/common/Permission";
const initialPagedData: Paginated<RoleUser> = {
@ -24,7 +23,6 @@ interface UserRoleEditorProps {
const UserRoleEditor: React.FC<UserRoleEditorProps> = ({ role }) => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<RoleUser>>(initialPagedData);
const [sortColumn, setSortColumn] = useState<Column<RoleUser>>({
@ -57,12 +55,9 @@ const UserRoleEditor: React.FC<UserRoleEditorProps> = ({ role }) => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
},
[roleGeneralIdRef],
@ -110,7 +105,7 @@ const UserRoleEditor: React.FC<UserRoleEditorProps> = ({ role }) => {
const addLink = "editRole/" + role?.id + "/addUserToRole";
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddRoleUser">
<div>
<Button
@ -131,7 +126,7 @@ const UserRoleEditor: React.FC<UserRoleEditorProps> = ({ role }) => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -7,12 +7,10 @@ import Permission from "../../../components/common/Permission";
import { Paginated } from "../../../services/Paginated";
import FormsTable from "./components/formsTable";
import formsService, { GetFormResponse } from "./services/formsService";
import Loading from "../../../components/common/Loading";
const Forms: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<GetFormResponse>>({
page: 1,
pageSize: 10,
@ -39,10 +37,7 @@ const Forms: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -58,11 +53,8 @@ const Forms: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -79,11 +71,8 @@ const Forms: React.FC = () => {
newFilters,
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -98,10 +87,7 @@ const Forms: React.FC = () => {
const loadInitial = async () => {
const data = await formsService.getForms(1, 10, "name", true, filters);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -109,7 +95,7 @@ const Forms: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddFormTemplate">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -126,7 +112,7 @@ const Forms: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -7,7 +7,6 @@ import { Namespaces } from "../../../i18n/i18n";
import { InputType } from "../../../components/common/Input";
import { MakeGeneralIdRef } from "../../../utils/GeneralIdRef";
import formsService from "./services/formsService";
import Loading from "../../../components/common/Loading";
import {
renderError,
renderButton,
@ -110,7 +109,7 @@ const FormsDetails: React.FC<{ editMode?: boolean }> = ({
if (editMode) mode = t("Edit");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("FormTemplate")}
</h1>
@ -141,7 +140,7 @@ const FormsDetails: React.FC<{ editMode?: boolean }> = ({
{editMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -12,7 +12,6 @@ import glossariesService, {
SystemGlossaries,
} from "./services/glossaryService";
import { CustomField } from "../customfields/services/customFieldsService";
import Loading from "../../../components/common/Loading";
import {
renderError,
renderButton,
@ -226,7 +225,7 @@ const GlossariesDetails: React.FC<GlossariesDetailsProps> = ({
};
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("GlossaryItem")}
</h1>
@ -268,7 +267,7 @@ const GlossariesDetails: React.FC<GlossariesDetailsProps> = ({
{editMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -10,19 +10,16 @@ import glossariesService, {
} from "./services/glossaryService";
import { GeneralIdRef } from "./../../../utils/GeneralIdRef";
import Button, { ButtonType } from "../../../components/common/Button";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const Glossaries: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const { glossaryId } = useParams<{ glossaryId: string }>();
const [loaded, setLoaded] = useState(false);
const [data, setData] = useState<Glossary | undefined>(undefined);
const [parentAddress, setParentAddress] = useState("");
const loadData = useCallback(async () => {
setLoaded(false);
let parentItem: GeneralIdRef = SystemGlossaries;
if (glossaryId !== undefined) {
@ -41,9 +38,6 @@ const Glossaries: React.FC = () => {
setData(result);
setParentAddress(nextParentAddress);
setLoaded(true);
} else {
setLoaded(false);
}
}, [glossaryId]);
@ -130,7 +124,7 @@ const Glossaries: React.FC = () => {
const pathBlock = createPathBlock();
return (
<Loading loaded={loaded}>
<>
<div>
<Permission privilegeKey="ViewGlossary">{upButton}</Permission>
<Permission privilegeKey="AddGlossary">
@ -143,7 +137,7 @@ const Glossaries: React.FC = () => {
<hr />
{pathBlock}
{table}
</Loading>
</>
);
};

View File

@ -9,11 +9,9 @@ import OrganisationsTable from "./components/OrganisationsTable";
import organisationsService, {
ReadOrganisation,
} from "./services/organisationsService";
import Loading from "../../../components/common/Loading";
const Organisations: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<ReadOrganisation>>({
page: 1,
pageSize: 10,
@ -40,10 +38,7 @@ const Organisations: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -60,11 +55,8 @@ const Organisations: React.FC = () => {
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -81,11 +73,8 @@ const Organisations: React.FC = () => {
newFilters,
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -109,10 +98,7 @@ const Organisations: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -120,7 +106,7 @@ const Organisations: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddOrganisation">
<Button buttonType={ButtonType.primary} to="add">
{t("Add")}
@ -135,7 +121,7 @@ const Organisations: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -8,7 +8,6 @@ import { InputType } from "../../../components/common/Input";
import { MakeGeneralIdRef } from "../../../utils/GeneralIdRef";
import Option from "../../../components/common/option";
import organisationsService from "./services/organisationsService";
import Loading from "../../../components/common/Loading";
import {
renderError,
renderButton,
@ -129,7 +128,7 @@ const OrganisationsDetails: React.FC<{ editMode?: boolean }> = ({
if (editMode) mode = t("Edit");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("Organisation")}
</h1>
@ -174,7 +173,7 @@ const OrganisationsDetails: React.FC<{ editMode?: boolean }> = ({
{editMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -15,7 +15,6 @@ import {
import sequenceService from "./services/sequenceService";
import Option from "../../../components/common/option";
import { MakeGeneralIdRef } from "../../../utils/GeneralIdRef";
import Loading from "../../../components/common/Loading";
import { useFormWithGuard } from "../../../components/common/useFormRouter";
interface SequenceDetailsProps {
@ -141,7 +140,7 @@ const SequenceDetails: React.FC<SequenceDetailsProps> = ({
form.handleSubmit(e, doSubmit);
};
const { loaded, redirect } = form.state;
const { redirect } = form.state;
if (redirect) return <Navigate to={redirect} />;
const rolloverOptions: Option[] = [
@ -154,7 +153,7 @@ const SequenceDetails: React.FC<SequenceDetailsProps> = ({
const mode = editMode ? t("Edit") : t("Add");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("Sequence")}
</h1>
@ -223,7 +222,7 @@ const SequenceDetails: React.FC<SequenceDetailsProps> = ({
{editMode && renderButton(labelApply, form.state.errors, "save")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -6,12 +6,10 @@ import SequenceTable from "./components/squenceTable";
import Column from "../../../components/common/columns";
import { Paginated } from "../../../services/Paginated";
import Button, { ButtonType } from "../../../components/common/Button";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const Sequence: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<ReadSequence>>({
page: 1,
pageSize: 10,
@ -38,10 +36,7 @@ const Sequence: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -57,11 +52,8 @@ const Sequence: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -78,11 +70,8 @@ const Sequence: React.FC = () => {
newFilters,
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -103,10 +92,7 @@ const Sequence: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -114,7 +100,7 @@ const Sequence: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddSequence">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -131,7 +117,7 @@ const Sequence: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -14,7 +14,6 @@ import {
import { MakeGeneralIdRef } from "../../../utils/GeneralIdRef";
import Option from "../../../components/common/option";
import siteService from "./services/sitessService";
import Loading from "../../../components/common/Loading";
import { useFormWithGuard } from "../../../components/common/useFormRouter";
interface SiteDetailsProps {
@ -128,7 +127,7 @@ const SiteDetails: React.FC<SiteDetailsProps> = ({ editMode = false }) => {
form.handleSubmit(e, doSubmit);
};
const { loaded, redirect } = form.state;
const { redirect } = form.state;
if (redirect) return <Navigate to={redirect} />;
const organisationStatusOptions: Option[] = [
@ -140,7 +139,7 @@ const SiteDetails: React.FC<SiteDetailsProps> = ({ editMode = false }) => {
const mode = editMode ? t("Edit") : t("Add");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("Site")}
</h1>
@ -185,7 +184,7 @@ const SiteDetails: React.FC<SiteDetailsProps> = ({ editMode = false }) => {
{editMode && renderButton(labelApply, form.state.errors, "save")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -7,7 +7,6 @@ import { Paginated } from "../../../services/Paginated";
import Button, { ButtonType } from "../../../components/common/Button";
import siteService, { ReadSite } from "./services/sitessService";
import SitesTable from "./components/SitesTable";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const initialPagedData: Paginated<ReadSite> = {
@ -22,7 +21,6 @@ const Sites: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const { organisationId } = useParams<{ organisationId: string }>();
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<ReadSite>>(initialPagedData);
const [sortColumn, setSortColumn] = useState<Column<ReadSite>>({
@ -56,11 +54,8 @@ const Sites: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
[
@ -84,11 +79,8 @@ const Sites: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -107,12 +99,9 @@ const Sites: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
@ -133,11 +122,8 @@ const Sites: React.FC = () => {
updatedFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(updatedFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
@ -163,7 +149,7 @@ const Sites: React.FC = () => {
);
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddSite">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -180,7 +166,7 @@ const Sites: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -9,7 +9,6 @@ import specificationService, {
ReadSpecification,
} from "./services/specificationService";
import SpecificationsTable from "./components/SpecificationsTable";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const initialPagedData: Paginated<ReadSpecification> = {
@ -23,8 +22,6 @@ const initialPagedData: Paginated<ReadSpecification> = {
const Specifications: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const { siteId } = useParams<{ siteId: string }>();
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] =
useState<Paginated<ReadSpecification>>(initialPagedData);
const [sortColumn, setSortColumn] = useState<Column<ReadSpecification>>({
@ -58,11 +55,8 @@ const Specifications: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order, updateFiltersWithSiteId],
@ -79,11 +73,8 @@ const Specifications: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
};
@ -102,12 +93,9 @@ const Specifications: React.FC = () => {
nextFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(nextFilters);
setPagedData(pagedDataResult);
setSortColumn(nextSortColumn);
} else {
setLoaded(false);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
@ -128,11 +116,8 @@ const Specifications: React.FC = () => {
updatedFilters,
);
if (pagedDataResult) {
setLoaded(true);
setFilters(updatedFilters);
setPagedData(pagedDataResult);
} else {
setLoaded(false);
}
},
// eslint-disable-next-line react-hooks/exhaustive-deps
@ -159,7 +144,7 @@ const Specifications: React.FC = () => {
);
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddSpecification">
<Button buttonType={ButtonType.primary} to="add">
{t("Add")}
@ -174,7 +159,7 @@ const Specifications: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -5,7 +5,6 @@ import { toast } from "react-toastify";
import { useTranslation } from "react-i18next";
import { Namespaces } from "../../../i18n/i18n";
import { InputType } from "../../../components/common/Input";
import Loading from "../../../components/common/Loading";
import TemplateFiller, {
TemplateFillerHandle,
} from "../../../components/common/TemplateFiller";
@ -203,13 +202,13 @@ const SpecificationsDetails: React.FC<SpecificationsDetailsProps> = ({
form.handleSubmit(e, doSubmit);
};
const { loaded, redirect } = form.state;
const { redirect } = form.state;
if (redirect && redirect !== "") return <Navigate to={redirect} />;
const mode = isEditMode() ? t("Edit") : t("Add");
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("Specifications")}
</h1>
@ -287,7 +286,7 @@ const SpecificationsDetails: React.FC<SpecificationsDetailsProps> = ({
true,
)}
</form>
</Loading>
</>
);
};

View File

@ -12,7 +12,6 @@ import {
renderError,
} from "../../../components/common/formHelpers";
import { MakeGeneralIdRef } from "../../../utils/GeneralIdRef";
import Loading from "../../../components/common/Loading";
import ssoManagerService from "./services/ssoManagerService";
interface SsoProviderDetailsProps {
@ -179,7 +178,7 @@ const SsoProviderDetails: React.FC<SsoProviderDetailsProps> = ({
ssoProviderId;
return (
<Loading loaded={loaded}>
<>
<h1>
{mode} {t("SsoProvider")}
</h1>
@ -291,7 +290,7 @@ const SsoProviderDetails: React.FC<SsoProviderDetailsProps> = ({
{editMode && renderButton(labelApply, form.state.errors, "apply")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -8,12 +8,10 @@ import ssoManagerService, {
GetSsoProvider,
} from "./services/ssoManagerService";
import Button, { ButtonType } from "../../../components/common/Button";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const SsoManager: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<GetSsoProvider>>({
page: 1,
pageSize: 10,
@ -40,10 +38,7 @@ const SsoManager: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -59,11 +54,8 @@ const SsoManager: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -80,11 +72,8 @@ const SsoManager: React.FC = () => {
newFilters,
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -108,10 +97,7 @@ const SsoManager: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -119,7 +105,7 @@ const SsoManager: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddSsoProvider">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -136,7 +122,7 @@ const SsoManager: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -3,7 +3,6 @@ import { useParams } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { toast } from "react-toastify";
import { Namespaces } from "../../../../i18n/i18n";
import Loading from "../../../../components/common/Loading";
import assignmentCompleteService, {
GetAssignmentForCompletion,
} from "./services/assignmentCompleteService";
@ -11,13 +10,11 @@ import assignmentCompleteService, {
const AssignmentComplete: React.FC = () => {
const { assignmentId } = useParams<{ assignmentId: string }>();
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [assignment, setAssignment] =
useState<GetAssignmentForCompletion | null>(null);
const loadAssignment = useCallback(async () => {
if (assignmentId === undefined) {
setLoaded(true);
return;
}
@ -29,10 +26,8 @@ const AssignmentComplete: React.FC = () => {
if (assignmentDetails) {
setAssignment(assignmentDetails);
}
setLoaded(true);
} catch (ex: any) {
toast.error(ex.message);
setLoaded(true);
}
}, [assignmentId]);
@ -41,9 +36,9 @@ const AssignmentComplete: React.FC = () => {
}, [loadAssignment]);
return (
<Loading loaded={loaded}>
<>
{assignment ? <>{assignment.taskName}</> : <>{t("CompleteAssignment")}</>}
</Loading>
</>
);
};

View File

@ -4,15 +4,12 @@ import { Namespaces } from "../../../i18n/i18n";
import Column from "../../../components/common/columns";
import { Paginated } from "../../../services/Paginated";
import Button, { ButtonType } from "../../../components/common/Button";
import { toast } from "react-toastify";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
import tasksService, { GetMyAssignments } from "./services/tasksService";
import TasksTable from "./components/tasksTable";
const Tasks: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<GetMyAssignments>>({
page: 1,
pageSize: 10,
@ -39,10 +36,7 @@ const Tasks: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -59,11 +53,8 @@ const Tasks: React.FC = () => {
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -80,11 +71,8 @@ const Tasks: React.FC = () => {
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -98,10 +86,7 @@ const Tasks: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -115,7 +100,6 @@ const Tasks: React.FC = () => {
{t("CreateActivity")}
</Button>
</Permission>
<Loading loaded={loaded}>
<TasksTable
data={pagedData}
sortColumn={sortColumn}
@ -123,7 +107,6 @@ const Tasks: React.FC = () => {
onSort={onSort}
onSearch={onSearch}
/>
</Loading>
</>
);
};

View File

@ -8,7 +8,6 @@ import { InputType } from "../../../../components/common/Input";
import { GeneralIdRef, MakeGeneralIdRef } from "../../../../utils/GeneralIdRef";
import authentication from "../../../frame/services/authenticationService";
import userService from "../services/usersService";
import Loading from "../../../../components/common/Loading";
import { CustomFieldValue } from "../../glossary/services/glossaryService";
import {
renderInput,
@ -145,7 +144,7 @@ const GeneralTab: React.FC<GeneralTabProps> = ({ isEditMode }) => {
if (redirect) return <Navigate to={redirect} />;
return (
<Loading loaded={loaded}>
<>
<form onSubmit={handleSubmit}>
{renderError("_general", form.state.errors)}
{isEditMode &&
@ -235,7 +234,7 @@ const GeneralTab: React.FC<GeneralTabProps> = ({ isEditMode }) => {
{isEditMode && renderButton(labelApply, form.state.errors, "save")}
{renderButton(labelSave, form.state.errors, "save")}
</form>
</Loading>
</>
);
};

View File

@ -7,12 +7,10 @@ import UsersTable from "./components/usersTable";
import userService, { GetUser } from "./services/usersService";
import Button, { ButtonType } from "../../../components/common/Button";
import { toast } from "react-toastify";
import Loading from "../../../components/common/Loading";
import Permission from "../../../components/common/Permission";
const Users: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<GetUser>>({
page: 1,
pageSize: 10,
@ -39,10 +37,7 @@ const Users: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -59,11 +54,8 @@ const Users: React.FC = () => {
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -80,11 +72,8 @@ const Users: React.FC = () => {
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -112,10 +101,7 @@ const Users: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -123,7 +109,7 @@ const Users: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddUser">
<div>
<Button buttonType={ButtonType.primary} to="add">
@ -141,7 +127,7 @@ const Users: React.FC = () => {
onDelete={onDelete}
resendConfirmEmail={resentConfirmEmail}
/>
</Loading>
</>
);
};

View File

@ -10,7 +10,6 @@ import templateVersionsService, {
ReadWorkflowTemplateVersion,
TaskDefinition,
} from "./services/WorkflowTemplateService";
import Loading from "../../../components/common/Loading";
import { toast } from "react-toastify";
import Joi from "joi";
import {
@ -154,7 +153,7 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({
});
}, []);
const { loaded, redirect, errors: formErrors, data } = form.state;
const { redirect, errors: formErrors, data } = form.state;
if (redirect) return <Navigate to={redirect} />;
let errors = { ...formErrors };
@ -214,7 +213,6 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({
];
return (
<Loading loaded={loaded}>
<div className="full-height-container">
<form onSubmit={handleSubmit}>
<h1>{heading}</h1>
@ -239,7 +237,6 @@ const WorkflowTemplateDetails: React.FC<{ editMode: boolean }> = ({
</HorizontalTabs>
</form>
</div>
</Loading>
);
};

View File

@ -5,7 +5,6 @@ import Button, { ButtonType } from "../../../components/common/Button";
import Column from "../../../components/common/columns";
import Permission from "../../../components/common/Permission";
import { Paginated } from "../../../services/Paginated";
import Loading from "../../../components/common/Loading";
import workflowTemplatesService, {
ReadWorkflowTemplate,
} from "./services/WorkflowTemplateService";
@ -13,7 +12,6 @@ import WorkflowTemplateManagerTable from "./components/WorkflowTemplateTable";
const WotkflowTemplateManager: React.FC = () => {
const { t } = useTranslation(Namespaces.Common);
const [loaded, setLoaded] = useState(false);
const [pagedData, setPagedData] = useState<Paginated<ReadWorkflowTemplate>>({
page: 1,
pageSize: 10,
@ -40,10 +38,7 @@ const WotkflowTemplateManager: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
},
[filters, sortColumn.key, sortColumn.order],
@ -60,11 +55,8 @@ const WotkflowTemplateManager: React.FC = () => {
);
if (data) {
setLoaded(true);
setPagedData(data);
setSortColumn(newSortColumn);
} else {
setLoaded(false);
}
};
@ -81,11 +73,8 @@ const WotkflowTemplateManager: React.FC = () => {
newFilters,
);
if (data) {
setLoaded(true);
setFilters(newFilters);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -109,10 +98,7 @@ const WotkflowTemplateManager: React.FC = () => {
filters,
);
if (data) {
setLoaded(true);
setPagedData(data);
} else {
setLoaded(false);
}
};
@ -120,7 +106,7 @@ const WotkflowTemplateManager: React.FC = () => {
}, []); // eslint-disable-line react-hooks/exhaustive-deps
return (
<Loading loaded={loaded}>
<>
<Permission privilegeKey="AddOrganisation">
<Button buttonType={ButtonType.primary} to="add">
{t("Add")}
@ -140,7 +126,7 @@ const WotkflowTemplateManager: React.FC = () => {
onSearch={onSearch}
onDelete={onDelete}
/>
</Loading>
</>
);
};

View File

@ -6,7 +6,6 @@ import { Namespaces } from "../../../i18n/i18n";
import profileService from "../services/profileService";
import { InputType } from "../../../components/common/Input";
import { TwoFactorAuthenticationSettings } from "../models/TwoFactorAuthenticationSettings";
import Loading from "../../../components/common/Loading";
import {
renderError,
renderButton,
@ -172,7 +171,6 @@ const InternalProfile: React.FC = () => {
form.handleSubmit(e, doSubmit);
};
const { loaded } = form.state;
const { usingTwoFactorAuthentication, newPassword } = form.state.data;
const passwordMaxLength = 255;
@ -273,7 +271,7 @@ const InternalProfile: React.FC = () => {
);
return (
<Loading loaded={loaded}>
<>
<h1>{t("Profile")}</h1>
<form onSubmit={handleSubmit}>
{renderError("_general", form.state.errors)}
@ -345,7 +343,7 @@ const InternalProfile: React.FC = () => {
<br />
{renderButton(labelApply, form.state.errors, "apply")}
</form>
</Loading>
</>
);
};