@uipath/apollo-react 6.49.0 → 6.50.0

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.
Files changed (45) hide show
  1. package/dist/canvas/components/Guardrails/__fixtures__/dnd-geometry.d.ts +3 -0
  2. package/dist/canvas/components/Guardrails/__fixtures__/dnd-geometry.d.ts.map +1 -0
  3. package/dist/canvas/components/Guardrails/__fixtures__/guardrail-list.fixtures.d.ts +9 -0
  4. package/dist/canvas/components/Guardrails/__fixtures__/guardrail-list.fixtures.d.ts.map +1 -0
  5. package/dist/canvas/components/Guardrails/components/guardrail-list-row.cjs +218 -0
  6. package/dist/canvas/components/Guardrails/components/guardrail-list-row.d.ts +26 -0
  7. package/dist/canvas/components/Guardrails/components/guardrail-list-row.d.ts.map +1 -0
  8. package/dist/canvas/components/Guardrails/components/guardrail-list-row.js +184 -0
  9. package/dist/canvas/components/Guardrails/components/guardrail-status-banner.cjs +2 -0
  10. package/dist/canvas/components/Guardrails/components/guardrail-status-banner.d.ts.map +1 -1
  11. package/dist/canvas/components/Guardrails/components/guardrail-status-banner.js +2 -0
  12. package/dist/canvas/components/Guardrails/components/mixed-scopes-banner.cjs +1 -0
  13. package/dist/canvas/components/Guardrails/components/mixed-scopes-banner.d.ts.map +1 -1
  14. package/dist/canvas/components/Guardrails/components/mixed-scopes-banner.js +1 -0
  15. package/dist/canvas/components/Guardrails/guardrail-list-utils.cjs +103 -0
  16. package/dist/canvas/components/Guardrails/guardrail-list-utils.d.ts +10 -0
  17. package/dist/canvas/components/Guardrails/guardrail-list-utils.d.ts.map +1 -0
  18. package/dist/canvas/components/Guardrails/guardrail-list-utils.js +60 -0
  19. package/dist/canvas/components/Guardrails/guardrail-list.cjs +214 -0
  20. package/dist/canvas/components/Guardrails/guardrail-list.d.ts +33 -0
  21. package/dist/canvas/components/Guardrails/guardrail-list.d.ts.map +1 -0
  22. package/dist/canvas/components/Guardrails/guardrail-list.js +180 -0
  23. package/dist/canvas/components/Guardrails/i18n.cjs +124 -16
  24. package/dist/canvas/components/Guardrails/i18n.d.ts +25 -0
  25. package/dist/canvas/components/Guardrails/i18n.d.ts.map +1 -1
  26. package/dist/canvas/components/Guardrails/i18n.js +110 -14
  27. package/dist/canvas/components/Guardrails/index.cjs +40 -3
  28. package/dist/canvas/components/Guardrails/index.d.ts +10 -2
  29. package/dist/canvas/components/Guardrails/index.d.ts.map +1 -1
  30. package/dist/canvas/components/Guardrails/index.js +6 -2
  31. package/dist/canvas/components/Guardrails/list-types.cjs +18 -0
  32. package/dist/canvas/components/Guardrails/list-types.d.ts +51 -0
  33. package/dist/canvas/components/Guardrails/list-types.d.ts.map +1 -0
  34. package/dist/canvas/components/Guardrails/list-types.js +0 -0
  35. package/dist/canvas/locales/en.cjs +1 -1
  36. package/dist/canvas/locales/en.d.ts.map +1 -1
  37. package/dist/canvas/locales/en.js +1 -1
  38. package/dist/canvas/styles/tailwind.canvas.css +1 -1
  39. package/package.json +3 -2
  40. package/dist/canvas/components/Guardrails/__fixtures__/catalog-coverage.cjs +0 -83
  41. package/dist/canvas/components/Guardrails/__fixtures__/catalog-coverage.js +0 -37
  42. package/dist/canvas/components/Guardrails/__fixtures__/definitions-wire.fixtures.cjs +0 -344
  43. package/dist/canvas/components/Guardrails/__fixtures__/definitions-wire.fixtures.js +0 -280
  44. package/dist/canvas/components/Guardrails/__fixtures__/host-copy-baselines.cjs +0 -221
  45. package/dist/canvas/components/Guardrails/__fixtures__/host-copy-baselines.js +0 -184
@@ -0,0 +1,60 @@
1
+ function getGuardrailListItemId(item) {
2
+ return item.id ?? item.name;
3
+ }
4
+ function matchesGuardrailListDefinition(definition, item) {
5
+ return void 0 === item.byoValidatorName ? void 0 === definition.byoValidatorName && definition.validator === item.validatorType : definition.byoValidatorName === item.byoValidatorName;
6
+ }
7
+ function resolveGuardrailListItemState(item, definitions = []) {
8
+ const isByo = void 0 !== item.byoValidatorName;
9
+ const definition = definitions.find((candidate)=>matchesGuardrailListDefinition(candidate, item));
10
+ const byoUnavailable = isByo && definitions.length > 0 && void 0 === definition;
11
+ const byoDisabled = isByo && definition?.status === 'Disabled';
12
+ return {
13
+ definition,
14
+ status: byoUnavailable ? 'Unavailable' : definition?.status,
15
+ isByo,
16
+ provider: definition?.byoConnectorName,
17
+ byoDisabled,
18
+ byoUnavailable
19
+ };
20
+ }
21
+ function getGuardrailListChips(input, labels) {
22
+ const chips = [];
23
+ const statusChip = (()=>{
24
+ switch(input.status){
25
+ case 'FeatureDisabled':
26
+ return {
27
+ tone: 'warning',
28
+ label: labels.statusFeatureDisabled
29
+ };
30
+ case 'Unauthorised':
31
+ return {
32
+ tone: 'warning',
33
+ label: labels.statusUnauthorized
34
+ };
35
+ case 'Disabled':
36
+ return {
37
+ tone: 'error',
38
+ label: labels.statusDisabled
39
+ };
40
+ case 'Unavailable':
41
+ return {
42
+ tone: 'error',
43
+ label: labels.statusUnavailable
44
+ };
45
+ default:
46
+ return;
47
+ }
48
+ })();
49
+ if (statusChip) chips.push({
50
+ id: 'status',
51
+ ...statusChip
52
+ });
53
+ if ('governance' === input.administration) chips.push({
54
+ id: 'administration',
55
+ tone: 'neutral',
56
+ label: labels.administrationGovernance
57
+ });
58
+ return chips;
59
+ }
60
+ export { getGuardrailListChips, getGuardrailListItemId, matchesGuardrailListDefinition, resolveGuardrailListItemState };
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ GuardrailList: ()=>GuardrailList
28
+ });
29
+ const jsx_runtime_namespaceObject = require("react/jsx-runtime");
30
+ const core_namespaceObject = require("@dnd-kit/core");
31
+ const modifiers_namespaceObject = require("@dnd-kit/modifiers");
32
+ const sortable_namespaceObject = require("@dnd-kit/sortable");
33
+ const utilities_namespaceObject = require("@dnd-kit/utilities");
34
+ const apollo_wind_namespaceObject = require("@uipath/apollo-wind");
35
+ const external_lucide_react_namespaceObject = require("lucide-react");
36
+ const external_react_namespaceObject = require("react");
37
+ const guardrail_list_row_cjs_namespaceObject = require("./components/guardrail-list-row.cjs");
38
+ const external_guardrail_list_utils_cjs_namespaceObject = require("./guardrail-list-utils.cjs");
39
+ const external_i18n_cjs_namespaceObject = require("./i18n.cjs");
40
+ const DND_MODIFIERS = [
41
+ modifiers_namespaceObject.restrictToVerticalAxis,
42
+ modifiers_namespaceObject.restrictToParentElement
43
+ ];
44
+ const POINTER_SENSOR_OPTIONS = {
45
+ activationConstraint: {
46
+ distance: 8
47
+ }
48
+ };
49
+ function SortableRows({ ids, onDragEnd, children }) {
50
+ const sensors = (0, core_namespaceObject.useSensors)((0, core_namespaceObject.useSensor)(core_namespaceObject.PointerSensor, POINTER_SENSOR_OPTIONS), (0, core_namespaceObject.useSensor)(core_namespaceObject.KeyboardSensor, {
51
+ coordinateGetter: sortable_namespaceObject.sortableKeyboardCoordinates
52
+ }));
53
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(core_namespaceObject.DndContext, {
54
+ sensors: sensors,
55
+ collisionDetection: core_namespaceObject.closestCenter,
56
+ modifiers: DND_MODIFIERS,
57
+ autoScroll: false,
58
+ onDragEnd: onDragEnd,
59
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(sortable_namespaceObject.SortableContext, {
60
+ items: ids,
61
+ strategy: sortable_namespaceObject.verticalListSortingStrategy,
62
+ children: children
63
+ })
64
+ });
65
+ }
66
+ function SortableGuardrailRow({ id, item, labels, ...rowProps }) {
67
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = (0, sortable_namespaceObject.useSortable)({
68
+ id
69
+ });
70
+ const handle = /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(apollo_wind_namespaceObject.Button, {
71
+ ref: setActivatorNodeRef,
72
+ type: "button",
73
+ variant: "ghost",
74
+ size: "3xs",
75
+ icon: true,
76
+ className: "cursor-grab touch-none",
77
+ "aria-label": (0, external_i18n_cjs_namespaceObject.formatGuardrailFormMessage)(labels.reorderItem, {
78
+ name: item.name
79
+ }),
80
+ ...attributes,
81
+ ...listeners,
82
+ children: /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.GripVertical, {})
83
+ });
84
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(guardrail_list_row_cjs_namespaceObject.GuardrailListRow, {
85
+ ref: setNodeRef,
86
+ id: id,
87
+ item: item,
88
+ labels: labels,
89
+ handle: handle,
90
+ style: {
91
+ transform: utilities_namespaceObject.CSS.Translate.toString(transform),
92
+ transition,
93
+ opacity: isDragging ? 0.5 : void 0
94
+ },
95
+ ...rowProps
96
+ });
97
+ }
98
+ function GuardrailList({ guardrails, definitions, disabled = false, reorderDisabled, onEdit, onRemove, onAdd, onReorder, getItemId = external_guardrail_list_utils_cjs_namespaceObject.getGuardrailListItemId, getItemAdministration, statusChips = false, previewChip = false, byoChip = false, unstyled = false, hideHeader = false, rowActivatesEdit = false, emptyState, footer, addSlot, statusBanner, renderRowTooltip, renderItemActions, formatScopes, formatAction, labels: labelOverrides, className }) {
99
+ const labels = (0, external_i18n_cjs_namespaceObject.useGuardrailListLabels)(labelOverrides);
100
+ const rows = (0, external_react_namespaceObject.useMemo)(()=>guardrails.map((item)=>({
101
+ item,
102
+ id: getItemId(item)
103
+ })), [
104
+ guardrails,
105
+ getItemId
106
+ ]);
107
+ const ids = (0, external_react_namespaceObject.useMemo)(()=>rows.map((row)=>row.id), [
108
+ rows
109
+ ]);
110
+ const isReorderable = !(reorderDisabled ?? disabled) && void 0 !== onReorder && guardrails.length > 1;
111
+ const handleDragEnd = (0, external_react_namespaceObject.useCallback)(({ active, over })=>{
112
+ if (!onReorder || !over || active.id === over.id) return;
113
+ const from = ids.indexOf(String(active.id));
114
+ const to = ids.indexOf(String(over.id));
115
+ if (-1 === from || -1 === to) return;
116
+ onReorder((0, sortable_namespaceObject.arrayMove)(guardrails, from, to), {
117
+ from,
118
+ to,
119
+ id: String(active.id)
120
+ });
121
+ }, [
122
+ guardrails,
123
+ ids,
124
+ onReorder
125
+ ]);
126
+ const renderedRows = rows.map(({ item, id }, index)=>{
127
+ const rowProps = {
128
+ item,
129
+ id,
130
+ index,
131
+ state: (0, external_guardrail_list_utils_cjs_namespaceObject.resolveGuardrailListItemState)(item, definitions),
132
+ labels,
133
+ disabled,
134
+ administration: getItemAdministration?.(item),
135
+ statusChips,
136
+ previewChip,
137
+ byoChip,
138
+ rowActivatesEdit,
139
+ onEdit,
140
+ onRemove,
141
+ renderRowTooltip,
142
+ renderItemActions,
143
+ formatScopes,
144
+ formatAction
145
+ };
146
+ return isReorderable ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(SortableGuardrailRow, {
147
+ ...rowProps
148
+ }, id) : /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(guardrail_list_row_cjs_namespaceObject.GuardrailListRow, {
149
+ ...rowProps
150
+ }, id);
151
+ });
152
+ const content = guardrails.length > 0 ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("div", {
153
+ className: "space-y-2",
154
+ children: renderedRows
155
+ }) : void 0 === emptyState ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("p", {
156
+ className: "text-sm text-muted-foreground",
157
+ children: labels.empty
158
+ }) : emptyState;
159
+ return /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
160
+ "data-slot": "guardrail-list",
161
+ className: (0, apollo_wind_namespaceObject.cn)(!unstyled && 'rounded-md border', className),
162
+ children: [
163
+ !hideHeader && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
164
+ className: (0, apollo_wind_namespaceObject.cn)('flex items-center justify-between', !unstyled && 'px-3 py-2'),
165
+ children: [
166
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
167
+ className: "flex items-center gap-2",
168
+ children: [
169
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.Shield, {
170
+ className: "size-4 text-muted-foreground",
171
+ "aria-hidden": "true"
172
+ }),
173
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)("span", {
174
+ className: "text-sm font-medium",
175
+ children: labels.title
176
+ })
177
+ ]
178
+ }),
179
+ void 0 !== addSlot ? addSlot : onAdd && /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)(apollo_wind_namespaceObject.Button, {
180
+ type: "button",
181
+ variant: "text",
182
+ size: "2xs",
183
+ className: "w-fit p-0",
184
+ disabled: disabled,
185
+ onClick: onAdd,
186
+ children: [
187
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(external_lucide_react_namespaceObject.Plus, {}),
188
+ labels.add
189
+ ]
190
+ })
191
+ ]
192
+ }),
193
+ /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsxs)("div", {
194
+ className: (0, apollo_wind_namespaceObject.cn)('space-y-2', !unstyled && 'p-3'),
195
+ children: [
196
+ statusBanner,
197
+ isReorderable ? /*#__PURE__*/ (0, jsx_runtime_namespaceObject.jsx)(SortableRows, {
198
+ ids: ids,
199
+ onDragEnd: handleDragEnd,
200
+ children: content
201
+ }) : content,
202
+ footer
203
+ ]
204
+ })
205
+ ]
206
+ });
207
+ }
208
+ exports.GuardrailList = __webpack_exports__.GuardrailList;
209
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
210
+ "GuardrailList"
211
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
212
+ Object.defineProperty(exports, '__esModule', {
213
+ value: true
214
+ });
@@ -0,0 +1,33 @@
1
+ import { type ReactNode } from 'react';
2
+ import { type GuardrailListLabels } from './i18n';
3
+ import type { GuardrailListAdministration, GuardrailListDefinition, GuardrailListItem, GuardrailListItemActionsContext, GuardrailReorderMove, GuardrailRowTooltipRenderer } from './list-types';
4
+ export interface GuardrailListProps {
5
+ guardrails: GuardrailListItem[];
6
+ definitions?: GuardrailListDefinition[];
7
+ disabled?: boolean;
8
+ reorderDisabled?: boolean;
9
+ onEdit?: (item: GuardrailListItem) => void;
10
+ onRemove?: (item: GuardrailListItem) => void;
11
+ onAdd?: () => void;
12
+ onReorder?: (guardrails: GuardrailListItem[], move: GuardrailReorderMove) => void;
13
+ getItemId?: (item: GuardrailListItem) => string;
14
+ getItemAdministration?: (item: GuardrailListItem) => GuardrailListAdministration | undefined;
15
+ statusChips?: boolean;
16
+ previewChip?: boolean;
17
+ byoChip?: boolean;
18
+ unstyled?: boolean;
19
+ hideHeader?: boolean;
20
+ rowActivatesEdit?: boolean;
21
+ emptyState?: ReactNode;
22
+ footer?: ReactNode;
23
+ addSlot?: ReactNode;
24
+ statusBanner?: ReactNode;
25
+ renderRowTooltip?: GuardrailRowTooltipRenderer;
26
+ renderItemActions?: (ctx: GuardrailListItemActionsContext) => ReactNode;
27
+ formatScopes?: (item: GuardrailListItem) => ReactNode;
28
+ formatAction?: (item: GuardrailListItem) => ReactNode;
29
+ labels?: Partial<GuardrailListLabels>;
30
+ className?: string;
31
+ }
32
+ export declare function GuardrailList({ guardrails, definitions, disabled, reorderDisabled, onEdit, onRemove, onAdd, onReorder, getItemId, getItemAdministration, statusChips, previewChip, byoChip, unstyled, hideHeader, rowActivatesEdit, emptyState, footer, addSlot, statusBanner, renderRowTooltip, renderItemActions, formatScopes, formatAction, labels: labelOverrides, className, }: GuardrailListProps): import("react/jsx-runtime").JSX.Element;
33
+ //# sourceMappingURL=guardrail-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guardrail-list.d.ts","sourceRoot":"","sources":["../../../../src/canvas/components/Guardrails/guardrail-list.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAE,KAAK,SAAS,EAAwB,MAAM,OAAO,CAAC;AAG7D,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACV,2BAA2B,EAC3B,uBAAuB,EACvB,iBAAiB,EACjB,+BAA+B,EAC/B,oBAAoB,EACpB,2BAA2B,EAC5B,MAAM,cAAc,CAAC;AAOtB,MAAM,WAAW,kBAAkB;IAKjC,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAMhC,WAAW,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAExC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAKnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAG1B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAK3C,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAE7C,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IAKnB,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,EAAE,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAGlF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,MAAM,CAAC;IAEhD,qBAAqB,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,2BAA2B,GAAG,SAAS,CAAC;IAG7F,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,UAAU,CAAC,EAAE,SAAS,CAAC;IAEvB,MAAM,CAAC,EAAE,SAAS,CAAC;IAEnB,OAAO,CAAC,EAAE,SAAS,CAAC;IAEpB,YAAY,CAAC,EAAE,SAAS,CAAC;IAGzB,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAE/C,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,+BAA+B,KAAK,SAAS,CAAC;IAExE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS,CAAC;IAEtD,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,SAAS,CAAC;IAEtD,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAoGD,wBAAgB,aAAa,CAAC,EAC5B,UAAU,EACV,WAAW,EACX,QAAgB,EAChB,eAAe,EACf,MAAM,EACN,QAAQ,EACR,KAAK,EACL,SAAS,EACT,SAAkC,EAClC,qBAAqB,EACrB,WAAmB,EACnB,WAAmB,EACnB,OAAe,EACf,QAAgB,EAChB,UAAkB,EAClB,gBAAwB,EACxB,UAAU,EACV,MAAM,EACN,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,SAAS,GACV,EAAE,kBAAkB,2CAkGpB"}
@@ -0,0 +1,180 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { DndContext, KeyboardSensor, PointerSensor, closestCenter, useSensor, useSensors } from "@dnd-kit/core";
3
+ import { restrictToParentElement, restrictToVerticalAxis } from "@dnd-kit/modifiers";
4
+ import { SortableContext, arrayMove, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy } from "@dnd-kit/sortable";
5
+ import { CSS } from "@dnd-kit/utilities";
6
+ import { Button, cn } from "@uipath/apollo-wind";
7
+ import { GripVertical, Plus, Shield } from "lucide-react";
8
+ import { useCallback, useMemo } from "react";
9
+ import { GuardrailListRow } from "./components/guardrail-list-row.js";
10
+ import { getGuardrailListItemId, resolveGuardrailListItemState } from "./guardrail-list-utils.js";
11
+ import { formatGuardrailFormMessage, useGuardrailListLabels } from "./i18n.js";
12
+ const DND_MODIFIERS = [
13
+ restrictToVerticalAxis,
14
+ restrictToParentElement
15
+ ];
16
+ const POINTER_SENSOR_OPTIONS = {
17
+ activationConstraint: {
18
+ distance: 8
19
+ }
20
+ };
21
+ function SortableRows({ ids, onDragEnd, children }) {
22
+ const sensors = useSensors(useSensor(PointerSensor, POINTER_SENSOR_OPTIONS), useSensor(KeyboardSensor, {
23
+ coordinateGetter: sortableKeyboardCoordinates
24
+ }));
25
+ return /*#__PURE__*/ jsx(DndContext, {
26
+ sensors: sensors,
27
+ collisionDetection: closestCenter,
28
+ modifiers: DND_MODIFIERS,
29
+ autoScroll: false,
30
+ onDragEnd: onDragEnd,
31
+ children: /*#__PURE__*/ jsx(SortableContext, {
32
+ items: ids,
33
+ strategy: verticalListSortingStrategy,
34
+ children: children
35
+ })
36
+ });
37
+ }
38
+ function SortableGuardrailRow({ id, item, labels, ...rowProps }) {
39
+ const { attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isDragging } = useSortable({
40
+ id
41
+ });
42
+ const handle = /*#__PURE__*/ jsx(Button, {
43
+ ref: setActivatorNodeRef,
44
+ type: "button",
45
+ variant: "ghost",
46
+ size: "3xs",
47
+ icon: true,
48
+ className: "cursor-grab touch-none",
49
+ "aria-label": formatGuardrailFormMessage(labels.reorderItem, {
50
+ name: item.name
51
+ }),
52
+ ...attributes,
53
+ ...listeners,
54
+ children: /*#__PURE__*/ jsx(GripVertical, {})
55
+ });
56
+ return /*#__PURE__*/ jsx(GuardrailListRow, {
57
+ ref: setNodeRef,
58
+ id: id,
59
+ item: item,
60
+ labels: labels,
61
+ handle: handle,
62
+ style: {
63
+ transform: CSS.Translate.toString(transform),
64
+ transition,
65
+ opacity: isDragging ? 0.5 : void 0
66
+ },
67
+ ...rowProps
68
+ });
69
+ }
70
+ function GuardrailList({ guardrails, definitions, disabled = false, reorderDisabled, onEdit, onRemove, onAdd, onReorder, getItemId = getGuardrailListItemId, getItemAdministration, statusChips = false, previewChip = false, byoChip = false, unstyled = false, hideHeader = false, rowActivatesEdit = false, emptyState, footer, addSlot, statusBanner, renderRowTooltip, renderItemActions, formatScopes, formatAction, labels: labelOverrides, className }) {
71
+ const labels = useGuardrailListLabels(labelOverrides);
72
+ const rows = useMemo(()=>guardrails.map((item)=>({
73
+ item,
74
+ id: getItemId(item)
75
+ })), [
76
+ guardrails,
77
+ getItemId
78
+ ]);
79
+ const ids = useMemo(()=>rows.map((row)=>row.id), [
80
+ rows
81
+ ]);
82
+ const isReorderable = !(reorderDisabled ?? disabled) && void 0 !== onReorder && guardrails.length > 1;
83
+ const handleDragEnd = useCallback(({ active, over })=>{
84
+ if (!onReorder || !over || active.id === over.id) return;
85
+ const from = ids.indexOf(String(active.id));
86
+ const to = ids.indexOf(String(over.id));
87
+ if (-1 === from || -1 === to) return;
88
+ onReorder(arrayMove(guardrails, from, to), {
89
+ from,
90
+ to,
91
+ id: String(active.id)
92
+ });
93
+ }, [
94
+ guardrails,
95
+ ids,
96
+ onReorder
97
+ ]);
98
+ const renderedRows = rows.map(({ item, id }, index)=>{
99
+ const rowProps = {
100
+ item,
101
+ id,
102
+ index,
103
+ state: resolveGuardrailListItemState(item, definitions),
104
+ labels,
105
+ disabled,
106
+ administration: getItemAdministration?.(item),
107
+ statusChips,
108
+ previewChip,
109
+ byoChip,
110
+ rowActivatesEdit,
111
+ onEdit,
112
+ onRemove,
113
+ renderRowTooltip,
114
+ renderItemActions,
115
+ formatScopes,
116
+ formatAction
117
+ };
118
+ return isReorderable ? /*#__PURE__*/ jsx(SortableGuardrailRow, {
119
+ ...rowProps
120
+ }, id) : /*#__PURE__*/ jsx(GuardrailListRow, {
121
+ ...rowProps
122
+ }, id);
123
+ });
124
+ const content = guardrails.length > 0 ? /*#__PURE__*/ jsx("div", {
125
+ className: "space-y-2",
126
+ children: renderedRows
127
+ }) : void 0 === emptyState ? /*#__PURE__*/ jsx("p", {
128
+ className: "text-sm text-muted-foreground",
129
+ children: labels.empty
130
+ }) : emptyState;
131
+ return /*#__PURE__*/ jsxs("div", {
132
+ "data-slot": "guardrail-list",
133
+ className: cn(!unstyled && 'rounded-md border', className),
134
+ children: [
135
+ !hideHeader && /*#__PURE__*/ jsxs("div", {
136
+ className: cn('flex items-center justify-between', !unstyled && 'px-3 py-2'),
137
+ children: [
138
+ /*#__PURE__*/ jsxs("div", {
139
+ className: "flex items-center gap-2",
140
+ children: [
141
+ /*#__PURE__*/ jsx(Shield, {
142
+ className: "size-4 text-muted-foreground",
143
+ "aria-hidden": "true"
144
+ }),
145
+ /*#__PURE__*/ jsx("span", {
146
+ className: "text-sm font-medium",
147
+ children: labels.title
148
+ })
149
+ ]
150
+ }),
151
+ void 0 !== addSlot ? addSlot : onAdd && /*#__PURE__*/ jsxs(Button, {
152
+ type: "button",
153
+ variant: "text",
154
+ size: "2xs",
155
+ className: "w-fit p-0",
156
+ disabled: disabled,
157
+ onClick: onAdd,
158
+ children: [
159
+ /*#__PURE__*/ jsx(Plus, {}),
160
+ labels.add
161
+ ]
162
+ })
163
+ ]
164
+ }),
165
+ /*#__PURE__*/ jsxs("div", {
166
+ className: cn('space-y-2', !unstyled && 'p-3'),
167
+ children: [
168
+ statusBanner,
169
+ isReorderable ? /*#__PURE__*/ jsx(SortableRows, {
170
+ ids: ids,
171
+ onDragEnd: handleDragEnd,
172
+ children: content
173
+ }) : content,
174
+ footer
175
+ ]
176
+ })
177
+ ]
178
+ });
179
+ }
180
+ export { GuardrailList };
@@ -26,11 +26,15 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  GUARDRAIL_BUILDER_EN_LABELS: ()=>GUARDRAIL_BUILDER_EN_LABELS,
28
28
  GUARDRAIL_FORM_EN_LABELS: ()=>GUARDRAIL_FORM_EN_LABELS,
29
- useGuardrailBuilderLabels: ()=>useGuardrailBuilderLabels,
29
+ resolveGuardrailListLabels: ()=>resolveGuardrailListLabels,
30
+ GUARDRAIL_LIST_EN_LABELS: ()=>GUARDRAIL_LIST_EN_LABELS,
30
31
  resolveGuardrailFormLabels: ()=>resolveGuardrailFormLabels,
32
+ useGuardrailFormLabels: ()=>useGuardrailFormLabels,
33
+ useGuardrailBuilderLabels: ()=>useGuardrailBuilderLabels,
31
34
  resolveGuardrailBuilderLabels: ()=>resolveGuardrailBuilderLabels,
32
35
  formatGuardrailFormMessage: ()=>formatGuardrailFormMessage,
33
- useGuardrailFormLabels: ()=>useGuardrailFormLabels
36
+ useGuardrailListLabels: ()=>useGuardrailListLabels,
37
+ GUARDRAIL_LIST_EN_MESSAGES: ()=>GUARDRAIL_LIST_EN_MESSAGES
34
38
  });
35
39
  const external_react_namespaceObject = require("react");
36
40
  const index_cjs_namespaceObject = require("../../../i18n/index.cjs");
@@ -102,9 +106,9 @@ const GUARDRAIL_BUILDER_EN_LABELS = {
102
106
  recipientRequiredError: 'Recipient is required',
103
107
  actionAppRequiredError: 'Action app is required'
104
108
  };
105
- function resolveGuardrailBuilderLabels(catalog, overrides) {
109
+ function mergeLabels(defaults, catalog, overrides) {
106
110
  const merged = {
107
- ...GUARDRAIL_BUILDER_EN_LABELS
111
+ ...defaults
108
112
  };
109
113
  for (const source of [
110
114
  catalog,
@@ -115,21 +119,14 @@ function resolveGuardrailBuilderLabels(catalog, overrides) {
115
119
  }
116
120
  return merged;
117
121
  }
122
+ function resolveGuardrailBuilderLabels(catalog, overrides) {
123
+ return mergeLabels(GUARDRAIL_BUILDER_EN_LABELS, catalog, overrides);
124
+ }
118
125
  function formatGuardrailFormMessage(template, vars) {
119
126
  return template.replace(/\{\{(\w+)\}\}/g, (match, token)=>token in vars ? String(vars[token]) : match);
120
127
  }
121
128
  function resolveGuardrailFormLabels(catalog, overrides) {
122
- const merged = {
123
- ...GUARDRAIL_FORM_EN_LABELS
124
- };
125
- for (const source of [
126
- catalog,
127
- overrides
128
- ])if (source) for (const key of Object.keys(merged)){
129
- const value = source[key];
130
- if (void 0 !== value) merged[key] = value;
131
- }
132
- return merged;
129
+ return mergeLabels(GUARDRAIL_FORM_EN_LABELS, catalog, overrides);
133
130
  }
134
131
  const TEMPLATE_TOKENS = {
135
132
  name: '{{name}}',
@@ -415,21 +412,132 @@ function useGuardrailBuilderLabels(overrides) {
415
412
  overrides
416
413
  ]);
417
414
  }
415
+ function buildGuardrailListLabels(_) {
416
+ return {
417
+ title: _({
418
+ id: 'guardrails.list.title',
419
+ message: 'Guardrails'
420
+ }),
421
+ add: _({
422
+ id: 'guardrails.list.add',
423
+ message: 'Add'
424
+ }),
425
+ empty: _({
426
+ id: 'guardrails.list.empty',
427
+ message: 'No guardrails configured'
428
+ }),
429
+ reorderItem: _({
430
+ id: 'guardrails.list.reorder-item',
431
+ message: 'Reorder guardrail {name}',
432
+ values: TEMPLATE_TOKENS
433
+ }),
434
+ editItem: _({
435
+ id: 'guardrails.list.edit-item',
436
+ message: 'Edit guardrail'
437
+ }),
438
+ editRow: _({
439
+ id: 'guardrails.list.edit-row',
440
+ message: 'Edit {name}',
441
+ values: TEMPLATE_TOKENS
442
+ }),
443
+ removeItem: _({
444
+ id: 'guardrails.list.remove-item',
445
+ message: 'Remove guardrail'
446
+ }),
447
+ removeRow: _({
448
+ id: 'guardrails.list.remove-row',
449
+ message: 'Remove {name}',
450
+ values: TEMPLATE_TOKENS
451
+ }),
452
+ preview: _({
453
+ id: 'guardrails.list.preview',
454
+ message: 'Preview'
455
+ }),
456
+ byo: _({
457
+ id: 'guardrails.list.byo',
458
+ message: 'BYO'
459
+ }),
460
+ provider: _({
461
+ id: 'guardrails.list.provider',
462
+ message: 'Provider'
463
+ }),
464
+ actionUnknown: _({
465
+ id: 'guardrails.list.action-unknown',
466
+ message: 'Unknown'
467
+ }),
468
+ byoDisabledNotice: _({
469
+ id: 'guardrails.list.byo-disabled-notice',
470
+ message: "This guardrail's configuration has been disabled and can no longer be used. Contact your administrator to re-enable the configuration or replace this guardrail before running the agent."
471
+ }),
472
+ byoUnavailableNotice: _({
473
+ id: 'guardrails.list.byo-unavailable-notice',
474
+ message: "This guardrail's configuration is no longer available. Replace it before running the agent."
475
+ }),
476
+ statusFeatureDisabled: _({
477
+ id: 'guardrails.list.status-feature-disabled',
478
+ message: 'Feature disabled'
479
+ }),
480
+ statusUnauthorized: _({
481
+ id: 'guardrails.list.status-unauthorized',
482
+ message: 'Unauthorized'
483
+ }),
484
+ statusDisabled: _({
485
+ id: 'guardrails.list.status-disabled',
486
+ message: 'Disabled'
487
+ }),
488
+ statusUnavailable: _({
489
+ id: 'guardrails.list.status-unavailable',
490
+ message: 'Unavailable'
491
+ }),
492
+ administrationGovernance: _({
493
+ id: 'guardrails.list.administration-governance',
494
+ message: 'Governance managed'
495
+ })
496
+ };
497
+ }
498
+ const englishListTranslate = ({ message, values })=>values ? message.replace(/\{(\w+)\}/g, (match, token)=>values[token] ?? match) : message;
499
+ const GUARDRAIL_LIST_EN_LABELS = buildGuardrailListLabels(englishListTranslate);
500
+ const GUARDRAIL_LIST_EN_MESSAGES = Object.freeze((()=>{
501
+ const messages = {};
502
+ buildGuardrailListLabels((descriptor)=>{
503
+ messages[descriptor.id] = descriptor.message;
504
+ return descriptor.message;
505
+ });
506
+ return messages;
507
+ })());
508
+ function resolveGuardrailListLabels(catalog, overrides) {
509
+ return mergeLabels(GUARDRAIL_LIST_EN_LABELS, catalog, overrides);
510
+ }
511
+ function useGuardrailListLabels(overrides) {
512
+ const { _ } = (0, index_cjs_namespaceObject.useSafeLingui)();
513
+ return (0, external_react_namespaceObject.useMemo)(()=>resolveGuardrailListLabels(buildGuardrailListLabels(_), overrides), [
514
+ _,
515
+ overrides
516
+ ]);
517
+ }
418
518
  exports.GUARDRAIL_BUILDER_EN_LABELS = __webpack_exports__.GUARDRAIL_BUILDER_EN_LABELS;
419
519
  exports.GUARDRAIL_FORM_EN_LABELS = __webpack_exports__.GUARDRAIL_FORM_EN_LABELS;
520
+ exports.GUARDRAIL_LIST_EN_LABELS = __webpack_exports__.GUARDRAIL_LIST_EN_LABELS;
521
+ exports.GUARDRAIL_LIST_EN_MESSAGES = __webpack_exports__.GUARDRAIL_LIST_EN_MESSAGES;
420
522
  exports.formatGuardrailFormMessage = __webpack_exports__.formatGuardrailFormMessage;
421
523
  exports.resolveGuardrailBuilderLabels = __webpack_exports__.resolveGuardrailBuilderLabels;
422
524
  exports.resolveGuardrailFormLabels = __webpack_exports__.resolveGuardrailFormLabels;
525
+ exports.resolveGuardrailListLabels = __webpack_exports__.resolveGuardrailListLabels;
423
526
  exports.useGuardrailBuilderLabels = __webpack_exports__.useGuardrailBuilderLabels;
424
527
  exports.useGuardrailFormLabels = __webpack_exports__.useGuardrailFormLabels;
528
+ exports.useGuardrailListLabels = __webpack_exports__.useGuardrailListLabels;
425
529
  for(var __rspack_i in __webpack_exports__)if (-1 === [
426
530
  "GUARDRAIL_BUILDER_EN_LABELS",
427
531
  "GUARDRAIL_FORM_EN_LABELS",
532
+ "GUARDRAIL_LIST_EN_LABELS",
533
+ "GUARDRAIL_LIST_EN_MESSAGES",
428
534
  "formatGuardrailFormMessage",
429
535
  "resolveGuardrailBuilderLabels",
430
536
  "resolveGuardrailFormLabels",
537
+ "resolveGuardrailListLabels",
431
538
  "useGuardrailBuilderLabels",
432
- "useGuardrailFormLabels"
539
+ "useGuardrailFormLabels",
540
+ "useGuardrailListLabels"
433
541
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
434
542
  Object.defineProperty(exports, '__esModule', {
435
543
  value: true