@oneuptime/common 10.2.6 → 10.2.8
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/Server/API/GlobalConfigAPI.ts +13 -16
- package/UI/Components/Header/ProjectPicker/ProjectPicker.tsx +11 -6
- package/UI/Components/LogsViewer/components/ColumnSelector.tsx +58 -4
- package/UI/Components/ModelTable/BaseModelTable.tsx +56 -27
- package/UI/Components/ModelTable/TableView.tsx +64 -32
- package/UI/Utils/GlobalConfig.ts +55 -0
- package/build/dist/Server/API/GlobalConfigAPI.js +10 -16
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js +2 -2
- package/build/dist/UI/Components/Header/ProjectPicker/ProjectPicker.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js +33 -3
- package/build/dist/UI/Components/LogsViewer/components/ColumnSelector.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +44 -22
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +30 -18
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Utils/GlobalConfig.js +38 -0
- package/build/dist/UI/Utils/GlobalConfig.js.map +1 -0
- package/package.json +1 -1
|
@@ -30,24 +30,21 @@ export default class GlobalConfigAPI extends BaseAPI<
|
|
|
30
30
|
`${new this.entityType().getCrudApiPath()?.toString()}/vars`,
|
|
31
31
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
32
32
|
try {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
* });
|
|
44
|
-
*/
|
|
33
|
+
const globalConfig: GlobalConfig | null =
|
|
34
|
+
await GlobalConfigService.findOneById({
|
|
35
|
+
id: ObjectID.getZeroObjectID(),
|
|
36
|
+
select: {
|
|
37
|
+
disableUserProjectCreation: true,
|
|
38
|
+
},
|
|
39
|
+
props: {
|
|
40
|
+
isRoot: true,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
45
43
|
|
|
46
44
|
return Response.sendJsonObjectResponse(req, res, {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
*/
|
|
45
|
+
disableUserProjectCreation: Boolean(
|
|
46
|
+
globalConfig?.disableUserProjectCreation,
|
|
47
|
+
),
|
|
51
48
|
});
|
|
52
49
|
} catch (err) {
|
|
53
50
|
next(err);
|
|
@@ -18,6 +18,7 @@ export interface ComponentProps {
|
|
|
18
18
|
selectedProjectName: string;
|
|
19
19
|
onCreateProjectButtonClicked: () => void;
|
|
20
20
|
onProjectSelected: (project: Project) => void;
|
|
21
|
+
hideCreateProjectButton?: boolean | undefined;
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
const ProjectPicker: FunctionComponent<ComponentProps> = (
|
|
@@ -101,12 +102,16 @@ const ProjectPicker: FunctionComponent<ComponentProps> = (
|
|
|
101
102
|
<></>
|
|
102
103
|
)}
|
|
103
104
|
</>
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
105
|
+
{!props.hideCreateProjectButton ? (
|
|
106
|
+
<CreateNewProjectButton
|
|
107
|
+
onCreateButtonClicked={() => {
|
|
108
|
+
setIsComponentVisible(false);
|
|
109
|
+
props.onCreateProjectButtonClicked();
|
|
110
|
+
}}
|
|
111
|
+
/>
|
|
112
|
+
) : (
|
|
113
|
+
<></>
|
|
114
|
+
)}
|
|
110
115
|
</ProjectPickerMenu>
|
|
111
116
|
)}
|
|
112
117
|
</div>
|
|
@@ -7,6 +7,7 @@ import React, {
|
|
|
7
7
|
} from "react";
|
|
8
8
|
import {
|
|
9
9
|
DEFAULT_LOGS_TABLE_COLUMNS,
|
|
10
|
+
getLogsAttributeColumnId,
|
|
10
11
|
LogsTableColumnOption,
|
|
11
12
|
normalizeLogsTableColumns,
|
|
12
13
|
} from "../types";
|
|
@@ -71,6 +72,23 @@ const ColumnSelector: FunctionComponent<ColumnSelectorProps> = (
|
|
|
71
72
|
});
|
|
72
73
|
}, [props.availableColumns, searchQuery, selectedColumnIds]);
|
|
73
74
|
|
|
75
|
+
const trimmedAttributeKey: string = searchQuery.trim();
|
|
76
|
+
const customAttributeColumnId: string = trimmedAttributeKey
|
|
77
|
+
? getLogsAttributeColumnId(trimmedAttributeKey)
|
|
78
|
+
: "";
|
|
79
|
+
const isCustomAttributeAlreadySelected: boolean =
|
|
80
|
+
customAttributeColumnId !== "" &&
|
|
81
|
+
selectedColumnIds.includes(customAttributeColumnId);
|
|
82
|
+
const isCustomAttributeAlreadyAvailable: boolean = availableColumns.some(
|
|
83
|
+
(column: LogsTableColumnOption): boolean => {
|
|
84
|
+
return column.id === customAttributeColumnId;
|
|
85
|
+
},
|
|
86
|
+
);
|
|
87
|
+
const canAddCustomAttribute: boolean =
|
|
88
|
+
trimmedAttributeKey !== "" &&
|
|
89
|
+
!isCustomAttributeAlreadySelected &&
|
|
90
|
+
!isCustomAttributeAlreadyAvailable;
|
|
91
|
+
|
|
74
92
|
const updateColumns: (columns: Array<string>) => void = (
|
|
75
93
|
columns: Array<string>,
|
|
76
94
|
): void => {
|
|
@@ -225,15 +243,51 @@ const ColumnSelector: FunctionComponent<ColumnSelectorProps> = (
|
|
|
225
243
|
onChange={(event: ChangeEvent<HTMLInputElement>) => {
|
|
226
244
|
setSearchQuery(event.target.value);
|
|
227
245
|
}}
|
|
228
|
-
|
|
229
|
-
|
|
246
|
+
onKeyDown={(
|
|
247
|
+
event: React.KeyboardEvent<HTMLInputElement>,
|
|
248
|
+
): void => {
|
|
249
|
+
if (event.key === "Enter" && canAddCustomAttribute) {
|
|
250
|
+
event.preventDefault();
|
|
251
|
+
addColumn(customAttributeColumnId);
|
|
252
|
+
setSearchQuery("");
|
|
253
|
+
}
|
|
254
|
+
}}
|
|
255
|
+
placeholder="Search or type attribute"
|
|
256
|
+
className="w-48 rounded-md border border-gray-200 px-2 py-1 text-xs text-gray-600 focus:border-indigo-300 focus:outline-none focus:ring-2 focus:ring-indigo-100"
|
|
230
257
|
/>
|
|
231
258
|
</div>
|
|
232
259
|
|
|
233
260
|
<div className="max-h-72 space-y-2 overflow-y-auto pr-1">
|
|
234
|
-
{
|
|
261
|
+
{canAddCustomAttribute && (
|
|
262
|
+
<div className="flex items-center justify-between rounded-md border border-dashed border-indigo-200 bg-indigo-50/50 px-3 py-2">
|
|
263
|
+
<div className="min-w-0 flex-1">
|
|
264
|
+
<p className="truncate text-sm text-gray-700">
|
|
265
|
+
<span className="text-gray-500">Attribute: </span>
|
|
266
|
+
<span className="font-mono">{trimmedAttributeKey}</span>
|
|
267
|
+
</p>
|
|
268
|
+
<p className="text-[11px] text-gray-500">
|
|
269
|
+
Add as a column to show this attribute's value.
|
|
270
|
+
</p>
|
|
271
|
+
</div>
|
|
272
|
+
|
|
273
|
+
<button
|
|
274
|
+
type="button"
|
|
275
|
+
className="ml-3 rounded-md px-2 py-1 text-xs font-medium text-indigo-600 transition-colors hover:bg-indigo-100 hover:text-indigo-700"
|
|
276
|
+
onClick={() => {
|
|
277
|
+
addColumn(customAttributeColumnId);
|
|
278
|
+
setSearchQuery("");
|
|
279
|
+
}}
|
|
280
|
+
>
|
|
281
|
+
Add attribute
|
|
282
|
+
</button>
|
|
283
|
+
</div>
|
|
284
|
+
)}
|
|
285
|
+
|
|
286
|
+
{availableColumns.length === 0 && !canAddCustomAttribute && (
|
|
235
287
|
<div className="rounded-md border border-dashed border-gray-200 px-3 py-4 text-sm text-gray-500">
|
|
236
|
-
|
|
288
|
+
{trimmedAttributeKey
|
|
289
|
+
? "No matching columns available."
|
|
290
|
+
: "Type an attribute name above to add it as a column."}
|
|
237
291
|
</div>
|
|
238
292
|
)}
|
|
239
293
|
|
|
@@ -1412,10 +1412,6 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
1412
1412
|
});
|
|
1413
1413
|
}
|
|
1414
1414
|
|
|
1415
|
-
if (props.saveFilterProps) {
|
|
1416
|
-
headerbuttons.push(getSaveFilterDropdown());
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
1415
|
setCardButtons(headerbuttons);
|
|
1420
1416
|
};
|
|
1421
1417
|
|
|
@@ -1861,6 +1857,21 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
1861
1857
|
};
|
|
1862
1858
|
};
|
|
1863
1859
|
|
|
1860
|
+
/*
|
|
1861
|
+
* When the load is driven by the search box, suppress the table-level
|
|
1862
|
+
* loading state so existing rows stay visible and the only spinner is
|
|
1863
|
+
* the one in the search bar. Sort / pagination / refresh loads still
|
|
1864
|
+
* show the table loader because there is no other indicator for those.
|
|
1865
|
+
*/
|
|
1866
|
+
type ShouldSuppressTableLoadingFunction = () => boolean;
|
|
1867
|
+
const isSearchActive: ShouldSuppressTableLoadingFunction = (): boolean => {
|
|
1868
|
+
return debouncedSearchText.trim().length > 0 || selectedLabels.length > 0;
|
|
1869
|
+
};
|
|
1870
|
+
|
|
1871
|
+
const getTableLoadingState: () => boolean = (): boolean => {
|
|
1872
|
+
return isSearchActive() ? false : isLoading;
|
|
1873
|
+
};
|
|
1874
|
+
|
|
1864
1875
|
const getTable: GetReactElementFunction = (): ReactElement => {
|
|
1865
1876
|
return (
|
|
1866
1877
|
<Table
|
|
@@ -1997,7 +2008,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
1997
2008
|
pluralLabel={props.pluralName || model.pluralName || "Items"}
|
|
1998
2009
|
error={error}
|
|
1999
2010
|
currentPageNumber={currentPageNumber}
|
|
2000
|
-
isLoading={
|
|
2011
|
+
isLoading={getTableLoadingState()}
|
|
2001
2012
|
enableDragAndDrop={props.enableDragAndDrop}
|
|
2002
2013
|
dragDropIdField={"_id"}
|
|
2003
2014
|
dragDropIndexField={props.dragDropIndexField}
|
|
@@ -2156,7 +2167,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2156
2167
|
}}
|
|
2157
2168
|
dragDropIdField={"_id"}
|
|
2158
2169
|
dragDropIndexField={props.dragDropIndexField}
|
|
2159
|
-
isLoading={
|
|
2170
|
+
isLoading={getTableLoadingState()}
|
|
2160
2171
|
totalItemsCount={totalItemsCount}
|
|
2161
2172
|
data={data}
|
|
2162
2173
|
id={props.id}
|
|
@@ -2337,10 +2348,18 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2337
2348
|
const trimmedSearch: string = stripTrailingMentionForUi(searchText).trim();
|
|
2338
2349
|
const trimmedActive: string =
|
|
2339
2350
|
stripTrailingMentionForUi(debouncedSearchText).trim();
|
|
2340
|
-
const isSearching: boolean =
|
|
2341
|
-
trimmedSearch.length > 0 && trimmedSearch !== trimmedActive;
|
|
2342
2351
|
const hasActiveSearch: boolean = trimmedActive.length > 0;
|
|
2343
2352
|
const hasSelectedLabels: boolean = selectedLabels.length > 0;
|
|
2353
|
+
/*
|
|
2354
|
+
* "isSearching" covers both phases — typing-in-flight (before the
|
|
2355
|
+
* debounce fires) AND the actual API request that follows. The table
|
|
2356
|
+
* loader is suppressed during the latter, so this spinner is the only
|
|
2357
|
+
* loading indicator the user sees during a search-driven fetch.
|
|
2358
|
+
*/
|
|
2359
|
+
const isTypingInFlight: boolean =
|
|
2360
|
+
trimmedSearch.length > 0 && trimmedSearch !== trimmedActive;
|
|
2361
|
+
const isSearching: boolean =
|
|
2362
|
+
isTypingInFlight || (isLoading && (hasActiveSearch || hasSelectedLabels));
|
|
2344
2363
|
const showMatchPill: boolean =
|
|
2345
2364
|
!isSearching && (hasActiveSearch || hasSelectedLabels);
|
|
2346
2365
|
|
|
@@ -2391,7 +2410,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2391
2410
|
{/* Expanded input + dropdown — sized to the full title slot */}
|
|
2392
2411
|
<div className="relative flex w-full flex-col gap-1">
|
|
2393
2412
|
<div
|
|
2394
|
-
className={`flex w-full items-center gap-2 rounded-
|
|
2413
|
+
className={`flex w-full items-center gap-2 rounded-md border bg-white px-3 py-2 transition-all duration-200 ${borderClass}`}
|
|
2395
2414
|
onClick={() => {
|
|
2396
2415
|
searchInputRef.current?.focus();
|
|
2397
2416
|
}}
|
|
@@ -2520,7 +2539,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2520
2539
|
spellCheck={false}
|
|
2521
2540
|
autoComplete="off"
|
|
2522
2541
|
tabIndex={expanded ? 0 : -1}
|
|
2523
|
-
className="min-w-[6rem] flex-1 bg-transparent
|
|
2542
|
+
className="min-w-[6rem] flex-1 bg-transparent text-sm leading-5 text-gray-900 placeholder-gray-400 outline-none"
|
|
2524
2543
|
/>
|
|
2525
2544
|
</div>
|
|
2526
2545
|
{isSearching && (
|
|
@@ -2796,15 +2815,15 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2796
2815
|
};
|
|
2797
2816
|
|
|
2798
2817
|
/*
|
|
2799
|
-
* Builds the right-hand side of the card header. All
|
|
2800
|
-
* trigger/bar, main button, more menu — stay mounted at all
|
|
2801
|
-
* transitions are purely CSS so the inputs keep their focus,
|
|
2802
|
-
* keeps its open state, and there's no mount/unmount flicker.
|
|
2818
|
+
* Builds the right-hand side of the card header. All slots — search
|
|
2819
|
+
* trigger/bar, saved views, main button, more menu — stay mounted at all
|
|
2820
|
+
* times. State transitions are purely CSS so the inputs keep their focus,
|
|
2821
|
+
* the dropdown keeps its open state, and there's no mount/unmount flicker.
|
|
2803
2822
|
*
|
|
2804
|
-
* Layout when collapsed: [🔍 trigger] [main] [⋯]
|
|
2823
|
+
* Layout when collapsed: [🔍 trigger] [Saved Views] [main] [⋯]
|
|
2805
2824
|
* Layout when expanded: [🔍 ━━━ wide search bar ━━━]
|
|
2806
|
-
*
|
|
2807
|
-
* search expands, freeing horizontal space for the bar.
|
|
2825
|
+
* Saved views + main button + more menu fade and collapse-to-zero-width
|
|
2826
|
+
* when the search expands, freeing horizontal space for the bar.
|
|
2808
2827
|
*/
|
|
2809
2828
|
const getHeaderButtonsWithSearch: GetHeaderButtonsFunction = (): Array<
|
|
2810
2829
|
CardButtonSchema | ReactElement
|
|
@@ -2813,15 +2832,27 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2813
2832
|
props.searchableFields && props.searchableFields.length > 0,
|
|
2814
2833
|
);
|
|
2815
2834
|
|
|
2835
|
+
/*
|
|
2836
|
+
* Saved views get their own first-class slot in the header — never
|
|
2837
|
+
* collapsed into the overflow ⋯ menu. Render fresh on every call so the
|
|
2838
|
+
* inner TableViewElement always sees the current query / sort / itemsOnPage.
|
|
2839
|
+
*/
|
|
2840
|
+
const savedViewsElement: ReactElement | null = props.saveFilterProps
|
|
2841
|
+
? getSaveFilterDropdown()
|
|
2842
|
+
: null;
|
|
2843
|
+
|
|
2816
2844
|
if (cardButtons.length === 0 && !hasSearch) {
|
|
2817
|
-
return cardButtons;
|
|
2845
|
+
return savedViewsElement ? [savedViewsElement] : cardButtons;
|
|
2818
2846
|
}
|
|
2819
2847
|
|
|
2820
2848
|
if (!hasSearch) {
|
|
2821
|
-
// Without search, just split into [main] [⋯]; no special wrapping.
|
|
2849
|
+
// Without search, just split into [Saved Views] [main] [⋯]; no special wrapping.
|
|
2822
2850
|
const { main, rest }: FindMainButtonResult =
|
|
2823
2851
|
splitButtonsForHeader(cardButtons);
|
|
2824
2852
|
const composed: Array<ReactElement> = [];
|
|
2853
|
+
if (savedViewsElement) {
|
|
2854
|
+
composed.push(savedViewsElement);
|
|
2855
|
+
}
|
|
2825
2856
|
if (main) {
|
|
2826
2857
|
composed.push(renderMainButton(main));
|
|
2827
2858
|
}
|
|
@@ -2841,10 +2872,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2841
2872
|
const moreMenu: ReactElement | null = renderMoreMenu(rest);
|
|
2842
2873
|
|
|
2843
2874
|
const wrapped: ReactElement = (
|
|
2844
|
-
<div
|
|
2845
|
-
key="model-table-header-actions"
|
|
2846
|
-
className="flex items-center gap-1.5"
|
|
2847
|
-
>
|
|
2875
|
+
<div key="model-table-header-actions" className="flex items-center gap-3">
|
|
2848
2876
|
{/*
|
|
2849
2877
|
* Search slot — a compact pill showing "Search … /" by default,
|
|
2850
2878
|
* grown into the full search bar when expanded. Always advertising
|
|
@@ -2868,7 +2896,7 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2868
2896
|
title="Search (/)"
|
|
2869
2897
|
aria-label="Open search"
|
|
2870
2898
|
tabIndex={isExpanded ? -1 : 0}
|
|
2871
|
-
className={`absolute inset-0 inline-flex items-center gap-2 rounded-
|
|
2899
|
+
className={`absolute inset-0 inline-flex items-center gap-2 rounded-md border bg-white px-3 text-sm shadow-sm transition-all duration-200 ease-out ${
|
|
2872
2900
|
isExpanded
|
|
2873
2901
|
? "pointer-events-none border-gray-200 opacity-0"
|
|
2874
2902
|
: "border-gray-200 opacity-100 hover:border-gray-300 hover:bg-gray-50"
|
|
@@ -2909,13 +2937,14 @@ const BaseModelTable: <TBaseModel extends BaseModel | AnalyticsBaseModel>(
|
|
|
2909
2937
|
* search slot to the left can grow into the freed space.
|
|
2910
2938
|
*/}
|
|
2911
2939
|
<div
|
|
2912
|
-
className={`flex items-center transition-all duration-300 ease-out ${
|
|
2940
|
+
className={`flex items-center transition-all duration-300 ease-out [&_button]:md:ml-0 ${
|
|
2913
2941
|
isExpanded
|
|
2914
|
-
? "max-w-0 -ml-
|
|
2915
|
-
: "max-w-[600px] gap-
|
|
2942
|
+
? "max-w-0 -ml-3 gap-0 opacity-0 pointer-events-none"
|
|
2943
|
+
: "max-w-[600px] gap-3 opacity-100"
|
|
2916
2944
|
}`}
|
|
2917
2945
|
aria-hidden={isExpanded}
|
|
2918
2946
|
>
|
|
2947
|
+
{savedViewsElement}
|
|
2919
2948
|
{main && renderMainButton(main)}
|
|
2920
2949
|
{moreMenu}
|
|
2921
2950
|
</div>
|
|
@@ -342,39 +342,77 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
342
342
|
);
|
|
343
343
|
}
|
|
344
344
|
|
|
345
|
-
type GetElementToBeShownInsteadOfButtonFunction = () =>
|
|
346
|
-
| ReactElement
|
|
347
|
-
| undefined;
|
|
345
|
+
type GetElementToBeShownInsteadOfButtonFunction = () => ReactElement;
|
|
348
346
|
|
|
349
347
|
const getElementToBeShownInsteadOfButton: GetElementToBeShownInsteadOfButtonFunction =
|
|
350
|
-
(): ReactElement
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
348
|
+
(): ReactElement => {
|
|
349
|
+
/*
|
|
350
|
+
* Shared shape so the trigger lines up with the search bar + Create button
|
|
351
|
+
* (text-sm font-medium + px-3 py-2 + 1px border → ~38px tall).
|
|
352
|
+
*/
|
|
353
|
+
const triggerBase: string =
|
|
354
|
+
"inline-flex cursor-pointer items-center gap-2 rounded-md border px-3 py-2 text-sm font-medium shadow-sm transition-colors";
|
|
355
|
+
|
|
356
|
+
if (currentlySelectedView) {
|
|
357
|
+
return (
|
|
357
358
|
<div
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}}
|
|
361
|
-
>
|
|
362
|
-
{currentlySelectedView.name}
|
|
363
|
-
</div>
|
|
364
|
-
<div
|
|
365
|
-
className="h-4 w-4 rounded-full bg-gray-500 text-white hover:bg-gray-800 ml-3 -mr-1 p-1"
|
|
366
|
-
onClick={() => {
|
|
367
|
-
setCurrentlySelectedView(null);
|
|
368
|
-
props.onViewChange?.(null);
|
|
369
|
-
closeDropdownMenu();
|
|
370
|
-
}}
|
|
359
|
+
className={`${triggerBase} border-indigo-300 bg-indigo-50 text-indigo-700 hover:border-indigo-400 hover:bg-indigo-100`}
|
|
360
|
+
title={`Saved view: ${currentlySelectedView.name}`}
|
|
371
361
|
>
|
|
372
362
|
<Icon
|
|
373
|
-
icon={IconProp.
|
|
374
|
-
|
|
375
|
-
thick={ThickProp.Thick}
|
|
363
|
+
icon={IconProp.Window}
|
|
364
|
+
className="h-4 w-4 flex-none text-indigo-500"
|
|
376
365
|
/>
|
|
366
|
+
<span className="max-w-[12rem] truncate">
|
|
367
|
+
{currentlySelectedView.name}
|
|
368
|
+
</span>
|
|
369
|
+
<div
|
|
370
|
+
role="button"
|
|
371
|
+
tabIndex={0}
|
|
372
|
+
aria-label="Clear saved view"
|
|
373
|
+
title="Clear saved view"
|
|
374
|
+
className="-mr-1 ml-1 inline-flex h-5 w-5 flex-none items-center justify-center rounded-full bg-indigo-100 text-indigo-600 ring-1 ring-inset ring-indigo-300 hover:bg-indigo-200 hover:text-indigo-900 hover:ring-indigo-400 focus:outline-none focus:ring-2 focus:ring-indigo-500"
|
|
375
|
+
onClick={(event: React.MouseEvent<HTMLDivElement>) => {
|
|
376
|
+
event.stopPropagation();
|
|
377
|
+
setCurrentlySelectedView(null);
|
|
378
|
+
props.onViewChange?.(null);
|
|
379
|
+
closeDropdownMenu();
|
|
380
|
+
}}
|
|
381
|
+
onKeyDown={(event: React.KeyboardEvent<HTMLDivElement>) => {
|
|
382
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
383
|
+
event.preventDefault();
|
|
384
|
+
event.stopPropagation();
|
|
385
|
+
setCurrentlySelectedView(null);
|
|
386
|
+
props.onViewChange?.(null);
|
|
387
|
+
closeDropdownMenu();
|
|
388
|
+
}
|
|
389
|
+
}}
|
|
390
|
+
>
|
|
391
|
+
<Icon
|
|
392
|
+
icon={IconProp.Close}
|
|
393
|
+
size={SizeProp.Small}
|
|
394
|
+
thick={ThickProp.Thick}
|
|
395
|
+
/>
|
|
396
|
+
</div>
|
|
377
397
|
</div>
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return (
|
|
402
|
+
<div
|
|
403
|
+
className={`${triggerBase} border-gray-300 bg-white text-gray-700 hover:bg-gray-50`}
|
|
404
|
+
title="Saved Views"
|
|
405
|
+
>
|
|
406
|
+
<Icon
|
|
407
|
+
icon={IconProp.Window}
|
|
408
|
+
className="h-4 w-4 flex-none text-gray-500"
|
|
409
|
+
/>
|
|
410
|
+
<span>Saved Views</span>
|
|
411
|
+
{allTableViews.length > 0 && (
|
|
412
|
+
<span className="text-gray-400">
|
|
413
|
+
{allTableViews.length.toLocaleString()}
|
|
414
|
+
</span>
|
|
415
|
+
)}
|
|
378
416
|
</div>
|
|
379
417
|
);
|
|
380
418
|
};
|
|
@@ -385,12 +423,6 @@ const TableViewElement: <T extends DatabaseBaseModel | AnalyticsBaseModel>(
|
|
|
385
423
|
}
|
|
386
424
|
};
|
|
387
425
|
|
|
388
|
-
const flipDropdown: VoidFunction = (): void => {
|
|
389
|
-
if (moreMenuRef.current) {
|
|
390
|
-
(moreMenuRef.current as any).flipDropdown();
|
|
391
|
-
}
|
|
392
|
-
};
|
|
393
|
-
|
|
394
426
|
return (
|
|
395
427
|
<MoreMenu
|
|
396
428
|
elementToBeShownInsteadOfButton={getElementToBeShownInsteadOfButton()}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import URL from "../../Types/API/URL";
|
|
2
|
+
import HTTPErrorResponse from "../../Types/API/HTTPErrorResponse";
|
|
3
|
+
import HTTPResponse from "../../Types/API/HTTPResponse";
|
|
4
|
+
import { JSONObject } from "../../Types/JSON";
|
|
5
|
+
import API from "../../Utils/API";
|
|
6
|
+
import { APP_API_URL } from "../Config";
|
|
7
|
+
|
|
8
|
+
export interface GlobalConfigVars {
|
|
9
|
+
disableUserProjectCreation: boolean;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default class GlobalConfigUtil {
|
|
13
|
+
private static cache: GlobalConfigVars | null = null;
|
|
14
|
+
private static fetchPromise: Promise<GlobalConfigVars> | null = null;
|
|
15
|
+
|
|
16
|
+
public static async fetchVars(): Promise<GlobalConfigVars> {
|
|
17
|
+
if (GlobalConfigUtil.cache) {
|
|
18
|
+
return GlobalConfigUtil.cache;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (GlobalConfigUtil.fetchPromise) {
|
|
22
|
+
return GlobalConfigUtil.fetchPromise;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
GlobalConfigUtil.fetchPromise = (async (): Promise<GlobalConfigVars> => {
|
|
26
|
+
const apiUrl: URL = URL.fromURL(APP_API_URL).addRoute(
|
|
27
|
+
"/global-config/vars",
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const response: HTTPResponse<JSONObject> | HTTPErrorResponse =
|
|
31
|
+
await API.get<JSONObject>({ url: apiUrl });
|
|
32
|
+
|
|
33
|
+
const data: JSONObject =
|
|
34
|
+
response instanceof HTTPErrorResponse
|
|
35
|
+
? {}
|
|
36
|
+
: (response.data as JSONObject);
|
|
37
|
+
|
|
38
|
+
GlobalConfigUtil.cache = {
|
|
39
|
+
disableUserProjectCreation: Boolean(data["disableUserProjectCreation"]),
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
return GlobalConfigUtil.cache;
|
|
43
|
+
})();
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
return await GlobalConfigUtil.fetchPromise;
|
|
47
|
+
} finally {
|
|
48
|
+
GlobalConfigUtil.fetchPromise = null;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public static clearCache(): void {
|
|
53
|
+
GlobalConfigUtil.cache = null;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -14,23 +14,17 @@ export default class GlobalConfigAPI extends BaseAPI {
|
|
|
14
14
|
super(GlobalConfig, GlobalConfigService);
|
|
15
15
|
this.router.get(`${(_a = new this.entityType().getCrudApiPath()) === null || _a === void 0 ? void 0 : _a.toString()}/vars`, async (req, res, next) => {
|
|
16
16
|
try {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
* },
|
|
27
|
-
* });
|
|
28
|
-
*/
|
|
17
|
+
const globalConfig = await GlobalConfigService.findOneById({
|
|
18
|
+
id: ObjectID.getZeroObjectID(),
|
|
19
|
+
select: {
|
|
20
|
+
disableUserProjectCreation: true,
|
|
21
|
+
},
|
|
22
|
+
props: {
|
|
23
|
+
isRoot: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
29
26
|
return Response.sendJsonObjectResponse(req, res, {
|
|
30
|
-
|
|
31
|
-
* USE_HTTPS:
|
|
32
|
-
* globalConfig?.useHttps?.toString() || 'false',
|
|
33
|
-
*/
|
|
27
|
+
disableUserProjectCreation: Boolean(globalConfig === null || globalConfig === void 0 ? void 0 : globalConfig.disableUserProjectCreation),
|
|
34
28
|
});
|
|
35
29
|
}
|
|
36
30
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GlobalConfigAPI.js","sourceRoot":"","sources":["../../../../Server/API/GlobalConfigAPI.ts"],"names":[],"mappings":"AAAA,OAAO,mBAEN,MAAM,iCAAiC,CAAC;AAMzC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AACzC,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,YAAY,MAAM,0CAA0C,CAAC;AACpE,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAE5C,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AACtE,OAAO,GAAG,MAAM,iBAAiB,CAAC;AAClC,OAAO,iBAAiB,MAAM,mCAAmC,CAAC;AAGlE,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAE7D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,OAG5C;IACC;;QACE,KAAK,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,GAAG,MAAA,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,cAAc,EAAE,0CAAE,QAAQ,EAAE,OAAO,EAC5D,KAAK,EAAE,GAAmB,EAAE,GAAoB,EAAE,IAAkB,EAAE,EAAE;YACtE,IAAI,CAAC;gBACH
|
|
1
|
+
{"version":3,"file":"GlobalConfigAPI.js","sourceRoot":"","sources":["../../../../Server/API/GlobalConfigAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,10 +40,10 @@ const ProjectPicker = (props) => {
|
|
|
40
40
|
props.onProjectSelected(project);
|
|
41
41
|
}, icon: IconProp.Folder }));
|
|
42
42
|
})) : (React.createElement(React.Fragment, null))),
|
|
43
|
-
React.createElement(CreateNewProjectButton, { onCreateButtonClicked: () => {
|
|
43
|
+
!props.hideCreateProjectButton ? (React.createElement(CreateNewProjectButton, { onCreateButtonClicked: () => {
|
|
44
44
|
setIsComponentVisible(false);
|
|
45
45
|
props.onCreateProjectButtonClicked();
|
|
46
|
-
} })))))));
|
|
46
|
+
} })) : (React.createElement(React.Fragment, null))))))));
|
|
47
47
|
};
|
|
48
48
|
export default ProjectPicker;
|
|
49
49
|
//# sourceMappingURL=ProjectPicker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectPicker.js","sourceRoot":"","sources":["../../../../../../UI/Components/Header/ProjectPicker/ProjectPicker.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,MAAM,yCAAyC,CAAC;AAC/E,OAAO,IAAI,MAAM,iBAAiB,CAAC;AACnC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,QAAQ,MAAM,iCAAiC,CAAC;AAEvD,OAAO,KAAK,EAAE,EAGZ,SAAS,EACT,QAAQ,GACT,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ProjectPicker.js","sourceRoot":"","sources":["../../../../../../UI/Components/Header/ProjectPicker/ProjectPicker.tsx"],"names":[],"mappings":"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"}
|