@iblai/web-containers 1.62.2 → 1.62.3
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/cjs/components/chat/index.js +38 -10
- package/dist/cjs/components/chat/index.js.map +1 -1
- package/dist/cjs/components/chat-input-form.js +2 -2
- package/dist/cjs/components/chat-input-form.js.map +1 -1
- package/dist/cjs/components/profile/billing.js +9 -3
- package/dist/cjs/components/profile/billing.js.map +1 -1
- package/dist/cjs/components/spend-caps/agent-limits-section.js +3 -5
- package/dist/cjs/components/spend-caps/agent-limits-section.js.map +1 -1
- package/dist/cjs/components/spend-caps/labels.js +74 -0
- package/dist/cjs/components/spend-caps/labels.js.map +1 -1
- package/dist/cjs/components/spend-caps/new-user-default-section.js +80 -0
- package/dist/cjs/components/spend-caps/new-user-default-section.js.map +1 -0
- package/dist/cjs/components/spend-caps/row-icon-action.js +18 -0
- package/dist/cjs/components/spend-caps/row-icon-action.js.map +1 -0
- package/dist/cjs/components/spend-caps/spend-cap-fields.js +25 -0
- package/dist/cjs/components/spend-caps/spend-cap-fields.js.map +1 -0
- package/dist/cjs/components/spend-caps/spend-cap-form.js +20 -22
- package/dist/cjs/components/spend-caps/spend-cap-form.js.map +1 -1
- package/dist/cjs/components/spend-caps/spend-cap-usage.js +1 -0
- package/dist/cjs/components/spend-caps/spend-cap-usage.js.map +1 -1
- package/dist/cjs/components/spend-caps/use-platform-user-options.js +41 -0
- package/dist/cjs/components/spend-caps/use-platform-user-options.js.map +1 -0
- package/dist/cjs/components/spend-caps/use-spend-cap-status.js +26 -0
- package/dist/cjs/components/spend-caps/use-spend-cap-status.js.map +1 -0
- package/dist/cjs/components/spend-caps/use-spend-caps.js +6 -16
- package/dist/cjs/components/spend-caps/use-spend-caps.js.map +1 -1
- package/dist/cjs/components/spend-caps/user-cap-modal.js +8 -32
- package/dist/cjs/components/spend-caps/user-cap-modal.js.map +1 -1
- package/dist/cjs/components/spend-caps/user-limits-section.js +119 -0
- package/dist/cjs/components/spend-caps/user-limits-section.js.map +1 -0
- package/dist/cjs/components/spend-caps/utils.js +15 -0
- package/dist/cjs/components/spend-caps/utils.js.map +1 -1
- package/dist/cjs/i18n/messages/en.json.js +44 -3
- package/dist/cjs/i18n/messages/en.json.js.map +1 -1
- package/dist/cjs/i18n/messages/es.json.js +44 -3
- package/dist/cjs/i18n/messages/es.json.js.map +1 -1
- package/dist/cjs/i18n/messages/fr.json.js +44 -3
- package/dist/cjs/i18n/messages/fr.json.js.map +1 -1
- package/dist/cjs/i18n/messages/zh.json.js +44 -3
- package/dist/cjs/i18n/messages/zh.json.js.map +1 -1
- package/dist/cjs/web-containers/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/components/chat/index.js +39 -11
- package/dist/esm/components/chat/index.js.map +1 -1
- package/dist/esm/components/chat-input-form.js +2 -2
- package/dist/esm/components/chat-input-form.js.map +1 -1
- package/dist/esm/components/profile/billing.js +9 -3
- package/dist/esm/components/profile/billing.js.map +1 -1
- package/dist/esm/components/spend-caps/agent-limits-section.js +3 -5
- package/dist/esm/components/spend-caps/agent-limits-section.js.map +1 -1
- package/dist/esm/components/spend-caps/labels.js +74 -0
- package/dist/esm/components/spend-caps/labels.js.map +1 -1
- package/dist/esm/components/spend-caps/new-user-default-section.js +78 -0
- package/dist/esm/components/spend-caps/new-user-default-section.js.map +1 -0
- package/dist/esm/components/spend-caps/row-icon-action.js +16 -0
- package/dist/esm/components/spend-caps/row-icon-action.js.map +1 -0
- package/dist/esm/components/spend-caps/spend-cap-fields.js +23 -0
- package/dist/esm/components/spend-caps/spend-cap-fields.js.map +1 -0
- package/dist/esm/components/spend-caps/spend-cap-form.js +21 -23
- package/dist/esm/components/spend-caps/spend-cap-form.js.map +1 -1
- package/dist/esm/components/spend-caps/spend-cap-usage.js +1 -0
- package/dist/esm/components/spend-caps/spend-cap-usage.js.map +1 -1
- package/dist/esm/components/spend-caps/use-platform-user-options.js +39 -0
- package/dist/esm/components/spend-caps/use-platform-user-options.js.map +1 -0
- package/dist/esm/components/spend-caps/use-spend-cap-status.js +23 -0
- package/dist/esm/components/spend-caps/use-spend-cap-status.js.map +1 -0
- package/dist/esm/components/spend-caps/use-spend-caps.js +1 -11
- package/dist/esm/components/spend-caps/use-spend-caps.js.map +1 -1
- package/dist/esm/components/spend-caps/user-cap-modal.js +8 -32
- package/dist/esm/components/spend-caps/user-cap-modal.js.map +1 -1
- package/dist/esm/components/spend-caps/user-limits-section.js +117 -0
- package/dist/esm/components/spend-caps/user-limits-section.js.map +1 -0
- package/dist/esm/components/spend-caps/utils.js +14 -1
- package/dist/esm/components/spend-caps/utils.js.map +1 -1
- package/dist/esm/i18n/messages/en.json.js +44 -3
- package/dist/esm/i18n/messages/en.json.js.map +1 -1
- package/dist/esm/i18n/messages/es.json.js +44 -3
- package/dist/esm/i18n/messages/es.json.js.map +1 -1
- package/dist/esm/i18n/messages/fr.json.js +44 -3
- package/dist/esm/i18n/messages/fr.json.js.map +1 -1
- package/dist/esm/i18n/messages/zh.json.js +44 -3
- package/dist/esm/i18n/messages/zh.json.js.map +1 -1
- package/dist/esm/web-containers/tsconfig.build.tsbuildinfo +1 -1
- package/dist/package.json +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var sonner = require('sonner');
|
|
6
|
+
var dataLayer = require('@iblai/data-layer');
|
|
7
|
+
var capabilityGate = require('../modals/edit-mentor-modal/capability-gate.js');
|
|
8
|
+
var index = require('../spinner/index.js');
|
|
9
|
+
var context = require('../../i18n/context.js');
|
|
10
|
+
require('../../packages/i18n/dist/index.esm.js');
|
|
11
|
+
var labels = require('./labels.js');
|
|
12
|
+
var spendCapFields = require('./spend-cap-fields.js');
|
|
13
|
+
var utils = require('./utils.js');
|
|
14
|
+
var shieldAlert = require('../../node_modules/.pnpm/lucide-react@0.528.0_react@19.1.0/node_modules/lucide-react/dist/esm/icons/shield-alert.js');
|
|
15
|
+
|
|
16
|
+
function fieldsFrom(template) {
|
|
17
|
+
var _a, _b;
|
|
18
|
+
return {
|
|
19
|
+
limit: (template === null || template === void 0 ? void 0 : template.max_cost_usd) != null ? String(Number(template.max_cost_usd)) : '',
|
|
20
|
+
interval: (_a = template === null || template === void 0 ? void 0 : template.interval_type) !== null && _a !== void 0 ? _a : 'month',
|
|
21
|
+
enforcement: (_b = template === null || template === void 0 ? void 0 : template.enforcement) !== null && _b !== void 0 ? _b : 'block',
|
|
22
|
+
thresholds: template ? utils.thresholdsToInput(template.alert_thresholds) : '80, 95',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Tenant-settings Billing card for the default spend limit each member gets
|
|
27
|
+
* when they join (`spend-caps/users/default/`, iblai-platform#2513). The
|
|
28
|
+
* endpoint holds a template, not a cap: it never 404s (`enabled: false` is
|
|
29
|
+
* "off"), its PUT replaces every field, and saving it never touches the
|
|
30
|
+
* per-user rows it already created — so there is no usage strip and no
|
|
31
|
+
* Delete here, only the switch and the same fields as a cap. Rendered inside
|
|
32
|
+
* `BillingTab` under `UserLimitsSection`.
|
|
33
|
+
*/
|
|
34
|
+
function NewUserDefaultSection({ tenantKey, labels: labelsOverride, }) {
|
|
35
|
+
const t = context.useT();
|
|
36
|
+
const labels$1 = React.useMemo(() => labels.resolveSpendCapsTabLabels(labelsOverride, t), [labelsOverride, t]);
|
|
37
|
+
const copy = labels$1.tenantSections.newUserDefault;
|
|
38
|
+
const { data: template, error: templateError, isLoading, } = dataLayer.useGetNewUserSpendCapDefaultQuery({ org: tenantKey }, { skip: !tenantKey });
|
|
39
|
+
const [upsertDefault, { isLoading: isSaving }] = dataLayer.useUpsertNewUserSpendCapDefaultMutation();
|
|
40
|
+
const isForbidden = utils.errorStatus(templateError) === 403;
|
|
41
|
+
const [enabled, setEnabled] = React.useState(false);
|
|
42
|
+
const [fields, setFields] = React.useState(() => fieldsFrom(undefined));
|
|
43
|
+
// Rehydrate whenever the server copy changes (first load and every save).
|
|
44
|
+
React.useEffect(() => {
|
|
45
|
+
var _a;
|
|
46
|
+
setEnabled((_a = template === null || template === void 0 ? void 0 : template.enabled) !== null && _a !== void 0 ? _a : false);
|
|
47
|
+
setFields(fieldsFrom(template));
|
|
48
|
+
}, [template]);
|
|
49
|
+
const limitValid = utils.isValidLimit(fields.limit);
|
|
50
|
+
// The amount is only required while the default is on; off, an empty one
|
|
51
|
+
// is stored as null so the rest of the setup is kept.
|
|
52
|
+
const limitOk = enabled ? limitValid : fields.limit.trim() === '' || limitValid;
|
|
53
|
+
const parsedThresholds = utils.parseThresholdsInput(fields.thresholds);
|
|
54
|
+
const canSave = limitOk && parsedThresholds !== null && !isSaving;
|
|
55
|
+
const handleSave = async () => {
|
|
56
|
+
if (parsedThresholds === null)
|
|
57
|
+
return;
|
|
58
|
+
try {
|
|
59
|
+
await upsertDefault({
|
|
60
|
+
org: tenantKey,
|
|
61
|
+
formData: {
|
|
62
|
+
enabled,
|
|
63
|
+
interval_type: fields.interval,
|
|
64
|
+
max_cost_usd: limitValid ? Number(fields.limit).toFixed(2) : null,
|
|
65
|
+
enforcement: fields.enforcement,
|
|
66
|
+
alert_thresholds: parsedThresholds,
|
|
67
|
+
},
|
|
68
|
+
}).unwrap();
|
|
69
|
+
sonner.toast.success(copy.savedToast);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.error('[NewUserDefaultSection] save default error', error);
|
|
73
|
+
sonner.toast.error(utils.errorDetail(error) || copy.saveErrorToast);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
return (jsxRuntime.jsxs("div", { "data-testid": "spend-limits-new-user-default-section", className: "rounded-lg border border-[#e5e5e5] bg-white shadow-[0_1px_2px_0_rgba(0,0,0,0.05)] dark:bg-zinc-900 dark:border-zinc-800", children: [jsxRuntime.jsx("div", { className: "flex flex-col gap-2 p-4 sm:flex-row sm:items-start sm:justify-between", children: jsxRuntime.jsxs("div", { className: "space-y-0.5", children: [jsxRuntime.jsx("h3", { className: "text-[16px] font-medium leading-6 text-[#101828] dark:text-gray-100", children: copy.title }), jsxRuntime.jsx("p", { className: "text-[13px] font-normal leading-5 text-[#4a5565] dark:text-gray-400", children: copy.description })] }) }), jsxRuntime.jsx("div", { className: "border-t border-[#e5e7eb] dark:border-zinc-800 px-4 py-3", children: isLoading ? (jsxRuntime.jsx("div", { className: "flex items-center justify-center py-8", "data-testid": "new-user-default-loading", children: jsxRuntime.jsx(index.Spinner, {}) })) : isForbidden ? (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2 rounded-lg border border-gray-200 bg-gray-50 px-4 py-10 text-center", "data-testid": "new-user-default-denied", children: [jsxRuntime.jsx(shieldAlert.default, { className: "h-6 w-6 text-gray-400" }), jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900", children: labels$1.denied.title }), jsxRuntime.jsx("p", { className: "max-w-sm text-xs text-gray-600", children: labels$1.denied.description })] })) : (jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": "new-user-default-form", children: [jsxRuntime.jsx("p", { className: "text-xs text-gray-500", "data-testid": "new-user-default-note", children: copy.futureJoinsNote }), jsxRuntime.jsx(capabilityGate.CapabilityGate, { title: copy.capability.title, description: copy.capability.description, offHint: copy.capability.offHint, enabled: enabled, onToggle: setEnabled, disabled: isSaving, ariaLabel: copy.capability.title, toggleTestId: "new-user-default-enabled-switch", children: jsxRuntime.jsx(spendCapFields.SpendCapFields, { labels: labels$1, values: fields, onChange: setFields, testId: "new-user-default" }) }), jsxRuntime.jsx("div", { className: "flex items-center justify-end gap-2", children: jsxRuntime.jsx("button", { type: "button", onClick: handleSave, disabled: !canSave, "data-testid": "new-user-default-save-button", className: "inline-flex items-center gap-2 rounded-md bg-gradient-to-r from-[#2563EB] to-[#93C5FD] px-4 py-2 text-sm font-medium text-white hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: isSaving ? labels$1.form.saving : labels$1.form.save }) })] })) })] }));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
exports.NewUserDefaultSection = NewUserDefaultSection;
|
|
80
|
+
//# sourceMappingURL=new-user-default-section.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new-user-default-section.js","sources":["../../../../../../../src/components/spend-caps/new-user-default-section.tsx"],"sourcesContent":[null],"names":["thresholdsToInput","useT","labels","resolveSpendCapsTabLabels","useGetNewUserSpendCapDefaultQuery","useUpsertNewUserSpendCapDefaultMutation","errorStatus","isValidLimit","parseThresholdsInput","toast","errorDetail","_jsxs","_jsx","Spinner","ShieldAlert","CapabilityGate","SpendCapFields"],"mappings":";;;;;;;;;;;;;;;AA8BA,SAAS,UAAU,CAAC,QAA4C,EAAA;;IAC9D,OAAO;QACL,KAAK,EAAE,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,YAAY,KAAI,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE;QAClF,QAAQ,EAAE,CAAA,EAAA,GAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,OAAO;QAC5C,WAAW,EAAE,CAAA,EAAA,GAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,OAAO;AAC7C,QAAA,UAAU,EAAE,QAAQ,GAAGA,uBAAiB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,QAAQ;KAC/E;AACH;AAEA;;;;;;;;AAQG;AACG,SAAU,qBAAqB,CAAC,EACpC,SAAS,EACT,MAAM,EAAE,cAAc,GACK,EAAA;AAC3B,IAAA,MAAM,CAAC,GAAGC,YAAI,EAAE;IAChB,MAAMC,QAAM,GAAG,KAAK,CAAC,OAAO,CAC1B,MAAMC,gCAAyB,CAAC,cAAc,EAAE,CAAC,CAAC,EAClD,CAAC,cAAc,EAAE,CAAC,CAAC,CACpB;AACD,IAAA,MAAM,IAAI,GAAGD,QAAM,CAAC,cAAc,CAAC,cAAc;IAEjD,MAAM,EACJ,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,GACV,GAAGE,2CAAiC,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;AAC/E,IAAA,MAAM,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAGC,iDAAuC,EAAE;IAC1F,MAAM,WAAW,GAAGC,iBAAW,CAAC,aAAa,CAAC,KAAK,GAAG;AAEtD,IAAA,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;AACnD,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAsB,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;;AAG5F,IAAA,KAAK,CAAC,SAAS,CAAC,MAAK;;AACnB,QAAA,UAAU,CAAC,CAAA,EAAA,GAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,OAAO,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,KAAK,CAAC;AACtC,QAAA,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AACjC,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEd,MAAM,UAAU,GAAGC,kBAAY,CAAC,MAAM,CAAC,KAAK,CAAC;;;IAG7C,MAAM,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,UAAU;IAC/E,MAAM,gBAAgB,GAAGC,0BAAoB,CAAC,MAAM,CAAC,UAAU,CAAC;IAChE,MAAM,OAAO,GAAG,OAAO,IAAI,gBAAgB,KAAK,IAAI,IAAI,CAAC,QAAQ;AAEjE,IAAA,MAAM,UAAU,GAAG,YAAW;QAC5B,IAAI,gBAAgB,KAAK,IAAI;YAAE;AAC/B,QAAA,IAAI;AACF,YAAA,MAAM,aAAa,CAAC;AAClB,gBAAA,GAAG,EAAE,SAAS;AACd,gBAAA,QAAQ,EAAE;oBACR,OAAO;oBACP,aAAa,EAAE,MAAM,CAAC,QAAQ;AAC9B,oBAAA,YAAY,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI;oBACjE,WAAW,EAAE,MAAM,CAAC,WAAW;AAC/B,oBAAA,gBAAgB,EAAE,gBAAgB;AACnC,iBAAA;aACF,CAAC,CAAC,MAAM,EAAE;AACX,YAAAC,YAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC;AAClE,YAAAA,YAAK,CAAC,KAAK,CAACC,iBAAW,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC;QACxD;AACF,IAAA,CAAC;AAED,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,uCAAuC,EACnD,SAAS,EAAC,yHAAyH,EAAA,QAAA,EAAA,CAEnIC,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uEAAuE,EAAA,QAAA,EACpFD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BC,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,qEAAqE,EAAA,QAAA,EAChF,IAAI,CAAC,KAAK,EAAA,CACR,EACLA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,qEAAqE,EAAA,QAAA,EAC/E,IAAI,CAAC,WAAW,EAAA,CACf,CAAA,EAAA,CACA,EAAA,CACF,EAENA,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0DAA0D,EAAA,QAAA,EACtE,SAAS,IACRA,cAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,uCAAuC,EAAA,aAAA,EACrC,0BAA0B,EAAA,QAAA,EAEtCA,cAAA,CAACC,aAAO,EAAA,EAAA,CAAG,EAAA,CACP,IACJ,WAAW,IACbF,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,sGAAsG,EAAA,aAAA,EACpG,yBAAyB,EAAA,QAAA,EAAA,CAErCC,cAAA,CAACE,mBAAW,EAAA,EAAC,SAAS,EAAC,uBAAuB,EAAA,CAAG,EACjDF,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAEV,QAAM,CAAC,MAAM,CAAC,KAAK,EAAA,CAAK,EAC1EU,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAAEV,QAAM,CAAC,MAAM,CAAC,WAAW,EAAA,CAAK,CAAA,EAAA,CACzE,KAENS,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,aAAA,EAAa,uBAAuB,EAAA,QAAA,EAAA,CAC5DC,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,aAAA,EAAa,uBAAuB,EAAA,QAAA,EACrE,IAAI,CAAC,eAAe,EAAA,CACnB,EAEJA,cAAA,CAACG,6BAAc,EAAA,EACb,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAC5B,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,EACxC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,EAChC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,UAAU,EACpB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,EAChC,YAAY,EAAC,iCAAiC,EAAA,QAAA,EAE9CH,cAAA,CAACI,6BAAc,EAAA,EACb,MAAM,EAAEd,QAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,SAAS,EACnB,MAAM,EAAC,kBAAkB,EAAA,CACzB,EAAA,CACa,EAEjBU,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qCAAqC,EAAA,QAAA,EAClDA,cAAA,CAAA,QAAA,EAAA,EACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,CAAC,OAAO,EAAA,aAAA,EACN,8BAA8B,EAC1C,SAAS,EAAC,kMAAkM,EAAA,QAAA,EAE3M,QAAQ,GAAGV,QAAM,CAAC,IAAI,CAAC,MAAM,GAAGA,QAAM,CAAC,IAAI,CAAC,IAAI,EAAA,CAC1C,EAAA,CACL,CAAA,EAAA,CACF,CACP,EAAA,CACG,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var button = require('../ui/button.js');
|
|
5
|
+
var tooltip = require('../ui/tooltip.js');
|
|
6
|
+
var utils = require('../../lib/utils.js');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* An icon action beside a row's status switch (the MCP connector-card
|
|
10
|
+
* pattern): a ghost icon button whose tooltip and accessible name are the
|
|
11
|
+
* same words.
|
|
12
|
+
*/
|
|
13
|
+
function RowIconAction({ label, icon: Icon, testId, onClick, disabled, className, }) {
|
|
14
|
+
return (jsxRuntime.jsx(tooltip.TooltipProvider, { delayDuration: 200, children: jsxRuntime.jsxs(tooltip.Tooltip, { children: [jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: jsxRuntime.jsx(button.Button, { type: "button", variant: "ghost", size: "icon", "aria-label": label, "data-testid": testId, className: utils.cn('h-8 w-8 text-gray-500', className), onClick: onClick, disabled: disabled, children: jsxRuntime.jsx(Icon, { className: "h-4 w-4", "aria-hidden": "true" }) }) }), jsxRuntime.jsx(tooltip.TooltipContent, { className: "ibl-tooltip-content z-50", children: label })] }) }));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
exports.RowIconAction = RowIconAction;
|
|
18
|
+
//# sourceMappingURL=row-icon-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"row-icon-action.js","sources":["../../../../../../../src/components/spend-caps/row-icon-action.tsx"],"sourcesContent":[null],"names":["_jsx","TooltipProvider","_jsxs","Tooltip","TooltipTrigger","Button","cn","TooltipContent"],"mappings":";;;;;;;AAwBA;;;;AAIG;SACa,aAAa,CAAC,EAC5B,KAAK,EACL,IAAI,EAAE,IAAI,EACV,MAAM,EACN,OAAO,EACP,QAAQ,EACR,SAAS,GACU,EAAA;AACnB,IAAA,QACEA,cAAA,CAACC,uBAAe,EAAA,EAAC,aAAa,EAAE,GAAG,EAAA,QAAA,EACjCC,eAAA,CAACC,eAAO,eACNH,cAAA,CAACI,sBAAc,EAAA,EAAC,OAAO,kBACrBJ,cAAA,CAACK,aAAM,EAAA,EACL,IAAI,EAAC,QAAQ,EACb,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,gBACC,KAAK,EAAA,aAAA,EACJ,MAAM,EACnB,SAAS,EAAEC,QAAE,CAAC,uBAAuB,EAAE,SAAS,CAAC,EACjD,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAAA,QAAA,EAElBN,cAAA,CAAC,IAAI,EAAA,EAAC,SAAS,EAAC,SAAS,EAAA,aAAA,EAAa,MAAM,GAAG,EAAA,CACxC,EAAA,CACM,EACjBA,cAAA,CAACO,sBAAc,EAAA,EAAC,SAAS,EAAC,0BAA0B,YAAE,KAAK,EAAA,CAAkB,CAAA,EAAA,CACrE,EAAA,CACM;AAEtB;;;;"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var input = require('../ui/input.js');
|
|
5
|
+
var label = require('../ui/label.js');
|
|
6
|
+
var select = require('../ui/select.js');
|
|
7
|
+
var utils = require('./utils.js');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The four writable fields of a spend limit — amount, reset interval,
|
|
11
|
+
* enforcement and alert thresholds — with their inline validation. Shared by
|
|
12
|
+
* the cap editor (`SpendCapForm`) and the new-user default editor.
|
|
13
|
+
*/
|
|
14
|
+
function SpendCapFields({ labels, values, onChange, testId }) {
|
|
15
|
+
const set = (key, value) => onChange({ ...values, [key]: value });
|
|
16
|
+
const limitTouched = values.limit.trim() !== '';
|
|
17
|
+
const limitValid = utils.isValidLimit(values.limit);
|
|
18
|
+
const thresholdsValid = utils.parseThresholdsInput(values.thresholds) !== null;
|
|
19
|
+
return (jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [jsxRuntime.jsx(label.Label, { className: "text-xs font-medium text-gray-700", children: labels.form.limitLabel }), jsxRuntime.jsx(input.Input, { className: "focus-visible:border-blue-500 focus-visible:ring-1 focus-visible:ring-blue-500", value: values.limit, onChange: (e) => set('limit', e.target.value), placeholder: labels.form.limitPlaceholder, inputMode: "decimal", "data-testid": `${testId}-limit-input` }), limitTouched && !limitValid && (jsxRuntime.jsx("p", { className: "text-xs text-red-500", "data-testid": `${testId}-limit-error`, children: labels.form.limitError }))] }), jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [jsxRuntime.jsx(label.Label, { className: "text-xs font-medium text-gray-700", children: labels.form.intervalLabel }), jsxRuntime.jsxs(select.Select, { value: values.interval, onValueChange: (value) => set('interval', value), children: [jsxRuntime.jsx(select.SelectTrigger, { className: "h-9", "data-testid": `${testId}-interval-select`, children: jsxRuntime.jsx(select.SelectValue, {}) }), jsxRuntime.jsxs(select.SelectContent, { children: [jsxRuntime.jsx(select.SelectItem, { value: "day", children: labels.form.intervalOptions.day }), jsxRuntime.jsx(select.SelectItem, { value: "week", children: labels.form.intervalOptions.week }), jsxRuntime.jsx(select.SelectItem, { value: "month", children: labels.form.intervalOptions.month }), jsxRuntime.jsx(select.SelectItem, { value: "year", children: labels.form.intervalOptions.year })] })] })] })] }), jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2", children: [jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [jsxRuntime.jsx(label.Label, { className: "text-xs font-medium text-gray-700", children: labels.form.enforcementLabel }), jsxRuntime.jsxs(select.Select, { value: values.enforcement, onValueChange: (value) => set('enforcement', value), children: [jsxRuntime.jsx(select.SelectTrigger, { className: "h-9", "data-testid": `${testId}-enforcement-select`, children: jsxRuntime.jsx(select.SelectValue, {}) }), jsxRuntime.jsxs(select.SelectContent, { children: [jsxRuntime.jsx(select.SelectItem, { value: "block", children: labels.form.enforcementOptions.block }), jsxRuntime.jsx(select.SelectItem, { value: "alert_only", children: labels.form.enforcementOptions.alertOnly })] })] }), jsxRuntime.jsx("p", { className: "text-xs text-gray-500", children: values.enforcement === 'block'
|
|
20
|
+
? labels.form.enforcementHelp.block
|
|
21
|
+
: labels.form.enforcementHelp.alertOnly })] }), jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [jsxRuntime.jsx(label.Label, { className: "text-xs font-medium text-gray-700", children: labels.form.thresholdsLabel }), jsxRuntime.jsx(input.Input, { className: "focus-visible:border-blue-500 focus-visible:ring-1 focus-visible:ring-blue-500", value: values.thresholds, onChange: (e) => set('thresholds', e.target.value), placeholder: labels.form.thresholdsPlaceholder, "data-testid": `${testId}-thresholds-input` }), thresholdsValid ? (jsxRuntime.jsx("p", { className: "text-xs text-gray-500", children: labels.form.thresholdsHelp })) : (jsxRuntime.jsx("p", { className: "text-xs text-red-500", "data-testid": `${testId}-thresholds-error`, children: labels.form.thresholdsError }))] })] })] }));
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.SpendCapFields = SpendCapFields;
|
|
25
|
+
//# sourceMappingURL=spend-cap-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spend-cap-fields.js","sources":["../../../../../../../src/components/spend-caps/spend-cap-fields.tsx"],"sourcesContent":[null],"names":["isValidLimit","parseThresholdsInput","_jsxs","_jsx","Label","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem"],"mappings":";;;;;;;;AAmCA;;;;AAIG;AACG,SAAU,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAuB,EAAA;IACtF,MAAM,GAAG,GAAG,CAAsC,GAAM,EAAE,KAA6B,KACrF,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,GAAG,GAAG,KAAK,EAAE,CAAC;IAEvC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;IAC/C,MAAM,UAAU,GAAGA,kBAAY,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7C,MAAM,eAAe,GAAGC,0BAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,IAAI;AAExE,IAAA,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,aACxBA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uCAAuC,aACpDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BC,eAACC,WAAK,EAAA,EAAC,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAA,CAAS,EACrFD,cAAA,CAACE,WAAK,IACJ,SAAS,EAAC,gFAAgF,EAC1F,KAAK,EAAE,MAAM,CAAC,KAAK,EACnB,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC7C,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,gBAAgB,EACzC,SAAS,EAAC,SAAS,EAAA,aAAA,EACN,CAAA,EAAG,MAAM,cAAc,EAAA,CACpC,EACD,YAAY,IAAI,CAAC,UAAU,KAC1BF,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,sBAAsB,EAAA,aAAA,EAAc,CAAA,EAAG,MAAM,cAAc,EAAA,QAAA,EACrE,MAAM,CAAC,IAAI,CAAC,UAAU,EAAA,CACrB,CACL,CAAA,EAAA,CACG,EAEND,yBAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BC,eAACC,WAAK,EAAA,EAAC,SAAS,EAAC,mCAAmC,YAAE,MAAM,CAAC,IAAI,CAAC,aAAa,EAAA,CAAS,EACxFF,gBAACI,aAAM,EAAA,EACL,KAAK,EAAE,MAAM,CAAC,QAAQ,EACtB,aAAa,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,UAAU,EAAE,KAA6B,CAAC,EAAA,QAAA,EAAA,CAExEH,cAAA,CAACI,oBAAa,EAAA,EAAC,SAAS,EAAC,KAAK,iBAAc,CAAA,EAAG,MAAM,kBAAkB,EAAA,QAAA,EACrEJ,cAAA,CAACK,kBAAW,EAAA,EAAA,CAAG,EAAA,CACD,EAChBN,eAAA,CAACO,oBAAa,EAAA,EAAA,QAAA,EAAA,CACZN,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,KAAK,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,GAAc,EACtEP,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,MAAM,YAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,GAAc,EACxEP,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,OAAO,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAA,CAAc,EAC1EP,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,MAAM,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,GAAc,CAAA,EAAA,CAC1D,CAAA,EAAA,CACT,IACL,CAAA,EAAA,CACF,EAENR,yBAAK,SAAS,EAAC,uCAAuC,EAAA,QAAA,EAAA,CACpDA,yBAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BC,cAAA,CAACC,WAAK,EAAA,EAAC,SAAS,EAAC,mCAAmC,YACjD,MAAM,CAAC,IAAI,CAAC,gBAAgB,GACvB,EACRF,eAAA,CAACI,aAAM,EAAA,EACL,KAAK,EAAE,MAAM,CAAC,WAAW,EACzB,aAAa,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,aAAa,EAAE,KAA4B,CAAC,EAAA,QAAA,EAAA,CAE1EH,cAAA,CAACI,oBAAa,EAAA,EAAC,SAAS,EAAC,KAAK,EAAA,aAAA,EAAc,GAAG,MAAM,CAAA,mBAAA,CAAqB,EAAA,QAAA,EACxEJ,cAAA,CAACK,kBAAW,EAAA,EAAA,CAAG,EAAA,CACD,EAChBN,eAAA,CAACO,oBAAa,eACZN,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,OAAO,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,GAAc,EAC7EP,cAAA,CAACO,iBAAU,EAAA,EAAC,KAAK,EAAC,YAAY,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAA,CAAc,IACxE,CAAA,EAAA,CACT,EACTP,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACjC,MAAM,CAAC,WAAW,KAAK;AACtB,sCAAE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC;sCAC5B,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,SAAS,EAAA,CACvC,CAAA,EAAA,CACA,EAEND,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAAA,CAC1BC,cAAA,CAACC,WAAK,EAAA,EAAC,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,eAAe,EAAA,CAAS,EAC1FD,cAAA,CAACE,WAAK,EAAA,EACJ,SAAS,EAAC,gFAAgF,EAC1F,KAAK,EAAE,MAAM,CAAC,UAAU,EACxB,QAAQ,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAClD,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAA,aAAA,EACjC,CAAA,EAAG,MAAM,CAAA,iBAAA,CAAmB,GACzC,EACD,eAAe,IACdF,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc,EAAA,CAAK,KAErEA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,sBAAsB,EAAA,aAAA,EAAc,CAAA,EAAG,MAAM,mBAAmB,EAAA,QAAA,EAC1E,MAAM,CAAC,IAAI,CAAC,eAAe,EAAA,CAC1B,CACL,CAAA,EAAA,CACG,CAAA,EAAA,CACF,CAAA,EAAA,CACF;AAEV;;;;"}
|
|
@@ -3,41 +3,41 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var capabilityGate = require('../modals/edit-mentor-modal/capability-gate.js');
|
|
6
|
-
var
|
|
7
|
-
var label = require('../ui/label.js');
|
|
8
|
-
var select = require('../ui/select.js');
|
|
6
|
+
var spendCapFields = require('./spend-cap-fields.js');
|
|
9
7
|
var utils = require('./utils.js');
|
|
10
8
|
|
|
9
|
+
function fieldsFrom(cap) {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
return {
|
|
12
|
+
limit: cap ? String(Number(cap.max_cost_usd)) : '',
|
|
13
|
+
interval: (_a = cap === null || cap === void 0 ? void 0 : cap.interval_type) !== null && _a !== void 0 ? _a : 'month',
|
|
14
|
+
enforcement: (_b = cap === null || cap === void 0 ? void 0 : cap.enforcement) !== null && _b !== void 0 ? _b : 'block',
|
|
15
|
+
thresholds: cap ? utils.thresholdsToInput(cap.alert_thresholds) : '80, 95',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
11
18
|
/**
|
|
12
19
|
* Editor for one spend cap of any scope. Counter fields
|
|
13
20
|
* (current spend / remaining / exceeded) are read-only on the backend and
|
|
14
21
|
* only rendered, never submitted.
|
|
15
22
|
*/
|
|
16
23
|
function SpendCapForm({ labels, cap, isSaving, isDeleting, onSave, onDelete, onCancel, showUsage = true, testId, }) {
|
|
17
|
-
const [
|
|
18
|
-
const [interval, setInterval] = React.useState('month');
|
|
19
|
-
const [enforcement, setEnforcement] = React.useState('block');
|
|
20
|
-
const [thresholds, setThresholds] = React.useState('80, 95');
|
|
24
|
+
const [fields, setFields] = React.useState(() => fieldsFrom(cap));
|
|
21
25
|
const [enabled, setEnabled] = React.useState(true);
|
|
22
26
|
// Rehydrate the form whenever the server copy changes.
|
|
23
27
|
React.useEffect(() => {
|
|
24
|
-
var _a
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
setEnforcement((_b = cap === null || cap === void 0 ? void 0 : cap.enforcement) !== null && _b !== void 0 ? _b : 'block');
|
|
28
|
-
setThresholds(cap ? utils.thresholdsToInput(cap.alert_thresholds) : '80, 95');
|
|
29
|
-
setEnabled((_c = cap === null || cap === void 0 ? void 0 : cap.enabled) !== null && _c !== void 0 ? _c : true);
|
|
28
|
+
var _a;
|
|
29
|
+
setFields(fieldsFrom(cap));
|
|
30
|
+
setEnabled((_a = cap === null || cap === void 0 ? void 0 : cap.enabled) !== null && _a !== void 0 ? _a : true);
|
|
30
31
|
}, [cap === null || cap === void 0 ? void 0 : cap.id, cap === null || cap === void 0 ? void 0 : cap.updated_at]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const parsedThresholds = utils.parseThresholdsInput(thresholds);
|
|
32
|
+
const limitValid = utils.isValidLimit(fields.limit);
|
|
33
|
+
const parsedThresholds = utils.parseThresholdsInput(fields.thresholds);
|
|
34
34
|
const thresholdsValid = parsedThresholds !== null;
|
|
35
35
|
const canSave = limitValid && thresholdsValid && !isSaving && !isDeleting;
|
|
36
36
|
const handleSave = () => {
|
|
37
37
|
const formData = {
|
|
38
|
-
interval_type: interval,
|
|
39
|
-
max_cost_usd: Number(limit).toFixed(2),
|
|
40
|
-
enforcement,
|
|
38
|
+
interval_type: fields.interval,
|
|
39
|
+
max_cost_usd: Number(fields.limit).toFixed(2),
|
|
40
|
+
enforcement: fields.enforcement,
|
|
41
41
|
enabled,
|
|
42
42
|
};
|
|
43
43
|
if (parsedThresholds && parsedThresholds.length > 0) {
|
|
@@ -51,9 +51,7 @@ function SpendCapForm({ labels, cap, isSaving, isDeleting, onSave, onDelete, onC
|
|
|
51
51
|
: usagePercent >= 80
|
|
52
52
|
? 'bg-amber-500'
|
|
53
53
|
: 'bg-blue-500';
|
|
54
|
-
return (jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": `${testId}-form`, children: [!cap && (jsxRuntime.jsx("p", { className: "text-xs text-gray-500", "data-testid": `${testId}-no-cap-hint`, children: labels.form.noCapHint })), jsxRuntime.jsx(capabilityGate.CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: enabled, onToggle: setEnabled, disabled: isSaving || isDeleting, ariaLabel: labels.capability.title, toggleTestId: `${testId}-enabled-switch`, children: jsxRuntime.jsxs("div", { className: "space-y-4", children: [cap && showUsage && (jsxRuntime.jsxs("div", { className: "space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-3", "data-testid": `${testId}-usage`, children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsx("p", { className: "text-xs font-medium text-gray-700", children: labels.usage.periodTitles[cap.interval_type] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [!cap.enabled && (jsxRuntime.jsx("span", { className: "rounded-full bg-gray-200 px-2 py-0.5 text-[11px] font-medium text-gray-700", "data-testid": `${testId}-disabled-badge`, children: labels.usage.disabledBadge })), cap.enforcement === 'alert_only' && (jsxRuntime.jsx("span", { className: "rounded-full bg-amber-100 px-2 py-0.5 text-[11px] font-medium text-amber-800", "data-testid": `${testId}-alert-only-badge`, children: labels.usage.alertOnlyBadge })), cap.is_exceeded && (jsxRuntime.jsx("span", { className: "rounded-full bg-red-100 px-2 py-0.5 text-[11px] font-medium text-red-700", "data-testid": `${testId}-exceeded-badge`, children: labels.usage.exceededBadge }))] })] }), jsxRuntime.jsx("div", { className: "h-2 w-full overflow-hidden rounded-full bg-gray-200", role: "progressbar", "aria-valuenow": usagePercent, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": labels.usage.title, children: jsxRuntime.jsx("div", { className: `h-full rounded-full transition-all ${barColor}`, style: { width: `${usagePercent}%` } }) }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-xs text-gray-600", children: [jsxRuntime.jsx("span", { "data-testid": `${testId}-spent`, children: labels.usage.spent.replace('{amount}', utils.formatUsd(cap.current_spend_usd)) }), jsxRuntime.jsx("span", { "data-testid": `${testId}-percent`, children: labels.usage.percentUsed.replace('{percent}', String(usagePercent)) }), jsxRuntime.jsx("span", { "data-testid": `${testId}-remaining`, children: labels.usage.remaining.replace('{amount}', utils.formatUsd(cap.remaining_usd)) })] })] })), jsxRuntime.
|
|
55
|
-
? labels.form.enforcementHelp.block
|
|
56
|
-
: labels.form.enforcementHelp.alertOnly })] }), jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [jsxRuntime.jsx(label.Label, { className: "text-xs font-medium text-gray-700", children: labels.form.thresholdsLabel }), jsxRuntime.jsx(input.Input, { className: "focus-visible:border-blue-500 focus-visible:ring-1 focus-visible:ring-blue-500", value: thresholds, onChange: (e) => setThresholds(e.target.value), placeholder: labels.form.thresholdsPlaceholder, "data-testid": `${testId}-thresholds-input` }), thresholdsValid ? (jsxRuntime.jsx("p", { className: "text-xs text-gray-500", children: labels.form.thresholdsHelp })) : (jsxRuntime.jsx("p", { className: "text-xs text-red-500", "data-testid": `${testId}-thresholds-error`, children: labels.form.thresholdsError }))] })] })] }) }), jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [onCancel && (jsxRuntime.jsx("button", { type: "button", onClick: onCancel, disabled: isSaving || isDeleting, "data-testid": `${testId}-cancel-button`, className: "inline-flex items-center rounded-md border border-gray-200 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50", children: labels.form.cancel })), cap && onDelete && (jsxRuntime.jsx("button", { type: "button", onClick: onDelete, disabled: isSaving || isDeleting, "data-testid": `${testId}-delete-button`, className: "inline-flex items-center rounded-md border border-red-200 px-4 py-2 text-sm font-medium text-red-600 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-50", children: isDeleting ? labels.form.removing : labels.form.remove })), jsxRuntime.jsx("button", { type: "button", onClick: handleSave, disabled: !canSave, "data-testid": `${testId}-save-button`, className: "inline-flex items-center gap-2 rounded-md bg-gradient-to-r from-[#2563EB] to-[#93C5FD] px-4 py-2 text-sm font-medium text-white hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: isSaving ? labels.form.saving : labels.form.save })] })] }));
|
|
54
|
+
return (jsxRuntime.jsxs("div", { className: "space-y-4", "data-testid": `${testId}-form`, children: [!cap && (jsxRuntime.jsx("p", { className: "text-xs text-gray-500", "data-testid": `${testId}-no-cap-hint`, children: labels.form.noCapHint })), jsxRuntime.jsx(capabilityGate.CapabilityGate, { title: labels.capability.title, description: labels.capability.description, offHint: labels.capability.offHint, enabled: enabled, onToggle: setEnabled, disabled: isSaving || isDeleting, ariaLabel: labels.capability.title, toggleTestId: `${testId}-enabled-switch`, children: jsxRuntime.jsxs("div", { className: "space-y-4", children: [cap && showUsage && (jsxRuntime.jsxs("div", { className: "space-y-2 rounded-lg border border-gray-200 bg-gray-50 p-3", "data-testid": `${testId}-usage`, children: [jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [jsxRuntime.jsx("p", { className: "text-xs font-medium text-gray-700", children: labels.usage.periodTitles[cap.interval_type] }), jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [!cap.enabled && (jsxRuntime.jsx("span", { className: "rounded-full bg-gray-200 px-2 py-0.5 text-[11px] font-medium text-gray-700", "data-testid": `${testId}-disabled-badge`, children: labels.usage.disabledBadge })), cap.enforcement === 'alert_only' && (jsxRuntime.jsx("span", { className: "rounded-full bg-amber-100 px-2 py-0.5 text-[11px] font-medium text-amber-800", "data-testid": `${testId}-alert-only-badge`, children: labels.usage.alertOnlyBadge })), cap.is_exceeded && (jsxRuntime.jsx("span", { className: "rounded-full bg-red-100 px-2 py-0.5 text-[11px] font-medium text-red-700", "data-testid": `${testId}-exceeded-badge`, children: labels.usage.exceededBadge }))] })] }), jsxRuntime.jsx("div", { className: "h-2 w-full overflow-hidden rounded-full bg-gray-200", role: "progressbar", "aria-valuenow": usagePercent, "aria-valuemin": 0, "aria-valuemax": 100, "aria-label": labels.usage.title, children: jsxRuntime.jsx("div", { className: `h-full rounded-full transition-all ${barColor}`, style: { width: `${usagePercent}%` } }) }), jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-xs text-gray-600", children: [jsxRuntime.jsx("span", { "data-testid": `${testId}-spent`, children: labels.usage.spent.replace('{amount}', utils.formatUsd(cap.current_spend_usd)) }), jsxRuntime.jsx("span", { "data-testid": `${testId}-percent`, children: labels.usage.percentUsed.replace('{percent}', String(usagePercent)) }), jsxRuntime.jsx("span", { "data-testid": `${testId}-remaining`, children: labels.usage.remaining.replace('{amount}', utils.formatUsd(cap.remaining_usd)) })] })] })), jsxRuntime.jsx(spendCapFields.SpendCapFields, { labels: labels, values: fields, onChange: setFields, testId: testId })] }) }), jsxRuntime.jsxs("div", { className: "flex items-center justify-end gap-2", children: [onCancel && (jsxRuntime.jsx("button", { type: "button", onClick: onCancel, disabled: isSaving || isDeleting, "data-testid": `${testId}-cancel-button`, className: "inline-flex items-center rounded-md border border-gray-200 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50", children: labels.form.cancel })), cap && onDelete && (jsxRuntime.jsx("button", { type: "button", onClick: onDelete, disabled: isSaving || isDeleting, "data-testid": `${testId}-delete-button`, className: "inline-flex items-center rounded-md border border-red-200 px-4 py-2 text-sm font-medium text-red-600 hover:bg-red-50 disabled:cursor-not-allowed disabled:opacity-50", children: isDeleting ? labels.form.removing : labels.form.remove })), jsxRuntime.jsx("button", { type: "button", onClick: handleSave, disabled: !canSave, "data-testid": `${testId}-save-button`, className: "inline-flex items-center gap-2 rounded-md bg-gradient-to-r from-[#2563EB] to-[#93C5FD] px-4 py-2 text-sm font-medium text-white hover:opacity-90 disabled:cursor-not-allowed disabled:opacity-50", children: isSaving ? labels.form.saving : labels.form.save })] })] }));
|
|
57
55
|
}
|
|
58
56
|
|
|
59
57
|
exports.SpendCapForm = SpendCapForm;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-cap-form.js","sources":["../../../../../../../src/components/spend-caps/spend-cap-form.tsx"],"sourcesContent":[null],"names":["thresholdsToInput","isValidLimit","parseThresholdsInput","percentUsed","_jsxs","_jsx","CapabilityGate","formatUsd","
|
|
1
|
+
{"version":3,"file":"spend-cap-form.js","sources":["../../../../../../../src/components/spend-caps/spend-cap-form.tsx"],"sourcesContent":[null],"names":["thresholdsToInput","isValidLimit","parseThresholdsInput","percentUsed","_jsxs","_jsx","CapabilityGate","formatUsd","SpendCapFields"],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ function SpendCapUsage({ tenantKey, userId, mentorId, showWhenOk = false, classN
|
|
|
29
29
|
tenant: t('spendCapUsage.scopeTenant'),
|
|
30
30
|
agent: t('spendCapUsage.scopeAgent'),
|
|
31
31
|
user_agent: t('spendCapUsage.scopeUserAgent'),
|
|
32
|
+
user: t('spendCapUsage.scopeUser'),
|
|
32
33
|
};
|
|
33
34
|
const intervalLabels = {
|
|
34
35
|
day: t('spendCapUsage.intervalDay'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spend-cap-usage.js","sources":["../../../../../../../src/components/spend-caps/spend-cap-usage.tsx"],"sourcesContent":[null],"names":["useT","useGetSpendCapStatusQuery","_jsxs","cn","_jsx","OctagonX","AlertTriangle"],"mappings":";;;;;;;;;;AA4BA;;;;;;AAMG;AACG,SAAU,aAAa,CAAC,EAC5B,SAAS,EACT,MAAM,EACN,QAAQ,EACR,UAAU,GAAG,KAAK,EAClB,SAAS,GACU,EAAA;AACnB,IAAA,MAAM,CAAC,GAAGA,YAAI,EAAE;AAEhB,IAAA,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAGC,mCAAyB,CAC1D,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAC5C,EAAE,IAAI,EAAE,CAAC,SAAS,IAAI,CAAC,MAAM,EAAE,CAChC;AAED,IAAA,IAAI,SAAS,IAAI,KAAK,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;IAE5C,MAAM,OAAO,GAA0B,IAAI;AAC3C,IAAA,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AAC1C,IAAA,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU;AAAE,QAAA,OAAO,IAAI;AAEvD,IAAA,MAAM,WAAW,GAAgD;AAC/D,QAAA,MAAM,EAAE,CAAC,CAAC,2BAA2B,CAAC;AACtC,QAAA,KAAK,EAAE,CAAC,CAAC,0BAA0B,CAAC;AACpC,QAAA,UAAU,EAAE,CAAC,CAAC,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"spend-cap-usage.js","sources":["../../../../../../../src/components/spend-caps/spend-cap-usage.tsx"],"sourcesContent":[null],"names":["useT","useGetSpendCapStatusQuery","_jsxs","cn","_jsx","OctagonX","AlertTriangle"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var index_module = require('../../node_modules/.pnpm/use-debounce@10.0.4_react@19.1.0/node_modules/use-debounce/dist/index.module.js');
|
|
4
|
+
var dataLayer = require('@iblai/data-layer');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Options for a platform-user picker, searched tenant-wide once the
|
|
8
|
+
* debounced term reaches two characters. Deliberately email-only in the UI
|
|
9
|
+
* (no name/username noise); the cap API is still keyed by username, which
|
|
10
|
+
* rides along as the option value.
|
|
11
|
+
*/
|
|
12
|
+
function usePlatformUserOptions(tenantKey, searchTerm, { enabled = true } = {}) {
|
|
13
|
+
var _a;
|
|
14
|
+
const [debouncedSearch] = index_module.useDebounce(searchTerm, 300);
|
|
15
|
+
const query = debouncedSearch.trim();
|
|
16
|
+
const shouldSearch = Boolean(enabled && tenantKey && query.length >= 2);
|
|
17
|
+
const { data, isFetching } = dataLayer.usePlatformUsersQuery({
|
|
18
|
+
page: 1,
|
|
19
|
+
page_size: 20,
|
|
20
|
+
platform_key: tenantKey,
|
|
21
|
+
platform_org: tenantKey,
|
|
22
|
+
query,
|
|
23
|
+
return_policies: 'false',
|
|
24
|
+
}, { skip: !shouldSearch });
|
|
25
|
+
// The platform users endpoint returns either `results` or `results.data`
|
|
26
|
+
// depending on whether policies were requested.
|
|
27
|
+
const rawResults = data === null || data === void 0 ? void 0 : data.results;
|
|
28
|
+
const foundUsers = Array.isArray(rawResults)
|
|
29
|
+
? rawResults
|
|
30
|
+
: ((_a = rawResults === null || rawResults === void 0 ? void 0 : rawResults.data) !== null && _a !== void 0 ? _a : []);
|
|
31
|
+
const options = foundUsers
|
|
32
|
+
.filter((user) => Boolean(user.username) && Boolean(user.email))
|
|
33
|
+
.map((user) => ({
|
|
34
|
+
value: user.username,
|
|
35
|
+
label: user.email,
|
|
36
|
+
}));
|
|
37
|
+
return { options, isSearching: isFetching };
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
exports.usePlatformUserOptions = usePlatformUserOptions;
|
|
41
|
+
//# sourceMappingURL=use-platform-user-options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-platform-user-options.js","sources":["../../../../../../../src/components/spend-caps/use-platform-user-options.ts"],"sourcesContent":[null],"names":["useDebounce","usePlatformUsersQuery"],"mappings":";;;;;AAcA;;;;;AAKG;AACG,SAAU,sBAAsB,CACpC,SAAiB,EACjB,UAAkB,EAClB,EAAE,OAAO,GAAG,IAAI,EAAA,GAA4B,EAAE,EAAA;;IAE9C,MAAM,CAAC,eAAe,CAAC,GAAGA,wBAAW,CAAC,UAAU,EAAE,GAAG,CAAC;AACtD,IAAA,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,EAAE;AACpC,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,IAAI,SAAS,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AACvE,IAAA,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAGC,+BAAqB,CAChD;AACE,QAAA,IAAI,EAAE,CAAC;AACP,QAAA,SAAS,EAAE,EAAE;AACb,QAAA,YAAY,EAAE,SAAS;AACvB,QAAA,YAAY,EAAE,SAAS;QACvB,KAAK;AACL,QAAA,eAAe,EAAE,OAAO;AACzB,KAAA,EACD,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,CACxB;;;IAID,MAAM,UAAU,GACd,IACD,KAAA,IAAA,IADC,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CACH,OAAO;AACV,IAAA,MAAM,UAAU,GAAyB,KAAK,CAAC,OAAO,CAAC,UAAU;AAC/D,UAAE;AACF,WAAG,CAAA,EAAA,GAAA,UAAU,KAAA,IAAA,IAAV,UAAU,KAAA,MAAA,GAAA,MAAA,GAAV,UAAU,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,CAAC;IAC5B,MAAM,OAAO,GAAyB;AACnC,SAAA,MAAM,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;AAC9D,SAAA,GAAG,CAAC,CAAC,IAAI,MAAM;QACd,KAAK,EAAE,IAAI,CAAC,QAAkB;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAe;AAC5B,KAAA,CAAC,CAAC;AAEL,IAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE;AAC7C;;;;"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var dataLayer = require('@iblai/data-layer');
|
|
5
|
+
|
|
6
|
+
/** How often the chat re-reads the status so a warning appears mid-conversation. */
|
|
7
|
+
const SPEND_CAP_STATUS_POLL_MS = 60000;
|
|
8
|
+
/**
|
|
9
|
+
* Learner-safe spend-cap status for the chat (zones and percentages only,
|
|
10
|
+
* never dollars), polled while the chat is open. `SpendCapUsage` reads the
|
|
11
|
+
* same cache entry, so rendering it beside this hook costs no extra request.
|
|
12
|
+
*/
|
|
13
|
+
function useSpendCapStatus({ tenantKey, userId, mentorId, enabled = true, }) {
|
|
14
|
+
const skip = !enabled || !tenantKey || !userId;
|
|
15
|
+
const { data, refetch } = dataLayer.useGetSpendCapStatusQuery({ org: tenantKey, userId, mentor: mentorId }, { skip, pollingInterval: skip ? 0 : SPEND_CAP_STATUS_POLL_MS, refetchOnMountOrArgChange: true });
|
|
16
|
+
// RTK throws on refetching a query that never started (the skipped case).
|
|
17
|
+
const safeRefetch = React.useCallback(() => {
|
|
18
|
+
if (!skip)
|
|
19
|
+
void refetch();
|
|
20
|
+
}, [skip, refetch]);
|
|
21
|
+
return { summary: data, blocked: Boolean(data === null || data === void 0 ? void 0 : data.blocked), refetch: safeRefetch };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
exports.SPEND_CAP_STATUS_POLL_MS = SPEND_CAP_STATUS_POLL_MS;
|
|
25
|
+
exports.useSpendCapStatus = useSpendCapStatus;
|
|
26
|
+
//# sourceMappingURL=use-spend-cap-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-spend-cap-status.js","sources":["../../../../../../../src/components/spend-caps/use-spend-cap-status.ts"],"sourcesContent":[null],"names":["useGetSpendCapStatusQuery"],"mappings":";;;;;AAKA;AACO,MAAM,wBAAwB,GAAG;AAoBxC;;;;AAIG;AACG,SAAU,iBAAiB,CAAC,EAChC,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,GAAG,IAAI,GACW,EAAA;IACzB,MAAM,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM;AAC9C,IAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAGA,mCAAyB,CACjD,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAC5C,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,GAAG,CAAC,GAAG,wBAAwB,EAAE,yBAAyB,EAAE,IAAI,EAAE,CAChG;;AAGD,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,MAAK;AACzC,QAAA,IAAI,CAAC,IAAI;YAAE,KAAK,OAAO,EAAE;AAC3B,IAAA,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEnB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,MAAA,GAAA,MAAA,GAAJ,IAAI,CAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE;AACjF;;;;;"}
|
|
@@ -2,18 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var sonner = require('sonner');
|
|
4
4
|
var dataLayer = require('@iblai/data-layer');
|
|
5
|
+
var utils = require('./utils.js');
|
|
5
6
|
|
|
6
|
-
function errorStatus(error) {
|
|
7
|
-
return error === null || error === void 0 ? void 0 : error.status;
|
|
8
|
-
}
|
|
9
|
-
function errorDetail(error) {
|
|
10
|
-
const data = error === null || error === void 0 ? void 0 : error.data;
|
|
11
|
-
if (typeof (data === null || data === void 0 ? void 0 : data.detail) === 'string')
|
|
12
|
-
return data.detail;
|
|
13
|
-
if (typeof (data === null || data === void 0 ? void 0 : data.error) === 'string')
|
|
14
|
-
return data.error;
|
|
15
|
-
return '';
|
|
16
|
-
}
|
|
17
7
|
function useSpendCaps({ tenantKey, mentorId, labels }) {
|
|
18
8
|
const identityReady = Boolean(tenantKey && mentorId);
|
|
19
9
|
// 404 is the documented "no cap configured yet" state for the singleton
|
|
@@ -39,9 +29,9 @@ function useSpendCaps({ tenantKey, mentorId, labels }) {
|
|
|
39
29
|
const [deleteTenantCap, { isLoading: isDeletingTenantCap }] = dataLayer.useDeleteTenantSpendCapMutation();
|
|
40
30
|
const [upsertUserCap, { isLoading: isSavingUserCap }] = dataLayer.useUpsertUserSpendCapMutation();
|
|
41
31
|
const [deleteUserCap, { isLoading: isDeletingUserCap }] = dataLayer.useDeleteUserSpendCapMutation();
|
|
42
|
-
const isAgentForbidden = errorStatus(agentCapError) === 403;
|
|
43
|
-
const isTenantForbidden = errorStatus(tenantCapError) === 403;
|
|
44
|
-
const isUsersForbidden = errorStatus(userCapsError) === 403;
|
|
32
|
+
const isAgentForbidden = utils.errorStatus(agentCapError) === 403;
|
|
33
|
+
const isTenantForbidden = utils.errorStatus(tenantCapError) === 403;
|
|
34
|
+
const isUsersForbidden = utils.errorStatus(userCapsError) === 403;
|
|
45
35
|
// Refetch the mutated scope explicitly after every successful save/delete
|
|
46
36
|
// (same as the grader tab's `refetchConfig()`): the singleton GETs 404
|
|
47
37
|
// until first created, and a cache entry whose only fetch errored isn't
|
|
@@ -56,7 +46,7 @@ function useSpendCaps({ tenantKey, mentorId, labels }) {
|
|
|
56
46
|
}
|
|
57
47
|
catch (error) {
|
|
58
48
|
console.error('[AgentSpendCapsTab] save spend cap error', error);
|
|
59
|
-
sonner.toast.error(errorDetail(error) || labels.toasts.saveError);
|
|
49
|
+
sonner.toast.error(utils.errorDetail(error) || labels.toasts.saveError);
|
|
60
50
|
return false;
|
|
61
51
|
}
|
|
62
52
|
};
|
|
@@ -69,7 +59,7 @@ function useSpendCaps({ tenantKey, mentorId, labels }) {
|
|
|
69
59
|
}
|
|
70
60
|
catch (error) {
|
|
71
61
|
console.error('[AgentSpendCapsTab] delete spend cap error', error);
|
|
72
|
-
sonner.toast.error(errorDetail(error) || labels.toasts.deleteError);
|
|
62
|
+
sonner.toast.error(utils.errorDetail(error) || labels.toasts.deleteError);
|
|
73
63
|
return false;
|
|
74
64
|
}
|
|
75
65
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-spend-caps.js","sources":["../../../../../../../src/components/spend-caps/use-spend-caps.ts"],"sourcesContent":[null],"names":["useGetAgentSpendCapQuery","useGetTenantSpendCapQuery","useListAgentUserSpendCapsQuery","useUpsertAgentSpendCapMutation","useDeleteAgentSpendCapMutation","useUpsertTenantSpendCapMutation","useDeleteTenantSpendCapMutation","useUpsertUserSpendCapMutation","useDeleteUserSpendCapMutation","toast"],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-spend-caps.js","sources":["../../../../../../../src/components/spend-caps/use-spend-caps.ts"],"sourcesContent":[null],"names":["useGetAgentSpendCapQuery","useGetTenantSpendCapQuery","useListAgentUserSpendCapsQuery","useUpsertAgentSpendCapMutation","useDeleteAgentSpendCapMutation","useUpsertTenantSpendCapMutation","useDeleteTenantSpendCapMutation","useUpsertUserSpendCapMutation","useDeleteUserSpendCapMutation","errorStatus","toast","errorDetail"],"mappings":"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"}
|
|
@@ -2,12 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var index_module = require('../../node_modules/.pnpm/use-debounce@10.0.4_react@19.1.0/node_modules/use-debounce/dist/index.module.js');
|
|
6
|
-
var dataLayer = require('@iblai/data-layer');
|
|
7
5
|
var dialog = require('../ui/dialog.js');
|
|
8
6
|
var utils = require('../../lib/utils.js');
|
|
9
7
|
var searchSelect = require('./search-select.js');
|
|
10
8
|
var spendCapForm = require('./spend-cap-form.js');
|
|
9
|
+
var usePlatformUserOptions = require('./use-platform-user-options.js');
|
|
11
10
|
var userProfileLink = require('../profile/user-profile-link.js');
|
|
12
11
|
|
|
13
12
|
/**
|
|
@@ -16,8 +15,8 @@ var userProfileLink = require('../profile/user-profile-link.js');
|
|
|
16
15
|
* (no free-text usernames), edit mode goes straight to the form for the
|
|
17
16
|
* cap's user. The form's Cancel/Save footer acts as the dialog footer.
|
|
18
17
|
*/
|
|
19
|
-
function UserCapModal({ isOpen, onClose, cap, labels, tenantKey, isSaving, onSave }) {
|
|
20
|
-
var _a, _b, _c, _d
|
|
18
|
+
function UserCapModal({ isOpen, onClose, cap, labels, tenantKey, initialUser = null, isSaving, onSave, }) {
|
|
19
|
+
var _a, _b, _c, _d;
|
|
21
20
|
const isEditing = Boolean(cap);
|
|
22
21
|
const [pickedUser, setPickedUser] = React.useState(null);
|
|
23
22
|
const [userSearch, setUserSearch] = React.useState('');
|
|
@@ -25,34 +24,11 @@ function UserCapModal({ isOpen, onClose, cap, labels, tenantKey, isSaving, onSav
|
|
|
25
24
|
React.useEffect(() => {
|
|
26
25
|
if (!isOpen)
|
|
27
26
|
return;
|
|
28
|
-
setPickedUser(
|
|
27
|
+
setPickedUser(initialUser);
|
|
29
28
|
setUserSearch('');
|
|
30
|
-
}, [isOpen, cap]);
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
const { data: usersData, isFetching: isSearchingUsers } = dataLayer.usePlatformUsersQuery({
|
|
34
|
-
page: 1,
|
|
35
|
-
page_size: 20,
|
|
36
|
-
platform_key: tenantKey,
|
|
37
|
-
platform_org: tenantKey,
|
|
38
|
-
query: debouncedUserSearch.trim(),
|
|
39
|
-
return_policies: 'false',
|
|
40
|
-
}, { skip: !shouldSearchUsers });
|
|
41
|
-
// The platform users endpoint returns either `results` or `results.data`
|
|
42
|
-
// depending on whether policies were requested.
|
|
43
|
-
const rawResults = usersData === null || usersData === void 0 ? void 0 : usersData.results;
|
|
44
|
-
const foundUsers = Array.isArray(rawResults)
|
|
45
|
-
? rawResults
|
|
46
|
-
: ((_a = rawResults === null || rawResults === void 0 ? void 0 : rawResults.data) !== null && _a !== void 0 ? _a : []);
|
|
47
|
-
// Deliberately email-only in the UI (no name/username noise); the cap API
|
|
48
|
-
// is still keyed by username, which rides along as the option value.
|
|
49
|
-
const userOptions = foundUsers
|
|
50
|
-
.filter((user) => Boolean(user.username) && Boolean(user.email))
|
|
51
|
-
.map((user) => ({
|
|
52
|
-
value: user.username,
|
|
53
|
-
label: user.email,
|
|
54
|
-
}));
|
|
55
|
-
const username = isEditing ? ((_b = cap === null || cap === void 0 ? void 0 : cap.username) !== null && _b !== void 0 ? _b : '') : ((_c = pickedUser === null || pickedUser === void 0 ? void 0 : pickedUser.value) !== null && _c !== void 0 ? _c : '');
|
|
29
|
+
}, [isOpen, cap, initialUser]);
|
|
30
|
+
const { options: userOptions, isSearching: isSearchingUsers } = usePlatformUserOptions.usePlatformUserOptions(tenantKey, userSearch, { enabled: isOpen && !isEditing });
|
|
31
|
+
const username = isEditing ? ((_a = cap === null || cap === void 0 ? void 0 : cap.username) !== null && _a !== void 0 ? _a : '') : ((_b = pickedUser === null || pickedUser === void 0 ? void 0 : pickedUser.value) !== null && _b !== void 0 ? _b : '');
|
|
56
32
|
const handleSave = async (formData) => {
|
|
57
33
|
if (!username)
|
|
58
34
|
return;
|
|
@@ -63,7 +39,7 @@ function UserCapModal({ isOpen, onClose, cap, labels, tenantKey, isSaving, onSav
|
|
|
63
39
|
return (jsxRuntime.jsx(dialog.Dialog, { open: isOpen, onOpenChange: onClose, children: jsxRuntime.jsxs(dialog.DialogContent, { "aria-describedby": "user-cap-modal-description", "data-testid": "user-cap-modal", className: "flex max-h-[85vh] flex-col sm:max-w-xl", children: [jsxRuntime.jsx(dialog.DialogHeader, { className: "flex-shrink-0", children: jsxRuntime.jsx(dialog.DialogTitle, { className: "ibl-dialog-title", children: isEditing ? labels.users.editTitle : labels.users.addTitle }) }), jsxRuntime.jsxs("div", { className: utils.cn('min-h-0 flex-1 space-y-4 overflow-y-auto',
|
|
64
40
|
// Reserve room for the search results dropdown while no user is
|
|
65
41
|
// picked yet — otherwise the scroll container clips it.
|
|
66
|
-
!isEditing && !pickedUser && 'min-h-[340px]'), id: "user-cap-modal-description", children: [isEditing ? (jsxRuntime.jsx("p", { className: "text-sm text-[#646464]", "data-testid": "user-cap-modal-username", children: jsxRuntime.jsx(userProfileLink.UserProfileLink, { tenantKey: tenantKey, username: (
|
|
42
|
+
!isEditing && !pickedUser && 'min-h-[340px]'), id: "user-cap-modal-description", children: [isEditing ? (jsxRuntime.jsx("p", { className: "text-sm text-[#646464]", "data-testid": "user-cap-modal-username", children: jsxRuntime.jsx(userProfileLink.UserProfileLink, { tenantKey: tenantKey, username: (_c = cap === null || cap === void 0 ? void 0 : cap.username) !== null && _c !== void 0 ? _c : '', display: (cap === null || cap === void 0 ? void 0 : cap.email) || ((_d = cap === null || cap === void 0 ? void 0 : cap.username) !== null && _d !== void 0 ? _d : ''), className: "inline", testId: "user-cap-modal-profile-link" }) })) : (jsxRuntime.jsx(searchSelect.SearchSelect, { labels: labels.users.picker, selected: pickedUser, onSelect: setPickedUser, onClear: () => setPickedUser(null), searchTerm: userSearch, onSearchTermChange: setUserSearch, options: userOptions, isLoading: isSearchingUsers, testId: "user-cap-modal-user-picker" })), Boolean(username) && (jsxRuntime.jsx(spendCapForm.SpendCapForm, { labels: labels, cap: cap !== null && cap !== void 0 ? cap : undefined, isSaving: isSaving, isDeleting: false, onSave: handleSave, onCancel: onClose, testId: "user-cap-modal" }))] })] }) }));
|
|
67
43
|
}
|
|
68
44
|
|
|
69
45
|
exports.UserCapModal = UserCapModal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"user-cap-modal.js","sources":["../../../../../../../src/components/spend-caps/user-cap-modal.tsx"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"user-cap-modal.js","sources":["../../../../../../../src/components/spend-caps/user-cap-modal.tsx"],"sourcesContent":[null],"names":["usePlatformUserOptions","_jsx","Dialog","_jsxs","DialogContent","DialogHeader","DialogTitle","cn","UserProfileLink","SearchSelect","SpendCapForm"],"mappings":"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"}
|