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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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