@olenbetong/synergi-react 2.5.0 → 2.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/components/AppMenu/AppMenu.css +158 -0
- package/es/components/AppMenu/index.d.ts +12 -0
- package/es/components/AppMenu/index.js +85 -0
- package/es/components/AppShell/index.d.ts +5 -0
- package/es/components/AppShell/index.js +112 -0
- package/es/components/ColorCard/index.d.ts +6 -6
- package/es/components/DateNavigator/index.d.ts +1 -1
- package/es/components/FilePond.d.ts +1 -1
- package/es/components/ImageEditor/DragHandle.d.ts +1 -1
- package/es/components/ImageEditor/EdgeHandle.d.ts +1 -1
- package/es/components/ImageEditor/ResponsiveButton.d.ts +1 -1
- package/es/components/ImageEditor/plugins/cropPlugin/CropContext.d.ts +1 -1
- package/es/components/ImageEditor/plugins/cropPlugin/CropOverlay.d.ts +1 -1
- package/es/components/ImageEditor/plugins/cropPlugin/CropToolbar.d.ts +1 -1
- package/es/components/ImageEditor/plugins/redactPlugin/RedactContext.d.ts +1 -1
- package/es/components/ImageEditor/plugins/redactPlugin/RedactOverlay.d.ts +1 -1
- package/es/components/ImageEditor/plugins/redactPlugin/RedactToolbar.d.ts +1 -1
- package/es/components/ImageEditor/plugins/zoomPlugin/ZoomCanvas.d.ts +1 -1
- package/es/components/ImageEditor/plugins/zoomPlugin/ZoomContext.d.ts +1 -1
- package/es/components/ImageEditor/plugins/zoomPlugin/ZoomControls.d.ts +1 -1
- package/es/components/LinkedCardList/index.d.ts +3 -3
- package/es/components/MergeProgressDialog/index.d.ts +1 -1
- package/es/components/PageBanner/index.d.ts +4 -4
- package/es/components/PdfViewer/PdfViewer.d.ts +1 -1
- package/es/components/Portal/index.d.ts +1 -1
- package/es/components/Sidebar/index.d.ts +1 -1
- package/es/components/Spinner/index.d.ts +1 -1
- package/es/components/SplitContainer/index.d.ts +1 -1
- package/es/components/Toolbar/index.d.ts +1 -1
- package/es/elements/ElementDamage/DamageFormButtons.d.ts +1 -1
- package/es/elements/ElementDamage/DescriptionInput.d.ts +1 -1
- package/es/elements/ElementDamage/DuplicateDamage/DesktopView.d.ts +2 -2
- package/es/elements/ElementDamage/DuplicateDamage/DublicateElementDamageDialog.d.ts +1 -1
- package/es/elements/ElementDamage/DuplicateDamage/PhoneView.d.ts +1 -1
- package/es/elements/ElementDamage/ElementNumberTextField.d.ts +1 -1
- package/es/elements/ElementDamage/HiddenDamageFields.d.ts +1 -1
- package/es/elements/ElementDamage/RegisterFix.d.ts +1 -1
- package/es/elements/ElementDamage/SubmitButtons.d.ts +1 -1
- package/es/elements/ElementDamage/TransportElementSelect.d.ts +1 -1
- package/es/elements/ElementLookup.d.ts +1 -1
- package/es/elements/ElementLookupDialog/BarcodeScanner/DeadIcon.d.ts +1 -1
- package/es/elements/ElementLookupDialog/BarcodeScanner/Error.d.ts +1 -1
- package/es/elements/ElementLookupDialog/BarcodeScanner/index.d.ts +1 -1
- package/es/elements/ElementLookupDialog/HIDScanner/index.d.ts +1 -1
- package/es/elements/ElementLookupDialog/Manual/ManualForm.d.ts +1 -1
- package/es/elements/ElementLookupDialog/index.d.ts +1 -1
- package/es/elements/ProjectSelect.d.ts +1 -1
- package/es/index.d.ts +2 -0
- package/es/index.js +2 -0
- package/package.json +10 -8
- package/src/components/AppMenu/AppMenu.css +158 -0
- package/src/components/AppMenu/index.tsx +179 -0
- package/src/components/AppShell/index.tsx +133 -0
- package/src/index.ts +2 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/* App Menu – trigger button */
|
|
2
|
+
.app-menu-trigger {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
justify-content: center;
|
|
6
|
+
padding: var(--ds-spacing-2);
|
|
7
|
+
background: transparent;
|
|
8
|
+
border: none;
|
|
9
|
+
border-radius: var(--ds-border-radius-md);
|
|
10
|
+
color: var(--ds-color-neutral-text-default);
|
|
11
|
+
cursor: pointer;
|
|
12
|
+
line-height: 1;
|
|
13
|
+
transition: background 0.15s ease;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.app-menu-trigger:hover {
|
|
17
|
+
background: var(--ds-color-neutral-background-hover);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.app-menu-trigger:focus-visible {
|
|
21
|
+
outline: 2px solid var(--ds-color-focus-outer);
|
|
22
|
+
outline-offset: 2px;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.app-menu-icon {
|
|
26
|
+
display: block;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Dialog backdrop */
|
|
30
|
+
.app-menu-dialog::backdrop {
|
|
31
|
+
background: rgba(0, 0, 0, 0.4);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Dialog container */
|
|
35
|
+
.app-menu-dialog {
|
|
36
|
+
padding: 0;
|
|
37
|
+
border: 1px solid var(--ds-color-neutral-border-default);
|
|
38
|
+
border-radius: var(--ds-border-radius-lg);
|
|
39
|
+
background: var(--ds-color-neutral-background-default);
|
|
40
|
+
box-shadow: var(--ds-shadow-lg, 0 8px 32px rgba(0, 0, 0, 0.18));
|
|
41
|
+
max-width: min(90vw, 36rem);
|
|
42
|
+
width: 100%;
|
|
43
|
+
max-height: min(90vh, 40rem);
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Inner wrapper – scrollable */
|
|
50
|
+
.app-menu-dialog-inner {
|
|
51
|
+
display: flex;
|
|
52
|
+
flex-direction: column;
|
|
53
|
+
gap: 0;
|
|
54
|
+
padding: var(--ds-spacing-4);
|
|
55
|
+
overflow: hidden;
|
|
56
|
+
height: 100%;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Search row */
|
|
60
|
+
.app-menu-search-row {
|
|
61
|
+
margin-bottom: var(--ds-spacing-3);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.app-menu-search {
|
|
65
|
+
width: 100%;
|
|
66
|
+
padding: var(--ds-spacing-2) var(--ds-spacing-3);
|
|
67
|
+
font-size: var(--ds-font-size-md);
|
|
68
|
+
border: 1px solid var(--ds-color-neutral-border-strong);
|
|
69
|
+
border-radius: var(--ds-border-radius-md);
|
|
70
|
+
background: var(--ds-color-neutral-background-subtle);
|
|
71
|
+
color: var(--ds-color-neutral-text-default);
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.app-menu-search:focus {
|
|
76
|
+
outline: 2px solid var(--ds-color-focus-outer);
|
|
77
|
+
outline-offset: 2px;
|
|
78
|
+
border-color: var(--ds-color-accent-border-strong);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* Loading / empty states */
|
|
82
|
+
.app-menu-loading,
|
|
83
|
+
.app-menu-empty {
|
|
84
|
+
text-align: center;
|
|
85
|
+
color: var(--ds-color-neutral-text-subtle);
|
|
86
|
+
font-size: var(--ds-font-size-sm);
|
|
87
|
+
padding: var(--ds-spacing-4) 0;
|
|
88
|
+
margin: 0;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* Groups scroll area */
|
|
92
|
+
.app-menu-groups {
|
|
93
|
+
overflow-y: auto;
|
|
94
|
+
flex: 1 1 auto;
|
|
95
|
+
display: flex;
|
|
96
|
+
flex-direction: column;
|
|
97
|
+
gap: var(--ds-spacing-4);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Individual group */
|
|
101
|
+
.app-menu-group {
|
|
102
|
+
display: flex;
|
|
103
|
+
flex-direction: column;
|
|
104
|
+
gap: var(--ds-spacing-1);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.app-menu-group-title {
|
|
108
|
+
font-size: var(--ds-font-size-xs);
|
|
109
|
+
font-weight: var(--ds-font-weight-medium, 600);
|
|
110
|
+
text-transform: uppercase;
|
|
111
|
+
letter-spacing: 0.06em;
|
|
112
|
+
color: var(--ds-color-neutral-text-subtle);
|
|
113
|
+
margin: 0 0 var(--ds-spacing-1);
|
|
114
|
+
padding: 0;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* App list */
|
|
118
|
+
.app-menu-list {
|
|
119
|
+
list-style: none;
|
|
120
|
+
margin: 0;
|
|
121
|
+
padding: 0;
|
|
122
|
+
display: grid;
|
|
123
|
+
grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
|
|
124
|
+
gap: var(--ds-spacing-1);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.app-menu-item {
|
|
128
|
+
display: contents;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/* App link tiles */
|
|
132
|
+
.app-menu-link {
|
|
133
|
+
display: flex;
|
|
134
|
+
align-items: center;
|
|
135
|
+
padding: var(--ds-spacing-2) var(--ds-spacing-3);
|
|
136
|
+
border-radius: var(--ds-border-radius-sm);
|
|
137
|
+
font-size: var(--ds-font-size-sm);
|
|
138
|
+
color: var(--ds-color-neutral-text-default);
|
|
139
|
+
text-decoration: none;
|
|
140
|
+
background: var(--ds-color-neutral-background-subtle);
|
|
141
|
+
border: 1px solid transparent;
|
|
142
|
+
transition:
|
|
143
|
+
background 0.12s ease,
|
|
144
|
+
border-color 0.12s ease;
|
|
145
|
+
word-break: break-word;
|
|
146
|
+
line-height: 1.4;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
.app-menu-link:hover {
|
|
150
|
+
background: var(--ds-color-accent-background-hover, var(--ds-color-neutral-background-hover));
|
|
151
|
+
border-color: var(--ds-color-accent-border-default, var(--ds-color-neutral-border-default));
|
|
152
|
+
color: var(--ds-color-accent-text-default, var(--ds-color-neutral-text-default));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.app-menu-link:focus-visible {
|
|
156
|
+
outline: 2px solid var(--ds-color-focus-outer);
|
|
157
|
+
outline-offset: 2px;
|
|
158
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import "./AppMenu.css";
|
|
2
|
+
import type { DataObject } from "@olenbetong/appframe-data";
|
|
3
|
+
export type AppMenuArticle = {
|
|
4
|
+
ArticleId: string;
|
|
5
|
+
Title: string | null;
|
|
6
|
+
MenuGroup: string | null;
|
|
7
|
+
Path: string | null;
|
|
8
|
+
};
|
|
9
|
+
export type AppMenuProps = {
|
|
10
|
+
dataObject: DataObject<AppMenuArticle>;
|
|
11
|
+
};
|
|
12
|
+
export declare function AppMenu({ dataObject }: AppMenuProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import "./AppMenu.css";
|
|
3
|
+
import { useData, useLoading } from "@olenbetong/appframe-react";
|
|
4
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
5
|
+
/** Strip version suffixes from ArticleId for building hrefs. */
|
|
6
|
+
function stripVersionSuffix(articleId) {
|
|
7
|
+
if (articleId.length > 9 && articleId[articleId.length - 8] === ".") {
|
|
8
|
+
return articleId.slice(0, -8);
|
|
9
|
+
}
|
|
10
|
+
if (articleId.length > 5 && articleId[articleId.length - 4] === ".") {
|
|
11
|
+
return articleId.slice(0, -4);
|
|
12
|
+
}
|
|
13
|
+
return articleId;
|
|
14
|
+
}
|
|
15
|
+
/** Group records by MenuGroup, returning an ordered list of [group, items] pairs. */
|
|
16
|
+
function groupByMenuGroup(items) {
|
|
17
|
+
let map = new Map();
|
|
18
|
+
for (let item of items) {
|
|
19
|
+
let key = item.MenuGroup ?? "";
|
|
20
|
+
let list = map.get(key);
|
|
21
|
+
if (!list) {
|
|
22
|
+
list = [];
|
|
23
|
+
map.set(key, list);
|
|
24
|
+
}
|
|
25
|
+
list.push(item);
|
|
26
|
+
}
|
|
27
|
+
return [...map.entries()];
|
|
28
|
+
}
|
|
29
|
+
export function AppMenu({ dataObject }) {
|
|
30
|
+
let dialogRef = useRef(null);
|
|
31
|
+
let searchRef = useRef(null);
|
|
32
|
+
let [search, setSearch] = useState("");
|
|
33
|
+
let [isOpen, setIsOpen] = useState(false);
|
|
34
|
+
let isLoading = useLoading(dataObject);
|
|
35
|
+
let allArticles = useData(dataObject);
|
|
36
|
+
// Refresh data when opened for the first time
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (isOpen && allArticles.length === 0 && !isLoading) {
|
|
39
|
+
dataObject.refreshDataSource();
|
|
40
|
+
}
|
|
41
|
+
}, [isOpen, allArticles.length, isLoading, dataObject]);
|
|
42
|
+
let filtered = useMemo(() => {
|
|
43
|
+
if (!search.trim())
|
|
44
|
+
return allArticles;
|
|
45
|
+
let lower = search.toLowerCase();
|
|
46
|
+
return allArticles.filter((a) => (a.Title ?? "").toLowerCase().includes(lower));
|
|
47
|
+
}, [allArticles, search]);
|
|
48
|
+
let groups = useMemo(() => groupByMenuGroup(filtered), [filtered]);
|
|
49
|
+
function openDialog() {
|
|
50
|
+
let dialog = dialogRef.current;
|
|
51
|
+
if (!dialog)
|
|
52
|
+
return;
|
|
53
|
+
setIsOpen(true);
|
|
54
|
+
dialog.showModal();
|
|
55
|
+
// Focus search after dialog opens
|
|
56
|
+
requestAnimationFrame(() => searchRef.current?.focus());
|
|
57
|
+
}
|
|
58
|
+
function closeDialog() {
|
|
59
|
+
let dialog = dialogRef.current;
|
|
60
|
+
if (!dialog)
|
|
61
|
+
return;
|
|
62
|
+
setSearch("");
|
|
63
|
+
setIsOpen(false);
|
|
64
|
+
dialog.close();
|
|
65
|
+
}
|
|
66
|
+
function handleBackdropClick(e) {
|
|
67
|
+
// Close when clicking outside the dialog content (on the backdrop)
|
|
68
|
+
let rect = dialogRef.current?.getBoundingClientRect();
|
|
69
|
+
if (!rect)
|
|
70
|
+
return;
|
|
71
|
+
let { clientX, clientY } = e;
|
|
72
|
+
if (clientX < rect.left || clientX > rect.right || clientY < rect.top || clientY > rect.bottom) {
|
|
73
|
+
closeDialog();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Native <dialog> handles Escape automatically — just sync state
|
|
77
|
+
function handleCancel() {
|
|
78
|
+
setSearch("");
|
|
79
|
+
setIsOpen(false);
|
|
80
|
+
}
|
|
81
|
+
return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "app-menu-trigger", "aria-label": "Open app menu", "aria-haspopup": "dialog", "aria-expanded": isOpen, onClick: openDialog, children: _jsx("svg", { className: "app-menu-icon", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", focusable: "false", width: "24", height: "24", children: _jsx("path", { d: "M4 6h4V4H4v2zm0 5h4V9H4v2zm0 5h4v-2H4v2zM10 4v2h10V4H10zm0 7h10V9H10v2zm0 5h10v-2H10v2z" }) }) }), _jsx("dialog", { ref: dialogRef, className: "app-menu-dialog", "aria-label": "App menu", onClick: handleBackdropClick, onCancel: handleCancel, children: _jsxs("div", { className: "app-menu-dialog-inner", children: [_jsxs("div", { className: "app-menu-search-row", children: [_jsx("label", { htmlFor: "app-menu-search", className: "visually-hidden", children: "Search apps" }), _jsx("input", { ref: searchRef, id: "app-menu-search", type: "search", className: "app-menu-search", placeholder: "Search apps\u2026", value: search, onChange: (e) => setSearch(e.target.value), autoComplete: "off" })] }), isLoading && _jsx("p", { className: "app-menu-loading", children: "Loading\u2026" }), !isLoading && groups.length === 0 && _jsx("p", { className: "app-menu-empty", children: "No apps found." }), _jsx("div", { className: "app-menu-groups", children: groups.map(([group, items]) => (_jsxs("section", { className: "app-menu-group", children: [group && _jsx("h2", { className: "app-menu-group-title", children: group }), _jsx("ul", { className: "app-menu-list", children: items.map((article) => {
|
|
82
|
+
let href = `/${stripVersionSuffix(article.ArticleId)}`;
|
|
83
|
+
return (_jsx("li", { className: "app-menu-item", children: _jsx("a", { href: href, className: "app-menu-link", onClick: closeDialog, children: article.Title ?? article.ArticleId }) }, article.ArticleId));
|
|
84
|
+
}) })] }, group))) })] }) })] }));
|
|
85
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { StyledEngineProvider, ThemeProvider } from "@mui/material";
|
|
3
|
+
import { createTheme as muiCreateTheme } from "@mui/material/styles";
|
|
4
|
+
import { AppErrorBoundary } from "@olenbetong/appframe-mui";
|
|
5
|
+
import { generateApiDataObject, SortOrder } from "@olenbetong/appframe-data";
|
|
6
|
+
import { useEffect, useState } from "react";
|
|
7
|
+
import { createPortal } from "react-dom";
|
|
8
|
+
import { AppMenu } from "../AppMenu/index.js";
|
|
9
|
+
// Created once — shared across all AppShell instances on a page.
|
|
10
|
+
const dsMenuArticles = generateApiDataObject({
|
|
11
|
+
resource: "aviw_WebShared_Articles",
|
|
12
|
+
id: "dsMenuArticles",
|
|
13
|
+
allowUpdate: false,
|
|
14
|
+
allowInsert: false,
|
|
15
|
+
allowDelete: false,
|
|
16
|
+
dynamicLoading: false,
|
|
17
|
+
fields: [
|
|
18
|
+
{ name: "ArticleId", type: "string", nullable: false },
|
|
19
|
+
{ name: "Title", type: "string", nullable: true },
|
|
20
|
+
{ name: "MenuGroup", type: "string", nullable: true },
|
|
21
|
+
{ name: "Path", type: "string", nullable: true },
|
|
22
|
+
],
|
|
23
|
+
parameters: {
|
|
24
|
+
maxRecords: -1,
|
|
25
|
+
whereClause: "ListOnFrontPage = 1 AND SysApp = 0 AND HideFromNav = 0 AND (IsPublishedVersion IS NULL OR IsPublishedVersion = 1) AND ISNULL(ParentArticleId, '') <> 'news'",
|
|
26
|
+
sortOrder: [{ MenuGroup: SortOrder.Asc }, { Title: SortOrder.Asc }],
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
function buildMuiTheme() {
|
|
30
|
+
const s = getComputedStyle(document.body);
|
|
31
|
+
const get = (v) => s.getPropertyValue(v).trim();
|
|
32
|
+
return muiCreateTheme({
|
|
33
|
+
palette: {
|
|
34
|
+
primary: {
|
|
35
|
+
main: get("--ds-color-brand-base-default") || "#116069",
|
|
36
|
+
dark: get("--ds-color-brand-base-hover") || "#0d4b52",
|
|
37
|
+
contrastText: get("--ds-color-brand-base-contrast-default") || "#ffffff",
|
|
38
|
+
},
|
|
39
|
+
secondary: {
|
|
40
|
+
main: get("--ds-color-brand-light-base-default") || "#1a95a2",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
typography: {
|
|
44
|
+
fontFamily: [
|
|
45
|
+
"-apple-system",
|
|
46
|
+
"BlinkMacSystemFont",
|
|
47
|
+
'"Segoe UI"',
|
|
48
|
+
"Roboto",
|
|
49
|
+
'"Helvetica Neue"',
|
|
50
|
+
"Arial",
|
|
51
|
+
"sans-serif",
|
|
52
|
+
'"Apple Color Emoji"',
|
|
53
|
+
'"Segoe UI Emoji"',
|
|
54
|
+
'"Segoe UI Symbol"',
|
|
55
|
+
].join(","),
|
|
56
|
+
},
|
|
57
|
+
components: {
|
|
58
|
+
MuiTypography: {
|
|
59
|
+
styleOverrides: {
|
|
60
|
+
h1: { fontSize: "2.488rem" },
|
|
61
|
+
h2: { fontSize: "2.074rem" },
|
|
62
|
+
h3: { fontSize: "1.728rem" },
|
|
63
|
+
h4: { fontSize: "1.44rem" },
|
|
64
|
+
h5: { fontSize: "1.2rem" },
|
|
65
|
+
h6: { fontSize: "1rem" },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
MuiAppBar: {
|
|
69
|
+
styleOverrides: {
|
|
70
|
+
root: {
|
|
71
|
+
"& .MuiTypography-h1": {
|
|
72
|
+
fontSize: "1.25rem",
|
|
73
|
+
fontWeight: "500",
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
MuiButton: {
|
|
79
|
+
styleOverrides: {
|
|
80
|
+
root: { borderRadius: 2 },
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
MuiDialogTitle: {
|
|
84
|
+
styleOverrides: {
|
|
85
|
+
root: {
|
|
86
|
+
fontSize: "1.2rem",
|
|
87
|
+
fontWeight: 500,
|
|
88
|
+
paddingLeft: 16,
|
|
89
|
+
paddingRight: 16,
|
|
90
|
+
},
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
MuiFormLabel: {
|
|
94
|
+
styleOverrides: {
|
|
95
|
+
root: { color: "rgba(0, 0, 0, 0.72)" },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
MuiTextField: { defaultProps: { variant: "filled" } },
|
|
99
|
+
MuiSelect: { defaultProps: { variant: "filled" } },
|
|
100
|
+
MuiFormControl: { defaultProps: { variant: "filled" } },
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function AppShell({ children }) {
|
|
105
|
+
const [theme, setTheme] = useState(() => buildMuiTheme());
|
|
106
|
+
// Re-read tokens after mount so CSS variables are fully resolved.
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
setTheme(buildMuiTheme());
|
|
109
|
+
}, []);
|
|
110
|
+
const appMenuSlot = document.getElementById("ob-toolbar-app-menu");
|
|
111
|
+
return (_jsx(StyledEngineProvider, { injectFirst: true, children: _jsx(ThemeProvider, { theme: theme, children: _jsxs(AppErrorBoundary, { children: [appMenuSlot && createPortal(_jsx(AppMenu, { dataObject: dsMenuArticles }), appMenuSlot), children] }) }) }));
|
|
112
|
+
}
|
|
@@ -3,14 +3,14 @@ export type ColorCardProps = Pick<React.HTMLAttributes<HTMLDivElement>, "id" | "
|
|
|
3
3
|
as?: "a" | "div" | "button" | "span" | "section" | "article";
|
|
4
4
|
href?: string;
|
|
5
5
|
};
|
|
6
|
-
export declare function ColorCard({ as: Component, children, className, href, ...other }: ColorCardProps): import("react
|
|
7
|
-
export declare function CardStepList({ children, className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react
|
|
8
|
-
export declare function CardStep({ children, className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react
|
|
6
|
+
export declare function ColorCard({ as: Component, children, className, href, ...other }: ColorCardProps): import("react").JSX.Element;
|
|
7
|
+
export declare function CardStepList({ children, className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
8
|
+
export declare function CardStep({ children, className, ...props }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
9
9
|
export declare function CardColumn({ children, className, minor, ...other }: React.HTMLAttributes<HTMLDivElement> & {
|
|
10
10
|
minor?: boolean;
|
|
11
|
-
}): import("react
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
12
|
export declare function CardDetail({ children, className, label, primary, ...other }: React.HTMLAttributes<HTMLDivElement> & {
|
|
13
13
|
label?: React.ReactNode;
|
|
14
14
|
primary?: boolean;
|
|
15
|
-
}): import("react
|
|
16
|
-
export declare function CardLabel({ children, className, ...other }: React.HTMLAttributes<HTMLDivElement>): import("react
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export declare function CardLabel({ children, className, ...other }: React.HTMLAttributes<HTMLDivElement>): import("react").JSX.Element;
|
|
@@ -7,4 +7,4 @@ export type DateNavigatorProps = {
|
|
|
7
7
|
minDate?: Date | string | number;
|
|
8
8
|
maxDate?: Date | string | number;
|
|
9
9
|
};
|
|
10
|
-
export declare function DateNavigator({ date: dateProp, defaultDate, disableTodayButton, onChange, minDate: minDateProp, maxDate: maxDateProp, }: DateNavigatorProps): import("react
|
|
10
|
+
export declare function DateNavigator({ date: dateProp, defaultDate, disableTodayButton, onChange, minDate: minDateProp, maxDate: maxDateProp, }: DateNavigatorProps): import("react").JSX.Element;
|
|
@@ -41,4 +41,4 @@ type FileStoreDataObjectRecord = {
|
|
|
41
41
|
Damage: boolean;
|
|
42
42
|
DamageID: number | null;
|
|
43
43
|
};
|
|
44
|
-
export declare function FilePond<T extends FileStoreDataObjectRecord>({ dataObject, fields, onUploadStart, onFileUploaded, onFinishedUploads, onFileRemoved, onError, fieldName, filePondOptions, primKey, attachmentPrimKeys, whereClause, inputRef: inputRefProp, ...props }: FilePondProps<T>): import("react
|
|
44
|
+
export declare function FilePond<T extends FileStoreDataObjectRecord>({ dataObject, fields, onUploadStart, onFileUploaded, onFinishedUploads, onFileRemoved, onError, fieldName, filePondOptions, primKey, attachmentPrimKeys, whereClause, inputRef: inputRefProp, ...props }: FilePondProps<T>): import("react").JSX.Element;
|
|
@@ -10,5 +10,5 @@ interface Props {
|
|
|
10
10
|
* Absolutely-positioned draggable corner handle.
|
|
11
11
|
* Position is in CSS pixels relative to the nearest `position: relative` ancestor.
|
|
12
12
|
*/
|
|
13
|
-
export declare function DragHandle({ x, y, onChange, containerWidth, containerHeight }: Props): import("react
|
|
13
|
+
export declare function DragHandle({ x, y, onChange, containerWidth, containerHeight }: Props): import("react").JSX.Element;
|
|
14
14
|
export {};
|
|
@@ -12,5 +12,5 @@ interface Props {
|
|
|
12
12
|
* Tracks the pointer delta so both corners on this edge move by the same amount,
|
|
13
13
|
* preserving the edge angle.
|
|
14
14
|
*/
|
|
15
|
-
export declare function EdgeHandle({ x, y, axis, onChange }: Props): import("react
|
|
15
|
+
export declare function EdgeHandle({ x, y, axis, onChange }: Props): import("react").JSX.Element;
|
|
16
16
|
export {};
|
|
@@ -7,5 +7,5 @@ interface Props {
|
|
|
7
7
|
isSmall: boolean;
|
|
8
8
|
}
|
|
9
9
|
/** Renders a labelled Button on large screens and a Tooltip-wrapped IconButton on small ones. */
|
|
10
|
-
export declare function ResponsiveButton({ icon, label, onClick, disabled, isSmall }: Props): import("react
|
|
10
|
+
export declare function ResponsiveButton({ icon, label, onClick, disabled, isSmall }: Props): import("react").JSX.Element;
|
|
11
11
|
export {};
|
|
@@ -5,6 +5,6 @@ interface CropContextValue extends CropToolState {
|
|
|
5
5
|
onApply: (blob: Blob, actions: EditAction[]) => void;
|
|
6
6
|
onCancel: () => void;
|
|
7
7
|
}
|
|
8
|
-
export declare function CropProvider({ imageUrl, onApply, onCancel, children }: ToolProviderProps): import("react
|
|
8
|
+
export declare function CropProvider({ imageUrl, onApply, onCancel, children }: ToolProviderProps): import("react").JSX.Element;
|
|
9
9
|
export declare function useCropContext(): CropContextValue;
|
|
10
10
|
export {};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Canvas-area overlay for the crop tool. Reads all state from CropContext. */
|
|
2
|
-
export declare function CropOverlay(): import("react
|
|
2
|
+
export declare function CropOverlay(): import("react").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Toolbar shown while the crop tool is active. Reads state from CropContext. */
|
|
2
|
-
export declare function CropToolbar(): import("react
|
|
2
|
+
export declare function CropToolbar(): import("react").JSX.Element;
|
|
@@ -5,6 +5,6 @@ interface RedactContextValue extends RedactToolState {
|
|
|
5
5
|
onApply: (blob: Blob, actions: EditAction[]) => void;
|
|
6
6
|
onCancel: () => void;
|
|
7
7
|
}
|
|
8
|
-
export declare function RedactProvider({ imageUrl, onApply, onCancel, children }: ToolProviderProps): import("react
|
|
8
|
+
export declare function RedactProvider({ imageUrl, onApply, onCancel, children }: ToolProviderProps): import("react").JSX.Element;
|
|
9
9
|
export declare function useRedactContext(): RedactContextValue;
|
|
10
10
|
export {};
|
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
* Uses an SVG layer over the image for drawing; blur preview uses SVG feGaussianBlur
|
|
4
4
|
* so the live preview matches the final applied output.
|
|
5
5
|
*/
|
|
6
|
-
export declare function RedactOverlay(): import("react
|
|
6
|
+
export declare function RedactOverlay(): import("react").JSX.Element;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Toolbar shown while the redact tool is active. Reads state from RedactContext. */
|
|
2
|
-
export declare function RedactToolbar(): import("react
|
|
2
|
+
export declare function RedactToolbar(): import("react").JSX.Element;
|
|
@@ -16,5 +16,5 @@ interface Props {
|
|
|
16
16
|
* • 2-finger pinch + translate: simultaneous zoom + pan anchored at midpoint
|
|
17
17
|
* • 1-finger drag (when panEnabled): pan
|
|
18
18
|
*/
|
|
19
|
-
export declare function ZoomCanvas({ children, panEnabled }: Props): import("react
|
|
19
|
+
export declare function ZoomCanvas({ children, panEnabled }: Props): import("react").JSX.Element;
|
|
20
20
|
export {};
|
|
@@ -2,5 +2,5 @@ interface Props {
|
|
|
2
2
|
disabled?: boolean;
|
|
3
3
|
isSmall?: boolean;
|
|
4
4
|
}
|
|
5
|
-
export declare function ZoomControls({ disabled, isSmall }: Props): import("react
|
|
5
|
+
export declare function ZoomControls({ disabled, isSmall }: Props): import("react").JSX.Element;
|
|
6
6
|
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "./index.css";
|
|
2
|
-
export declare function LinkedList({ children, className, ...other }: React.HTMLProps<HTMLUListElement>): import("react
|
|
2
|
+
export declare function LinkedList({ children, className, ...other }: React.HTMLProps<HTMLUListElement>): import("react").JSX.Element;
|
|
3
3
|
export declare function LinkedListItem({ children, className, label, ...other }: React.HTMLProps<HTMLLIElement> & {
|
|
4
4
|
label: React.ReactNode;
|
|
5
|
-
}): import("react
|
|
5
|
+
}): import("react").JSX.Element;
|
|
6
6
|
export declare function Card({ as, children, className, ...other }: React.HTMLProps<HTMLDivElement> & {
|
|
7
7
|
as?: any;
|
|
8
|
-
}): import("react
|
|
8
|
+
}): import("react").JSX.Element;
|
|
@@ -5,4 +5,4 @@ export type MergeProgressDialogProps = {
|
|
|
5
5
|
getMergerId: () => Promise<string | number>;
|
|
6
6
|
mergeType?: "pdf" | "zip";
|
|
7
7
|
};
|
|
8
|
-
export declare function MergeProgressDialog({ open, onClose, getMergerId, mergeType }: MergeProgressDialogProps): import("react
|
|
8
|
+
export declare function MergeProgressDialog({ open, onClose, getMergerId, mergeType }: MergeProgressDialogProps): import("react").JSX.Element;
|
|
@@ -3,20 +3,20 @@ import React from "react";
|
|
|
3
3
|
export type PageBannerProps = React.HTMLProps<HTMLDivElement> & {
|
|
4
4
|
as?: "header" | "section" | "div";
|
|
5
5
|
};
|
|
6
|
-
export declare function PageBanner({ as, className, children, ...other }: PageBannerProps):
|
|
6
|
+
export declare function PageBanner({ as, className, children, ...other }: PageBannerProps): React.JSX.Element;
|
|
7
7
|
export type BannerImageProps = React.DetailedHTMLProps<React.ImgHTMLAttributes<HTMLImageElement>, HTMLImageElement>;
|
|
8
8
|
export declare const BannerImage: React.ForwardRefExoticComponent<Omit<BannerImageProps, "ref"> & React.RefAttributes<HTMLImageElement>>;
|
|
9
9
|
export type TabListProps = Pick<React.HTMLProps<HTMLDivElement>, "id" | "className" | "children"> & {
|
|
10
10
|
as?: "ul" | "ol" | "nav" | "div" | "span";
|
|
11
11
|
sticky?: boolean;
|
|
12
12
|
};
|
|
13
|
-
export declare function TabList({ as, className, children, sticky, ...other }: TabListProps):
|
|
13
|
+
export declare function TabList({ as, className, children, sticky, ...other }: TabListProps): React.JSX.Element;
|
|
14
14
|
export type TabProps = Pick<React.HTMLProps<HTMLDivElement>, "id" | "className" | "children"> & {
|
|
15
15
|
active?: boolean;
|
|
16
16
|
as?: "a" | "li" | "div" | "span";
|
|
17
17
|
};
|
|
18
|
-
export declare function Tab({ active, as, className, children, ...other }: TabProps):
|
|
18
|
+
export declare function Tab({ active, as, className, children, ...other }: TabProps): React.JSX.Element;
|
|
19
19
|
export type TitleProps = Pick<React.HTMLProps<HTMLDivElement>, "id" | "className" | "children"> & {
|
|
20
20
|
as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "div" | "span" | "p";
|
|
21
21
|
};
|
|
22
|
-
export declare function Title({ as, className, children, ...other }: TitleProps):
|
|
22
|
+
export declare function Title({ as, className, children, ...other }: TitleProps): React.JSX.Element;
|
|
@@ -3,5 +3,5 @@ type PdfViewerProps = {
|
|
|
3
3
|
url?: string;
|
|
4
4
|
file?: string | Blob | ArrayBuffer;
|
|
5
5
|
};
|
|
6
|
-
export declare function PdfViewer({ url, file }: PdfViewerProps): import("react
|
|
6
|
+
export declare function PdfViewer({ url, file }: PdfViewerProps): import("react").JSX.Element;
|
|
7
7
|
export {};
|
|
@@ -3,4 +3,4 @@ export type PortalProps = {
|
|
|
3
3
|
root?: string;
|
|
4
4
|
type?: string;
|
|
5
5
|
};
|
|
6
|
-
export declare function Portal({ children, root, type }: PortalProps): import("react
|
|
6
|
+
export declare function Portal({ children, root, type }: PortalProps): import("react").JSX.Element;
|
|
@@ -6,4 +6,4 @@ export type SidebarProps = React.HTMLAttributes<HTMLDivElement> & {
|
|
|
6
6
|
pullRight?: boolean;
|
|
7
7
|
shadow?: boolean;
|
|
8
8
|
};
|
|
9
|
-
export declare function Sidebar(props: SidebarProps): import("react
|
|
9
|
+
export declare function Sidebar(props: SidebarProps): import("react").JSX.Element;
|
|
@@ -19,4 +19,4 @@ export type SplitContainerProps = {
|
|
|
19
19
|
*/
|
|
20
20
|
id?: string;
|
|
21
21
|
};
|
|
22
|
-
export declare function SplitContainer({ className, children, direction, fixedPanel, panelClassName, defaultFixedSize, layoutVersion, min, max, id, }: SplitContainerProps):
|
|
22
|
+
export declare function SplitContainer({ className, children, direction, fixedPanel, panelClassName, defaultFixedSize, layoutVersion, min, max, id, }: SplitContainerProps): React.JSX.Element;
|
|
@@ -12,4 +12,4 @@ export type BreadcrumbItem = {
|
|
|
12
12
|
export type ToolbarBreadcrumbsProps = {
|
|
13
13
|
items: BreadcrumbItem[];
|
|
14
14
|
};
|
|
15
|
-
export declare function ToolbarBreadcrumbs({ items }: ToolbarBreadcrumbsProps): import("react
|
|
15
|
+
export declare function ToolbarBreadcrumbs({ items }: ToolbarBreadcrumbsProps): import("react").JSX.Element;
|
|
@@ -5,5 +5,5 @@ type DamageFormButtonsProps = {
|
|
|
5
5
|
handleDelete: () => void;
|
|
6
6
|
handleCancel: () => void;
|
|
7
7
|
};
|
|
8
|
-
export declare function DamageFormButtonsProps({ isEdit, loading, uploadingFile, handleDelete, handleCancel, }: DamageFormButtonsProps): import("react
|
|
8
|
+
export declare function DamageFormButtonsProps({ isEdit, loading, uploadingFile, handleDelete, handleCancel, }: DamageFormButtonsProps): import("react").JSX.Element;
|
|
9
9
|
export {};
|
|
@@ -12,5 +12,5 @@ type DescriptionInputProps = {
|
|
|
12
12
|
onCopyPrevDamage?: (value: DescriptionInputType) => void;
|
|
13
13
|
onChange?: (value: DescriptionInputType) => void;
|
|
14
14
|
};
|
|
15
|
-
export declare function DescriptionInput({ value, defaultValue, descriptionOptions, storageNamespace, onCopyPrevDamage, onChange, }: DescriptionInputProps): import("react
|
|
15
|
+
export declare function DescriptionInput({ value, defaultValue, descriptionOptions, storageNamespace, onCopyPrevDamage, onChange, }: DescriptionInputProps): import("react").JSX.Element;
|
|
16
16
|
export {};
|
|
@@ -3,6 +3,6 @@ type ElementDamagesItemProps = {
|
|
|
3
3
|
record: DamagesRecord;
|
|
4
4
|
linkToDamage: boolean;
|
|
5
5
|
};
|
|
6
|
-
export declare function ElementDamagesItem({ record, linkToDamage }: ElementDamagesItemProps): import("react
|
|
7
|
-
export declare function ElementDamagesHeader(): import("react
|
|
6
|
+
export declare function ElementDamagesItem({ record, linkToDamage }: ElementDamagesItemProps): import("react").JSX.Element;
|
|
7
|
+
export declare function ElementDamagesHeader(): import("react").JSX.Element;
|
|
8
8
|
export {};
|
|
@@ -7,5 +7,5 @@ type DuplicateElementDamageDialogProps = {
|
|
|
7
7
|
loading: boolean;
|
|
8
8
|
linkToDamage: boolean;
|
|
9
9
|
};
|
|
10
|
-
export declare function DuplicateElementDamageDialog({ open, onClose, record, onRegisterAnyway, loading, linkToDamage, }: DuplicateElementDamageDialogProps): import("react
|
|
10
|
+
export declare function DuplicateElementDamageDialog({ open, onClose, record, onRegisterAnyway, loading, linkToDamage, }: DuplicateElementDamageDialogProps): import("react").JSX.Element;
|
|
11
11
|
export {};
|
|
@@ -3,5 +3,5 @@ type DuplicatePhoneViewItemProps = {
|
|
|
3
3
|
record: DamagesRecord;
|
|
4
4
|
linkToDamage: boolean;
|
|
5
5
|
};
|
|
6
|
-
export declare function DuplicatePhoneViewItem({ record, linkToDamage }: DuplicatePhoneViewItemProps): import("react
|
|
6
|
+
export declare function DuplicatePhoneViewItem({ record, linkToDamage }: DuplicatePhoneViewItemProps): import("react").JSX.Element;
|
|
7
7
|
export {};
|