@cobaltcore-dev/aurora 2.1.0 → 2.1.1
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/dist/client/DeleteFlavorModal-C4nAi7gY.mjs +724 -0
- package/dist/client/DeleteFlavorModal-C4nAi7gY.mjs.map +1 -0
- package/dist/client/_flavorId-BPvssEzn.mjs +277 -0
- package/dist/client/_flavorId-BPvssEzn.mjs.map +1 -0
- package/dist/client/{_flavorId-CgueqKTs.mjs → _flavorId-CFUBcU-l.mjs} +3 -3
- package/dist/client/{_flavorId-CgueqKTs.mjs.map → _flavorId-CFUBcU-l.mjs.map} +1 -1
- package/dist/client/{_flavorId-B7fp6Nk8.mjs → _flavorId-CZcIp0Ih.mjs} +2 -2
- package/dist/client/{_flavorId-B7fp6Nk8.mjs.map → _flavorId-CZcIp0Ih.mjs.map} +1 -1
- package/dist/client/_imageId-BAezmV0Y.mjs +526 -0
- package/dist/client/_imageId-BAezmV0Y.mjs.map +1 -0
- package/dist/client/{_imageId-Ccv8PedW.mjs → _imageId-D-jqz3e3.mjs} +3 -3
- package/dist/client/_imageId-D-jqz3e3.mjs.map +1 -0
- package/dist/client/{_imageId-D9LR-02T.mjs → _imageId-gMdrdnVt.mjs} +2 -2
- package/dist/client/_imageId-gMdrdnVt.mjs.map +1 -0
- package/dist/client/{_projectId-BDARsteX.mjs → _projectId-BYccdAtX.mjs} +3 -3
- package/dist/client/{_projectId-BDARsteX.mjs.map → _projectId-BYccdAtX.mjs.map} +1 -1
- package/dist/client/{_projectId-ZBk6vka0.mjs → _projectId-CBjZC1tv.mjs} +5 -5
- package/dist/client/{_projectId-ZBk6vka0.mjs.map → _projectId-CBjZC1tv.mjs.map} +1 -1
- package/dist/client/{_projectId-CtyAHqhH.mjs → _projectId-CLEa1zgw.mjs} +2 -2
- package/dist/client/{_projectId-CtyAHqhH.mjs.map → _projectId-CLEa1zgw.mjs.map} +1 -1
- package/dist/client/{flavors-Ce3J-cFa.mjs → flavors-CJVSNz6R.mjs} +2 -2
- package/dist/client/{flavors-Ce3J-cFa.mjs.map → flavors-CJVSNz6R.mjs.map} +1 -1
- package/dist/client/{flavors-D5ThLaXO.mjs → flavors-CflJDIEH.mjs} +25 -24
- package/dist/client/{flavors-D5ThLaXO.mjs.map → flavors-CflJDIEH.mjs.map} +1 -1
- package/dist/client/imageHelpers-DBhL2ebL.mjs +1272 -0
- package/dist/client/imageHelpers-DBhL2ebL.mjs.map +1 -0
- package/dist/client/{images-C8M3ysWR.mjs → images-BsylWUiH.mjs} +836 -848
- package/dist/client/images-BsylWUiH.mjs.map +1 -0
- package/dist/client/{images-Cf5R28NR.mjs → images-zQq1nSVv.mjs} +2 -2
- package/dist/client/{images-Cf5R28NR.mjs.map → images-zQq1nSVv.mjs.map} +1 -1
- package/dist/client/index.js +10 -9
- package/dist/client/index.js.map +1 -1
- package/dist/client/{securitygroups-DXrfyuVF.mjs → securitygroups-CSmsBzUb.mjs} +104 -103
- package/dist/client/securitygroups-CSmsBzUb.mjs.map +1 -0
- package/dist/client/{securitygroups-67fFxiwt.mjs → securitygroups-T7kaNFEp.mjs} +2 -2
- package/dist/client/{securitygroups-67fFxiwt.mjs.map → securitygroups-T7kaNFEp.mjs.map} +1 -1
- package/dist/client/trpcClient.d.ts +0 -1
- package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs +83 -0
- package/dist/client/useErrorTranslation-Dc0eE8Zt.mjs.map +1 -0
- package/dist/server/index.d.ts +0 -1
- package/dist/server/index.js +786 -534
- package/package.json +2 -2
- package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs +0 -802
- package/dist/client/DeleteFlavorModal-Be2GFiB_.mjs.map +0 -1
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs +0 -1135
- package/dist/client/ImageToastNotifications-BWfzOUMc.mjs.map +0 -1
- package/dist/client/_flavorId-0PioWpEp.mjs +0 -276
- package/dist/client/_flavorId-0PioWpEp.mjs.map +0 -1
- package/dist/client/_imageId-Ccv8PedW.mjs.map +0 -1
- package/dist/client/_imageId-CiqEQB_J.mjs +0 -558
- package/dist/client/_imageId-CiqEQB_J.mjs.map +0 -1
- package/dist/client/_imageId-D9LR-02T.mjs.map +0 -1
- package/dist/client/images-C8M3ysWR.mjs.map +0 -1
- package/dist/client/securitygroups-DXrfyuVF.mjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { C as e, D as t, K as n, L as r, M as i, P as a, Q as o, S as s, T as c, X as l, ft as u, g as d, h as f, i as p, l as m, lt as h, m as g, o as _, ot as v, p as y, rt as b, st as x, t as S, x as C } from "./build-WuxXRAqf.mjs";
|
|
2
2
|
import { a as w } from "./trpcClient-D7gpR7YG.mjs";
|
|
3
|
-
import { t as T } from "./securitygroups-
|
|
3
|
+
import { t as T } from "./securitygroups-T7kaNFEp.mjs";
|
|
4
4
|
import { t as E } from "./useProjectId-DBc5lpoU.mjs";
|
|
5
5
|
import { t as D } from "./SortInput-4g7nSTHW.mjs";
|
|
6
6
|
import { t as O } from "./ContentHeader-fKKZVu-o.mjs";
|
|
@@ -28,10 +28,7 @@ function ae({ securityGroup: e, permissions: n, onEdit: r, onDelete: i, onViewDe
|
|
|
28
28
|
onChange: () => u?.(e)
|
|
29
29
|
})
|
|
30
30
|
}),
|
|
31
|
-
/*#__PURE__*/ F(S, { children:
|
|
32
|
-
className: "text-md",
|
|
33
|
-
children: e.name
|
|
34
|
-
}) }) }),
|
|
31
|
+
/*#__PURE__*/ F(S, { children: e.name }),
|
|
35
32
|
/*#__PURE__*/ F(S, { children: e.description || f._({ id: "h47p9L" }) }),
|
|
36
33
|
/*#__PURE__*/ I(S, { children: [/*#__PURE__*/ F(m, { value: e.shared }), e.shared && /*#__PURE__*/ I("p", { children: [
|
|
37
34
|
/*#__PURE__*/ F(V, { id: "LtI9AS" }),
|
|
@@ -450,95 +447,99 @@ var oe = ({ securityGroups: e, isLoading: t, isError: n, error: r, permissions:
|
|
|
450
447
|
replace: !0
|
|
451
448
|
});
|
|
452
449
|
};
|
|
453
|
-
return /*#__PURE__*/ I(P, { children: [
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
gap: "2",
|
|
468
|
-
className: "pb-2",
|
|
469
|
-
children: /*#__PURE__*/ I(o, {
|
|
470
|
-
gap: "2",
|
|
471
|
-
children: [/*#__PURE__*/ F(D, {
|
|
472
|
-
options: c.options,
|
|
473
|
-
sortBy: c.sortBy,
|
|
474
|
-
sortDirection: c.sortDirection ?? "asc",
|
|
475
|
-
selectClassName: "min-w-40",
|
|
476
|
-
onSortByChange: (e) => xe({
|
|
477
|
-
...c,
|
|
478
|
-
sortBy: e,
|
|
479
|
-
sortDirection: c.sortDirection
|
|
480
|
-
}),
|
|
481
|
-
onSortDirectionChange: (e) => xe({
|
|
482
|
-
...c,
|
|
483
|
-
sortDirection: e
|
|
484
|
-
})
|
|
485
|
-
}), Z.canCreate && /*#__PURE__*/ F(p, {
|
|
486
|
-
onClick: () => y(!0),
|
|
487
|
-
variant: "primary",
|
|
488
|
-
className: "whitespace-nowrap",
|
|
489
|
-
children: /*#__PURE__*/ F(V, { id: "YjAOtb" })
|
|
490
|
-
})]
|
|
491
|
-
})
|
|
492
|
-
}),
|
|
493
|
-
/*#__PURE__*/ F(m, { children: /*#__PURE__*/ I(o, {
|
|
450
|
+
return /*#__PURE__*/ I(P, { children: [
|
|
451
|
+
/*#__PURE__*/ F(O, {
|
|
452
|
+
title: n._({ id: "4opp4r" }),
|
|
453
|
+
projectId: t
|
|
454
|
+
}),
|
|
455
|
+
K && J.length > 0 && /*#__PURE__*/ F(r, {
|
|
456
|
+
variant: "error",
|
|
457
|
+
className: "mb-4",
|
|
458
|
+
children: X
|
|
459
|
+
}),
|
|
460
|
+
/*#__PURE__*/ I(o, {
|
|
461
|
+
direction: "vertical",
|
|
462
|
+
className: "juno-pattern-datagrid-outer",
|
|
463
|
+
children: [/*#__PURE__*/ I(o, {
|
|
494
464
|
direction: "vertical",
|
|
495
|
-
|
|
496
|
-
children: [/*#__PURE__*/
|
|
497
|
-
distribution: "
|
|
465
|
+
className: "juno-pattern-datagrid-header",
|
|
466
|
+
children: [/*#__PURE__*/ F(o, {
|
|
467
|
+
distribution: "end",
|
|
498
468
|
alignment: "center",
|
|
499
|
-
|
|
469
|
+
gap: "2",
|
|
470
|
+
className: "pb-2",
|
|
471
|
+
children: /*#__PURE__*/ I(o, {
|
|
472
|
+
gap: "2",
|
|
473
|
+
children: [/*#__PURE__*/ F(D, {
|
|
474
|
+
options: c.options,
|
|
475
|
+
sortBy: c.sortBy,
|
|
476
|
+
sortDirection: c.sortDirection ?? "asc",
|
|
477
|
+
selectClassName: "min-w-40",
|
|
478
|
+
onSortByChange: (e) => xe({
|
|
479
|
+
...c,
|
|
480
|
+
sortBy: e,
|
|
481
|
+
sortDirection: c.sortDirection
|
|
482
|
+
}),
|
|
483
|
+
onSortDirectionChange: (e) => xe({
|
|
484
|
+
...c,
|
|
485
|
+
sortDirection: e
|
|
486
|
+
})
|
|
487
|
+
}), Z.canCreate && /*#__PURE__*/ F(p, {
|
|
488
|
+
onClick: () => y(!0),
|
|
489
|
+
variant: "primary",
|
|
490
|
+
className: "whitespace-nowrap",
|
|
491
|
+
children: /*#__PURE__*/ F(V, { id: "YjAOtb" })
|
|
492
|
+
})]
|
|
493
|
+
})
|
|
494
|
+
}), /*#__PURE__*/ F(m, { children: /*#__PURE__*/ I(o, {
|
|
495
|
+
direction: "vertical",
|
|
496
|
+
gap: "2",
|
|
497
|
+
children: [/*#__PURE__*/ I(o, {
|
|
498
|
+
distribution: "between",
|
|
499
|
+
alignment: "center",
|
|
500
|
+
children: [/*#__PURE__*/ F(A, {
|
|
501
|
+
filters: u.filters,
|
|
502
|
+
selectClassName: "sm:min-w-40",
|
|
503
|
+
comboboxClassName: "sm:min-w-40",
|
|
504
|
+
onChange: (e) => {
|
|
505
|
+
let t = de(u.selectedFilters || [], e, u.filters);
|
|
506
|
+
t !== (u.selectedFilters || []) && Q({
|
|
507
|
+
...u,
|
|
508
|
+
selectedFilters: t
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}), /*#__PURE__*/ F(e, {
|
|
512
|
+
className: "w-60 sm:w-68",
|
|
513
|
+
placeholder: n._({ id: "rp7Ili" }),
|
|
514
|
+
"data-testid": "searchbar",
|
|
515
|
+
value: f,
|
|
516
|
+
onInput: (e) => {
|
|
517
|
+
let t = e.currentTarget.value;
|
|
518
|
+
h(t), clearTimeout(g.current), g.current = window.setTimeout(() => {
|
|
519
|
+
g.current = void 0, $(t);
|
|
520
|
+
}, pe);
|
|
521
|
+
},
|
|
522
|
+
onSearch: (e) => {
|
|
523
|
+
clearTimeout(g.current), g.current = void 0, $(typeof e == "string" ? e : "");
|
|
524
|
+
},
|
|
525
|
+
onClear: () => {
|
|
526
|
+
clearTimeout(g.current), g.current = void 0, h(""), $("");
|
|
527
|
+
}
|
|
528
|
+
})]
|
|
529
|
+
}), u.selectedFilters && u.selectedFilters.length > 0 && /*#__PURE__*/ F(k, {
|
|
530
|
+
selectedFilters: u.selectedFilters,
|
|
500
531
|
filters: u.filters,
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
}
|
|
510
|
-
}), /*#__PURE__*/ F(e, {
|
|
511
|
-
className: "w-60 sm:w-68",
|
|
512
|
-
placeholder: n._({ id: "rp7Ili" }),
|
|
513
|
-
"data-testid": "searchbar",
|
|
514
|
-
value: f,
|
|
515
|
-
onInput: (e) => {
|
|
516
|
-
let t = e.currentTarget.value;
|
|
517
|
-
h(t), clearTimeout(g.current), g.current = window.setTimeout(() => {
|
|
518
|
-
g.current = void 0, $(t);
|
|
519
|
-
}, pe);
|
|
520
|
-
},
|
|
521
|
-
onSearch: (e) => {
|
|
522
|
-
clearTimeout(g.current), g.current = void 0, $(typeof e == "string" ? e : "");
|
|
523
|
-
},
|
|
524
|
-
onClear: () => {
|
|
525
|
-
clearTimeout(g.current), g.current = void 0, h(""), $("");
|
|
526
|
-
}
|
|
532
|
+
onDelete: (e) => Q({
|
|
533
|
+
...u,
|
|
534
|
+
selectedFilters: (u.selectedFilters || []).filter((t) => t.name !== e.name || t.value !== e.value)
|
|
535
|
+
}),
|
|
536
|
+
onClear: () => Q({
|
|
537
|
+
...u,
|
|
538
|
+
selectedFilters: []
|
|
539
|
+
})
|
|
527
540
|
})]
|
|
528
|
-
})
|
|
529
|
-
|
|
530
|
-
filters: u.filters,
|
|
531
|
-
onDelete: (e) => Q({
|
|
532
|
-
...u,
|
|
533
|
-
selectedFilters: (u.selectedFilters || []).filter((t) => t.name !== e.name || t.value !== e.value)
|
|
534
|
-
}),
|
|
535
|
-
onClear: () => Q({
|
|
536
|
-
...u,
|
|
537
|
-
selectedFilters: []
|
|
538
|
-
})
|
|
539
|
-
})]
|
|
540
|
-
}) }),
|
|
541
|
-
/*#__PURE__*/ F(oe, {
|
|
541
|
+
}) })]
|
|
542
|
+
}), /*#__PURE__*/ F(oe, {
|
|
542
543
|
securityGroups: J,
|
|
543
544
|
isLoading: G,
|
|
544
545
|
isError: K && J.length === 0,
|
|
@@ -554,18 +555,18 @@ var oe = ({ securityGroups: e, isLoading: t, isError: n, error: r, permissions:
|
|
|
554
555
|
currentProjectId: t,
|
|
555
556
|
hasAnyBulkAction: !1,
|
|
556
557
|
onClearUpdateError: be
|
|
557
|
-
})
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
558
|
+
})]
|
|
559
|
+
}),
|
|
560
|
+
/*#__PURE__*/ F(se, {
|
|
561
|
+
isOpen: _,
|
|
562
|
+
onClose: () => {
|
|
563
|
+
C(null), y(!1);
|
|
564
|
+
},
|
|
565
|
+
onCreate: _e,
|
|
566
|
+
isLoading: me.isPending,
|
|
567
|
+
error: S
|
|
568
|
+
})
|
|
569
|
+
] });
|
|
569
570
|
};
|
|
570
571
|
//#endregion
|
|
571
572
|
//#region src/client/routes/_auth/projects/$projectId/network/securitygroups/index.tsx?tsr-split=component
|
|
@@ -577,4 +578,4 @@ function Z() {
|
|
|
577
578
|
//#endregion
|
|
578
579
|
export { Z as component };
|
|
579
580
|
|
|
580
|
-
//# sourceMappingURL=securitygroups-
|
|
581
|
+
//# sourceMappingURL=securitygroups-CSmsBzUb.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"securitygroups-CSmsBzUb.mjs","names":["DataGridCell","DataGridRow","PopupMenu","PopupMenuItem","PopupMenuOptions","Checkbox","SecurityGroupTableRow","securityGroup","sg","permissions","onEdit","onDelete","onViewDetails","isReadOnly","showSelectColumn","isSelected","onSelect","useLingui","BooleanValue","value","span","t","handleShowDetails","data-testid","id","onClick","className","e","stopPropagation","checked","onChange","name","description","shared","p","project_id","stateful","label","canUpdate","canDelete","useState","useEffect","useRef","DataGrid","DataGridCell","DataGridHeadCell","DataGridRow","Status","useNavigate","useProjectId","EditSecurityGroupModal","DeleteSecurityGroupDialog","SecurityGroupTableRow","SecurityGroupListContainer","securityGroups","isLoading","isError","error","permissions","onDeleteSecurityGroup","isDeletingSecurityGroup","deleteError","onUpdateSecurityGroup","isUpdatingSecurityGroup","updateError","currentProjectId","hasAnyBulkAction","onClearUpdateError","useLingui","navigate","projectId","selectedSecurityGroup","setSelectedSecurityGroup","editModalOpen","setEditModalOpen","deleteDialogOpen","setDeleteDialogOpen","prevIsDeletingRef","prevIsUpdatingRef","handleEdit","sg","id","handleDelete","handleViewDetails","to","params","securityGroupId","closeEditModal","closeDeleteDialog","deletionJustFinished","current","updateJustFinished","columnCount","columns","minContentColumns","t","map","label","colSpan","status","title","message","length","isReadOnly","Boolean","project_id","securityGroup","onEdit","onDelete","onViewDetails","showSelectColumn","isSelected","onSelect","body","open","onClose","onUpdate","data","Promise","resolve","isOpen","isDeleting","React","useState","Modal","Form","FormRow","FormSection","TextInput","Checkbox","Button","ButtonRow","Spinner","ModalFooter","Textarea","Message","Status","defaultSecurityGroupValues","name","description","stateful","CreateSecurityGroupModal","isOpen","onClose","onCreate","isLoading","error","useLingui","properties","setProperties","errors","setErrors","handleInputChange","e","value","type","target","checked","prev","newErrors","validateForm","trim","t","Object","keys","length","handleSubmit","preventDefault","securityGroupData","undefined","handleClose","open","onCancel","size","title","modalFooter","className","variant","onClick","disabled","data-testid","dismissible","status","id","label","onChange","required","errortext","placeholder","rows","helptext","BOOLEAN_VALUES","BOOLEAN_PARAM","true","false","isBooleanValue","value","includes","BOOLEAN_FILTER_NAMES","isBooleanFilterName","name","buildSecurityGroupFilters","labels","displayName","shared","filterName","values","valueLabels","yes","no","supportsMultiValue","stateful","buildSecurityGroupFilterParams","selectedFilters","params","selected","filter","f","inactive","at","isKnownSecurityGroupFilter","isKnownSecurityGroupFilter","parseFiltersFromUrl","searchParams","filters","shared","push","name","value","stateful","buildFilterParams","selectedFilters","filterDefinitions","params","length","filterGroups","filter","sf","inactive","reduce","acc","Object","entries","forEach","filterName","values","filterDef","find","f","supportsMultiValue","join","applyFilterSelection","current","selected","alreadySelected","some","supportsMulti","buildUrlSearchParams","baseParams","newParams","search","sortBy","sortDirection","useState","useEffect","useRef","useNavigate","useSearch","Button","Stack","DataGridToolbar","SearchInput","Message","toast","ContentHeader","trpcReact","SortInput","SelectedFilters","FiltersInput","SecurityGroupListContainer","CreateSecurityGroupModal","useSecurityGroupPermissions","parseFiltersFromUrl","buildUrlSearchParams","applyFilterSelection","buildSecurityGroupFilterParams","buildSecurityGroupFilters","getSecurityGroupDeletedToast","getSecurityGroupDeleteErrorToast","getSecurityGroupUpdatedToast","getSecurityGroupUpdateErrorToast","SEARCH_DEBOUNCE_MS","SecurityGroups","project","projectId","useLingui","navigate","searchParams","strict","sortSettings","setSortSettings","options","label","t","value","sortBy","sortDirection","filterSettings","setFilterSettings","filters","shared","stateful","yes","no","selectedFilters","localSearchTerm","setLocalSearchTerm","search","debounceTimer","undefined","createModalOpen","setCreateModalOpen","deleteError","setDeleteError","createError","setCreateError","updateError","setUpdateError","utils","useUtils","clearTimeout","current","prev","urlFilters","urlSortBy","urlSortDirection","urlSearchTerm","data","securityGroupsData","isLoading","isError","error","network","securityGroup","list","useQuery","project_id","sort_key","sort_dir","searchTerm","refetchOnWindowFocus","placeholderData","securityGroups","listError","code","message","permissions","createSecurityGroupMutation","create","useMutation","onSuccess","createdSecurityGroup","invalidate","getById","to","params","securityGroupId","id","onError","deleteSecurityGroupMutation","deleteById","updateSecurityGroupMutation","update","handleCreateSecurityGroup","securityGroupData","mutateAsync","handleDeleteSecurityGroup","sgName","find","sg","name","mutate","success","handleUpdateSecurityGroup","handleClearUpdateError","handleSortChange","newSortSettings","settings","toString","replace","handleFilterChange","newFilterSettings","handleSearchChange","term","title","length","variant","className","direction","distribution","alignment","gap","selectClassName","onSortByChange","v","onSortDirectionChange","dir","canCreate","onClick","comboboxClassName","onChange","selected","newSelected","placeholder","data-testid","onInput","e","currentTarget","window","setTimeout","onSearch","onClear","onDelete","filterToRemove","filter","f","onCreateClick","onDeleteSecurityGroup","isDeletingSecurityGroup","isPending","onUpdateSecurityGroup","isUpdatingSecurityGroup","currentProjectId","hasAnyBulkAction","onClearUpdateError","isOpen","onClose","onCreate","SecurityGroups","Route","RouteComponent","projectId","useParams","trpcClient","useRouteContext","Error","component"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupTableRow.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupListContainer.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/-modals/CreateSecurityGroupModal.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/filterConfig.ts","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/urlHelpers.ts","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/-components/SecurityGroupsList.tsx","../../src/client/routes/_auth/projects/$projectId/network/securitygroups/index.tsx?tsr-split=component"],"sourcesContent":["import {\n DataGridCell,\n DataGridRow,\n PopupMenu,\n PopupMenuItem,\n PopupMenuOptions,\n Checkbox,\n} from \"@cloudoperators/juno-ui-components\"\nimport { useLingui, Trans } from \"@lingui/react/macro\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\n\nexport interface SecurityGroupPermissions {\n canView: boolean\n canCreate: boolean\n canUpdate: boolean\n canDelete: boolean\n canCreateRule: boolean\n canDeleteRule: boolean\n canManageAccess: boolean\n canViewRBAC: boolean\n}\n\ninterface SecurityGroupTableRowProps {\n securityGroup: SecurityGroup\n permissions: SecurityGroupPermissions\n onEdit: (sg: SecurityGroup) => void\n onDelete: (sg: SecurityGroup) => void\n onViewDetails?: (sg: SecurityGroup) => void\n isReadOnly?: boolean\n showSelectColumn?: boolean\n isSelected?: boolean\n onSelect?: (sg: SecurityGroup) => void\n}\n\nexport function SecurityGroupTableRow({\n securityGroup: sg,\n permissions,\n onEdit,\n onDelete,\n onViewDetails,\n isReadOnly = false,\n showSelectColumn = false,\n isSelected = false,\n onSelect,\n}: SecurityGroupTableRowProps) {\n const { t } = useLingui()\n\n const BooleanValue = ({ value }: { value: boolean | undefined }) => <span>{value ? t`Yes` : t`No`}</span>\n\n const handleShowDetails = () => {\n if (onViewDetails) {\n onViewDetails(sg)\n }\n }\n\n return (\n <DataGridRow\n key={sg.id}\n data-testid={`security-group-row-${sg.id}`}\n onClick={handleShowDetails}\n className=\"hover:bg-theme-background-lvl-2 cursor-pointer\"\n >\n {showSelectColumn && (\n <DataGridCell onClick={(e) => e.stopPropagation()}>\n <Checkbox checked={isSelected} onChange={() => onSelect?.(sg)} />\n </DataGridCell>\n )}\n <DataGridCell>{sg.name}</DataGridCell>\n <DataGridCell>{sg.description || t`—`}</DataGridCell>\n <DataGridCell>\n <BooleanValue value={sg.shared} />\n {sg.shared && (\n <p>\n <Trans>Owner</Trans>: <span className=\"text-theme-light text-xs\">{sg.project_id}</span>\n </p>\n )}\n </DataGridCell>\n <DataGridCell>\n <BooleanValue value={sg.stateful ?? true} />\n </DataGridCell>\n <DataGridCell onClick={(e) => e.stopPropagation()} className=\"items-end pr-0\">\n <PopupMenu>\n <PopupMenuOptions>\n <PopupMenuItem label={t`Show Details`} onClick={() => handleShowDetails()} />\n {permissions.canUpdate && !isReadOnly && <PopupMenuItem label={t`Edit Group`} onClick={() => onEdit(sg)} />}\n {permissions.canDelete && !isReadOnly && (\n <PopupMenuItem label={t`Delete Group`} onClick={() => onDelete(sg)} />\n )}\n </PopupMenuOptions>\n </PopupMenu>\n </DataGridCell>\n </DataGridRow>\n )\n}\n","import { useState, useEffect, useRef } from \"react\"\nimport { DataGrid, DataGridCell, DataGridHeadCell, DataGridRow, Status } from \"@cloudoperators/juno-ui-components\"\nimport { useLingui } from \"@lingui/react/macro\"\nimport { useNavigate } from \"@tanstack/react-router\"\nimport { useProjectId } from \"@/client/hooks\"\nimport type { SecurityGroup } from \"@/server/Network/types/securityGroup\"\nimport type { UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\nimport { EditSecurityGroupModal } from \"./-modals/EditSecurityGroupModal\"\nimport { DeleteSecurityGroupDialog } from \"./-modals/DeleteSecurityGroupDialog\"\nimport { SecurityGroupTableRow, type SecurityGroupPermissions } from \"./SecurityGroupTableRow\"\n\ninterface SecurityGroupListContainerProps {\n securityGroups: SecurityGroup[]\n isLoading: boolean\n isError: boolean\n error: { message?: string } | null\n permissions: SecurityGroupPermissions\n onCreateClick?: () => void\n onDeleteSecurityGroup?: (securityGroupId: string) => void\n isDeletingSecurityGroup?: boolean\n deleteError?: string | null\n onUpdateSecurityGroup?: (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => Promise<void>\n isUpdatingSecurityGroup?: boolean\n updateError?: string | null\n currentProjectId?: string\n hasAnyBulkAction?: boolean\n onClearUpdateError?: () => void\n}\n\nexport const SecurityGroupListContainer = ({\n securityGroups,\n isLoading,\n isError,\n error,\n permissions,\n onDeleteSecurityGroup,\n isDeletingSecurityGroup = false,\n deleteError = null,\n onUpdateSecurityGroup,\n isUpdatingSecurityGroup = false,\n updateError = null,\n currentProjectId,\n hasAnyBulkAction = false,\n onClearUpdateError,\n}: SecurityGroupListContainerProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const projectId = useProjectId()\n const [selectedSecurityGroup, setSelectedSecurityGroup] = useState<SecurityGroup | null>(null)\n const [editModalOpen, setEditModalOpen] = useState(false)\n const [deleteDialogOpen, setDeleteDialogOpen] = useState(false)\n const prevIsDeletingRef = useRef<boolean>(false)\n const prevIsUpdatingRef = useRef<boolean>(false)\n\n const handleEdit = (sg: SecurityGroup) => {\n // Clear error when selecting a different security group\n if (selectedSecurityGroup && selectedSecurityGroup.id !== sg.id && onClearUpdateError) {\n onClearUpdateError()\n }\n setSelectedSecurityGroup(sg)\n setEditModalOpen(true)\n }\n\n const handleDelete = (sg: SecurityGroup) => {\n setSelectedSecurityGroup(sg)\n setDeleteDialogOpen(true)\n }\n\n const handleViewDetails = (sg: SecurityGroup) => {\n navigate({\n to: \"/projects/$projectId/network/securitygroups/$securityGroupId\",\n params: { projectId, securityGroupId: sg.id },\n })\n }\n\n const closeEditModal = () => {\n setSelectedSecurityGroup(null)\n setEditModalOpen(false)\n }\n\n const closeDeleteDialog = () => {\n setSelectedSecurityGroup(null)\n setDeleteDialogOpen(false)\n }\n\n // Close delete dialog when deletion completes successfully\n useEffect(() => {\n // Check if deletion just finished (was deleting before, now not deleting)\n const deletionJustFinished = prevIsDeletingRef.current && !isDeletingSecurityGroup\n\n // Close dialog if deletion just finished and there's no error\n if (deletionJustFinished && deleteDialogOpen && !deleteError) {\n closeDeleteDialog()\n }\n\n // Update the ref for next render\n prevIsDeletingRef.current = isDeletingSecurityGroup\n }, [isDeletingSecurityGroup, deleteError, deleteDialogOpen])\n\n // Close edit modal when update completes successfully\n useEffect(() => {\n // Check if update just finished (was updating before, now not updating)\n const updateJustFinished = prevIsUpdatingRef.current && !isUpdatingSecurityGroup\n\n // Close modal if update just finished and there's no error\n if (updateJustFinished && editModalOpen && !updateError) {\n closeEditModal()\n }\n\n // Update the ref for next render\n prevIsUpdatingRef.current = isUpdatingSecurityGroup\n }, [isUpdatingSecurityGroup, updateError, editModalOpen])\n\n const columnCount = hasAnyBulkAction ? 6 : 5\n\n return (\n <>\n <DataGrid columns={columnCount} minContentColumns={hasAnyBulkAction ? [5] : [4]}>\n <DataGridRow>\n {hasAnyBulkAction && <DataGridHeadCell />}\n {[t`Name`, t`Description`, t`Shared`, t`Stateful`, \"\"].map((label) => (\n <DataGridHeadCell key={label}>{label}</DataGridHeadCell>\n ))}\n </DataGridRow>\n\n {isLoading ? (\n <DataGridRow>\n <DataGridCell colSpan={columnCount}>\n <Status status=\"progress\" title={t`Loading...`} />\n </DataGridCell>\n </DataGridRow>\n ) : isError ? (\n <DataGridRow>\n <DataGridCell colSpan={columnCount}>\n <Status status=\"error\" title={error?.message ?? t`Failed to Load Security Groups`} />\n </DataGridCell>\n </DataGridRow>\n ) : securityGroups.length > 0 ? (\n securityGroups.map((sg) => {\n // Compute isReadOnly only when the security group has an explicit project owner\n const isReadOnly = Boolean(currentProjectId && sg.project_id && sg.project_id !== currentProjectId)\n\n return (\n <SecurityGroupTableRow\n key={sg.id}\n securityGroup={sg}\n permissions={permissions}\n onEdit={handleEdit}\n onDelete={handleDelete}\n onViewDetails={handleViewDetails}\n isReadOnly={isReadOnly}\n showSelectColumn={hasAnyBulkAction}\n isSelected={false}\n onSelect={() => {}}\n />\n )\n })\n ) : (\n <DataGridRow>\n <DataGridCell colSpan={columnCount}>\n <Status\n status=\"empty\"\n title={t`No security groups found`}\n body={t`There are no security groups available for this project with the current filters applied. Try adjusting your filter criteria or create a new security group to get started.`}\n />\n </DataGridCell>\n </DataGridRow>\n )}\n </DataGrid>\n\n {selectedSecurityGroup && (\n <>\n <EditSecurityGroupModal\n securityGroup={selectedSecurityGroup}\n open={editModalOpen}\n onClose={closeEditModal}\n onUpdate={(id, data) => {\n if (onUpdateSecurityGroup) {\n return onUpdateSecurityGroup(id, data)\n }\n return Promise.resolve()\n }}\n isLoading={isUpdatingSecurityGroup}\n error={updateError}\n />\n <DeleteSecurityGroupDialog\n securityGroup={selectedSecurityGroup}\n isOpen={deleteDialogOpen}\n onClose={closeDeleteDialog}\n onDelete={(id) => {\n if (onDeleteSecurityGroup) {\n onDeleteSecurityGroup(id)\n }\n }}\n isDeleting={isDeletingSecurityGroup}\n error={deleteError}\n />\n </>\n )}\n </>\n )\n}\n","import React, { useState } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport {\n Modal,\n Form,\n FormRow,\n FormSection,\n TextInput,\n Checkbox,\n Button,\n ButtonRow,\n Spinner,\n ModalFooter,\n Textarea,\n Message,\n Status,\n} from \"@cloudoperators/juno-ui-components\"\nimport { CreateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\n\ninterface CreateSecurityGroupModalProps {\n isOpen: boolean\n onClose: () => void\n onCreate: (securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\">) => Promise<void>\n isLoading?: boolean\n error?: string | null\n}\n\ninterface SecurityGroupProperties {\n name: string\n description: string\n stateful: boolean\n}\n\nconst defaultSecurityGroupValues: SecurityGroupProperties = {\n name: \"\",\n description: \"\",\n stateful: true,\n}\n\nexport const CreateSecurityGroupModal: React.FC<CreateSecurityGroupModalProps> = ({\n isOpen,\n onClose,\n onCreate,\n isLoading = false,\n error = null,\n}) => {\n const { t } = useLingui()\n\n const [properties, setProperties] = useState<SecurityGroupProperties>({ ...defaultSecurityGroupValues })\n const [errors, setErrors] = useState<{ [key: string]: string }>({})\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const { name, value, type } = e.target\n const checked = (e.target as HTMLInputElement).checked\n\n setProperties((prev) => ({\n ...prev,\n [name]: type === \"checkbox\" ? checked : value,\n }))\n\n if (errors[name]) {\n setErrors((prev) => {\n const newErrors = { ...prev }\n delete newErrors[name]\n return newErrors\n })\n }\n }\n\n const validateForm = (): boolean => {\n const newErrors: { [key: string]: string } = {}\n\n if (!properties.name || properties.name.trim() === \"\") {\n newErrors.name = t`Security group name is required`\n }\n\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n\n if (!validateForm()) {\n return\n }\n\n const securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\"> = {\n name: properties.name.trim(),\n description: properties.description.trim() || undefined,\n stateful: properties.stateful,\n }\n\n await onCreate(securityGroupData)\n handleClose()\n }\n\n const handleClose = () => {\n setProperties({ ...defaultSecurityGroupValues })\n setErrors({})\n onClose()\n }\n\n return (\n <Modal\n open={isOpen}\n onCancel={handleClose}\n size=\"large\"\n title={t`Create Security Group`}\n modalFooter={\n <ModalFooter className=\"flex justify-end\">\n <ButtonRow>\n <Button variant=\"default\" onClick={handleClose} disabled={isLoading}>\n <Trans>Cancel</Trans>\n </Button>\n <Button\n variant=\"primary\"\n onClick={(e) => {\n handleSubmit(e)\n }}\n disabled={isLoading}\n data-testid=\"create-security-group-button\"\n >\n {isLoading ? <Spinner size=\"small\" /> : <Trans>Create Security Group</Trans>}\n </Button>\n </ButtonRow>\n </ModalFooter>\n }\n >\n {/* Error Message */}\n {error && (\n <Message dismissible={false} variant=\"error\" className=\"mb-4\">\n {error}\n </Message>\n )}\n\n {isLoading && <Status status=\"progress\" title={t`Creating Security Group...`} className=\"mt-0\" />}\n\n {!isLoading && (\n <Form className=\"mb-6\">\n <FormSection className=\"mb-6\">\n <FormRow className=\"mb-6\">\n <TextInput\n id=\"name\"\n name=\"name\"\n label={t`Name`}\n value={properties.name}\n onChange={handleInputChange}\n required\n errortext={errors.name}\n placeholder={t`Type name`}\n disabled={isLoading}\n />\n </FormRow>\n\n <FormRow className=\"mb-6\">\n <Textarea\n id=\"description\"\n name=\"description\"\n label={t`Description`}\n value={properties.description}\n onChange={handleInputChange}\n placeholder={t`Description`}\n disabled={isLoading}\n rows={3}\n />\n </FormRow>\n\n <FormRow className=\"mb-0\">\n <Checkbox\n id=\"stateful\"\n name=\"stateful\"\n label={t`Stateful`}\n checked={properties.stateful}\n onChange={handleInputChange}\n disabled={isLoading}\n helptext={t`Stateful security groups track connection state. This setting cannot be changed after creation.`}\n />\n </FormRow>\n </FormSection>\n </Form>\n )}\n </Modal>\n )\n}\n","import type { ListSecurityGroupsInput } from \"@/server/Network/types/securityGroup\"\nimport type { Filter, SelectedFilter } from \"@/client/components/ListToolbar/types\"\n\n/** Filter params this list may send to network.securityGroup.list. Names AND types come from the tRPC input schema. */\nexport type SecurityGroupFilterParams = Partial<Pick<ListSecurityGroupsInput, \"shared\" | \"stateful\">>\nexport type SecurityGroupFilterName = keyof SecurityGroupFilterParams\n\nconst BOOLEAN_VALUES = [\"true\", \"false\"] as const\ntype BooleanValue = (typeof BOOLEAN_VALUES)[number]\n\n// Maps the raw string value carried in the URL/pill to the typed value sent to the tRPC procedure.\n// If a server-side field ever changes type (e.g. to a string enum), this mapping fails to compile,\n// surfacing the mismatch at build time instead of at runtime.\nconst BOOLEAN_PARAM: Record<BooleanValue, boolean> = {\n true: true,\n false: false,\n}\n\nconst isBooleanValue = (value: string): value is BooleanValue => (BOOLEAN_VALUES as readonly string[]).includes(value)\n\nconst BOOLEAN_FILTER_NAMES = [\"shared\", \"stateful\"] as const satisfies readonly SecurityGroupFilterName[]\ntype BooleanFilterName = (typeof BOOLEAN_FILTER_NAMES)[number]\n\nconst isBooleanFilterName = (name: string): name is BooleanFilterName =>\n (BOOLEAN_FILTER_NAMES as readonly string[]).includes(name)\n\n/**\n * Builds the Filter definitions for the Security Groups list toolbar.\n * Labels are passed in (rather than resolved via `t` here) so this module stays plain\n * data/logic and can be unit-tested without an I18nProvider.\n */\nexport const buildSecurityGroupFilters = (labels: {\n shared: string\n stateful: string\n yes: string\n no: string\n}): Filter[] => [\n {\n displayName: labels.shared,\n filterName: \"shared\" satisfies SecurityGroupFilterName,\n values: [...BOOLEAN_VALUES],\n valueLabels: { true: labels.yes, false: labels.no },\n supportsMultiValue: false,\n },\n {\n displayName: labels.stateful,\n filterName: \"stateful\" satisfies SecurityGroupFilterName,\n values: [...BOOLEAN_VALUES],\n valueLabels: { true: labels.yes, false: labels.no },\n supportsMultiValue: false,\n },\n]\n\n/**\n * Builds the typed filter params sent to `network.securityGroup.list` from the currently\n * selected filters. Unlike the generic `Record<string, string>` builder, the return type here\n * is checked by the compiler against the tRPC input schema when spread into the query input.\n */\nexport const buildSecurityGroupFilterParams = (selectedFilters: SelectedFilter[]): SecurityGroupFilterParams => {\n const params: SecurityGroupFilterParams = {}\n\n for (const name of BOOLEAN_FILTER_NAMES) {\n // Single-value filters: the toolbar replaces an earlier selection, but the URL may still\n // carry more than one entry, in which case the last one wins.\n const selected = selectedFilters.filter((f) => !f.inactive && f.name === name).at(-1)\n\n if (selected && isBooleanValue(selected.value)) {\n params[name] = BOOLEAN_PARAM[selected.value]\n }\n }\n\n return params\n}\n\n/** Whether a raw URL value is a known, valid value for the given Security Groups filter name. */\nexport const isKnownSecurityGroupFilter = (name: string, value: string): boolean =>\n isBooleanFilterName(name) && isBooleanValue(value)\n","import { SelectedFilter, Filter } from \"@/client/components/ListToolbar/types\"\nimport { isKnownSecurityGroupFilter } from \"./filterConfig\"\n\ntype SecurityGroupsSearchParams = {\n shared?: string\n stateful?: string\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n}\n\n/**\n * Parses URL search params into SelectedFilter array for ListToolbar\n */\nexport const parseFiltersFromUrl = (searchParams: SecurityGroupsSearchParams): SelectedFilter[] => {\n const filters: SelectedFilter[] = []\n\n // Shared filter\n if (searchParams.shared && isKnownSecurityGroupFilter(\"shared\", searchParams.shared)) {\n filters.push({ name: \"shared\", value: searchParams.shared })\n }\n\n // Stateful filter\n if (searchParams.stateful && isKnownSecurityGroupFilter(\"stateful\", searchParams.stateful)) {\n filters.push({ name: \"stateful\", value: searchParams.stateful })\n }\n\n return filters\n}\n\n/**\n * Builds filter parameters for API request from SelectedFilter array\n */\nexport const buildFilterParams = (\n selectedFilters: SelectedFilter[],\n filterDefinitions: Filter[]\n): Record<string, string> => {\n const params: Record<string, string> = {}\n\n if (!selectedFilters?.length) return params\n\n // Group selected filters by filter name\n const filterGroups = selectedFilters\n .filter((sf) => !sf.inactive)\n .reduce(\n (acc, sf) => {\n if (!acc[sf.name]) acc[sf.name] = []\n acc[sf.name].push(sf.value)\n return acc\n },\n {} as Record<string, string[]>\n )\n\n // Build parameters based on whether filter supports multiple values\n Object.entries(filterGroups).forEach(([filterName, values]) => {\n const filterDef = filterDefinitions.find((f) => f.filterName === filterName)\n\n if (filterDef?.supportsMultiValue && values.length > 1) {\n params[filterName] = `in:${values.join(\",\")}`\n } else {\n params[filterName] = values[0]\n }\n })\n\n return params\n}\n\n/**\n * Merges a newly selected filter into the current list.\n * - Ignores duplicates (same name + value).\n * - For single-value filters, replaces any existing entry with the same name.\n * - For multi-value filters, appends.\n */\nexport const applyFilterSelection = (\n current: SelectedFilter[],\n selected: SelectedFilter,\n filterDefinitions: Filter[]\n): SelectedFilter[] => {\n const alreadySelected = current.some((f) => f.name === selected.name && f.value === selected.value)\n if (alreadySelected) return current\n\n const supportsMulti = filterDefinitions.find((f) => f.filterName === selected.name)?.supportsMultiValue\n return supportsMulti ? [...current, selected] : [...current.filter((f) => f.name !== selected.name), selected]\n}\n\n/**\n * Builds URL search params object from filter settings for navigation\n */\nexport const buildUrlSearchParams = (\n selectedFilters: SelectedFilter[],\n filterDefinitions: Filter[],\n baseParams: {\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n }\n): SecurityGroupsSearchParams => {\n const newParams: SecurityGroupsSearchParams = {\n search: baseParams.search,\n sortBy: baseParams.sortBy,\n sortDirection: baseParams.sortDirection,\n }\n\n if (!selectedFilters?.length) return newParams\n\n const filterGroups = selectedFilters\n .filter((sf) => !sf.inactive)\n .reduce(\n (acc, sf) => {\n if (!acc[sf.name]) acc[sf.name] = []\n acc[sf.name].push(sf.value)\n return acc\n },\n {} as Record<string, string[]>\n )\n\n Object.entries(filterGroups).forEach(([filterName, values]) => {\n const filterDef = filterDefinitions.find((f) => f.filterName === filterName)\n\n if (filterDef?.supportsMultiValue && values.length > 1) {\n // Type assertion needed because we're dynamically setting filter fields\n ;(newParams as Record<string, string>)[filterName] = `in:${values.join(\",\")}`\n } else {\n ;(newParams as Record<string, string>)[filterName] = values[0]\n }\n })\n\n return newParams\n}\n","import { useState, useEffect, useRef } from \"react\"\nimport { Trans, useLingui } from \"@lingui/react/macro\"\nimport { useNavigate, useSearch } from \"@tanstack/react-router\"\nimport { Button, Stack, DataGridToolbar, SearchInput, Message, toast } from \"@cloudoperators/juno-ui-components\"\nimport { CreateSecurityGroupInput, UpdateSecurityGroupInput } from \"@/server/Network/types/securityGroup\"\nimport { ContentHeader } from \"@/client/components/ContentHeader/ContentHeader\"\nimport { trpcReact } from \"@/client/trpcClient\"\nimport { SortInput } from \"@/client/components/ListToolbar/SortInput\"\nimport { SelectedFilters } from \"@/client/components/ListToolbar/SelectedFilters\"\nimport { FiltersInput } from \"@/client/components/ListToolbar/FiltersInput\"\nimport { FilterSettings, SortSettings } from \"@/client/components/ListToolbar/types\"\nimport { SecurityGroupListContainer } from \"./SecurityGroupListContainer\"\nimport { CreateSecurityGroupModal } from \"./-modals/CreateSecurityGroupModal\"\nimport { useSecurityGroupPermissions } from \"../-hooks/useSecurityGroupPermissions\"\nimport { parseFiltersFromUrl, buildUrlSearchParams, applyFilterSelection } from \"../urlHelpers\"\nimport { buildSecurityGroupFilterParams, buildSecurityGroupFilters } from \"../filterConfig\"\nimport {\n getSecurityGroupDeletedToast,\n getSecurityGroupDeleteErrorToast,\n getSecurityGroupUpdatedToast,\n getSecurityGroupUpdateErrorToast,\n} from \"./SecurityGroupToastNotifications\"\n\nconst SEARCH_DEBOUNCE_MS = 500\n\ntype SecurityGroupSortKey = \"name\" | \"project_id\"\n\ntype SecurityGroupsSearchParams = {\n shared?: string\n stateful?: string\n search?: string\n sortBy?: string\n sortDirection?: \"asc\" | \"desc\"\n}\n\ntype RequiredSortSettings = {\n options: SortSettings[\"options\"]\n sortBy: string\n sortDirection: \"asc\" | \"desc\"\n}\n\ninterface SecurityGroupsProps {\n project: string\n}\n\nexport const SecurityGroups = ({ project: projectId }: SecurityGroupsProps) => {\n const { t } = useLingui()\n const navigate = useNavigate()\n const searchParams = useSearch({ strict: false }) as SecurityGroupsSearchParams\n\n const [sortSettings, setSortSettings] = useState<RequiredSortSettings>({\n options: [{ label: t`Name`, value: \"name\" }],\n sortBy: searchParams.sortBy || \"name\",\n sortDirection: searchParams.sortDirection || \"asc\",\n })\n\n const [filterSettings, setFilterSettings] = useState<FilterSettings>({\n filters: buildSecurityGroupFilters({ shared: t`Shared`, stateful: t`Stateful`, yes: t`Yes`, no: t`No` }),\n selectedFilters: parseFiltersFromUrl(searchParams),\n })\n\n const [localSearchTerm, setLocalSearchTerm] = useState(searchParams.search || \"\")\n const debounceTimer = useRef<number | undefined>(undefined)\n const [createModalOpen, setCreateModalOpen] = useState(false)\n const [deleteError, setDeleteError] = useState<string | null>(null)\n const [createError, setCreateError] = useState<string | null>(null)\n const [updateError, setUpdateError] = useState<string | null>(null)\n\n const utils = trpcReact.useUtils()\n\n useEffect(() => () => clearTimeout(debounceTimer.current), [])\n\n useEffect(() => {\n setSortSettings((prev) => ({\n ...prev,\n sortBy: searchParams.sortBy || \"name\",\n sortDirection: searchParams.sortDirection || \"asc\",\n }))\n setFilterSettings((prev) => ({\n ...prev,\n selectedFilters: parseFiltersFromUrl(searchParams),\n }))\n // Only sync the input from the URL when there's no debounced search \"in flight\" — otherwise\n // this effect would clobber characters the user typed while the debounce timer was pending.\n if (debounceTimer.current === undefined) {\n setLocalSearchTerm(searchParams.search || \"\")\n }\n }, [searchParams.sortBy, searchParams.sortDirection, searchParams.search, searchParams.shared, searchParams.stateful])\n\n const urlFilters = parseFiltersFromUrl(searchParams)\n const urlSortBy = (searchParams.sortBy || \"name\") as SecurityGroupSortKey\n const urlSortDirection = searchParams.sortDirection || \"asc\"\n const urlSearchTerm = searchParams.search || \"\"\n\n const {\n data: securityGroupsData,\n isLoading,\n isError,\n error,\n } = trpcReact.network.securityGroup.list.useQuery(\n {\n project_id: projectId || \"\",\n sort_key: urlSortBy,\n sort_dir: urlSortDirection,\n ...buildSecurityGroupFilterParams(urlFilters),\n ...(urlSearchTerm ? { searchTerm: urlSearchTerm } : {}),\n },\n {\n refetchOnWindowFocus: false,\n placeholderData: (prev) => prev,\n }\n )\n\n const securityGroups = securityGroupsData || []\n const listError = isError\n ? error?.data?.code === \"FORBIDDEN\"\n ? t`You do not have permission to view security groups`\n : error.message || t`Failed to Load Security Groups`\n : null\n\n const { permissions } = useSecurityGroupPermissions(projectId)\n\n const createSecurityGroupMutation = trpcReact.network.securityGroup.create.useMutation({\n onSuccess: (createdSecurityGroup) => {\n utils.network.securityGroup.list.invalidate()\n utils.network.securityGroup.getById.invalidate()\n setCreateError(null)\n navigate({\n to: \"/projects/$projectId/network/securitygroups/$securityGroupId\",\n params: {\n projectId,\n securityGroupId: createdSecurityGroup.id,\n },\n })\n },\n onError: (error) => {\n setCreateError(error.message || t`Failed to create security group`)\n },\n })\n\n const deleteSecurityGroupMutation = trpcReact.network.securityGroup.deleteById.useMutation({\n onSuccess: () => {\n utils.network.securityGroup.list.invalidate()\n utils.network.securityGroup.getById.invalidate()\n setDeleteError(null)\n },\n onError: (error) => {\n setDeleteError(error.message || t`Failed to delete security group`)\n const { message, ...options } = getSecurityGroupDeleteErrorToast(error.message)\n toast.error(message, options)\n },\n })\n\n const updateSecurityGroupMutation = trpcReact.network.securityGroup.update.useMutation({\n onSuccess: () => {\n utils.network.securityGroup.list.invalidate()\n utils.network.securityGroup.getById.invalidate()\n setUpdateError(null)\n },\n onError: (error) => {\n setUpdateError(error.message || t`Failed to update security group`)\n const { message, ...options } = getSecurityGroupUpdateErrorToast(error.message)\n toast.error(message, options)\n },\n })\n\n const handleCreateSecurityGroup = async (securityGroupData: Omit<CreateSecurityGroupInput, \"project_id\">) => {\n setCreateError(null)\n try {\n await createSecurityGroupMutation.mutateAsync({ project_id: projectId, ...securityGroupData })\n } catch {\n // onError handles error state and UI feedback\n }\n }\n\n const handleDeleteSecurityGroup = (securityGroupId: string) => {\n setDeleteError(null)\n const sgName = securityGroups.find((sg) => sg.id === securityGroupId)?.name || securityGroupId\n deleteSecurityGroupMutation.mutate(\n { project_id: projectId, securityGroupId },\n {\n onSuccess: () => {\n const { message, ...options } = getSecurityGroupDeletedToast(sgName)\n toast.success(message, options)\n },\n }\n )\n }\n\n const handleUpdateSecurityGroup = async (\n securityGroupId: string,\n data: Omit<UpdateSecurityGroupInput, \"securityGroupId\" | \"project_id\">\n ) => {\n setUpdateError(null)\n const sgName = data.name || securityGroups.find((sg) => sg.id === securityGroupId)?.name || securityGroupId\n try {\n await updateSecurityGroupMutation.mutateAsync({ project_id: projectId, securityGroupId, ...data })\n const { message, ...options } = getSecurityGroupUpdatedToast(sgName)\n toast.success(message, options)\n } catch {\n // onError handles error state and UI feedback\n }\n }\n\n const handleClearUpdateError = () => {\n setUpdateError(null)\n }\n\n const handleSortChange = (newSortSettings: SortSettings) => {\n const settings: RequiredSortSettings = {\n options: newSortSettings.options,\n sortBy: newSortSettings.sortBy?.toString() || \"name\",\n sortDirection: newSortSettings.sortDirection || \"asc\",\n }\n setSortSettings(settings)\n navigate({\n search: ((prev: SecurityGroupsSearchParams) => ({\n ...prev,\n sortBy: settings.sortBy,\n sortDirection: settings.sortDirection,\n })) as unknown as true,\n replace: true,\n })\n }\n\n const handleFilterChange = (newFilterSettings: FilterSettings) => {\n setFilterSettings(newFilterSettings)\n navigate({\n search: ((prev: SecurityGroupsSearchParams) =>\n buildUrlSearchParams(newFilterSettings.selectedFilters || [], newFilterSettings.filters, {\n search: prev.search,\n sortBy: prev.sortBy,\n sortDirection: prev.sortDirection,\n })) as unknown as true,\n replace: true,\n })\n }\n\n const handleSearchChange = (term: string) => {\n navigate({\n search: ((prev: SecurityGroupsSearchParams) => ({\n ...prev,\n search: term || undefined,\n })) as unknown as true,\n replace: true,\n })\n }\n\n return (\n <>\n <ContentHeader title={t`Security Groups`} projectId={projectId} />\n\n {/* Non-blocking error banner for refetch failures with cached data */}\n {isError && securityGroups.length > 0 && (\n <Message variant=\"error\" className=\"mb-4\">\n {listError}\n </Message>\n )}\n\n <Stack direction=\"vertical\" className=\"juno-pattern-datagrid-outer\">\n <Stack direction=\"vertical\" className=\"juno-pattern-datagrid-header\">\n {/* Zone 1: sort + primary action */}\n <Stack distribution=\"end\" alignment=\"center\" gap=\"2\" className=\"pb-2\">\n <Stack gap=\"2\">\n <SortInput\n options={sortSettings.options}\n sortBy={sortSettings.sortBy}\n sortDirection={sortSettings.sortDirection ?? \"asc\"}\n selectClassName=\"min-w-40\"\n onSortByChange={(v) =>\n handleSortChange({ ...sortSettings, sortBy: v, sortDirection: sortSettings.sortDirection })\n }\n onSortDirectionChange={(dir) => handleSortChange({ ...sortSettings, sortDirection: dir })}\n />\n {permissions.canCreate && (\n <Button onClick={() => setCreateModalOpen(true)} variant=\"primary\" className=\"whitespace-nowrap\">\n <Trans>Create Security Group</Trans>\n </Button>\n )}\n </Stack>\n </Stack>\n\n {/* Zone 2: filters, search, active filter pills */}\n <DataGridToolbar>\n <Stack direction=\"vertical\" gap=\"2\">\n <Stack distribution=\"between\" alignment=\"center\">\n <FiltersInput\n filters={filterSettings.filters}\n selectClassName=\"sm:min-w-40\"\n comboboxClassName=\"sm:min-w-40\"\n onChange={(selected) => {\n const newSelected = applyFilterSelection(\n filterSettings.selectedFilters || [],\n selected,\n filterSettings.filters\n )\n if (newSelected === (filterSettings.selectedFilters || [])) return\n handleFilterChange({ ...filterSettings, selectedFilters: newSelected })\n }}\n />\n <SearchInput\n // The wrapper is inline-block/w-auto and the input reserves pr-16 for its icons, so at\n // the browser's default input width this placeholder gets cut off mid-ellipsis.\n className=\"w-60 sm:w-68\"\n placeholder={t`Search security groups...`}\n data-testid=\"searchbar\"\n value={localSearchTerm}\n onInput={(e: React.FormEvent<HTMLInputElement>) => {\n const v = e.currentTarget.value\n setLocalSearchTerm(v)\n clearTimeout(debounceTimer.current)\n debounceTimer.current = window.setTimeout(() => {\n debounceTimer.current = undefined\n handleSearchChange(v)\n }, SEARCH_DEBOUNCE_MS)\n }}\n onSearch={(v) => {\n clearTimeout(debounceTimer.current)\n debounceTimer.current = undefined\n handleSearchChange(typeof v === \"string\" ? v : \"\")\n }}\n onClear={() => {\n clearTimeout(debounceTimer.current)\n debounceTimer.current = undefined\n setLocalSearchTerm(\"\")\n handleSearchChange(\"\")\n }}\n />\n </Stack>\n {filterSettings.selectedFilters && filterSettings.selectedFilters.length > 0 && (\n <SelectedFilters\n selectedFilters={filterSettings.selectedFilters}\n filters={filterSettings.filters}\n onDelete={(filterToRemove) =>\n handleFilterChange({\n ...filterSettings,\n selectedFilters: (filterSettings.selectedFilters || []).filter(\n (f) => !(f.name === filterToRemove.name && f.value === filterToRemove.value)\n ),\n })\n }\n onClear={() => handleFilterChange({ ...filterSettings, selectedFilters: [] })}\n />\n )}\n </Stack>\n </DataGridToolbar>\n </Stack>\n\n {/* Renders <DataGrid> as a direct child; its Edit/Delete modals portal and add no in-flow DOM */}\n <SecurityGroupListContainer\n securityGroups={securityGroups}\n isLoading={isLoading}\n isError={isError && securityGroups.length === 0}\n error={listError ? { message: listError } : null}\n permissions={permissions}\n onCreateClick={() => setCreateModalOpen(true)}\n onDeleteSecurityGroup={handleDeleteSecurityGroup}\n isDeletingSecurityGroup={deleteSecurityGroupMutation.isPending}\n deleteError={deleteError}\n onUpdateSecurityGroup={handleUpdateSecurityGroup}\n isUpdatingSecurityGroup={updateSecurityGroupMutation.isPending}\n updateError={updateError}\n currentProjectId={projectId}\n hasAnyBulkAction={false}\n onClearUpdateError={handleClearUpdateError}\n />\n </Stack>\n\n <CreateSecurityGroupModal\n isOpen={createModalOpen}\n onClose={() => {\n setCreateError(null)\n setCreateModalOpen(false)\n }}\n onCreate={handleCreateSecurityGroup}\n isLoading={createSecurityGroupMutation.isPending}\n error={createError}\n />\n </>\n )\n}\n","import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { SecurityGroups } from \"./-components/SecurityGroupsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/securitygroups/\")({\n staticData: {\n section: \"network\",\n service: \"securitygroups\",\n analytics: {\n name: \"network.securitygroups.list\",\n },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Security Groups` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n\n return <SecurityGroups project={projectId} />\n}\n"],"mappings":"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"}
|
|
@@ -7,9 +7,9 @@ var r = e("/_auth/projects/$projectId/network/securitygroups/")({
|
|
|
7
7
|
analytics: { name: "network.securitygroups.list" }
|
|
8
8
|
},
|
|
9
9
|
head: () => ({ meta: [{ title: n._({ id: "4opp4r" }) }] }),
|
|
10
|
-
component: t(() => import("./securitygroups-
|
|
10
|
+
component: t(() => import("./securitygroups-CSmsBzUb.mjs"), "component")
|
|
11
11
|
});
|
|
12
12
|
//#endregion
|
|
13
13
|
export { r as t };
|
|
14
14
|
|
|
15
|
-
//# sourceMappingURL=securitygroups-
|
|
15
|
+
//# sourceMappingURL=securitygroups-T7kaNFEp.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securitygroups-
|
|
1
|
+
{"version":3,"file":"securitygroups-T7kaNFEp.mjs","names":["createFileRoute","t","Route","staticData","section","service","analytics","name","RouteInfo","head","meta","title","component","lazyRouteComponent","$$splitComponentImporter"],"sources":["../../src/client/routes/_auth/projects/$projectId/network/securitygroups/index.tsx"],"sourcesContent":["import { createFileRoute } from \"@tanstack/react-router\"\nimport { t } from \"@lingui/core/macro\"\nimport { SecurityGroups } from \"./-components/SecurityGroupsList\"\nimport type { RouteInfo } from \"@/client/routes/routeInfo\"\n\nexport const Route = createFileRoute(\"/_auth/projects/$projectId/network/securitygroups/\")({\n staticData: {\n section: \"network\",\n service: \"securitygroups\",\n analytics: {\n name: \"network.securitygroups.list\",\n },\n } satisfies RouteInfo,\n head: () => ({ meta: [{ title: t`Security Groups` }] }),\n component: RouteComponent,\n})\n\nfunction RouteComponent() {\n const { projectId } = Route.useParams()\n const { trpcClient } = Route.useRouteContext()\n\n if (!trpcClient) {\n throw new Error(\"trpcClient is not available in route context\")\n }\n\n return <SecurityGroups project={projectId} />\n}\n"],"mappings":";;AAKA,IAAaE,IAAQF,EAAgB,oDAAA,CAAA,CAAsD;CACzFG,YAAY;EACVC,SAAS;EACTC,SAAS;EACTC,WAAW,EACTC,MAAM,8BACR;CACF;CACAE,aAAa,EAAEC,MAAM,CAAC,EAAEC,OAAOV,EAAAA,EAAC,EAAA,IAAA,SAAA,CAAA,EAAkB,CAAC,EAAE;CACrDW,WAASC,iDAAA,WAAA;AACX,CAAA"}
|
|
@@ -339,7 +339,6 @@ export declare const trpcReactClient: TRPCClient<import('@trpc/server').TRPCBuil
|
|
|
339
339
|
sort_dir?: "asc" | "desc" | undefined;
|
|
340
340
|
name?: string | undefined;
|
|
341
341
|
description?: string | undefined;
|
|
342
|
-
tenant_id?: string | undefined;
|
|
343
342
|
shared?: boolean | undefined;
|
|
344
343
|
tags?: string | undefined;
|
|
345
344
|
tags_any?: string | undefined;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { useLingui as e } from "@lingui/react";
|
|
2
|
+
//#region src/client/utils/useErrorTranslation.ts
|
|
3
|
+
var t = () => {
|
|
4
|
+
let { i18n: t, _: n } = e();
|
|
5
|
+
return {
|
|
6
|
+
translateError: (e) => {
|
|
7
|
+
switch (e) {
|
|
8
|
+
case "FLAVORS_UNAUTHORIZED": return t._({ id: "1iUuTT" });
|
|
9
|
+
case "FLAVORS_FORBIDDEN": return t._({ id: "mSLePW" });
|
|
10
|
+
case "FLAVORS_NOT_FOUND": return t._({ id: "EQnVgi" });
|
|
11
|
+
case "FLAVORS_SERVER_ERROR": return t._({ id: "Hivb/4" });
|
|
12
|
+
case "FLAVORS_FETCH_FAILED": return t._({ id: "EztMB8" });
|
|
13
|
+
case "FLAVORS_PARSE_ERROR": return t._({ id: "t1fq6V" });
|
|
14
|
+
case "GET_FLAVOR_DETAILS_UNAUTHORIZED": return t._({ id: "zCD96i" });
|
|
15
|
+
case "GET_FLAVOR_DETAILS_FORBIDDEN": return t._({ id: "/9Squ9" });
|
|
16
|
+
case "GET_FLAVOR_DETAILS_NOT_FOUND": return t._({ id: "HxTYrE" });
|
|
17
|
+
case "GET_FLAVOR_DETAILS_SERVER_ERROR": return t._({ id: "KJC+M7" });
|
|
18
|
+
case "GET_FLAVOR_DETAILS_INVALID_ID": return t._({ id: "YUU0QW" });
|
|
19
|
+
case "GET_FLAVOR_DETAILS_PARSE_ERROR": return t._({ id: "ZUmOzn" });
|
|
20
|
+
case "GET_FLAVOR_DETAILS_FAILED": return t._({ id: "RCr0yv" });
|
|
21
|
+
case "CREATE_FLAVOR_INVALID_DATA": return t._({ id: "0kCt7e" });
|
|
22
|
+
case "CREATE_FLAVOR_UNAUTHORIZED": return t._({ id: "oDkgME" });
|
|
23
|
+
case "CREATE_FLAVOR_FORBIDDEN": return t._({ id: "cPKL6O" });
|
|
24
|
+
case "CREATE_FLAVOR_CONFLICT": return t._({ id: "OlmKCg" });
|
|
25
|
+
case "CREATE_FLAVOR_SERVER_ERROR": return t._({ id: "qaAo9Y" });
|
|
26
|
+
case "CREATE_FLAVOR_FAILED": return t._({ id: "QuJSSl" });
|
|
27
|
+
case "DELETE_FLAVOR_UNAUTHORIZED": return t._({ id: "2gH+i8" });
|
|
28
|
+
case "DELETE_FLAVOR_FORBIDDEN": return t._({ id: "EPMHs9" });
|
|
29
|
+
case "DELETE_FLAVOR_NOT_FOUND": return t._({ id: "rIi6x4" });
|
|
30
|
+
case "DELETE_FLAVOR_SERVER_ERROR": return t._({ id: "tASa/P" });
|
|
31
|
+
case "DELETE_FLAVOR_FAILED": return t._({ id: "h3P8z+" });
|
|
32
|
+
case "DELETE_FLAVOR_INVALID_ID": return t._({ id: "YUU0QW" });
|
|
33
|
+
case "CREATE_EXTRA_SPECS_UNAUTHORIZED": return t._({ id: "RTQFAw" });
|
|
34
|
+
case "CREATE_EXTRA_SPECS_FORBIDDEN": return t._({ id: "kGmM/p" });
|
|
35
|
+
case "CREATE_EXTRA_SPECS_NOT_FOUND": return t._({ id: "HxTYrE" });
|
|
36
|
+
case "CREATE_EXTRA_SPECS_CONFLICT": return t._({ id: "6oolxV" });
|
|
37
|
+
case "CREATE_EXTRA_SPECS_INVALID_DATA": return t._({ id: "JoECY1" });
|
|
38
|
+
case "CREATE_EXTRA_SPECS_SERVER_ERROR": return t._({ id: "jMc/mo" });
|
|
39
|
+
case "CREATE_EXTRA_SPECS_PARSE_ERROR": return t._({ id: "07WXfc" });
|
|
40
|
+
case "CREATE_EXTRA_SPECS_FAILED": return t._({ id: "7BpykL" });
|
|
41
|
+
case "GET_EXTRA_SPECS_UNAUTHORIZED": return t._({ id: "3nWqQW" });
|
|
42
|
+
case "GET_EXTRA_SPECS_FORBIDDEN": return t._({ id: "wcUecy" });
|
|
43
|
+
case "GET_EXTRA_SPECS_NOT_FOUND": return t._({ id: "M470oJ" });
|
|
44
|
+
case "GET_EXTRA_SPECS_SERVER_ERROR": return t._({ id: "tIrNgH" });
|
|
45
|
+
case "GET_EXTRA_SPECS_PARSE_ERROR": return t._({ id: "07WXfc" });
|
|
46
|
+
case "GET_EXTRA_SPECS_FAILED": return t._({ id: "lhIa6x" });
|
|
47
|
+
case "DELETE_EXTRA_SPEC_UNAUTHORIZED": return t._({ id: "dVdc7N" });
|
|
48
|
+
case "DELETE_EXTRA_SPEC_FORBIDDEN": return t._({ id: "YrAy/S" });
|
|
49
|
+
case "DELETE_EXTRA_SPEC_NOT_FOUND": return t._({ id: "vBUQNE" });
|
|
50
|
+
case "DELETE_EXTRA_SPEC_SERVER_ERROR": return t._({ id: "0kc0zi" });
|
|
51
|
+
case "DELETE_EXTRA_SPEC_INVALID_KEY": return t._({ id: "ylfbpz" });
|
|
52
|
+
case "DELETE_EXTRA_SPEC_FAILED": return t._({ id: "TfdeUd" });
|
|
53
|
+
case "GET_FLAVOR_ACCESS_UNAUTHORIZED": return t._({ id: "Mt6sRo" });
|
|
54
|
+
case "GET_FLAVOR_ACCESS_FORBIDDEN": return t._({ id: "MbKJNP" });
|
|
55
|
+
case "GET_FLAVOR_ACCESS_NOT_FOUND": return t._({ id: "HxTYrE" });
|
|
56
|
+
case "GET_FLAVOR_ACCESS_SERVER_ERROR": return t._({ id: "YsOJlj" });
|
|
57
|
+
case "GET_FLAVOR_ACCESS_FAILED": return t._({ id: "bISG26" });
|
|
58
|
+
case "ADD_TENANT_ACCESS_FAILED": return t._({ id: "rIe0oV" });
|
|
59
|
+
case "ADD_TENANT_ACCESS_INVALID_DATA": return t._({ id: "gztCjq" });
|
|
60
|
+
case "ADD_TENANT_ACCESS_UNAUTHORIZED": return t._({ id: "+Lt5cp" });
|
|
61
|
+
case "ADD_TENANT_ACCESS_FORBIDDEN": return t._({ id: "8s0tOH" });
|
|
62
|
+
case "ADD_TENANT_ACCESS_NOT_FOUND": return t._({ id: "1rPB1p" });
|
|
63
|
+
case "ADD_TENANT_ACCESS_CONFLICT": return t._({ id: "NRMm0E" });
|
|
64
|
+
case "ADD_TENANT_ACCESS_SERVER_ERROR": return t._({ id: "KoQP4F" });
|
|
65
|
+
case "REMOVE_TENANT_ACCESS_FAILED": return t._({ id: "ZhVSpK" });
|
|
66
|
+
case "REMOVE_TENANT_ACCESS_INVALID_DATA": return t._({ id: "gztCjq" });
|
|
67
|
+
case "REMOVE_TENANT_ACCESS_UNAUTHORIZED": return t._({ id: "78+riR" });
|
|
68
|
+
case "REMOVE_TENANT_ACCESS_FORBIDDEN": return t._({ id: "qs+BrU" });
|
|
69
|
+
case "REMOVE_TENANT_ACCESS_NOT_FOUND": return t._({ id: "Do5/uH" });
|
|
70
|
+
case "REMOVE_TENANT_ACCESS_CONFLICT": return t._({ id: "+nQTmZ" });
|
|
71
|
+
case "REMOVE_TENANT_ACCESS_SERVER_ERROR": return t._({ id: "0BSSYj" });
|
|
72
|
+
case "COMPUTE_SERVICE_UNAVAILABLE": return t._({ id: "gGdfWx" });
|
|
73
|
+
case "COMPUTE_SERVICE_CONNECTION_FAILED": return t._({ id: "Qg4EG6" });
|
|
74
|
+
default: return t._({ id: "byKna+" });
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
isRetryableError: (e) => ["FLAVORS_SERVER_ERROR", "FLAVORS_FETCH_FAILED"].includes(e)
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
//#endregion
|
|
81
|
+
export { t };
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=useErrorTranslation-Dc0eE8Zt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useErrorTranslation-Dc0eE8Zt.mjs","names":["useErrorTranslation","useLingui","translateError","errorCode","t","isRetryableError","includes"],"sources":["../../src/client/utils/useErrorTranslation.ts"],"sourcesContent":["import { useLingui } from \"@lingui/react/macro\"\n\nexport const useErrorTranslation = () => {\n const { t } = useLingui()\n\n const translateError = (errorCode: string): string => {\n switch (errorCode) {\n // List Flavor\n case \"FLAVORS_UNAUTHORIZED\":\n return t`Your session has expired. Please log in again.`\n case \"FLAVORS_FORBIDDEN\":\n return t`You don't have permission to access flavors for this project.`\n case \"FLAVORS_NOT_FOUND\":\n return t`Flavor service is not available for this project.`\n case \"FLAVORS_SERVER_ERROR\":\n return t`Server is experiencing issues. Please try again later.`\n case \"FLAVORS_FETCH_FAILED\":\n return t`Failed to fetch flavors from server.`\n case \"FLAVORS_PARSE_ERROR\":\n return t`Server returned unexpected data format.`\n\n // Get flavor\n case \"GET_FLAVOR_DETAILS_UNAUTHORIZED\":\n return t`You are not authorized to view flavor details. Please log in again.`\n case \"GET_FLAVOR_DETAILS_FORBIDDEN\":\n return t`You don't have permission to view this flavor's details.`\n case \"GET_FLAVOR_DETAILS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"GET_FLAVOR_DETAILS_SERVER_ERROR\":\n return t`Server error occurred while fetching flavor details. Please try again later.`\n case \"GET_FLAVOR_DETAILS_INVALID_ID\":\n return t`Flavor ID is required and cannot be empty.`\n case \"GET_FLAVOR_DETAILS_PARSE_ERROR\":\n return t`Server returned unexpected data format for flavor details.`\n case \"GET_FLAVOR_DETAILS_FAILED\":\n return t`Failed to load flavor details. Please try again.`\n\n // Create Flavor\n case \"CREATE_FLAVOR_INVALID_DATA\":\n return t`The flavor data provided is invalid. Please check your input.`\n case \"CREATE_FLAVOR_UNAUTHORIZED\":\n return t`You are not authorized to create flavors. Please log in again.`\n case \"CREATE_FLAVOR_FORBIDDEN\":\n return t`You don't have permission to create flavors in this project.`\n case \"CREATE_FLAVOR_CONFLICT\":\n return t`A flavor with this ID or name already exists. Please use different values.`\n case \"CREATE_FLAVOR_SERVER_ERROR\":\n return t`Server error occurred while creating the flavor. Please try again later.`\n case \"CREATE_FLAVOR_FAILED\":\n return t`Failed to create the flavor. Please try again.`\n\n // Delete Flavor\n case \"DELETE_FLAVOR_UNAUTHORIZED\":\n return t`You are not authorized to delete flavors. Please log in again.`\n case \"DELETE_FLAVOR_FORBIDDEN\":\n return t`You don't have permission to delete flavors in this project.`\n case \"DELETE_FLAVOR_NOT_FOUND\":\n return t`The flavor could not be found. It may have already been deleted.`\n case \"DELETE_FLAVOR_SERVER_ERROR\":\n return t`Server error occurred while deleting the flavor. Please try again later.`\n case \"DELETE_FLAVOR_FAILED\":\n return t`Failed to delete the flavor. Please try again.`\n case \"DELETE_FLAVOR_INVALID_ID\":\n return t`Flavor ID is required and cannot be empty.`\n\n // Create Metadata\n case \"CREATE_EXTRA_SPECS_UNAUTHORIZED\":\n return t`You are not authorized to create extra specs. Please log in again.`\n case \"CREATE_EXTRA_SPECS_FORBIDDEN\":\n return t`You don't have permission to create extra specs for this flavor.`\n case \"CREATE_EXTRA_SPECS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"CREATE_EXTRA_SPECS_CONFLICT\":\n return t`This extra spec keys already exist. Please use different keys.`\n case \"CREATE_EXTRA_SPECS_INVALID_DATA\":\n return t`The extra spec data provided is invalid. Please check your input.`\n case \"CREATE_EXTRA_SPECS_SERVER_ERROR\":\n return t`Server error occurred while creating extra specs. Please try again later.`\n case \"CREATE_EXTRA_SPECS_PARSE_ERROR\":\n return t`Server returned unexpected data format for extra specs.`\n case \"CREATE_EXTRA_SPECS_FAILED\":\n return t`Failed to create extra specs. Please try again.`\n\n // Get Metadata\n case \"GET_EXTRA_SPECS_UNAUTHORIZED\":\n return t`You are not authorized to view extra specs. Please log in again.`\n case \"GET_EXTRA_SPECS_FORBIDDEN\":\n return t`You don't have permission to view extra specs for this flavor.`\n case \"GET_EXTRA_SPECS_NOT_FOUND\":\n return t`The flavor could not be found or has no extra specs.`\n case \"GET_EXTRA_SPECS_SERVER_ERROR\":\n return t`Server error occurred while fetching extra specs. Please try again later.`\n case \"GET_EXTRA_SPECS_PARSE_ERROR\":\n return t`Server returned unexpected data format for extra specs.`\n case \"GET_EXTRA_SPECS_FAILED\":\n return t`Failed to load extra specs. Please try again.`\n\n // Delete Metadata\n case \"DELETE_EXTRA_SPEC_UNAUTHORIZED\":\n return t`You are not authorized to delete extra specs. Please log in again.`\n case \"DELETE_EXTRA_SPEC_FORBIDDEN\":\n return t`You don't have permission to delete extra specs for this flavor.`\n case \"DELETE_EXTRA_SPEC_NOT_FOUND\":\n return t`The extra spec could not be found. It may have already been deleted.`\n case \"DELETE_EXTRA_SPEC_SERVER_ERROR\":\n return t`Server error occurred while deleting the extra spec. Please try again later.`\n case \"DELETE_EXTRA_SPEC_INVALID_KEY\":\n return t`Extra spec key is required and cannot be empty.`\n case \"DELETE_EXTRA_SPEC_FAILED\":\n return t`Failed to delete the extra spec. Please try again.`\n\n // Get Flavor Access\n case \"GET_FLAVOR_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to access flavor access information. Please log in again.`\n case \"GET_FLAVOR_ACCESS_FORBIDDEN\":\n return t`You don't have permission to access flavor access information for this flavor.`\n case \"GET_FLAVOR_ACCESS_NOT_FOUND\":\n return t`The flavor could not be found. It may have been deleted.`\n case \"GET_FLAVOR_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while fetching flavor access information. Please try again later.`\n case \"GET_FLAVOR_ACCESS_FAILED\":\n return t`Failed to fetch flavor access information. Please try again.`\n\n // Add Tenant Access\n case \"ADD_TENANT_ACCESS_FAILED\":\n return t`Failed to add tenant access to flavor. Please try again.`\n case \"ADD_TENANT_ACCESS_INVALID_DATA\":\n return t`The tenant ID provided is invalid. Please check your input.`\n case \"ADD_TENANT_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to add tenant access. Please log in again.`\n case \"ADD_TENANT_ACCESS_FORBIDDEN\":\n return t`You don't have permission to add tenant access to this flavor.`\n case \"ADD_TENANT_ACCESS_NOT_FOUND\":\n return t`The flavor or tenant could not be found. Please verify they exist.`\n case \"ADD_TENANT_ACCESS_CONFLICT\":\n return t`This tenant already has access to the flavor.`\n case \"ADD_TENANT_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while adding tenant access. Please try again later.`\n\n // Remove Tenant Access\n case \"REMOVE_TENANT_ACCESS_FAILED\":\n return t`Failed to remove tenant access from flavor. Please try again.`\n case \"REMOVE_TENANT_ACCESS_INVALID_DATA\":\n return t`The tenant ID provided is invalid. Please check your input.`\n case \"REMOVE_TENANT_ACCESS_UNAUTHORIZED\":\n return t`You are not authorized to remove tenant access. Please log in again.`\n case \"REMOVE_TENANT_ACCESS_FORBIDDEN\":\n return t`You don't have permission to remove tenant access from this flavor.`\n case \"REMOVE_TENANT_ACCESS_NOT_FOUND\":\n return t`The flavor or tenant could not be found. It may have already been removed.`\n case \"REMOVE_TENANT_ACCESS_CONFLICT\":\n return t`This tenant does not have access to the flavor.`\n case \"REMOVE_TENANT_ACCESS_SERVER_ERROR\":\n return t`Server error occurred while removing tenant access. Please try again later.`\n\n // Service Connection Errors\n case \"COMPUTE_SERVICE_UNAVAILABLE\":\n return t`The compute service is currently unavailable for this project. Please try again later.`\n case \"COMPUTE_SERVICE_CONNECTION_FAILED\":\n return t`Unable to connect to the compute service. Please check your connection and try again.`\n\n default:\n return t`An unexpected error occurred. Please try again.`\n }\n }\n\n const isRetryableError = (errorCode: string): boolean => {\n return [\"FLAVORS_SERVER_ERROR\", \"FLAVORS_FETCH_FAILED\"].includes(errorCode)\n }\n\n return { translateError, isRetryableError }\n}\n"],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -959,7 +959,6 @@ declare const buildBaseRouter: (policyDir: string) => _trpc_server.TRPCBuiltRout
|
|
|
959
959
|
sort_dir?: "asc" | "desc" | undefined;
|
|
960
960
|
name?: string | undefined;
|
|
961
961
|
description?: string | undefined;
|
|
962
|
-
tenant_id?: string | undefined;
|
|
963
962
|
shared?: boolean | undefined;
|
|
964
963
|
tags?: string | undefined;
|
|
965
964
|
tags_any?: string | undefined;
|